From 9315481bf2b4168887fe301b4fb3ceefc7ffb73f Mon Sep 17 00:00:00 2001 From: FellowTraveler Date: Wed, 5 Oct 2011 13:07:33 -0700 Subject: [PATCH] Fixed a bug in exchangeBasket. Signed-off-by: FellowTraveler --- .gitignore | 101 + Android.mk | 8 + GETTING-STARTED.txt | 207 + INSTALL-Android.txt | 311 + INSTALL-Mac-Linux-FreeBSD.txt | 376 + INSTALL-Windows.txt | 427 + LICENSE-AND-CREDITS.txt | 1962 + Makefile | 302 + OTLib/Android.mk | 40 + OTLib/Bitcoin.pb.cpp | 2423 ++ OTLib/Bitcoin.pb.h | 2307 ++ OTLib/Bitcoin.proto | 43 + OTLib/Generics.pb.cpp | 1098 + OTLib/Generics.pb.h | 689 + OTLib/Generics.proto | 20 + OTLib/Lucre/CHANGES | 5 + OTLib/Lucre/LUCRE_LICENSE.txt | 48 + OTLib/Lucre/Makefile | 55 + OTLib/Lucre/bank-new.cpp | 42 + OTLib/Lucre/bank-sign.cpp | 37 + OTLib/Lucre/bank-verify.cpp | 27 + OTLib/Lucre/bank.h | 353 + OTLib/Lucre/bankdemo.cpp | 159 + OTLib/Lucre/bankimp.cpp | 245 + OTLib/Lucre/banktest.cpp | 68 + OTLib/Lucre/banktest2.cpp | 57 + OTLib/Lucre/coin-request.cpp | 31 + OTLib/Lucre/coin-unblind.cpp | 32 + OTLib/Makefile | 377 + OTLib/Markets.pb.cpp | 5141 +++ OTLib/Markets.pb.h | 4613 +++ OTLib/Markets.proto | 162 + OTLib/Moneychanger.pb.cpp | 2718 ++ OTLib/Moneychanger.pb.h | 2263 ++ OTLib/Moneychanger.proto | 56 + OTLib/OTASCIIArmor.cpp | 1356 + OTLib/OTASCIIArmor.h | 225 + OTLib/OTAccount.cpp | 922 + OTLib/OTAccount.h | 237 + OTLib/OTAgreement.cpp | 1094 + OTLib/OTAgreement.h | 401 + OTLib/OTAssetContract.cpp | 442 + OTLib/OTAssetContract.h | 190 + OTLib/OTAsymmetricKey.cpp | 1532 + OTLib/OTAsymmetricKey.h | 260 + OTLib/OTBasket.cpp | 446 + OTLib/OTBasket.h | 276 + OTLib/OTCheque.cpp | 371 + OTLib/OTCheque.h | 228 + OTLib/OTContract.cpp | 2366 ++ OTLib/OTContract.h | 378 + OTLib/OTCron.cpp | 1145 + OTLib/OTCron.h | 249 + OTLib/OTCronItem.cpp | 1092 + OTLib/OTCronItem.h | 297 + OTLib/OTData.cpp | 397 + OTLib/OTData.h | 222 + OTLib/OTDataCheck.cpp | 224 + OTLib/OTDataCheck.h | 151 + OTLib/OTEnvelope.cpp | 628 + OTLib/OTEnvelope.h | 180 + OTLib/OTIdentifier.cpp | 1053 + OTLib/OTIdentifier.h | 224 + OTLib/OTInstrument.cpp | 226 + OTLib/OTInstrument.h | 193 + OTLib/OTItem.cpp | 1926 + OTLib/OTItem.h | 416 + OTLib/OTLedger.cpp | 1243 + OTLib/OTLedger.h | 265 + OTLib/OTLib.cp | 101 + OTLib/OTLib.h | 145 + OTLib/OTLib.xcodeproj/project.pbxproj | 619 + OTLib/OTLib/OTLib.vcxproj | 265 + OTLib/OTLib/stdafx.cpp | 8 + OTLib/OTLib/stdafx.h | 13 + OTLib/OTLib/targetver.h | 8 + OTLib/OTLibPriv.h | 142 + OTLib/OTLibProj.xcconfig | 6 + OTLib/OTLibTarget.xcconfig | 11 + OTLib/OTLib_Prefix.pch | 6 + OTLib/OTLog.cpp | 847 + OTLib/OTLog.h | 341 + OTLib/OTMarket.cpp | 2382 ++ OTLib/OTMarket.h | 293 + OTLib/OTMessage.cpp | 3668 ++ OTLib/OTMessage.h | 202 + OTLib/OTMessageBuffer.cpp | 173 + OTLib/OTMessageBuffer.h | 154 + OTLib/OTMint.cpp | 1213 + OTLib/OTMint.h | 258 + OTLib/OTOffer.cpp | 458 + OTLib/OTOffer.h | 273 + OTLib/OTPayload.cpp | 327 + OTLib/OTPayload.h | 191 + OTLib/OTPaymentPlan.cpp | 1614 + OTLib/OTPaymentPlan.h | 437 + OTLib/OTPseudonym.cpp | 2971 ++ OTLib/OTPseudonym.h | 437 + OTLib/OTPurse.cpp | 668 + OTLib/OTPurse.h | 216 + OTLib/OTServerContract.cpp | 333 + OTLib/OTServerContract.h | 166 + OTLib/OTSignature.cpp | 313 + OTLib/OTSignature.h | 149 + OTLib/OTSignedFile.cpp | 372 + OTLib/OTSignedFile.h | 212 + OTLib/OTStorage.cpp | 3076 ++ OTLib/OTStorage.h | 2232 ++ OTLib/OTString.cpp | 1109 + OTLib/OTString.h | 384 + OTLib/OTStringXML.cpp | 225 + OTLib/OTStringXML.h | 182 + OTLib/OTToken.cpp | 1174 + OTLib/OTToken.h | 378 + OTLib/OTTrackable.cpp | 224 + OTLib/OTTrackable.h | 207 + OTLib/OTTrade.cpp | 1299 + OTLib/OTTrade.h | 310 + OTLib/OTTransaction.cpp | 3467 ++ OTLib/OTTransaction.h | 384 + OTLib/OTTransactionType.cpp | 377 + OTLib/OTTransactionType.h | 261 + OTLib/OTWallet.cpp | 1433 + OTLib/OTWallet.h | 240 + OTLib/OTglobal.h | 172 + OTLib/anyoption.cpp | 1177 + OTLib/anyoption.h | 270 + OTLib/bigint/.gitignore | 6 + OTLib/bigint/BigInteger.cc | 421 + OTLib/bigint/BigInteger.hh | 231 + OTLib/bigint/BigIntegerAlgorithms.cc | 86 + OTLib/bigint/BigIntegerAlgorithms.hh | 41 + OTLib/bigint/BigIntegerLibrary.hh | 24 + OTLib/bigint/BigIntegerUtils.cc | 130 + OTLib/bigint/BigIntegerUtils.hh | 102 + OTLib/bigint/BigUnsigned.cc | 713 + OTLib/bigint/BigUnsigned.hh | 434 + OTLib/bigint/BigUnsignedInABase.cc | 149 + OTLib/bigint/BigUnsignedInABase.hh | 138 + OTLib/bigint/ChangeLog | 146 + OTLib/bigint/Makefile | 73 + OTLib/bigint/NumberlikeArray.hh | 193 + OTLib/bigint/README | 71 + OTLib/bigint/run-testsuite | 37 + OTLib/bigint/sample.cc | 139 + OTLib/bigint/testsuite.cc | 326 + OTLib/buildproto | 5 + OTLib/containers/containers.hpp | 23 + OTLib/containers/containers_fixes.hpp | 132 + OTLib/containers/copy_functors.hpp | 66 + OTLib/containers/digraph.hpp | 507 + OTLib/containers/digraph.tpp | 1483 + OTLib/containers/exceptions.hpp | 71 + OTLib/containers/foursome.hpp | 61 + OTLib/containers/foursome.tpp | 72 + OTLib/containers/hash.hpp | 205 + OTLib/containers/hash.tpp | 658 + OTLib/containers/matrix.hpp | 63 + OTLib/containers/matrix.tpp | 215 + OTLib/containers/ntree.hpp | 399 + OTLib/containers/ntree.tpp | 962 + OTLib/containers/safe_iterator.hpp | 155 + OTLib/containers/safe_iterator.tpp | 357 + OTLib/containers/simple_ptr.hpp | 282 + OTLib/containers/simple_ptr.tpp | 395 + OTLib/containers/smart_ptr.hpp | 221 + OTLib/containers/smart_ptr.tpp | 345 + OTLib/containers/triple.hpp | 56 + OTLib/containers/triple.tpp | 67 + OTLib/easyzlib.c | 8081 ++++ OTLib/easyzlib.h | 107 + OTLib/irrxml/CXMLReaderImpl.h | 797 + OTLib/irrxml/fast_atof.h | 139 + OTLib/irrxml/heapsort.h | 73 + OTLib/irrxml/irrArray.h | 444 + OTLib/irrxml/irrString.h | 664 + OTLib/irrxml/irrTypes.h | 101 + OTLib/irrxml/irrXML.cpp | 170 + OTLib/irrxml/irrXML.h | 540 + OTLib/mkcert.c | 186 + OTLib/simpleini/ConvertUTF.c | 539 + OTLib/simpleini/ConvertUTF.h | 149 + OTLib/simpleini/Makefile | 28 + OTLib/simpleini/SimpleIni.h | 3374 ++ OTLib/simpleini/SimpleIni.sln | 29 + OTLib/simpleini/SimpleIni.vcproj | 291 + OTLib/simpleini/ini.syn | 36 + OTLib/simpleini/package.cmd | 26 + OTLib/simpleini/simpleini.doxy | 1321 + OTLib/simpleini/simpleini.dsp | 178 + OTLib/simpleini/simpleini.dsw | 29 + OTLib/simpleini/snippets.cpp | 123 + OTLib/simpleini/test.cmd | 24 + OTLib/simpleini/test1-expected.ini | 82 + OTLib/simpleini/test1-input.ini | 73 + OTLib/simpleini/test1.cpp | 165 + OTLib/simpleini/testsi-EUCJP.ini | 52 + OTLib/simpleini/testsi-SJIS.ini | 51 + OTLib/simpleini/testsi-UTF8.ini | 50 + OTLib/simpleini/testsi.cpp | 309 + PUBKEY-FellowTraveler.asc | 64 + README.md | 192 + docs/LICENSE-AND-CREDITS.txt | 2059 + docs/RELEASE-NOTES.txt | 414 + docs/SSL-NOTES.txt | 293 + docs/WIPE-USERS-ACCOUNTS.txt | 89 + ot-sample-data-clean/CLIENT-COMMANDS.txt | 247 + ot-sample-data-clean/client.cfg | 19 + ot-sample-data-clean/client_data/.ot_ini | 5 + .../client_data/LICENSE-AND-CREDITS.txt | 2059 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 25 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 25 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 50 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 71 + .../client_data/certs/special/ca.crt | 18 + .../client_data/certs/special/client.pem | 50 + ...dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp | 131 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 143 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 134 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 19 + .../client_data/nyms/NOTES.txt | 24 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 61 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 26 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + .../client_data/pubkeys/TESTPUBKEYCLI.txt | 8 + ...dKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success | 88 + ...WgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail | 52 + ...TUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success | 77 + ...YY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success | 90 + .../client_data/signcontract.exe | Bin 0 -> 5408524 bytes ot-sample-data-clean/client_data/wallet.xml | 27 + ot-sample-data-clean/command-line-ot.opt | 15 + ot-sample-data-clean/ot_init.cfg | 7 + ot-sample-data-clean/server.cfg | 25 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 25 + ...98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN | 25 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 25 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 71 + .../server_data/certs/special/ca.crt | 18 + .../certs/special/dh_param_1024.pem | 17 + .../server_data/certs/special/server.pem | 71 + ...dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp | 131 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 143 + .../server_data/createmint.exe | Bin 0 -> 5408652 bytes .../server_data/cron/OT-CRON.crn | 59 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 364 + ...acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 | 364 + ...WKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC | 134 + .../server_data/notaryServer.xml | 10 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 19 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 29 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 26 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 8 + .../server_data/pubkeys/TESTPUBKEY.txt | 8 + ...dKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success | 79 + ...TUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success | 77 + ...YY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success | 81 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 35 + ot-sample-data/CLIENT-COMMANDS.txt | 247 + ot-sample-data/client.cfg | 19 + ot-sample-data/client_data/.ot_ini | 5 + .../client_data/LICENSE-AND-CREDITS.txt | 2059 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 25 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 25 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 25 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 25 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 25 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 25 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 25 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 50 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 31 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 71 + .../client_data/certs/special/ca.crt | 18 + .../client_data/certs/special/client.pem | 50 + ot-sample-data/client_data/certs/temp.nym | 31 + ...dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp | 131 + ...ph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW | 159 + ...BCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz | 43 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 143 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 19 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 45 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 19 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 19 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 45 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 134 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 19 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 19 + ot-sample-data/client_data/nyms/NOTES.txt | 24 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 62 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 29 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 26 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 19 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 19 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 19 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 19 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + .../client_data/pubkeys/TESTPUBKEYCLI.txt | 8 + ...dKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success | 83 + ...WgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail | 52 + ...TUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success | 303 + ...2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success | 80 + ...vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS.success | 85 + ...7bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success | 301 + ...P3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success | 78 + ...YY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success | 90 + ot-sample-data/client_data/wallet.xml | 71 + ot-sample-data/command-line-ot.opt | 15 + ot-sample-data/ot_init.cfg | 7 + ot-sample-data/server.cfg | 25 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 25 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 25 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 25 + ...EabE80EP4MYiUEOLSMKlUfaLmsWjxg3xixOmpzRQsp | 25 + ...98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN | 25 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 25 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 25 + ...7Ar8H0ppA9TRiFfLVbf5STq44JaivmPYUO0npyoArb | 25 + ...JfjQPFUpfF0M6rYA9tX4KOxxZVMg0WczTTTMYsC2K2 | 25 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 25 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 25 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 71 + .../server_data/certs/special/ca.crt | 18 + .../certs/special/dh_param_1024.pem | 17 + .../server_data/certs/special/server.pem | 71 + ...dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp | 131 + ...ph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW | 159 + ...BCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz | 43 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 143 + ot-sample-data/server_data/cron/OT-CRON.crn | 59 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 19 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 45 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 19 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 19 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 45 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...V6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa | 364 + ...acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 | 364 + ...WKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC | 134 + ot-sample-data/server_data/notaryServer.xml | 20 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 19 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 19 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 30 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 29 + ...c23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C | 26 + ...N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl | 19 + ...AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh | 19 + ...BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 | 19 + ...9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 | 19 + ...TdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS | 19 + ...cHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y | 19 + ...SBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV | 19 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 8 + .../server_data/pubkeys/TESTPUBKEY.txt | 8 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 8 + ...dKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success | 79 + ...TUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success | 303 + ...2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success | 80 + ...7bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success | 301 + ...P3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success | 78 + ...YY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success | 81 + ...1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV | 35 + ...MTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z | 35 + sample-contracts/NOTES.txt | 33 + sample-contracts/localhost.otc | 131 + sample-contracts/localhost.xml | 120 + sample-contracts/silver.otc | 143 + sample-contracts/silver.xml | 131 + sample-contracts/test-server-contract.otc | 127 + sample-contracts/test-server-contract.xml | 116 + sample-contracts/tokens.otc | 158 + sample-contracts/tokens.xml | 147 + ssl/Makefile | 42 + ssl/NOTES.txt | 18 + ssl/client.cnf | 53 + ssl/client.pem | 50 + ssl/clientcert.pem | 15 + ssl/clientkey.pem | 17 + ssl/clientreq.pem | 13 + ssl/dh1024.pem | 17 + ssl/dh512.pem | 12 + ssl/root.cnf | 52 + ssl/root.pem | 36 + ssl/root.srl | 1 + ssl/rootcert.pem | 18 + ssl/rootkey.pem | 18 + ssl/rootreq.pem | 11 + ssl/server.cnf | 53 + ssl/server.pem | 71 + ssl/serverCA.cnf | 54 + ssl/serverCA.pem | 55 + ssl/serverCA.srl | 1 + ssl/serverCAcert.pem | 19 + ssl/serverCAkey.pem | 18 + ssl/serverCAreq.pem | 12 + ssl/servercert.pem | 16 + ssl/serverkey.pem | 18 + ssl/serverreq.pem | 13 + testwallet/API-README.txt | 332 + testwallet/Acct.cs | 84 + testwallet/Acct.java | 67 + testwallet/AddressBook.cs | 70 + testwallet/AddressBook.java | 121 + testwallet/Android.mk | 38 + testwallet/AskData.cs | 108 + testwallet/AskData.java | 92 + testwallet/BidData.cs | 108 + testwallet/BidData.java | 92 + testwallet/BitcoinAcct.cs | 96 + testwallet/BitcoinAcct.java | 84 + testwallet/BitcoinServer.cs | 132 + testwallet/BitcoinServer.java | 108 + testwallet/Blob.cs | 60 + testwallet/Blob.java | 51 + .../CPP_API_Windows/CPP_API_Windows.vcxproj | 164 + testwallet/Contact.cs | 152 + testwallet/Contact.java | 245 + testwallet/ContactAcct.cs | 144 + testwallet/ContactAcct.java | 116 + testwallet/ContactNym.cs | 130 + testwallet/ContactNym.java | 170 + testwallet/Displayable.cs | 60 + testwallet/Displayable.java | 51 + .../JNI_API_Windows/JNI_API_Windows.cpp | 28 + testwallet/JNI_API_Windows/JNI_API_Windows.h | 22 + .../JNI_API_Windows/JNI_API_Windows.vcxproj | 177 + testwallet/JNI_API_Windows/applink.c | 94 + testwallet/JNI_API_Windows/dllmain.cpp | 19 + testwallet/JNI_API_Windows/stdafx.cpp | 6 + testwallet/JNI_API_Windows/stdafx.h | 16 + testwallet/JNI_API_Windows/targetver.h | 8 + testwallet/LoomServer.cs | 132 + testwallet/LoomServer.java | 108 + testwallet/Makefile | 343 + testwallet/Makefile.API | 773 + testwallet/MarketData.cs | 252 + testwallet/MarketData.java | 188 + testwallet/MarketList.cs | 70 + testwallet/MarketList.java | 121 + testwallet/OTAPI.cpp | 8624 ++++ testwallet/OTAPI.h | 186 + testwallet/OTAPI.i | 1769 + testwallet/OTAPI_csharp.cpp | 10106 +++++ testwallet/OTAPI_csharp.h | 33 + testwallet/OTAPI_d.h | 0 testwallet/OTAPI_funcdef.h | 2060 + testwallet/OTAPI_java.cpp | 15415 ++++++++ testwallet/OTAPI_java.h | 31 + testwallet/OTAPI_perl5.cpp | 32410 ++++++++++++++++ testwallet/OTAPI_perl5.h | 0 testwallet/OTAPI_php.cpp | 26210 +++++++++++++ testwallet/OTAPI_php.h | 23 + testwallet/OTAPI_python.cpp | 29811 ++++++++++++++ testwallet/OTAPI_python.h | 64 + testwallet/OTAPI_ruby.cpp | 27700 +++++++++++++ testwallet/OTAPI_ruby.h | 29 + testwallet/OTAPI_tcl.cpp | 26311 +++++++++++++ testwallet/OTAPI_tcl.h | 0 testwallet/OTAPI_wrap.h | 31 + testwallet/OTCallback.cs | 87 + testwallet/OTCallback.java | 66 + testwallet/OTCaller.cs | 72 + testwallet/OTCaller.java | 66 + testwallet/OTClient.cpp | 7878 ++++ testwallet/OTClient.h | 358 + testwallet/OTDBString.cs | 60 + testwallet/OTDBString.java | 51 + testwallet/OTServerConnection.cpp | 1658 + testwallet/OTServerConnection.h | 255 + testwallet/OfferDataMarket.cs | 108 + testwallet/OfferDataMarket.java | 83 + testwallet/OfferDataNym.cs | 250 + testwallet/OfferDataNym.java | 188 + testwallet/OfferListMarket.cs | 92 + testwallet/OfferListMarket.java | 196 + testwallet/OfferListNym.cs | 70 + testwallet/OfferListNym.java | 121 + testwallet/OpenTransactions.cpp | 7384 ++++ testwallet/OpenTransactions.h | 575 + testwallet/PackType.cs | 14 + testwallet/PackType.java | 16 + testwallet/RippleServer.cs | 156 + testwallet/RippleServer.java | 124 + testwallet/SSL-Example/SFSocket.c | 501 + testwallet/SSL-Example/SFSocket.h | 44 + testwallet/SSL-Example/client.c | 55 + testwallet/SSL-Example/server.c | 67 + testwallet/SWIGTYPE_p_IStorable.cs | 27 + testwallet/SWIGTYPE_p_IStorable.java | 26 + testwallet/SWIGTYPE_p_OTCallback.cs | 27 + testwallet/SWIGTYPE_p_OTCallback.java | 25 + testwallet/SWIGTYPE_p_OTPacker.cs | 27 + testwallet/SWIGTYPE_p_OTPacker.java | 26 + testwallet/SWIGTYPE_p_PackedBuffer.cs | 27 + testwallet/SWIGTYPE_p_PackedBuffer.java | 26 + ...E_p_std__mapT_std__string_std__string_t.cs | 27 + ...p_std__mapT_std__string_std__string_t.java | 26 + ...PE_p_std__mapTstd__string_std__string_t.cs | 27 + testwallet/SWIGTYPE_p_std__string.cs | 27 + testwallet/SWIGTYPE_p_std__string.java | 26 + ...SWIGTYPE_p_std__vectorT_unsigned_char_t.cs | 27 + ...IGTYPE_p_std__vectorT_unsigned_char_t.java | 26 + .../SWIGTYPE_p_std__vectorTunsigned_char_t.cs | 27 + testwallet/SWIGTYPE_p_uint32_t.cs | 27 + testwallet/SWIGTYPE_p_uint32_t.java | 26 + testwallet/SWIGTYPE_p_uint64_t.cs | 27 + testwallet/SWIGTYPE_p_uint64_t.java | 26 + testwallet/Server.cs | 108 + testwallet/Server.java | 83 + testwallet/ServerInfo.cs | 84 + testwallet/ServerInfo.java | 76 + testwallet/Storable.cs | 55 + testwallet/Storable.java | 48 + testwallet/Storage.cs | 309 + testwallet/Storage.java | 222 + testwallet/StorageType.cs | 13 + testwallet/StorageType.java | 15 + testwallet/StoredObjectType.cs | 36 + testwallet/StoredObjectType.java | 38 + testwallet/StringMap.cs | 70 + testwallet/StringMap.java | 60 + testwallet/TradeDataMarket.cs | 108 + testwallet/TradeDataMarket.java | 92 + testwallet/TradeDataNym.cs | 120 + testwallet/TradeDataNym.java | 100 + testwallet/TradeListMarket.cs | 70 + testwallet/TradeListMarket.java | 121 + testwallet/TradeListNym.cs | 70 + testwallet/TradeListNym.java | 121 + testwallet/WalletData.cs | 136 + testwallet/WalletData.java | 346 + testwallet/buildwrappers | 46 + testwallet/main.h | 146 + testwallet/ot_client.cfg | 5 + testwallet/otapi.cs | 1071 + testwallet/otapi.java | 856 + testwallet/otapi.php | 2672 ++ testwallet/otapi.pm | 1618 + testwallet/otapi.py | 1900 + testwallet/otapiJNI.java | 709 + testwallet/otapiPINVOKE.cs | 2152 + testwallet/otapi_im.d | 1580 + testwallet/php_otapi.h | 562 + testwallet/runme.java | 87 + testwallet/silver.xml | 131 + testwallet/test.php | 11 + testwallet/testclient.cpp | 1002 + testwallet/testread.cpp | 57 + .../testwallet.xcodeproj/project.pbxproj | 291 + testwallet/testwallet/applink.c | 94 + testwallet/testwallet/stdafx.cpp | 16 + testwallet/testwallet/stdafx.h | 16 + testwallet/testwallet/targetver.h | 8 + testwallet/testwallet/testwallet.cpp | 11 + testwallet/testwallet/testwallet.vcxproj | 171 + testwallet/testwrite.cpp | 72 + testwallet/xmlrpcxx_client.cpp | 2767 ++ transaction/Makefile | 321 + transaction/OTClientConnection.cpp | 862 + transaction/OTClientConnection.h | 234 + transaction/OTServer.cpp | 9292 +++++ transaction/OTServer.h | 354 + transaction/SSL-Example/SFSocket.c | 560 + transaction/SSL-Example/SFSocket.h | 45 + transaction/SSL-Example/client.c | 55 + transaction/SSL-Example/server.c | 67 + transaction/main.h | 153 + transaction/ot_server.cfg | 5 + transaction/testserver.cpp | 589 + .../transaction.xcodeproj/project.pbxproj | 263 + transaction/transaction/applink.c | 94 + transaction/transaction/stdafx.cpp | 8 + transaction/transaction/stdafx.h | 15 + transaction/transaction/targetver.h | 8 + transaction/transaction/transaction.cpp | 12 + transaction/transaction/transaction.vcxproj | 111 + transaction/xmlrpcxx_server.cpp | 755 + util/NOTES.txt | 28 + util/otcreatemint/Makefile | 269 + util/otcreatemint/Makefile.linux | 114 + util/otcreatemint/main.cpp | 287 + .../otcreatemint.xcodeproj/project.pbxproj | 229 + util/signcontract/Makefile | 270 + util/signcontract/Makefile.linux | 112 + util/signcontract/main.cpp | 124 + .../signcontract.xcodeproj/project.pbxproj | 229 + 597 files changed, 376683 insertions(+) create mode 100644 .gitignore create mode 100644 Android.mk create mode 100644 GETTING-STARTED.txt create mode 100644 INSTALL-Android.txt create mode 100644 INSTALL-Mac-Linux-FreeBSD.txt create mode 100644 INSTALL-Windows.txt create mode 100644 LICENSE-AND-CREDITS.txt create mode 100644 Makefile create mode 100644 OTLib/Android.mk create mode 100644 OTLib/Bitcoin.pb.cpp create mode 100644 OTLib/Bitcoin.pb.h create mode 100644 OTLib/Bitcoin.proto create mode 100644 OTLib/Generics.pb.cpp create mode 100644 OTLib/Generics.pb.h create mode 100644 OTLib/Generics.proto create mode 100755 OTLib/Lucre/CHANGES create mode 100644 OTLib/Lucre/LUCRE_LICENSE.txt create mode 100644 OTLib/Lucre/Makefile create mode 100755 OTLib/Lucre/bank-new.cpp create mode 100755 OTLib/Lucre/bank-sign.cpp create mode 100755 OTLib/Lucre/bank-verify.cpp create mode 100755 OTLib/Lucre/bank.h create mode 100755 OTLib/Lucre/bankdemo.cpp create mode 100755 OTLib/Lucre/bankimp.cpp create mode 100755 OTLib/Lucre/banktest.cpp create mode 100755 OTLib/Lucre/banktest2.cpp create mode 100755 OTLib/Lucre/coin-request.cpp create mode 100755 OTLib/Lucre/coin-unblind.cpp create mode 100644 OTLib/Makefile create mode 100644 OTLib/Markets.pb.cpp create mode 100644 OTLib/Markets.pb.h create mode 100644 OTLib/Markets.proto create mode 100644 OTLib/Moneychanger.pb.cpp create mode 100644 OTLib/Moneychanger.pb.h create mode 100644 OTLib/Moneychanger.proto create mode 100644 OTLib/OTASCIIArmor.cpp create mode 100644 OTLib/OTASCIIArmor.h create mode 100644 OTLib/OTAccount.cpp create mode 100644 OTLib/OTAccount.h create mode 100644 OTLib/OTAgreement.cpp create mode 100644 OTLib/OTAgreement.h create mode 100644 OTLib/OTAssetContract.cpp create mode 100644 OTLib/OTAssetContract.h create mode 100644 OTLib/OTAsymmetricKey.cpp create mode 100644 OTLib/OTAsymmetricKey.h create mode 100644 OTLib/OTBasket.cpp create mode 100644 OTLib/OTBasket.h create mode 100644 OTLib/OTCheque.cpp create mode 100644 OTLib/OTCheque.h create mode 100644 OTLib/OTContract.cpp create mode 100644 OTLib/OTContract.h create mode 100644 OTLib/OTCron.cpp create mode 100644 OTLib/OTCron.h create mode 100644 OTLib/OTCronItem.cpp create mode 100644 OTLib/OTCronItem.h create mode 100644 OTLib/OTData.cpp create mode 100644 OTLib/OTData.h create mode 100644 OTLib/OTDataCheck.cpp create mode 100644 OTLib/OTDataCheck.h create mode 100644 OTLib/OTEnvelope.cpp create mode 100644 OTLib/OTEnvelope.h create mode 100644 OTLib/OTIdentifier.cpp create mode 100644 OTLib/OTIdentifier.h create mode 100644 OTLib/OTInstrument.cpp create mode 100644 OTLib/OTInstrument.h create mode 100644 OTLib/OTItem.cpp create mode 100644 OTLib/OTItem.h create mode 100644 OTLib/OTLedger.cpp create mode 100644 OTLib/OTLedger.h create mode 100644 OTLib/OTLib.cp create mode 100644 OTLib/OTLib.h create mode 100644 OTLib/OTLib.xcodeproj/project.pbxproj create mode 100644 OTLib/OTLib/OTLib.vcxproj create mode 100755 OTLib/OTLib/stdafx.cpp create mode 100755 OTLib/OTLib/stdafx.h create mode 100755 OTLib/OTLib/targetver.h create mode 100644 OTLib/OTLibPriv.h create mode 100644 OTLib/OTLibProj.xcconfig create mode 100644 OTLib/OTLibTarget.xcconfig create mode 100644 OTLib/OTLib_Prefix.pch create mode 100644 OTLib/OTLog.cpp create mode 100644 OTLib/OTLog.h create mode 100644 OTLib/OTMarket.cpp create mode 100644 OTLib/OTMarket.h create mode 100644 OTLib/OTMessage.cpp create mode 100644 OTLib/OTMessage.h create mode 100644 OTLib/OTMessageBuffer.cpp create mode 100644 OTLib/OTMessageBuffer.h create mode 100644 OTLib/OTMint.cpp create mode 100644 OTLib/OTMint.h create mode 100644 OTLib/OTOffer.cpp create mode 100644 OTLib/OTOffer.h create mode 100644 OTLib/OTPayload.cpp create mode 100644 OTLib/OTPayload.h create mode 100644 OTLib/OTPaymentPlan.cpp create mode 100644 OTLib/OTPaymentPlan.h create mode 100644 OTLib/OTPseudonym.cpp create mode 100644 OTLib/OTPseudonym.h create mode 100644 OTLib/OTPurse.cpp create mode 100644 OTLib/OTPurse.h create mode 100644 OTLib/OTServerContract.cpp create mode 100644 OTLib/OTServerContract.h create mode 100644 OTLib/OTSignature.cpp create mode 100644 OTLib/OTSignature.h create mode 100644 OTLib/OTSignedFile.cpp create mode 100644 OTLib/OTSignedFile.h create mode 100644 OTLib/OTStorage.cpp create mode 100644 OTLib/OTStorage.h create mode 100644 OTLib/OTString.cpp create mode 100644 OTLib/OTString.h create mode 100644 OTLib/OTStringXML.cpp create mode 100644 OTLib/OTStringXML.h create mode 100644 OTLib/OTToken.cpp create mode 100644 OTLib/OTToken.h create mode 100644 OTLib/OTTrackable.cpp create mode 100644 OTLib/OTTrackable.h create mode 100644 OTLib/OTTrade.cpp create mode 100644 OTLib/OTTrade.h create mode 100644 OTLib/OTTransaction.cpp create mode 100644 OTLib/OTTransaction.h create mode 100644 OTLib/OTTransactionType.cpp create mode 100644 OTLib/OTTransactionType.h create mode 100644 OTLib/OTWallet.cpp create mode 100644 OTLib/OTWallet.h create mode 100644 OTLib/OTglobal.h create mode 100755 OTLib/anyoption.cpp create mode 100755 OTLib/anyoption.h create mode 100755 OTLib/bigint/.gitignore create mode 100755 OTLib/bigint/BigInteger.cc create mode 100755 OTLib/bigint/BigInteger.hh create mode 100755 OTLib/bigint/BigIntegerAlgorithms.cc create mode 100755 OTLib/bigint/BigIntegerAlgorithms.hh create mode 100755 OTLib/bigint/BigIntegerLibrary.hh create mode 100644 OTLib/bigint/BigIntegerUtils.cc create mode 100644 OTLib/bigint/BigIntegerUtils.hh create mode 100755 OTLib/bigint/BigUnsigned.cc create mode 100755 OTLib/bigint/BigUnsigned.hh create mode 100755 OTLib/bigint/BigUnsignedInABase.cc create mode 100755 OTLib/bigint/BigUnsignedInABase.hh create mode 100755 OTLib/bigint/ChangeLog create mode 100755 OTLib/bigint/Makefile create mode 100755 OTLib/bigint/NumberlikeArray.hh create mode 100755 OTLib/bigint/README create mode 100755 OTLib/bigint/run-testsuite create mode 100644 OTLib/bigint/sample.cc create mode 100755 OTLib/bigint/testsuite.cc create mode 100755 OTLib/buildproto create mode 100644 OTLib/containers/containers.hpp create mode 100644 OTLib/containers/containers_fixes.hpp create mode 100644 OTLib/containers/copy_functors.hpp create mode 100644 OTLib/containers/digraph.hpp create mode 100644 OTLib/containers/digraph.tpp create mode 100644 OTLib/containers/exceptions.hpp create mode 100644 OTLib/containers/foursome.hpp create mode 100644 OTLib/containers/foursome.tpp create mode 100644 OTLib/containers/hash.hpp create mode 100644 OTLib/containers/hash.tpp create mode 100644 OTLib/containers/matrix.hpp create mode 100644 OTLib/containers/matrix.tpp create mode 100644 OTLib/containers/ntree.hpp create mode 100644 OTLib/containers/ntree.tpp create mode 100644 OTLib/containers/safe_iterator.hpp create mode 100644 OTLib/containers/safe_iterator.tpp create mode 100644 OTLib/containers/simple_ptr.hpp create mode 100644 OTLib/containers/simple_ptr.tpp create mode 100644 OTLib/containers/smart_ptr.hpp create mode 100644 OTLib/containers/smart_ptr.tpp create mode 100644 OTLib/containers/triple.hpp create mode 100644 OTLib/containers/triple.tpp create mode 100644 OTLib/easyzlib.c create mode 100644 OTLib/easyzlib.h create mode 100755 OTLib/irrxml/CXMLReaderImpl.h create mode 100755 OTLib/irrxml/fast_atof.h create mode 100755 OTLib/irrxml/heapsort.h create mode 100755 OTLib/irrxml/irrArray.h create mode 100755 OTLib/irrxml/irrString.h create mode 100755 OTLib/irrxml/irrTypes.h create mode 100755 OTLib/irrxml/irrXML.cpp create mode 100755 OTLib/irrxml/irrXML.h create mode 100644 OTLib/mkcert.c create mode 100755 OTLib/simpleini/ConvertUTF.c create mode 100755 OTLib/simpleini/ConvertUTF.h create mode 100755 OTLib/simpleini/Makefile create mode 100755 OTLib/simpleini/SimpleIni.h create mode 100755 OTLib/simpleini/SimpleIni.sln create mode 100755 OTLib/simpleini/SimpleIni.vcproj create mode 100755 OTLib/simpleini/ini.syn create mode 100755 OTLib/simpleini/package.cmd create mode 100755 OTLib/simpleini/simpleini.doxy create mode 100755 OTLib/simpleini/simpleini.dsp create mode 100755 OTLib/simpleini/simpleini.dsw create mode 100755 OTLib/simpleini/snippets.cpp create mode 100755 OTLib/simpleini/test.cmd create mode 100755 OTLib/simpleini/test1-expected.ini create mode 100755 OTLib/simpleini/test1-input.ini create mode 100755 OTLib/simpleini/test1.cpp create mode 100755 OTLib/simpleini/testsi-EUCJP.ini create mode 100755 OTLib/simpleini/testsi-SJIS.ini create mode 100755 OTLib/simpleini/testsi-UTF8.ini create mode 100755 OTLib/simpleini/testsi.cpp create mode 100644 PUBKEY-FellowTraveler.asc create mode 100644 README.md create mode 100644 docs/LICENSE-AND-CREDITS.txt create mode 100755 docs/RELEASE-NOTES.txt create mode 100755 docs/SSL-NOTES.txt create mode 100755 docs/WIPE-USERS-ACCOUNTS.txt create mode 100755 ot-sample-data-clean/CLIENT-COMMANDS.txt create mode 100644 ot-sample-data-clean/client.cfg create mode 100755 ot-sample-data-clean/client_data/.ot_ini create mode 100755 ot-sample-data-clean/client_data/LICENSE-AND-CREDITS.txt create mode 100644 ot-sample-data-clean/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data-clean/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data-clean/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100755 ot-sample-data-clean/client_data/certs/special/ca.crt create mode 100755 ot-sample-data-clean/client_data/certs/special/client.pem create mode 100755 ot-sample-data-clean/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp create mode 100644 ot-sample-data-clean/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data-clean/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data-clean/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data-clean/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data-clean/client_data/nyms/NOTES.txt create mode 100755 ot-sample-data-clean/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data-clean/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100644 ot-sample-data-clean/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data-clean/client_data/pubkeys/TESTPUBKEYCLI.txt create mode 100644 ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success create mode 100644 ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail create mode 100644 ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success create mode 100644 ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success create mode 100755 ot-sample-data-clean/client_data/signcontract.exe create mode 100755 ot-sample-data-clean/client_data/wallet.xml create mode 100644 ot-sample-data-clean/command-line-ot.opt create mode 100644 ot-sample-data-clean/ot_init.cfg create mode 100644 ot-sample-data-clean/server.cfg create mode 100644 ot-sample-data-clean/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN create mode 100644 ot-sample-data-clean/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data-clean/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100755 ot-sample-data-clean/server_data/certs/special/ca.crt create mode 100755 ot-sample-data-clean/server_data/certs/special/dh_param_1024.pem create mode 100755 ot-sample-data-clean/server_data/certs/special/server.pem create mode 100755 ot-sample-data-clean/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp create mode 100644 ot-sample-data-clean/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100755 ot-sample-data-clean/server_data/createmint.exe create mode 100644 ot-sample-data-clean/server_data/cron/OT-CRON.crn create mode 100644 ot-sample-data-clean/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 create mode 100644 ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC create mode 100755 ot-sample-data-clean/server_data/notaryServer.xml create mode 100644 ot-sample-data-clean/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data-clean/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data-clean/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100644 ot-sample-data-clean/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data-clean/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data-clean/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data-clean/server_data/pubkeys/TESTPUBKEY.txt create mode 100644 ot-sample-data-clean/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success create mode 100644 ot-sample-data-clean/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success create mode 100644 ot-sample-data-clean/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success create mode 100644 ot-sample-data-clean/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data/CLIENT-COMMANDS.txt create mode 100644 ot-sample-data/client.cfg create mode 100755 ot-sample-data/client_data/.ot_ini create mode 100755 ot-sample-data/client_data/LICENSE-AND-CREDITS.txt create mode 100644 ot-sample-data/client_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/client_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/client_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/client_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/client_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/client_data/certs/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100755 ot-sample-data/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100755 ot-sample-data/client_data/certs/special/ca.crt create mode 100755 ot-sample-data/client_data/certs/special/client.pem create mode 100644 ot-sample-data/client_data/certs/temp.nym create mode 100755 ot-sample-data/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp create mode 100644 ot-sample-data/client_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW create mode 100644 ot-sample-data/client_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz create mode 100644 ot-sample-data/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data/client_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/client_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/client_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/client_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/client_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/client_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100755 ot-sample-data/client_data/nyms/NOTES.txt create mode 100755 ot-sample-data/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/client_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100755 ot-sample-data/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100644 ot-sample-data/client_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/client_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/client_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/client_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/client_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data/client_data/pubkeys/TESTPUBKEYCLI.txt create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success create mode 100644 ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success create mode 100755 ot-sample-data/client_data/wallet.xml create mode 100644 ot-sample-data/command-line-ot.opt create mode 100644 ot-sample-data/ot_init.cfg create mode 100644 ot-sample-data/server.cfg create mode 100644 ot-sample-data/server_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/server_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/server_data/accounts/WEabE80EP4MYiUEOLSMKlUfaLmsWjxg3xixOmpzRQsp create mode 100644 ot-sample-data/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN create mode 100644 ot-sample-data/server_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/server_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/server_data/accounts/i7Ar8H0ppA9TRiFfLVbf5STq44JaivmPYUO0npyoArb create mode 100644 ot-sample-data/server_data/accounts/jJfjQPFUpfF0M6rYA9tX4KOxxZVMg0WczTTTMYsC2K2 create mode 100644 ot-sample-data/server_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100755 ot-sample-data/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100755 ot-sample-data/server_data/certs/special/ca.crt create mode 100755 ot-sample-data/server_data/certs/special/dh_param_1024.pem create mode 100755 ot-sample-data/server_data/certs/special/server.pem create mode 100755 ot-sample-data/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp create mode 100644 ot-sample-data/server_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW create mode 100644 ot-sample-data/server_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz create mode 100644 ot-sample-data/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data/server_data/cron/OT-CRON.crn create mode 100644 ot-sample-data/server_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/server_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/server_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/server_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/server_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa create mode 100644 ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 create mode 100644 ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC create mode 100755 ot-sample-data/server_data/notaryServer.xml create mode 100644 ot-sample-data/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/server_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100644 ot-sample-data/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/server_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100755 ot-sample-data/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C create mode 100644 ot-sample-data/server_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl create mode 100644 ot-sample-data/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh create mode 100644 ot-sample-data/server_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 create mode 100644 ot-sample-data/server_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 create mode 100644 ot-sample-data/server_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS create mode 100644 ot-sample-data/server_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y create mode 100644 ot-sample-data/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV create mode 100644 ot-sample-data/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100755 ot-sample-data/server_data/pubkeys/TESTPUBKEY.txt create mode 100644 ot-sample-data/server_data/pubkeys/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100644 ot-sample-data/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success create mode 100644 ot-sample-data/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success create mode 100644 ot-sample-data/server_data/receipts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success create mode 100644 ot-sample-data/server_data/receipts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success create mode 100644 ot-sample-data/server_data/receipts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success create mode 100644 ot-sample-data/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success create mode 100644 ot-sample-data/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV create mode 100644 ot-sample-data/server_data/useraccounts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z create mode 100755 sample-contracts/NOTES.txt create mode 100644 sample-contracts/localhost.otc create mode 100644 sample-contracts/localhost.xml create mode 100644 sample-contracts/silver.otc create mode 100644 sample-contracts/silver.xml create mode 100644 sample-contracts/test-server-contract.otc create mode 100644 sample-contracts/test-server-contract.xml create mode 100644 sample-contracts/tokens.otc create mode 100644 sample-contracts/tokens.xml create mode 100755 ssl/Makefile create mode 100755 ssl/NOTES.txt create mode 100755 ssl/client.cnf create mode 100644 ssl/client.pem create mode 100644 ssl/clientcert.pem create mode 100644 ssl/clientkey.pem create mode 100644 ssl/clientreq.pem create mode 100644 ssl/dh1024.pem create mode 100644 ssl/dh512.pem create mode 100755 ssl/root.cnf create mode 100644 ssl/root.pem create mode 100644 ssl/root.srl create mode 100644 ssl/rootcert.pem create mode 100644 ssl/rootkey.pem create mode 100644 ssl/rootreq.pem create mode 100755 ssl/server.cnf create mode 100644 ssl/server.pem create mode 100755 ssl/serverCA.cnf create mode 100644 ssl/serverCA.pem create mode 100644 ssl/serverCA.srl create mode 100644 ssl/serverCAcert.pem create mode 100644 ssl/serverCAkey.pem create mode 100644 ssl/serverCAreq.pem create mode 100644 ssl/servercert.pem create mode 100644 ssl/serverkey.pem create mode 100644 ssl/serverreq.pem create mode 100644 testwallet/API-README.txt create mode 100644 testwallet/Acct.cs create mode 100644 testwallet/Acct.java create mode 100644 testwallet/AddressBook.cs create mode 100644 testwallet/AddressBook.java create mode 100644 testwallet/Android.mk create mode 100644 testwallet/AskData.cs create mode 100644 testwallet/AskData.java create mode 100644 testwallet/BidData.cs create mode 100644 testwallet/BidData.java create mode 100644 testwallet/BitcoinAcct.cs create mode 100644 testwallet/BitcoinAcct.java create mode 100644 testwallet/BitcoinServer.cs create mode 100644 testwallet/BitcoinServer.java create mode 100644 testwallet/Blob.cs create mode 100644 testwallet/Blob.java create mode 100644 testwallet/CPP_API_Windows/CPP_API_Windows.vcxproj create mode 100644 testwallet/Contact.cs create mode 100644 testwallet/Contact.java create mode 100644 testwallet/ContactAcct.cs create mode 100644 testwallet/ContactAcct.java create mode 100644 testwallet/ContactNym.cs create mode 100644 testwallet/ContactNym.java create mode 100644 testwallet/Displayable.cs create mode 100644 testwallet/Displayable.java create mode 100755 testwallet/JNI_API_Windows/JNI_API_Windows.cpp create mode 100755 testwallet/JNI_API_Windows/JNI_API_Windows.h create mode 100644 testwallet/JNI_API_Windows/JNI_API_Windows.vcxproj create mode 100755 testwallet/JNI_API_Windows/applink.c create mode 100755 testwallet/JNI_API_Windows/dllmain.cpp create mode 100755 testwallet/JNI_API_Windows/stdafx.cpp create mode 100755 testwallet/JNI_API_Windows/stdafx.h create mode 100755 testwallet/JNI_API_Windows/targetver.h create mode 100644 testwallet/LoomServer.cs create mode 100644 testwallet/LoomServer.java create mode 100644 testwallet/Makefile create mode 100644 testwallet/Makefile.API create mode 100644 testwallet/MarketData.cs create mode 100644 testwallet/MarketData.java create mode 100644 testwallet/MarketList.cs create mode 100644 testwallet/MarketList.java create mode 100644 testwallet/OTAPI.cpp create mode 100644 testwallet/OTAPI.h create mode 100644 testwallet/OTAPI.i create mode 100644 testwallet/OTAPI_csharp.cpp create mode 100644 testwallet/OTAPI_csharp.h create mode 100644 testwallet/OTAPI_d.h create mode 100644 testwallet/OTAPI_funcdef.h create mode 100644 testwallet/OTAPI_java.cpp create mode 100644 testwallet/OTAPI_java.h create mode 100644 testwallet/OTAPI_perl5.cpp create mode 100644 testwallet/OTAPI_perl5.h create mode 100644 testwallet/OTAPI_php.cpp create mode 100644 testwallet/OTAPI_php.h create mode 100644 testwallet/OTAPI_python.cpp create mode 100644 testwallet/OTAPI_python.h create mode 100644 testwallet/OTAPI_ruby.cpp create mode 100644 testwallet/OTAPI_ruby.h create mode 100644 testwallet/OTAPI_tcl.cpp create mode 100644 testwallet/OTAPI_tcl.h create mode 100644 testwallet/OTAPI_wrap.h create mode 100644 testwallet/OTCallback.cs create mode 100644 testwallet/OTCallback.java create mode 100644 testwallet/OTCaller.cs create mode 100644 testwallet/OTCaller.java create mode 100644 testwallet/OTClient.cpp create mode 100644 testwallet/OTClient.h create mode 100644 testwallet/OTDBString.cs create mode 100644 testwallet/OTDBString.java create mode 100644 testwallet/OTServerConnection.cpp create mode 100644 testwallet/OTServerConnection.h create mode 100644 testwallet/OfferDataMarket.cs create mode 100644 testwallet/OfferDataMarket.java create mode 100644 testwallet/OfferDataNym.cs create mode 100644 testwallet/OfferDataNym.java create mode 100644 testwallet/OfferListMarket.cs create mode 100644 testwallet/OfferListMarket.java create mode 100644 testwallet/OfferListNym.cs create mode 100644 testwallet/OfferListNym.java create mode 100644 testwallet/OpenTransactions.cpp create mode 100644 testwallet/OpenTransactions.h create mode 100644 testwallet/PackType.cs create mode 100644 testwallet/PackType.java create mode 100644 testwallet/RippleServer.cs create mode 100644 testwallet/RippleServer.java create mode 100755 testwallet/SSL-Example/SFSocket.c create mode 100755 testwallet/SSL-Example/SFSocket.h create mode 100755 testwallet/SSL-Example/client.c create mode 100755 testwallet/SSL-Example/server.c create mode 100644 testwallet/SWIGTYPE_p_IStorable.cs create mode 100644 testwallet/SWIGTYPE_p_IStorable.java create mode 100644 testwallet/SWIGTYPE_p_OTCallback.cs create mode 100644 testwallet/SWIGTYPE_p_OTCallback.java create mode 100644 testwallet/SWIGTYPE_p_OTPacker.cs create mode 100644 testwallet/SWIGTYPE_p_OTPacker.java create mode 100644 testwallet/SWIGTYPE_p_PackedBuffer.cs create mode 100644 testwallet/SWIGTYPE_p_PackedBuffer.java create mode 100644 testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.cs create mode 100644 testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.java create mode 100644 testwallet/SWIGTYPE_p_std__mapTstd__string_std__string_t.cs create mode 100644 testwallet/SWIGTYPE_p_std__string.cs create mode 100644 testwallet/SWIGTYPE_p_std__string.java create mode 100644 testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.cs create mode 100644 testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.java create mode 100644 testwallet/SWIGTYPE_p_std__vectorTunsigned_char_t.cs create mode 100644 testwallet/SWIGTYPE_p_uint32_t.cs create mode 100644 testwallet/SWIGTYPE_p_uint32_t.java create mode 100644 testwallet/SWIGTYPE_p_uint64_t.cs create mode 100644 testwallet/SWIGTYPE_p_uint64_t.java create mode 100644 testwallet/Server.cs create mode 100644 testwallet/Server.java create mode 100644 testwallet/ServerInfo.cs create mode 100644 testwallet/ServerInfo.java create mode 100644 testwallet/Storable.cs create mode 100644 testwallet/Storable.java create mode 100644 testwallet/Storage.cs create mode 100644 testwallet/Storage.java create mode 100644 testwallet/StorageType.cs create mode 100644 testwallet/StorageType.java create mode 100644 testwallet/StoredObjectType.cs create mode 100644 testwallet/StoredObjectType.java create mode 100644 testwallet/StringMap.cs create mode 100644 testwallet/StringMap.java create mode 100644 testwallet/TradeDataMarket.cs create mode 100644 testwallet/TradeDataMarket.java create mode 100644 testwallet/TradeDataNym.cs create mode 100644 testwallet/TradeDataNym.java create mode 100644 testwallet/TradeListMarket.cs create mode 100644 testwallet/TradeListMarket.java create mode 100644 testwallet/TradeListNym.cs create mode 100644 testwallet/TradeListNym.java create mode 100644 testwallet/WalletData.cs create mode 100644 testwallet/WalletData.java create mode 100755 testwallet/buildwrappers create mode 100644 testwallet/main.h create mode 100644 testwallet/ot_client.cfg create mode 100644 testwallet/otapi.cs create mode 100644 testwallet/otapi.java create mode 100644 testwallet/otapi.php create mode 100644 testwallet/otapi.pm create mode 100644 testwallet/otapi.py create mode 100644 testwallet/otapiJNI.java create mode 100644 testwallet/otapiPINVOKE.cs create mode 100644 testwallet/otapi_im.d create mode 100644 testwallet/php_otapi.h create mode 100644 testwallet/runme.java create mode 100644 testwallet/silver.xml create mode 100755 testwallet/test.php create mode 100644 testwallet/testclient.cpp create mode 100644 testwallet/testread.cpp create mode 100644 testwallet/testwallet.xcodeproj/project.pbxproj create mode 100755 testwallet/testwallet/applink.c create mode 100755 testwallet/testwallet/stdafx.cpp create mode 100755 testwallet/testwallet/stdafx.h create mode 100755 testwallet/testwallet/targetver.h create mode 100755 testwallet/testwallet/testwallet.cpp create mode 100644 testwallet/testwallet/testwallet.vcxproj create mode 100644 testwallet/testwrite.cpp create mode 100644 testwallet/xmlrpcxx_client.cpp create mode 100644 transaction/Makefile create mode 100644 transaction/OTClientConnection.cpp create mode 100644 transaction/OTClientConnection.h create mode 100644 transaction/OTServer.cpp create mode 100644 transaction/OTServer.h create mode 100755 transaction/SSL-Example/SFSocket.c create mode 100755 transaction/SSL-Example/SFSocket.h create mode 100755 transaction/SSL-Example/client.c create mode 100755 transaction/SSL-Example/server.c create mode 100644 transaction/main.h create mode 100644 transaction/ot_server.cfg create mode 100644 transaction/testserver.cpp create mode 100644 transaction/transaction.xcodeproj/project.pbxproj create mode 100755 transaction/transaction/applink.c create mode 100755 transaction/transaction/stdafx.cpp create mode 100755 transaction/transaction/stdafx.h create mode 100755 transaction/transaction/targetver.h create mode 100755 transaction/transaction/transaction.cpp create mode 100644 transaction/transaction/transaction.vcxproj create mode 100644 transaction/xmlrpcxx_server.cpp create mode 100755 util/NOTES.txt create mode 100644 util/otcreatemint/Makefile create mode 100644 util/otcreatemint/Makefile.linux create mode 100755 util/otcreatemint/main.cpp create mode 100644 util/otcreatemint/otcreatemint.xcodeproj/project.pbxproj create mode 100644 util/signcontract/Makefile create mode 100644 util/signcontract/Makefile.linux create mode 100755 util/signcontract/main.cpp create mode 100644 util/signcontract/signcontract.xcodeproj/project.pbxproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..13de095eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +#see http://shanesbrain.net/2008/7/9/using-xcode-with-git +# xcode noise +build/* +*.xcconfig +*.xcclassmodel/* +*.o +*.a +*.dylib +*.pbxuser +*.mode1v3 +*.mode2v3 +*.pch +*.perspectivev3 + +*.jar + +# old skool +.svn + +# osx noise +.DS_Store +profile + +# emacs noise +*~ + +# targets +testwallet/testwallet.exe +transaction/transaction.exe +OTLib/build/Debug/libOTLib.dylib +OTLib/build/OTLib.build/Debug/OTLib.build/OTLib.dep +OTLib/build/OTLib.build/Debug/OTLib.build/OTLib~.dep +OTLib/build/OTLib.build/Debug/OTLib.build/Objects-normal/x86_64/libOTLib.LinkFileList +OTLib/build/OTLib.build/Debug/OTLib.build/build-state.dat +OTLib/build/OTLib.build/Debug/OTLib.build/build-state~.dat +OTLib/build/OTLib.build/Debug/OTLib.build/libOTLib-all-target-headers.hmap +OTLib/build/OTLib.build/Debug/OTLib.build/libOTLib-generated-files.hmap +OTLib/build/OTLib.build/Debug/OTLib.build/libOTLib-own-target-headers.hmap +OTLib/build/OTLib.build/Debug/OTLib.build/libOTLib-project-headers.hmap +OTLib/build/OTLib.build/Debug/OTLib.build/libOTLib.hmap +OTLib/build/OTLib.build/OTLib.pbxindex/categories.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/cdecls.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/decls.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/files.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/imports.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/pbxindex.header +OTLib/build/OTLib.build/OTLib.pbxindex/protocols.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/refs.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/strings.pbxstrings/control +OTLib/build/OTLib.build/OTLib.pbxindex/strings.pbxstrings/strings +OTLib/build/OTLib.build/OTLib.pbxindex/subclasses.pbxbtree +OTLib/build/OTLib.build/OTLib.pbxindex/symbols0.pbxsymbols +testwallet/build/Debug/testwallet +testwallet/build/testwallet.build/Debug/testwallet.build/Objects-normal/x86_64/testwallet.LinkFileList +testwallet/build/testwallet.build/Debug/testwallet.build/build-state.dat +testwallet/build/testwallet.build/Debug/testwallet.build/build-state~.dat +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet-all-target-headers.hmap +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet-generated-files.hmap +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet-own-target-headers.hmap +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet-project-headers.hmap +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet.dep +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet.hmap +testwallet/build/testwallet.build/Debug/testwallet.build/testwallet~.dep +testwallet/build/testwallet.build/testwallet.pbxindex/categories.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/cdecls.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/decls.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/files.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/imports.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/pbxindex.header +testwallet/build/testwallet.build/testwallet.pbxindex/protocols.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/refs.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/strings.pbxstrings/control +testwallet/build/testwallet.build/testwallet.pbxindex/strings.pbxstrings/strings +testwallet/build/testwallet.build/testwallet.pbxindex/subclasses.pbxbtree +testwallet/build/testwallet.build/testwallet.pbxindex/symbols0.pbxsymbols +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/OTClientConnection.o~$ +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/OTClientConnection.o~> +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/OTServer.o~$ +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/OTServer.o~> +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/OTServer.o~? +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/testserver.o~$ +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/testserver.o~> +transaction/build/transaction.build/Debug/transaction.build/Objects-normal/x86_64/testserver.o~? +transaction/build/transaction.build/transaction.pbxindex/categories.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/cdecls.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/decls.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/files.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/imports.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/pbxindex.header +transaction/build/transaction.build/transaction.pbxindex/protocols.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/refs.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/strings.pbxstrings/control +transaction/build/transaction.build/transaction.pbxindex/strings.pbxstrings/strings +transaction/build/transaction.build/transaction.pbxindex/subclasses.pbxbtree +transaction/build/transaction.build/transaction.pbxindex/symbols0.pbxsymbols +testwallet/libOTAPI.jnilib +testwallet/libOTAPI.so +testwallet/_OTAPI.so +testwallet/OTAPI.so +testwallet/OTAPI.pyc +testwallet/OTAPI.bundle \ No newline at end of file diff --git a/Android.mk b/Android.mk new file mode 100644 index 000000000..08e86d146 --- /dev/null +++ b/Android.mk @@ -0,0 +1,8 @@ +LOCAL_PATH := $(call my-dir) + +subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ + OTLib \ + testwallet \ + )) + +include $(subdirs) diff --git a/GETTING-STARTED.txt b/GETTING-STARTED.txt new file mode 100644 index 000000000..e89d9cbd5 --- /dev/null +++ b/GETTING-STARTED.txt @@ -0,0 +1,207 @@ + +Welcome to Open Transactions. + +See LICENSE-AND-CREDITS file, which should be in the same +folder as this README file. You agree to the terms. + +Online install instructions: +https://github.com/FellowTraveler/Open-Transactions/wiki/Install + +------------------------------------------------------------------------- + +GETTING STARTED: + + +1) For most, assuming you have all the necessary libraries installed already, + (OpenSSL 1.0.0, MsgPack, Protocol Buffers, and ZeroMQ) then you just type + this to build: + + make + (It will auto-detect platform, etc.) + +Then: sudo make install + + +If you also want the Java version (for the Moneychanger GUI) then do +this next: + + make clean && make java + +2) To run the server, type: + ot_server + +(It will give you instructions.) + +3) To run the test client, type: + ot -? + +(It will give you instructions.) + +** PASSWORD ** is test (always) + + +4) To run the Moneychanger client, just make sure the libotapi.jnilib aka +libotapi.so is in the same folder as the Moneychanger jar file and lib folder, +then double-click the jar file. + +It will want to know where the data folder is: ~/.ot/client_data + +------------------------------------------------------------------------- + + +IN MORE DETAIL: + + INSTALL-Mac-Linux-FreeBSD.txt +(or) INSTALL-Windows.txt +(or) INSTALL-Android.txt + +------------------------------------------------------------------- + +Open Transactions requires OpenSSL version 1.0.0. + + * To check current version: openssl version + + * To upgrade on Mac: sudo port install openssl + If that doesn't work: sudo port install openssl-devel + + * On Linux: +NOTE for 64-bit Linux: MAKE SURE you configure OpenSSL explicitly for 64-bit and for shared binaries, THEN re-build it. (OpenSSL does not come built with those options by default, on 64bit Linux.) +Again: For 64-bit Linux, run: "./configure -m64 shared" in the openssl folder BEFORE building OpenSSL 1.0.0, and then it should work when you build and run Open-Transactions.) + wget http://www.openssl.org/source/openssl-1.0.0d.tar.gz + tar -xf openssl-1.0.0d.tar.gz + cd openssl-1.0.0d + ./config + make + sudo make install + + * On FreeBSD (as root): + cd /usr/ports/security/openssl/ && make install clean + +--------------------------------------------------------------- + + +INSTALL: MsgPack Library (data packing library now used by OT.) + +Available here: msgpack.org +To install from command line: port install msgpack +(OR) brew install msgpack + +Install instructions for all platforms: +http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language + +--------------------------------------------------------------- + +INSTALL: Google's Protocol Buffers library (another data packer.) + +Available here: +http://code.google.com/p/protobuf/downloads/list + +--------------------------------------------------------------- + +INSTALL: ZeroMQ (transport library) + +Available here: +http://www.zeromq.org/intro:get-the-software + +port install zmq + +--------------------------------------------------------------- + +DOWNLOAD OPEN TRANSACTIONS + +git clone git://github.com/FellowTraveler/Open-Transactions.git + +Source code (FYI): +https://github.com/FellowTraveler/Open-Transactions + +---------------------------------------------------------------- + +BUILD OPEN TRANSACTIONS + +cd Open-Transactions && make clean && make + + +FOR JAVA MODE (If using Moneychanger Java GUI): + +make clean && make java + +--------------------------------------------------------------- + +BUILD THE API + +To build the API for a specific language, try: + +make java +make python +make php5 +make perl5 +make ruby +make c +make d + +Etc. Use "make clean" between builds. + +See testwallet/API-README.txt for full instructions on building +the API for the various different languages. (There are more languages +available.) + +--------------------------------------------------------------- + +DEVELOPER RESOURCES + +The OT API, with notes: +https://github.com/FellowTraveler/Open-Transactions/wiki/API + +Use cases for the OT API: +https://github.com/FellowTraveler/Open-Transactions/wiki/Use-Cases + +--------------------------------------------------------------- + +TO START THE SERVER + +cd transaction && ./transaction.exe + +OR: ot_server will work from any folder, if you did make install. + +The server requires a password and a path when it starts up. +(It will tell you what to do.) + +FYI, the data folder for the server is: +~/.ot/server_data + +If you want to back up a copy of it, then you can feel free +to play around with the data files, knowing you can refresh them +at any time. + +--------------------------------------------------------------- + +TO RUN THE TEST CLIENT + +Once the server is running, then try the testwallet in a +separate terminal: + +cd Open-Transactions && cd testwallet && ./testwallet.exe + +OR: ot will work from any folder, if you did make install. + +Again, it will ask you to enter a password and a path. +Don't worry, it gives clear instructions. + +To use the testwallet, read ~/.ot/CLIENT-COMMANDS.txt +Online: +https://github.com/FellowTraveler/Open-Transactions/wiki/Test-Wallet-commands + +Note: the test wallet and the API are really just different build +options for the same client-side code, which is located in the +Open-Transactions/testwallet folder. + +The data folder for the client is: +~/.ot/client_data + +Fresh copies of all data is located in Open-Transactions/ot-sample-data + + + + + + diff --git a/INSTALL-Android.txt b/INSTALL-Android.txt new file mode 100644 index 000000000..c86027502 --- /dev/null +++ b/INSTALL-Android.txt @@ -0,0 +1,311 @@ + +OpenTransactions for ANDROID + + + --- Open Transactions is currently built on: + - Linux Ubuntu 2.6.32 and FreeBSD using g++. + - Mac OS X 10.6.4 (Snow Leopard) using XCode as well as gcc + - Windows 7 using MS Visual C++ 2010 Express. + - Android 8 using NDK. + + --- OpenSSL version 1.0.0a (at least) is necessary, since the SAMY hash + uses WHRLPOOL. (XOR'd with SHA-512.) WHIRLPOOL is a new addition to + OpenSSL. + +==> NOTE: Android still uses OpenSSL 0.9.8!! Thus, the default hash + algorithm in the Android build is SHA512, *not* SAMY! This will + be fixed as soon as the newest version of OpenSSL becomes available + for the Android platform. + + --- Let me know if there are any problems, since this is new software; + this will be a living document. + +NOTE: the Android build and instructions have not been updated for a while, and since then the packing libraries have been added to OT. So I'm adding the packing notes here: + +--------------------------------------------------------------- + + +INSTALL: MsgPack Library (data packing library now used by OT.) + +Available here: msgpack.org +To install from command line: port install msgpack +(OR) brew install msgpack + +Install instructions for all platforms: +http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language + +--------------------------------------------------------------- + +INSTALL: Google's Protocol Buffers library (another data packer.) + +Available here: +http://code.google.com/p/protobuf/downloads/list + +--------------------------------------------------------------- + + +INSTALL: ZeroMQ (transport library.) + +Available here: +http://www.zeromq.org/intro:get-the-software + +--------------------------------------------------------------- + + +NOTE: OT hasn't been build on Android for a while, so it will +probably need some work to get it building again. Just let me know +if you are seriously playing with Android and I will put in the +work to to get it building again for you. + + +PRE-BUILD: + +--- Presumably you have installed the Android SDK. I went with version 2.2 + as the development platform. + +--- You must install a SPECIAL version of the NDK in order to use the C++ + standard libraries (which Open-Transactions does.) It's called the + CRYSTAX NDK and I found it here: + http://www.crystax.net/android/ndk-r4.php + +--- I put the SDK folder, as well as the NDK folder, here: + ~/Android + +NOTE: YOU CAN USE ANY LOCATION YOU PREFER, BUT THIS IS WHAT I'M USING FOR THIS EXAMPLE. + + So the SDK and NDK, on my system, are therefore here: + ~/Android/android-sdk-mac_x86 + ~/Android/android-ndk-r4-crystax + + (But I suppose you could install them anywhere you want, as long as you + give Eclipse the path...) + +NOTE: WHENEVER YOU ARE IN AN NDK PROJECT, the Root folder is ALWAYS assumed to be the main NDK +folder, which in the above example is ~/Android/android-ndk-r4-crystax. So ALL of the other +NDK folders relevant to these instructions are found there. For example, on my computer, +the apps, external, and sources are found in these locations: + +~/Android/android-ndk-r4-crystax/apps +~/Android/android-ndk-r4-crystax/external +~/Android/android-ndk-r4-crystax/sources + +Make sure you CREATE ALL THREE FOLDERS ABOVE, if they do not already exist on your system +(apps, external, and sources.) + + +--- Your Eclipse project will be in your workspace folder. Make sure you create a link + from your project's folder to the NDK's apps folder. For example: + + ln -s ~/workspace/fiatcash ~/Android/android-ndk-r4-crystax/apps/fiatcash + +The above command creates a symbolic link: ~/Android/android-ndk-r4-crystax/apps/fiatcash +and points it to the folder: ~/workspace/fiatcash + +This way, your code is safely in its workspace folder, but it also appears as an application +in your Android NDK's apps folder. + + +--- INSTALL OpenSSL and ZLIB into the external folder. You can download Android versions here: +OpenSSL: +http://android.git.kernel.org/?p=platform/external/openssl.git;a=summary +ZLIB: +http://android.git.kernel.org/?p=platform/external/zlib.git;a=summary + +When you are done, they should be installed here: +~/Android/android-ndk-r4-crystax/external/openssl +~/Android/android-ndk-r4-crystax/external/zlib + +NOTE: Unfortunately, that OpenSSL version will not build without a few fixes to the +Android.mk files within. If you would like to contact me, I will be happy to send you +a copy of these files. (I also built OpenSSL as a static library, so the files were adjusted +for that as well.) +FURTHER NOTE: FOR THE EXACT CHANGES YOU NEED TO MAKE, SCROLL TO THE BOTTOM OF THIS FILE. + + +--- Copy the entire Open-Transactions directory tree into the NDK sources folder. When done, + it will appear here: + +~/Android/android-ndk-r4-crystax/sources/Open-Transactions + +---------------------------------------------------------------- + + +TO BUILD: + +--- First change directory to the main NDK folder, like this: + +cd ~/Android/android-ndk-r4-crystax/ + +--- Then to build your Android application: + +make APP=fiatcash + +(Assuming fiatcash is the name of your application.) +NOTE that the APP must be all-caps. + +This command causes the Android build system to look for an application called fiatcash. +It will look for that application here: +~/Android/android-ndk-r4-crystax/apps/fiatcash + +Inside the JNI folder of that app is your Android makefile. Here is the full path to it: +~/Android/android-ndk-r4-crystax/apps/fiatcash/jni/Android.mk + +THAT makefile builds the NDK aspects of your Android application. In order for your application +to link to Open-Transactions (and OpenSSL, etc) your makefile does it like this: + + +--------------- BEGIN SAMPLE FIATCASH MAKEFILE (TO LINK WITH OPEN-TRANSACTIONS) ------------ +# +# Fiatcash / Android +# +# See copyright notice that came with this distribution. +# + +FIATCASH_PATH := $(call my-dir) + +OTAPI_MAKE := sources/Open-Transactions/Android.mk +OTAPI_DIR := sources/Open-Transactions/testwallet + + +include $(OTAPI_MAKE) + +# fiatcash... +# +include $(CLEAR_VARS) + +LOCAL_PATH := $(FIATCASH_PATH) + +LOCAL_MODULE := fiatcash + +LOCAL_C_INCLUDES += $(LOCAL_PATH) $(OTAPI_DIR) + +LOCAL_SRC_FILES := fiatcash.c + +LOCAL_LDLIBS += -ldl -lz + +LOCAL_SHARED_LIBRARIES := libOTAPI + +include $(BUILD_SHARED_LIBRARY) + +------------------ END SAMPLE MAKEFILE (DO NOT INCLUDE THIS NOTICE IN THE ACTUAL FILE) ---------- + + + +--- The above makefile will activate the Open-Transactions Android makefiles, and then + link it into your application. + +--- Inside your FiatCash.java file, make sure to load the OTAPI shared library before + making any calls. Also load it before your own application. Like this: + + System.LoadLibrary("OTAPI"); + System.LoadLibrary("fiatcash"); + +--- (Test files will have to be generated separately for Android since it uses SHA512 instead of + SAMY hash.) + +--- As always, the password is "test" for all the test certs that come with Open Transactions. + + +------------------------------------------------ + + + + + +--- If you don't want me to send you the OpenSSL makefiles, you can fix them yourself. + +The main fix is in external/openssl/crypto/Android.mk. Near the bottom of the file, it should +look like this: + +---------------- BEGIN BOTTOM OF THE FILE: external/openssl/crypto/Android.mk---------- + +LOCAL_CFLAGS += -DNO_WINDOWS_BRAINDEATH + +include $(LOCAL_PATH)/../android-config.mk + +LOCAL_C_INCLUDES += \ + external/openssl \ + external/openssl/include \ + external/zlib + +# LOCAL_SHARED_LIBRARIES += libz + +# ifneq ($(TARGET_SIMULATOR),true) +# LOCAL_SHARED_LIBRARIES += libdl +# endif + +LOCAL_LDLIBS += -ldl -lz + +LOCAL_MODULE:= libcrypto + +include $(BUILD_STATIC_LIBRARY) + +-------------- END BOTTOM OF THE FILE: external/openssl/crypto/Android.mk------------ + + + +--- ALSO, near the TOP of that file, notice that I had to capitalize all the .S files: + +ifeq ($(TARGET_ARCH),arm) + LOCAL_CFLAGS += -DOPENSSL_BN_ASM_MONT -DAES_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM + LOCAL_SRC_FILES:= 0.9.9-dev/bn/armv4-mont.S \ + 0.9.9-dev/aes/aes-armv4.S \ + 0.9.9-dev/sha/sha1-armv4-large.S \ + 0.9.9-dev/sha/sha256-armv4.S \ + 0.9.9-dev/sha/sha512-armv4.S + +---------------------------------------------------------- + + + +--- I ALSO HAD to make some changes to external/openssl/ssl/Android.mk +Notice that both libraries are now static instead of shared... + +---------- BEGIN BOTTOM OF THE FILE: external/openssl/ssl/Android.mk ------------ +include $(LOCAL_PATH)/../android-config.mk + +LOCAL_C_INCLUDES += $(local_c_includes) + +LOCAL_STATIC_LIBRARIES += libcrypto + +LOCAL_MODULE:= libssl + +include $(BUILD_STATIC_LIBRARY) + +include $(CLEAR_VARS) + +# ssltest + +LOCAL_SRC_FILES:=ssltest.c + +LOCAL_C_INCLUDES += $(local_c_includes) + +LOCAL_STATIC_LIBRARIES := libssl + +include $(LOCAL_PATH)/../android-config.mk + +LOCAL_MODULE:=ssltest + +LOCAL_MODULE_TAGS := optional + +include $(BUILD_EXECUTABLE) +------------------END BOTTOM OF THE FILE: external/openssl/ssl/Android.mk ------------ + + + +--- I ALSO MADE a small change to one small part of external/openssl/apps/Android.mk + +Make sure it says this: + +LOCAL_STATIC_LIBRARIES := \ + libssl \ + libcrypto + +Instead of this: + +LOCAL_SHARED_LIBRARIES := \ + libssl \ + libcrypto + + + diff --git a/INSTALL-Mac-Linux-FreeBSD.txt b/INSTALL-Mac-Linux-FreeBSD.txt new file mode 100644 index 000000000..28eb682bc --- /dev/null +++ b/INSTALL-Mac-Linux-FreeBSD.txt @@ -0,0 +1,376 @@ + + +OpenTransactions for Mac OS X, Linux, and FreeBSD + + + --- Open Transactions is currently built on: + - Linux Ubuntu 2.6.32 and FreeBSD using g++/gcc. + - Mac OS X 10.7.1 (Lion) using XCode as well as gcc + - Windows 7 using MS Visual C++ 2010 Express. + - Android 8 using NDK. + + --- OpenSSL version 1.0.0a (at least) is necessary, since the SAMY hash + uses WHRLPOOL. (XOR'd with SHA-512.) WHIRLPOOL is a new addition to + OpenSSL. (Current build is tested with 1.0.0d) + + --- Let me know if there are any problems, since this is new software; + this will be a living document. + + +Install instructions (Wiki): +https://github.com/FellowTraveler/Open-Transactions/wiki/Install + +For Troubleshooting notes: +https://github.com/FellowTraveler/Moneychanger/wiki/Troubleshooting + +---------------------------------- + +PRE-BUILD: + +--- Make sure OpenSSL 1.0.0d is installed, since earlier versions don't + have WHIRLPOOL and the software won't work without it. + + To check your current version of OpenSSL, type: openssl version + + * To upgrade on Mac: sudo port install openssl + If that doesn't work: sudo port install openssl-devel + + * On Linux: +NOTE for 64-bit Linux: MAKE SURE you configure OpenSSL explicitly for 64-bit and for shared binaries, THEN re-build it. (OpenSSL does not come built with those options by default, on 64bit Linux.) +Again: For 64-bit Linux, run: "./configure -m64 shared" in the openssl folder BEFORE building OpenSSL 1.0.0, and then it should work when you build and run Open-Transactions.) + wget http://www.openssl.org/source/openssl-1.0.0d.tar.gz + tar -xf openssl-1.0.0d.tar.gz + cd openssl-1.0.0d + ./config (SEE NOTE ABOVE: for you, this might be: ./configure -m64 shared) + make + sudo make install + + * On FreeBSD (as root): cd /usr/ports/security/openssl/ && make install clean + +--- cd Open-Transactions <=== ("THE MAIN FOLDER") + +(See Troubleshooting doc on wiki for notes on how to use OpenSSL 1.0.0 with +Open-Transactions WITHOUT having to install it as your official system copy.) + + +--------------------------------------------------------------- + +JAVA MODE: + +If you are planning to build in Java mode (to use the Java GUI aka "Moneychanger") then you will need to install the JDK. +----------------------------- +On Linux: +sudo apt-get install openjdk-6-jdk +sudo apt-get install openjdk-6-source + +export JAVA_HOME=/usr/lib/jvm/java-6-openjdk +or: export JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk +(Depending on which version of java you have installed. Just look and see what's there first.) + +Also, to get it to find the missing libotapi.so, I needed to add a reference to the current directory: +export LD_LIBRARY_PATH=/usr/local/lib:. +----------------------------- +On Mac: +sudo port install openjdk6 + +--------------------------------------------------------------- + +INSTALL: MsgPack Library (data packing library now used by OT.) + +Available here: msgpack.org +To install from command line: port install msgpack +(OR) brew install msgpack + +Install instructions for all platforms: +http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language +--------------------------------------------------------------- + +INSTALL: Google's Protocol Buffers library (another data packer.) + +Available here: +http://code.google.com/p/protobuf/downloads/list + + +------------------------------------------------------------------------ + +INSTALL: ZeroMQ (transport library) + +Available here: +http://www.zeromq.org/intro:get-the-software + +sudo port install zmq (OR) +sudo apt-get install zeromq + +etc. + +------------------------------------------------------------------------ + +XCode NOTES: These are old, and were moved to the bottom of this file. +Unless you know/care what Xcode is, then you can ignore them. + +------------------------------------------------------------------------ + + +DON'T WANT TO COMPILE OPEN-TRANSACTIONS YOUSELF? + + +Download pre-built binaries of Open-Transactions: + https://github.com/FellowTraveler/Open-Transactions/downloads + +Download pre-built jar files of Moneychanger (GUI for OT): + https://github.com/FellowTraveler/Moneychanger/downloads + +------------------------------------------------------------------------ + + + +BUILD INSTRUCTIONS + +If you want to build everything yourself, use this command: + + make (To build in C mode, for the OT command-line) +Or: make java (To build in Java mode, for the Moneychanger Java GUI) + +Or: make PLATFORM=[darwin|linux|freebsd] +(Optional since it WILL try to auto-detect your operating system.) + + +Other build targets are tcp, debug, debugtcp, javadebug, and clean. + +You can also build the API for several languages (python, ruby, +perl5, and php5) at the top level. For other languages, see the +below notes, as well as the testwallet/API-README.txt file. For +example: + make java + make javadebug + make python + make php5 + make csharp + make ruby + Etc. + + +!!! For FreeBSD, make sure you have gmake installed, since the Makefiles won't +work with the default version of make. Once you install it, you can build +using these commands, depending on which options you prefer: + + gmake + gmake PLATFORM=[darwin|linux|freebsd] + (Let it auto-detect. This option is only if you are desperate.) + + +IF THERE ARE ANY ISSUES WITH WRONG FOLDER, ETC, OPEN Open-Transactions/Makefile +AND CHECK OUT THE FOLDERS IN THERE; MAKE SURE THEY ARE CORRECT FOR YOUR SYSTEM. + +If you "make java" you may need to make sure $JAVA_HOME is set. + + +==> SKIP DOWN TO THE "To Run" section to see how to run OT, now that it's built. + + +--------------------------------------------------------------- + +If you prefer to build all of the projects individually, they are below for +my notes. (But the above steps should be enough to take care of everything for +most people.) + +--- Build the Library: +cd OTLib; +make PLATFORM=[darwin|linux|freebsd] [DYNAMIC_OTLIB=1] + +output will be libOTLib.a +(The other projects/Makefiles will expect that library to be built.) + +--- Build the server: +cd ../transaction; +make PLATFORM=[darwin|linux|freebsd] [TRANSPORT=ZMQ] [DYNAMIC_OTLIB=1] + +--- Build the client: +cd ../testwallet; +make PLATFORM=[darwin|linux|freebsd] [TRANSPORT=ZMQ] + + +If you fail to use TRANSPORT=ZMQ, then OT will build in TCP/SSL mode, +instead of ZeroMQ mode. (You don't want that.) + +Make sure you use DYNAMIC_OTLIB=1 whenever building OT for other languages. +For example, Java, Python, Ruby, etc. OT must be built in dynamic mode since +those languages load it as a DLL, or shared library. + +--------------------------------------------------------------- + +With the above steps, the library, server, and test client are now built and ready to run. + + +--- OPTIONAL: Native APIs available for C, C++, C#, Obj-C, Java, Ruby, Python, Perl, Php, Lisp, etc. + + +cd Open-Transactions/testwallet; make clean; +make -f Makefile.API [TRANSPORT=ZMQ] PLATFORM=[darwin|linux|freebsd] LANGUAGE=[c|csharp|java|ruby|python|perl|php|tcl|lisp] + + +NOTE: +For some languages (Python) on some platforms (Linux) it might require that OTLib +is built with the variable DYNAMIC_OTLIB=1. So if you get a build error while building +the API, do this: + +cd ../OTLib; make clean; make DYNAMIC_OTLIB=1; cd ../testwallet + +(Now try to build your API interface again.) + +More detailed notes in Open-Transactions/testwallet/API-README.txt + +-------------------------------------------------------- + +** INSTALL, CONFIG FILES AND INI FILE ** + +In the "Open-Transactions" folder, type: + sudo make install + +FYI, This copies transaction/transaction.exe to /usr/local/bin/ot_server, +and it copies testwallet/testwallet.exe to /usr/local/bin/ot +It also creates the ~/.ot folder, and copies the contents of ot-sample-data +into that folder. + +Important configuration data is located in the various .cfg and .opt files +located in ~/.ot +(I suggest you check them out.) + + +-------------------------------------------------------- + +TO START THE SERVER + + ot_server + +It will probably ask you to enter a password and a path. Don't worry, +it gives clear instructions. Also see the INSTALL docs. + +----------------------------------- + +OT GUI (MONEYCHANGER) + +To start Moneychanger, just double click the jar file. +Or type: java -jar JavaWrapper.jar + +You will need to select the data folder for the client. +This is located in: ~/.ot/client_data + +==> Make sure the Moneychanger lib folder is also there with the jar. +==> Also, make sure OT is built in java mode. If it's not, then go to +the Open-Transactions folder and type this: +make clean && make java + +----------------------------------- + +To use the OT COMMAND-LINE... + +In a new shell, run the command-line utility like this: + + ot -? + +The instructions for using OT at the command-line will be provided. + +(NOTE: for now, do not run multiple clients AT THE SAME TIME against +the SAME data folder!) + +----------------------------------- + +OT PROMPT + +If you prefer to use the OT PROMPT, then type "ot" with NO ARGUMENTS, +and it will drop into the OT PROMPT, which looks like this: OT> + +----------------------------------- + +You don't have to specify a hostname and port, because the server contract +already contains that information. + +(In the server contract that comes with this test distribution, +the hostname is localhost and port is 7085.) + + + +USING THE SOFTWARE: + +I already created your user account. The password is test (always) + +==> With the server, all you can do is watch the output as it runs. + +==> But with the client, there is a command-line interface. + +**** READ: ~/.ot/CLIENT-COMMANDS.txt for a list of the Wallet's commands. +I will soon add that file to a help command inside the wallet. +You can create asset accounts, issue new asset types, +transfer assets, get inbox, process inbox, +withdraw cash, deposit cash, getcontract, getmint. +You can also create basket currencies and exchange between normal +asset accounts and basket accounts. (To the server it's just another +account type.) You can also write and deposit cheques, and withdraw +vouchers. + +REMEMBER: If you move some assets, and you don't see the change show up in your +account, then you probably just need to type "get" (to get the latest copy of the +account after a change has just been made.) Another useful command is 'i' for +grabbing the inbox of any specific account. Then "get", and then "stat" to see +the balances change. + +Obviously a nice client will do this automatically. + + + +Let's organize to make a pretty GUI for various platforms, eh? + + +------------------------------------ + + + + + + + + + +------------------------------------------------------------------------ + +NOTE: These are old notes and I would be wary of, at least step 2. + + +XCode NOTES: (IGNORE this section if you aren't using XCode on Mac.) + +It's better to just use the Makefile. But if you prefer to use the XCode +project files, then you need to fix the REDACTED inside those. + +XCode project files are: +Open-Transactions/OTLib/OTLib.xcodeproj/project.pbxproj +Open-Transactions/testwallet/testwallet.xcodeproj/project.pbxproj +Open-Transactions/transaction/transaction.xcodeproj/project.pbxproj + +Edit those three files and fix wherever it says REDACTED (it will be +a path -- just set it to whatever path is correct for your own system, +you will see what I mean.) + + To search for all occurrences, use this command from the "main" folder: + fgrep -n REDACTED * */* */*/* */*/*/* + + Make sure to replace the REDACTED (entire path) with whatever + path is appropriate for your system. + +TWO more XCode notes: +1) The include path issue is addressed by changing: +Search Paths->Header Search Paths = "/opt/local/include" instead +of "/usr/local/include" (So you get the macports version of OpenSSL, +which is 1.0.0c, instead of the default version, which is 0.9.8) + +2) You also have to change a couple links that the Mac system uses to +point at the "current" OpenSSL: + +sudo rm /usr/lib/libcrypto.dylib +sudo ln -s /opt/local/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib +sudo rm /usr/lib/libssl.dylib +sudo ln -s /opt/local/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib + +Now you should be good to go with XCode! +------------------------------------------------------------------------ + diff --git a/INSTALL-Windows.txt b/INSTALL-Windows.txt new file mode 100644 index 000000000..661f8e92a --- /dev/null +++ b/INSTALL-Windows.txt @@ -0,0 +1,427 @@ + + +OpenTransactions for WINDOWS + + + --- Open Transactions is currently built on: + - Windows 7 using MS Visual C++ 2010 Express. + - Mac OS X 10.7.1 (Lion) using XCode as well as gcc + - Linux Ubuntu 2.6.32 and FreeBSD using g++/gcc. + - Android 8 using NDK. + + --- OpenSSL version 1.0.0a (at least) is necessary, since the SAMY hash uses WHRLPOOL. (XOR'd with SHA-512.) WHIRLPOOL is a new addition to OpenSSL. + Currently OpenSSL is up to 1.0.0d. + + --- Let me know if there are any problems, since this is new software; this will be a living document. + + +FOR MICROSOFT WINDOWS: + +1) I used Microsoft Visual C++ 2010 Express, which is free, to build Open Transactions on Windows 7. + +------------ + +2) Windows transport should now be operational since switching to the ZeroMQ library. + +------------ + +3) I had to install OpenSSL for Windows, (version 1.0.0 at least is necessary for Open Transactions to function properly.) The download page is here: + +http://www.slproweb.com/products/Win32OpenSSL.html + +(I found it by looking here: http://www.openssl.org/related/binaries.html) + +The specific OpenSSL version that I installed was this one: + Win32 OpenSSL v1.0.0d (32 BIT) + http://www.slproweb.com/download/Win32OpenSSL-1_0_0d.exe + Win64 OpenSSL v1.0.0d (64 BIT) + http://www.slproweb.com/download/Win64OpenSSL-1_0_0d.exe + +There may be errors when using OpenSSL stemming from missing redistributables. +If so, you can download them here: + 32 bit x86 Visual C++ 2008 redistributable DLLs: + http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF + 64 bit x64 Visual C++ 2008 redistributable DLLs (x64): + http://www.microsoft.com/downloads/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6 +----------------------- + +IMPORTANT: While the default install folder for OpenSSL is: + "C:\OpenSSL-Win32", DO NOT USE THIS LOCATION! + +I HAVE INSTEAD INSTALLED IT HERE: "C:\~\OpenSSL-Win32" +(This is at the request of our only known Windows developer. Notice the TILDE character in that path!) + +THEREFORE, make sure you install OpenSSL to that folder, again: C:\~\OpenSSL-Win32 + +...since that is where the project will assume that it can be found. If you prefer to install to the default location, be warned that you need to update the path in various project files in order for it to work. + +IF YOU ARE USING 64-BIT WINDOWS, AGAIN, I HAVE NOT TESTED ON THAT PLATFORM. +PRESUMABLY, YOU WOULD STILL NEED TO NAME THE FOLDER "OpenSSL-Win32" SINCE +THE PROJECT FILE LOOKS IN THAT LOCATION. (YOU CAN ALWAYS EDIT THE PROJECT +FILE TO CHANGE IT.) + +--------------------------------------------------------------- + +INSTALL: MsgPack Library (data packing library now used by OT.) + +Available here: msgpack.org +To install from command line: port install msgpack +(OR) brew install msgpack + +Install instructions for all platforms: +http://wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language + +Install to: C:\~\msgpack\ +(VC++ Project files expect it to be there.) + +Before building msgpack, go to the project properties (release mode), +Configuration projects, C/C++, Code Generation, and set the Runtime +library to Multi-threaded (/MT). + +(OT defaults to release mode, so make sure you build this in release mode also.) + +--------------------------------------------------------------- + +INSTALL: Google's Protocol Buffers library (another data packer.) + +Available here: +http://code.google.com/p/protobuf/downloads/list + +I used this one: +http://protobuf.googlecode.com/files/protobuf-2.4.1.zip + +Install to: C:\~\protobuf\ +(VC++ Project files expect it to be there.) + +(OT defaults to release mode, so make sure you build this in release mode also.) + +Before building protobuf, go to the project properties (release mode), +Configuration projects, C/C++, Code Generation, and set the Runtime +library to Multi-threaded (/MT). + +--------------------------------------------------------------- + + +INSTALL: ZeroMQ (transport library) + +Available here: +http://www.zeromq.org/intro:get-the-software + +Install to: C:\~\zeromq\ +(VC++ Project files expect it to be there.) + +To build ZMQ, the Windows project files are here: +C:\~\zeromq\builds\msvc\libzmq + +(OT defaults to release mode, so make sure you build this in release mode also.) + +Before building protobuf, go to the project properties (release mode), +Configuration projects, C/C++, Code Generation, and set the Runtime +library to Multi-threaded (/MT). + +--------------------------------------------------------------- + + +4) Then I had to download these header files: +http://code.google.com/p/msinttypes/downloads/detail?name=msinttypes-r26.zip&can=2&q= + +Once you download the header files, unzip them so that they appear in your C:\~\OpenSSL-Win32\include folder, (and this path is specified in the OTLib project, so make sure you use the same path.) + +(Those were headers that are included in Unix but not Windows, so you just have to download them separately and put them into an include folder. That's what this step (4) does.) + + +------ + + + +YOU'RE BASICALLY DONE. Build OTLib, then CPP_API_Windows, then JNI_API_WINDOWS. + +(Or build the testwallet if you prefer, but I prefer you use the Java API...) + + +--------------------------------------------------------------- + +JDK + +ONE MORE THING: If you don't have the JDK for Windows, then the JNI_API_Windows project obviously won't build. + +I installed it from here: http://jdk6.java.net/download.html + +The JNI_API_Windows project file is configured to use various Java folders, such as this one: +C:\Program Files\Java\jdk1.6.0\include\win32 + +You may notice, after installing the JDK, that a build number is appended, like this: + +C:\Program Files\Java\jdk1.6.0_27\include\win32 +But again, Open-Transactions is looking for this: +C:\Program Files\Java\jdk1.6.0\include\win32 + +Therefore, it's best if you rename that folder after installing the JDK, so that the OT project file will be able to find it. +(Otherwise you'll need to edit the OT project file.) + + + + + +BELOW ARE ONLY FOR MY NOTES: + + + + +------------ + +5) Then I created a Win32 command-line application and chose 'library' as the type. + +(YOU DON'T HAVE TO WORRY ABOUT THIS STEP, since it's already done: I have included the project files with this distribution.) + +FYI, then I copied all of the OTLib files into the new Win32 OTLib folder for my new project. + +I also created Visual C++ projects for transaction and testwallet (the server and client.) I created them as normal command-line applications, and I copied the files of each to their respective folders and added to each project as appropriate. + +------------ + +The idea is for you to use C:\~\Open-Transactions as your main folder. If you do that, all the paths are ALREADY set up for you correctly. + +(Otherwise you'd have to search the project and fix them all, which is not a big deal if you prefer to do that.) + +CONFIG FILES: +Any path corrections should be unnecessary if you install to +C:\~\Open-Transactions +but if you prefer to use different directories, you will have to fix the path in these locations: + +On Windows, if you use the VC++ project files that I distributed, the paths are in these files: +Open-Transactions\testwallet\testwallet\testwallet.vcxproj +Open-Transactions\transaction\transaction\transaction.vcxproj +Open-Transactions\OTLib\OTLib\OTLib.vcxproj + +------------------- + + + +7) The VC++ projects should be set up with precompiled headers turned OFF. + +(Under C/C++, click on Precompiled Headers and made sure I set "Precompiled Header" to "Not Using Precompiled Headers".) + +NOTE: You should be able to use any good C++ compiler for Windows that you want to, as long as you get the right headers and libraries etc. But VC++ 2010 is what I used, since it was free. + + +------ + +8) OTLIB INCLUDE DIRECTORIES + +Under VC++ Directories -> Include Directories, the value is set to: +(SEPARATED ONTO MULTIPLE LINES FOR READABILITY...) + +C:\~\Open-Transactions\OTLib\Lucre; +C:\~\OpenSSL-Win32\include; +$(IncludePath) + +(I added newlines to make it easier for you to decipher.) Make sure your own project includes the OpenSSL path and the Lucre path as appropriate for your system. + +----- + +9) DIRECTORIES for TESTWALLET (the client software) + +The VC++ project for testwallet, under VC++ Directories -> Include Directories, +it is set to: +C:\~\OpenSSL-Win32\include; +C:\~\Open-Transactions\OTLib; +$(IncludePath) + +Again, I added newlines above to make it easier to read. When I copied it, this was all on a single line. + +Just underneath that are the Library Directories. Mine is set to: +C:\~\OpenSSL-Win32\lib\VC; +C:\~\Open-Transactions\OTLib\OTLib\Debug; +$(LibraryPath) + +Notice a couple things. (1) the newlines again, you must remove those. +(2) I am specifying the OTLib\OTLib\Debug folder as part of the library path. +That's because so far I've only been coding in Debug Mode, so I had the +debug testwallet looking in the debug folder for the debug library (which +is statically linked.) +THE SAME IS TRUE ON THE SERVER SIDE. + +Notice also that OpenSSL has to be on the "Include Library" path for each project. + +----- + +10) TESTWALLET LINKER SETTINGS + +Here are the libraries I had to link against in order to get testwallet running: +Linker -> Input -> Additional Dependencies: +winmm.lib;wininet.lib;ws2_32.lib;libeay32MT.lib;ssleay32MT.lib;OTLib.lib;CPP_API_Windows.lib;%(AdditionalDependencies) + +- winmm.lib is a windows library and ws2_32.lib is Winsock2. + +- (OTLib is the Open Transactions library that testwallet needs to link against +for all the OT calls that it makes.) + +- libeay32 is the OpenSSL crypto lib for Windows. +- ssleay32 is the OpenSSL SSL lib for Windows. + +When you install OpenSSL, it puts a bunch of different versions of these static +libraries into the C:\~\OpenSSL-Win32\lib\VC folder. Each one is for a different +build... + +The versions in C:\~\OpenSSL-Win32\lib\VC are static stubs, that actually load +DLLs (surprise!) But you still link to them statically. + +The versions in C:\~\OpenSSL-Win32\lib\VC\static are the full static libs, +that do NOT load DLLs, and they are considerably larger. + +The suffixes stand for: + +MT multi-threaded, standard C run-time libraries are statically linked. +MTd multi-threaded, standard C run-time libraries are statically linked, debug version. +MD multi-threaded, standard C run-time libraries are dynamically linked. +MDd multi-threaded, standard C run-time libraries are dynamically linked, debug version. + +These have to match your project. Remember, this has nothing to do with whether +your project itself is statically or dynamically linked. Rather, it has to do with +whether the C-runtime libs used by your project are statically or dynamically linked. + +If your project has the /MD flag, then you must link to the MD version of OpenSSL, +and if you project has the /MTd flag (again, for C runtime libs) then you must +link to the MTd version of OpenSSL. + + +************* + +OPTIONAL: HIGH-LEVEL API -- Now available in C++ and Java!! + +Notice there are a few extra folders in Open-Transactions\testwallet: + +CPP_API_Windows +JNI_API_Windows + +Each contains an MS Visual Studio 2010 Express project. Description: + +CPP_API_Windows -- Build this first. It's the OT Library, but with the socket code + added as well as the high-level C++ interface. After you build it, + you can include the static lib it generates into any C++ project. + Just make sure you include OpenTransactions.h in your project. + +JNI_API_Windows -- There is also a Java JNI interface. Build this next and it will create + the DLL. Then you can use OpenTransactionsJNI.java in your java projects, + and it will load the DLL as appropriate (make sure it's on the classpath.) + + NOTE: You have to install the JDK for Windows in order to build this. It + uses jni.h which won't otherwise be on your machine. + +Now you can include Open Transactions in your Java or C++ projects on Windows, with +a very easy, high-level interface. A trained monkey could do it! + +------- + +11) TRANSACTION + +- transaction (the server) has the same "VC++ Directories -> Linker Input" +as testwallet does: +winmm.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;%(AdditionalDependencies) + +Also the include directories and library directories are the same: + +- transaction's "VC++ Directories -> Include Directories": +C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + +- Library Directories: +C:\~\OpenSSL-Win32\lib\VC;C:\~\Open-Transactions\OTLib\Debug;$(LibraryPath) + +Obviously you will have to edit these to make them appropriate for your own system. + + +--------- + +In addition the code is now littered with "#ifdef _WIN32" directives... + +---------- + +Also in addition, the file: +Open-Transactions\transaction\transaction\applink.c + +...was added as part of making OpenSSL functional. I'm sure it's the same version +of the file that you will have also with your own OpenSSL installation, so you won't +need to replace that file. But I still wanted to make a note of it for the install notes. + +There are other files in that folder that will be necessary to build on Windows, +no matter which compiler you are using. + +----------- + + +Open Transactions now works on Linux, Windows, and Mac! + +I was actually running it in the DOS prompt, but the JNI will be where the real fun begins. + +------------- + + +TO RUN: + +The client and server expect to be run from the command line in their respective folders. + +(Assuming you have already built the projects, including OTLib first.) + +NOTE: Make sure you fix the paths in testwallet\wallet.xml and +transaction\notaryServer.xml + +SERVER +to enter the right folder: cd Open-Transactions\transaction +to run: .\transaction.exe +OR if you just built it in debug mode: .\Debug\transaction.exe + + +CLIENT +to enter the right folder: cd Open-Transactions\testwallet +to run: .\testwallet.exe +OR if you just built it in debug mode: .\Debug\testwallet.exe + + +You don't have to specify a hostname and port, because the server contract +already contains that information. + +(In the server contract that comes with this test distribution, +the hostname is localhost and port is 7085.) + + + +USING THE SOFTWARE: + +I already created your user account. The password is test (always) + +==> With the server, all you can do is watch the output as it runs. + +==> But with the client, there is a command-line interface. + + UNFORTUNATELY the command-line interface is nearly unusable on Windows. + (THE REASON this software was ported to Windows was so a Java developer + could get started on an Android client.) + +**** READ: docs\CLIENT-COMMANDS.txt for a list of the Wallet's commands. +I will soon add that file to a help command inside the wallet. +You can create asset accounts, issue new asset types, +transfer assets, get inbox, process inbox, +withdraw cash, deposit cash, getcontract, getmint. +You can also create basket currencies and exchange between normal +asset accounts and basket accounts. (To the server it's just another +account type.) You can also write and deposit cheques, and withdraw +vouchers. + +REMEMBER: If you move some assets, and you don't see the change show up in your +account, then you probably just need to type "get" (to get the latest copy of the +account after a change has just been made.) Another useful command is 'i' for +grabbing the inbox of any specific account. Then "get", and then "stat" to see +the balances change. + +Obviously a nice client will do this automatically. + + + +Let's organize to make a pretty GUI for various platforms, eh? + + +------------------------------------ + + + diff --git a/LICENSE-AND-CREDITS.txt b/LICENSE-AND-CREDITS.txt new file mode 100644 index 000000000..a4fdab376 --- /dev/null +++ b/LICENSE-AND-CREDITS.txt @@ -0,0 +1,1962 @@ +Open Transactions v0.72b +(Scroll to the bottom to see the complete AGPLv3.) +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (Darwin) + +iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki +hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K +7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F +R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U +GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU +BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp +Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 +0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX +5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH +RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s +DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O +qg/U8uXzgLQuLbFxBjyr +=utx2 +-----END PGP SIGNATURE----- +**************************************************************/ + + + + + +SIGNED PUBLIC KEY FOR AUTHOR. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Public key for "FellowTraveler", author: + +- -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: PGP Desktop 10.0.1 + + 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 + =6+N5 + -----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.10 (Darwin) + +iQIcBAEBCAAGBQJNsWCWAAoJEAMIAO35UbuOv3kP/Rd6UekX27+rHiMPfo8vN1Iz +cjXg3o7J4BWsppZQppT4r1ZmZ6ftVXDxfSeR22kWQeU7IjNjDKcQ8Vh0P1x/DHva +YczzHzQsiGGCWVzCyJyh8ENreS0mFAM6RqAP7HwOE+5iJstSatN5EHd0Om+QQvKJ +xdSe8pct6y4NjhfjXm1bfIV4suadQodFw4qp3h3LfVypPEeiGD0ohAJ2l7zO/bE3 +xNxvvj/WLfqyxVVc1pip7CzNNJTr+bQI1hh3nFXTElH+zu/YXvob4NPySruh98wE +PxzFnZ+Nl0n13+sfUW/tdI2xYWo7IZ34Ft2SjCy3He9rSLE5keke3loT8r50tu3J +pfpwDUHXAJO6nQFMbiAIEc/n+B42s8AvQ/PNmQA1/JcdlQaeBA2+k/ursOPSajDb +sTjsqsBsp5AYXAIJUbvzDDIz/2gzRcZjXaj+P9YfH00gJ2ZmKM1gTLWFrYRURIW7 +dRLUMY6HvDtyjAlO9LnvuwbdBU6jQb9EaE7FOQuO4LG62Rh9irHo3j7/FjJZkllj +g7Ypjamz9+U/5Jt2V7ivvmPbZ/IGu5dA2bw3Pqf0LtTMGqiLQWFmXLRlZ44DPv6Q +MvrCHCsSZB/Dgb4A8vZYFLbY2kzqf+g1ra4qWkKQFyNkwCbSU1p1xj2rnrRmWwSf +kLZLksZLPzcxEHdPh6YV +=/Nb5 +-----END PGP SIGNATURE----- + + + + +A few relevant notes, followed by contributor credits: + + +"The silver is mine, and the gold is mine, says the LORD of hosts." +Haggai 2:8 + +"By your wisdom and your understanding you have made wealth for + yourself, and have gathered gold and silver into your treasuries" +Ezekiel 28:4 + +"Precious treasure and oil are in a wise man's dwelling, + but a foolish man devours it." +Proverbs 21:20 + +"Because you say, 'I am rich, and increased with goods, and I need nothing,' + and you know not that you are wretched, and miserable, and poor, and blind, + and naked... +"I counsel you to buy from me gold refined by fire, so that you may be rich, + and white garments so that you may clothe yourself and the shame of your + nakedness may not be seen, and salve to anoint your eyes, + so that you may see." +Rev. 3:17-18 + +"Say to the children of Israel, I am the LORD, + and I will bring you out from under the burdens of the Egyptians, + and I will rid you out of their bondage, + and I will redeem you with a stretched out arm, + and with great judgments. + And I will take you to me for a people, + and I will be to you a God: + and you shall know that I am the LORD your God, + which brings you out from under the burdens of the Egyptians. + And I will bring you in unto the land, + concerning which I did swear to give it to Abraham, to Isaac, and to Jacob; + and I will give it you for an heritage: I am the LORD." +Exodus 6:6-9 + +"After the doings of the land of Egypt, + (where you lived before), you shall not do: + and after the doings of the land of Canaan, + (where I am bringing you), you shall not do: + neither shall you walk in their ordinances. + You shall do MY judgments, and keep MY ordinances, + to walk in them: I am the LORD your God. + You shall therefore keep my statutes, and my judgments: + which if a man does, he shall live in them: I am the LORD." +Leviticus 18:1-5 + +"Except the LORD build the house, they labor in vain that build it: + except the LORD keep the city, the watchman wakes in vain." +Psalms 127 + +"Do what is right and good in the Lord's sight, + so all will go well with you." +Deuteronomy 6:18 + +"Hate evil, and love good, + and establish justice in the courts." +Amos 5:15 + +"Justice, and only justice, you shall follow, that you may live and + inherit the land that the Lord your God is giving you." +Deuteronomy 16:20 + +"Select capable men, + from all the people, + men who fear God, + trustworthy men who hate dishonest gain, + and appoint them as officials over thousands, + hundreds, fifties and tens." +Exodus 18:21 + +"Let every soul be subject unto the higher powers. + For there is no power but of God: + the powers that be are ordained of God. + Whosoever therefore resists the power, resists the ordinance of God: + and they that resist shall receive to themselves condemnation. + For rulers are not a terror to good works, but to the evil. + Will you then not be afraid of the power? + Do that which is good, and you shall have praise of the same: + For he is the minister of God to you for good. + But if you do that which is evil, be afraid; + for he bears not the sword in vain: + for he is the minister of God, + a revenger to execute wrath upon him that does evil. + Therefore you must be subject, not only for wrath, + but also for conscience sake." +Romans 13:1-5 + +"Woe to those... + who justify the wicked for a bribe, + and take away the rights of the innocent." +Isaiah 5:23 + +"Woe unto those who decree unrighteous decrees, and + write grievousness which they have prescribed;" +Isaiah 10:1 + +"And David said to God, +'Wasn't it I who commanded the people to be numbered? + I am the one who has sinned, and done evil indeed'" +1 Chronicles 21:17a + +"Woe to those who scheme iniquity, + who work out evil on their beds! + When morning comes, they do it, + (for it is in the power of their hands.) + They covet fields and then seize them, + and houses, and take them away. + They rob a man and his house, + a man and his inheritance." +Micah 2:1-2 + +"Then came also publicans to be baptized, and said unto Him, + 'Master, what shall we do?' + And He said to them, + 'Exact no more than that which is appointed you.' + And the soldiers likewise demanded of Him, saying, + 'And what shall we do?' + And He said to them, + 'Do violence to no man, + neither accuse any falsely; + and be content with your wages.'" +Luke 3:12-14 + +"Do not pervert justice; + do not show partiality to the poor + or favoritism to the strong, + but judge your neighbor fairly." +Leviticus 19:15 + +"You shall not go after the majority to do evil. + Neither shall you testify in a matter of strife + to incline after the majority to pervert justice." +Exodus 23:2 + +"You shall not accept a bribe, + for a bribe blinds the eyes of the wise, + and subverts the cause of the righteous." +Deuteronomy 16:19 + +"You shall not lend upon usury to thy brother; + usury of money, usury of victuals, + usury of any thing that is lent upon usury: + Unto a stranger you may lend upon usury; + but unto your brother you shall not lend upon usury: + that the LORD your God may bless you in all that you set your hand to + in the land you go to possess." +Deuteronomy 23:19-20 + +"You shall not have different weights in your bag, a great and a small. + You shall not have different measures in your house, a great and a small. + But you shall have a perfect and just weight, a perfect and just measure + you shall have: That your days may be lengthened in the land which the + LORD your God gives you." +Deuteronomy 25:13 + +"You shall not steal." +Exodus 20:15 + +"Different weights, and different measures, both of them are alike + abomination to the LORD." +Proverbs 20:10 + + He overturned the tables of the money-lenders, + and the benches of those selling doves. + "It is written," he said to them, + "'My house will be called a house of prayer,' (1) + but you are making it a 'den of thieves'." (2) +Matthew 21:12b-13, 1. Isaiah 56:7, 2. Jeremiah 7:11 + +"The rich rule over the poor, and the borrower is servant to the lender." +Proverbs 22:7 + +"Be not deceived; God is not mocked: for whatsoever a man sows, + he shall also reap." +Galatians 6:7 + +"You are bought with a price; be you not the servants of men." +1 Corinthians 7:23 + +"You cannot serve both God and Mammon." +Luke 16:13 + +"Now the Lord is the Spirit, + and where the Spirit of the Lord is, there is liberty." +2 Corinthians 3:17 + +"Proclaim liberty throughout all the land unto all its inhabitants." +Leviticus 25:10 + +"From any tree of the garden you may eat freely;" +Genesis 2:16a + +"So in everything, do unto others what you would have them do unto you, +for this sums up the Law and the Prophets." +-Jesus Christ, Matthew 7:12 + +"We must obey God rather than men." +Acts 5:29 + +"For the LORD is our judge; + the LORD is our lawgiver; + the LORD is our king." +Isaiah 33:22 + +"And it shall come to pass, if you listen diligently + to the voice of the Lord your God, + to observe and to do all his commandments + which I command you today, + that the Lord your God will set you on high, + above all nations of the earth" +Deuteronomy 28:1 + +"Righteousness exalts a nation." +Proverbs 14:34 + +"Tell the righteous it will be well with them, + for they will enjoy the fruit of their labor." +Isaiah 3:10 + +"A righteous man knows the rights of the poor; + a wicked man does not understand such knowledge." +Proverbs 29:7 + +"Is it not lawful for me to do what I wish with my own things?" +-Jesus Christ, Matthew 20:15 + +"The man who looks intently into the perfect law that gives freedom, + and continues to do this, not forgetting what he has heard, but doing it, + he will be blessed in what he does." +James 1:25 + +"Whoever hears these words of mine and puts them into practice, + he is like a wise man, who built his house upon a rock: + and the rain descended, + and the floods came, + and the winds blew, + and beat upon that house; + yet it fell not: + for it was founded upon a rock." +Matthew 7:24-25 + +"Observe and hear all these words which I command you, that it may + go well with you, and with your children after you forever, + when you do that which is good and right + in the sight of the LORD your God." +Deuteronomy 12:28-32 + +"It is for freedom that Christ has set us free. Stand firm, then, + and do not let yourselves be burdened again by a yoke of slavery." +-Galatians 5:1 + +"Whoever hears these words of mine and fails to do them, + he is like a foolish man who built his house upon the sand, + and the rain descended, + and the rivers came, + and the winds blew, + and they dashed against that house; + and it fell -- and its fall was great." +Matthew 7:26-27 + +"My people are destroyed for lack of knowledge: + because you have rejected knowledge, + I will also reject you, + that you shall be no priest to me: + seeing you have forgotten the law of your God, + I will also forget your children." +Hosea 4:6 + +"Come now you rich, + weep and howl for your miseries + which are coming upon you. + Your riches have rotted + Your gold and your silver have rusted + and their rust will be a witness against you. + It is in the last days that you have stored up your treasure! + Behold, the pay of the laborers who mowed your fields + (which has been withheld by you) + cries out against you, + and the outcry of those who did the harvesting + has reached the ears of the Lord of the Sabbath. + You have lived luxuriously on the earth, + and led a life of wanton pleasure. + You have fattened your hearts in a day of slaughter. + You have condemned and murdered the righteous man;" +James 5:1-6 + +"'...And you had turned, and had done right in my sight, in + proclaiming liberty, every man to his neighbor; and you had made a + covenant before me in the house which is called by my name. +"'But you turned and polluted my name, and caused every man his + servant, and every man his handmaid, whom you had set at liberty, to + return, and brought them into subjection, to be your servants and + handmaids. +"'Therefore,' (thus says the Lord) 'You have not hearkened unto me, + in proclaiming a liberty, every one to his brother, and every man to his + neighbor: behold, I proclaim a liberty for you, says the Lord, to the + sword, to the pestilence, and to the famine; and I will make you to be + removed into all the kingdoms of the earth.'" +Jeremiah 34:15-17 + +"Now it shall come to pass in the latter days + that the mountain of the LORD's house + shall be established on the top of the mountains, + and shall be exalted above the hills; + and all nations shall flow to it. + Many people shall come and say: + 'Come, and let us go up to the mountain of the Lord, + to the house of the God of Jacob; + He will teach us His ways, + and we shall walk in His paths.' + For out of Zion shall go forth the law, + and the word of the Lord from Jerusalem." +Isaiah 2:2-3 + +"In the last days... everyone will + sit under their own vine, + and under their own fig tree, + and no one will make them afraid, + for the LORD Almighty has spoken." +Micah 4:1-4 + +"Because the creature itself also shall be delivered + from the bondage of corruption + into the glorious liberty of the children of God." +Romans 8:21 + + + +Thomas Paine wrote in COMMON SENSE: + +Government by kings was first introduced into the world by the +Heathens, from whom the children of Israel copied the custom. It was +the most prosperous invention the Devil ever set on foot for the +promotion of idolatry. The Heathens paid divine honors to their +deceased kings, and the Christian world hath improved on the plan by +doing the same to their living ones. + +How impious is the title of sacred majesty applied to a worm, who in +the midst of his splendor is crumbling into dust! + +As the exalting one man so greatly above the rest cannot be +justified on the equal rights of nature, so neither can it be +defended on the authority of scripture; for the will of the +Almighty, as declared by Gideon and the prophet Samuel, expressly +disapproves of government by kings. + +All anti-monarchial parts of scripture have been very smoothly +glossed over in monarchial governments, but they undoubtedly merit +the attention of countries which have their governments yet to form. +Render unto Caesar the things which are Caesar's is the scriptural +doctrine of courts, yet it is no support of monarchial government, +for the Jews at that time were without a king, and in a state of +vassalage to the Romans. + +Near three thousand years passed away from the Mosaic account of the +creation, till the Jews under a national delusion requested a king. +Till then their form of government (except in extraordinary cases, +where the Almighty interposed) was a kind of republic administered +by a judge and the elders of the tribes. Kings they had none, and it +was held sinful to acknowledge any being under that title but the +Lords of Hosts. + +And when a man seriously reflects on the idolatrous homage which is +paid to the persons of kings he need not wonder, that the Almighty, +ever jealous of his honor, should disapprove of a form of government +which so impiously invades the prerogative of heaven. +... +The children of Israel being oppressed by the Midianites, Gideon +marched against them with a small army, and victory, through the +divine interposition, decided in his favor. The Jews, elate with +success, and attributing it to the generalship of Gideon, proposed +making him a king, saying, "Rule thou over us, thou and thy son and +thy son's son." + +Here was temptation in its fullest extent; not a kingdom only, but +an hereditary one, but Gideon in the piety of his soul replied, "I +will not rule over you, neither shall my son rule over you, THE LORD +SHALL RULE OVER YOU." + +Words need not be more explicit; Gideon doth not decline the honor +but denies their right to give it; neither doth he compliment them +with invented declarations of his thanks, but in the positive style +of a prophet charges them with disaffection to their proper +sovereign, the King of Heaven. + +About one hundred and thirty years after this, they fell again into +the same error. The hankering which the Jews had for the idolatrous +customs of the Heathens, is something exceedingly unaccountable; but +so it was, that laying hold of the misconduct of Samuel's two sons, +who were entrusted with some secular concerns, they came in an +abrupt and clamorous manner to Samuel, saying, "Behold thou art old +and thy sons walk not in thy ways, now make us a king to judge us +like all the other nations." + +And here we cannot but observe that their motives were bad, viz., +that they might be like unto other nations, i.e., the Heathen, +whereas their true glory laid in being as much unlike them as +possible. But the thing displeased Samuel when they said, give us a +king to judge us; and Samuel prayed unto the Lord, and the Lord said +unto Samuel, "Listen to the voice of the people in all that they say +to you, for they have not rejected you, but they have rejected me, +THEN I SHOULD NOT REIGN OVER THEM. According to all the works which +they have done since the day; wherewith they brought them up out of +Egypt, even unto this day; wherewith they have forsaken me and served +other Gods; so do they also unto you. + +"Now therefore hearken unto their voice, howbeit, protest solemnly +unto them and show them the manner of the king that shall reign over +them," i.e., not of any particular king, but the general manner of +the kings of the earth, whom Israel was so eagerly copying after. +And notwithstanding the great distance of time and difference of +manners, the character is still in fashion. + +And Samuel told all the words of the Lord unto the people, that +asked of him a king. And he said, "This shall be the manner of the +king that shall reign over you: + +"He will take your sons and appoint them for himself for his +chariots, and to be his horsemen, and some shall run before his +chariots [this description agrees with the present mode of +impressing men] and he will appoint him captains over thousands and +captains over fifties, and will set them to ear his ground and to +reap his harvest, and to make his instruments of war, and +instruments of his chariots; and he will take your daughters to be +confectionaries and to be cooks and to be bakers [this describes the +expense and luxury as well as the oppression of kings] and he will +take your fields and your olive yards, even the best of them, and +give them to his servants; and he will take the tenth of your seed, +and of your vineyards, and give them to his officers and to his +servants [by which we see that bribery, corruption, and favoritism +are the standing vices of kings] and he will take the tenth of your +men servants, and your maid servants, and your goodliest young men +and your asses, and put them to his work; and he will take the tenth +of your sheep, ---and ye shall be his servants--- and ye shall cry +out in that day because of your king which ye shall have chosen, AND +THE LORD WILL NOT HEAR YOU IN THAT DAY." + +This accounts for the continuation of monarchy; neither do the +characters of the few good kings which have lived since, either +sanctify the title, or blot out the sinfulness of the origin; the +high encomium given of David takes no notice of him officially as a +king, but only as a man after God's own heart. + +Nevertheless the People refused to obey the voice of Samuel, and +they said, "Nay, but we will have a king over us, that we may be like +all the nations, and that our king may judge us, and go out before +us and fight our battles." + +Samuel continued to reason with them, but to no purpose; he set +before them their ingratitude, but all would not avail; and seeing +them fully bent on their folly, he cried out, "I will call unto the +Lord, and he shall send thunder and rain [which then was a +punishment, being the time of wheat harvest] that ye may perceive +and see that your wickedness is great which ye have done in the +sight of the Lord, IN ASKING YOU A KING." + +So Samuel called unto the Lord, and the Lord sent thunder and rain +that day, and all the people greatly feared the Lord and Samuel. And +all the people said unto Samuel, "Pray for thy servants unto the Lord +thy God that we die not, for WE HAVE ADDED UNTO OUR SINS THIS EVIL, +TO ASK A KING." + +These portions of scripture are direct and positive. They admit of +no equivocal construction. That the Almighty hath here entered his +protest against monarchial government is true, or the scripture is +false. And a man hath good reason to believe that there is as much +of kingcraft, as priestcraft in withholding the scripture from the +public in Popish countries. For monarchy in every instance is the +Popery of government. + + + + + +----------------------------------------------------------------- + + + + + + + + More detailed credits regarding the other contributors: + + + + + * ==================================================================== + * + * LUCRE -- Anonymous Electronic Tokens v1.8 + * Copyright (c) 1999, 2000, 2009 Ben Laurie. All rights reserved. + * + * OFFICIAL SITE: http://anoncvs.aldigital.co.uk/lucre/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * 4. The name "Lucre" must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 5. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR + * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + + + +/*************************************************************************** + +www.OpenSSL.org (Crypto library) + +(Open Transactions does not actually contain the OpenSSL code, but merely +links to it. Nevertheless, these credits are provided in respect of the people +who worked on the project.) + +OpenSSL is based on the excellent SSLeay library developed by Eric A. Young and Tim J. Hudson. +The OpenSSL toolkit is licensed under a Apache-style licence which basically means that you are +free to get and use it for commercial and non-commercial purposes. + +The current OpenSSL core team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Mark J. Cox mark@openssl.org mark@awe.com UK +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK +Ben Laurie ben@openssl.org ben@algroup.co.uk UK + +The current OpenSSL development team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location Key ID +Mark J. Cox mark@openssl.org mark@awe.com UK 49A563D9 +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE 26BB437D +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK F295C759 +Lutz Jänicke jaenicke@openssl.org lutz@lutz-jaenicke.de DE 9C58A66D +Nils Larsch nils@openssl.org nils@larsch.net DE +Ben Laurie ben@openssl.org ben@algroup.co.uk UK 2118CF83 +Richard Levitte levitte@openssl.org richard@levitte.org SE F709453B +Bodo Möller bodo@openssl.org bmoeller@acm.org DE 5A6A9B85 +Ulf Möller ulf@openssl.org mail@ulfm.de DE +Andy Polyakov appro@openssl.org appro@fy.chalmers.se SE +Geoff Thorpe geoff@openssl.org geoff@geoffthorpe.net QC + +OpenSSL Emeritae - old members now off doing other things (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Holger Reif holger@openssl.org holger@reif.net DE +Paul C. Sutton paul@openssl.org paul@awe.com UK + +*/ + + + +/********************************************************************* + + * easyzlib release 1.0 --- (Compression) + * + * Copyright (C) 2008 First Objective Software, Inc. (Used with + * permission.) + * + * This entire notice must be retained in this source code + * Redistributing this source code requires written permission + * This software is provided "as is", with no warranty. + * + * Latest fixes enhancements and documentation at www.firstobject.com + **********************************************************************/ + + + + +/*********************************************************************** + * ZLIB + * + * (Open Transactions does not actually contain the zlib code, but + * merely links to it via easyzlib. Nevertheless, these credits are + * provided in respect of the people who worked on the project.) + * + * + * 'zlib' general purpose compression library + * version 1.2.2, October 3rd, 2004 + * + * Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source + * distribution. + * + * Jean-loup Gailly jloup@gzip.org + * Mark Adler madler@alumni.caltech.edu + + ***********************************************************************/ + + + + +/* + * (PGP-to-OpenSSL Conversion) + * + * An implementation of conversion from PGP public key format to OpenSSL + * equivalent Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI http://www.idrix.fr + * Used with permission. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +// ------------------------------------------- + +/* + * STLplus (used for smart pointers) + * + * Author: Andy Rushton http://www.andyrushton.co.uk/ + * + * http://stlplus.sourceforge.net/ + * + * BSD-style license: + * http://stlplus.sourceforge.net/stlplus/docs/license.html + * + */ + +// ------------------------------------------- + +/* + * MESSAGE PACK (Used for packing data.) + * + * http://msgpack.org/ + * + * Copyright (C) 2008-2010 FURUHASHI Sadayuki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ------------------------------------------- + +/* + * PROTOCOL BUFFERS (Used for packing data.) + * + * http://protobuf.googlecode.com + * + * Copyright 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Code generated by the Protocol Buffer compiler is owned by the owner + * of the input file used when generating it. This code is not + * standalone and requires a support library to be linked with it. This + * support library is itself covered by the above license. + * + */ + +// ------------------------------------------- + +/* + * ZeroMQ (transport library.) + * + * http://www.zeromq.org/ + * + * ZeroMQ 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * ------------------------------------------------------ + * + * SPECIAL EXCEPTION GRANTED BY IMATIX + * + * As a special exception, iMatix gives you permission to link this library + * with independent modules to produce an executable, regardless of the + * license terms of these independent modules, and to copy and distribute + * the resulting executable under terms of your choice, provided that you + * also meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module which + * is not derived from or based on this library. If you modify this + * library, you must extend this exception to your version of the library. + * + * ------------------------------------------------------ + * + * Parts of the software are licensed under the MIT (X11) license + * as follows: + * + * Copyright (c) 2007-2010 Contributors as listed in AUTHORS + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +// ------------------------------------------- + + +/* (transport: OTMessage -> TCP -> SSL) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +// ------------------------------------------- + + +/* + * strlcpy and strlcat + * + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + + +/************************************************************************** + + irrXML --- (XML Parser) + +The irrXML license is based on the zlib license. Basically, this means you +can do with irrXML whatever you want: + +Copyright (C) 2002-2005 Nikolaus Gebhardt + +http://www.ambiera.com/irrxml/ + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +History + +As lots of references in this documentation and the source show, this xml +parser has originally been a part of the +Irrlicht Engine. But because +the parser has become very useful with the latest release, people asked for +a separate version of it, to be able to use it in non Irrlicht projects. +With irrXML 1.0, this has now been done. + +*/ + +// ------------------------------------------- + + + +/* + Simple Ini (Used for ini files.) + + Copyright (c) 2006-2008, Brodie Thiesfield + + The licence text below is the boilerplate "MIT Licence" used from: + http://www.opensource.org/licenses/mit-license.php + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +/* + * AnyOption 1.3 (Used for command-line options and config files.) + * + * kishan at hackorama dot com www.hackorama.com JULY 2001 + * + * With updates from Michael D Peters (mpeters at sandia.gov) + * and Boyan Asenov. + * + */ + + +// ------------------------------------------------------------------- + +/* + + C++ Big Integer Library + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, + waive my copyright to it, placing it in the public domain. The library + comes with absolutely no warranty. + + */ + + + + + +// ************************************************************************* + + + + +/* + It seems appropriate to mention a few other people who deserve mentioning. + + A moment of silence for "Jolly Good Fellow" Bernard von NotHaus, + the founder of NORFED who was recently (and wrongfully) convicted of + "domestic terrorism." + + For history, I will reproduce a few gloating FBI quotes: + + "Attempts to undermine the legitimate currency of this country + are simply a unique form of domestic terrorism." + ... + "We are determined to meet these threats through infiltration, + disruption, and dismantling of organizations which seek to challenge + the legitimacy of our democratic form of government." + ... + "While these forms of anti-government activities do not involve + violence, they are every bit as insidious and represent a clear and + present danger to the economic stability of this country." + + // ----------------------------------------------- + + Speaking of wrongful prosecution... + + Tip of the hat to Dr. Douglas Jackson for his sacrifices and + accomplishments. + May this software protect future innovators from persecution, in a + diversity of jurisdictions. And check out e-gold.com, as well as + goldmoney.com, igolder, pecunix, and all the other digital gold reserve + outfits. May they all soon be traded as a single basket currency using + this new software. + + // ----------------------------------------------- + + Thank you to David Chaum, for inventing digital cash in the first place. + + Kudos to David Wagner, and Ben Laurie, who brought us Lucre. + + Kudos to Ian Grigg for his many advancements in financial cryptography. + Check out his website at http://iang.org/ + + J. Orlin Grabbe and his writings have been inspirational. He will be + missed. His DMT as well as critiques of it were useful to me. + http://www.orlingrabbe.com/ + + Kudos to Phil Zimmermann for writing and releasing PGP. The man who put + power into the hands of the people. Many people in corrupt jurisdictions + now have PGP to thank for their lives. Let's do the same for their money. + + Bill St. Clair, whose Truledger was truly inspirational. Check out + Truledger at http://truledger.com/ + + Patrick Chkoreff, whose Loom is operational and is what showed me the + idea of separation of powers. Check out https://Loom.cc for more info. + + Andrew McMeikan's PKTP, which can be found here: http://pktp.co.cc/ + + Ryan Fugger's Ripple project, which will probably figure more into the + client development of OpenTransactions. http://ripple-project.org/ + + Jim Bell, of course. His story is partially the reason for this software. + I still don't understand why he was stink-bombing IRS offices instead of + writing code. But he definitely made his mark. + + Tim May for writing the Cyphernomicon. (Google it.) + + Robert A. Hettinga for his writings: http://www.philodox.com/ + + And of course SAMY, who wrote the famous MySpace worm, and who suggested + using two message digest algorithms XOR'd together in case one is ever + broken and needs to be swapped out. Thus the SAMY hash is named in his + honor, and utilizes WHIRLPOOL XOR'd with SHA-256. +*/ + + + + + +/************************************************************************** + + + ==================> OPEN TRANSACTIONS LICENSE <================== + + + * Components: + * Moneychanger..... A Java Client App..........LICENSE: GPLv3 + * OTLib............ A class library............LICENSE: LAGPLv3 + * OT-API........... A Client API...............LICENSE: LAGPLv3 + * testwallet....... A command-line client......LICENSE: LAGPLv3 + * OT-Server........ A Server Application.......LICENSE: AGPLv3 + * http://github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which was + * written by Vicky C (livewire_3001@yahoo.com) under contract. + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 section 7: + * This paragraph applies only to the LAGPLv3 components listed above. + * If you modify this Program, or any covered work, by linking or + * combining it with other code, such other code is not for that reason + * alone subject to any of the requirements of the GNU Affero GPL + * version 3. (This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to Open + * Transactions itself must be open source. Similar to LGPLv3, except + * it applies to software-as-a-service, not just distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries used by OT: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. The same is + * true for any other open source libraries included in this project: + * complete waiver from the AGPL is hereby granted to compile, link, + * and/or use them with Open Transactions, according to their own terms, + * as long as the rest of the Open Transactions terms remain respected, + * with regard to the Open Transactions code itself. + * + * Lucre License: + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. See Open-Transactions/OTLib/Lucre. + * The Laurie requirements are light, but if there is any problem with + * his license, simply remove the Lucre code. Although there are no other + * blind token algorithms in Open Transactions (yet. credlib is coming), + * the other functionality will continue to operate. + + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see: + . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . + +*/ + + + diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..2a75a7c94 --- /dev/null +++ b/Makefile @@ -0,0 +1,302 @@ + +# COMMENT: This is set up for Mac OS X, Linux, and FreeBSD. +# This makefile will build the entire project and all the assorted tools. +# +# For Mac and Linux, just type 'make'. For FreeBSD, type 'gmake'. +# +# RPC is the PREFERRED mode to run the software, since it uses ZMQ over +# http. 'make rpc' +# +# (Both of the above options will also build the API in C.) +# +# If you would like to build the API for python, ruby, perl5, or php5: +# +# make [python|ruby|perl5|php5] +# +# (gmake on FreeBSD) +# + + + +OT_PLATFORM := ___OT_UNKNOWN_PLATFORM___ + +# --------------------------------------------------------------------- + + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = FELLOW_TRAVELER=1 +else +FT_FLAGS = #empty +endif + + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += DSP=1 +endif + +# --------------------------------------------------------------------- + + + +OT_MAKE := make + + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +endif + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + + + +DYNAMIC_FLAG = # empty + + + +# The SSL libraries are now set in the section below, for various platforms. +# The Makefiles in the subfolders will only set those values (also by platform) +# in the case where they aren't already set. So you can set them here for the entire +# project :-) +# +# You can also override them, here or there, on the command line. + +# ------------------------------------- + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib + +EXECUTABLE_INSTALL_FOLDER = /usr/local/bin + +endif + + +# ------------------------------------- + +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +DYNAMIC_FLAG = DYNAMIC_OTLIB=1 +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) + +EXECUTABLE_INSTALL_FOLDER = /usr/local/bin + +endif + +# ------------------------------------- + + +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd + +OT_MAKE := gmake + +# No extra targets for now on this platform. Gotta fix those Makefiles first. + +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c + +EXECUTABLE_INSTALL_FOLDER = /usr/local/bin + +endif + +# ------------------------------------- + +OT_UTIL_PLATFORM_INCLUDEDIRS = -I../../openssl/include +OT_UTIL_PLATFORM_LIBDIRS = -L../../openssl + + +ifeq ($(DSP), 1) +PLATFORM_INCLUDEDIRS = -I../openssl/include +PLATFORM_LIBDIRS = -L../openssl +OT_SSL_INCLUDE_AND_LIBS = $(FT_FLAGS) PLATFORM_INCLUDEDIRS=$(PLATFORM_INCLUDEDIRS) PLATFORM_LIBDIRS=$(PLATFORM_LIBDIRS) OT_UTIL_PLATFORM_INCLUDEDIRS=$(OT_UTIL_PLATFORM_INCLUDEDIRS) OT_UTIL_PLATFORM_LIBDIRS=$(OT_UTIL_PLATFORM_LIBDIRS) SSL_INCLUDEDIRS=$(SSL_INCLUDEDIRS) SSL_LIBDIRS=$(SSL_LIBDIRS) +else +OT_SSL_INCLUDE_AND_LIBS = $(FT_FLAGS) SSL_INCLUDEDIRS=$(SSL_INCLUDEDIRS) SSL_LIBDIRS=$(SSL_LIBDIRS) +endif + +# ------------------------------------- + + + + +OT_MAKE_PLATFORM_INC_LIBS = $(OT_MAKE) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) + + +EXTRA_TARGETS1 += cd util/otcreatemint && $(OT_MAKE_PLATFORM_INC_LIBS) && cp ./createmint.exe ../../ot-sample-data/server_data/createmint.exe +EXTRA_TARGETS2 += cd util/signcontract && $(OT_MAKE_PLATFORM_INC_LIBS) && cp ./signcontract.exe ../../ot-sample-data/client_data/signcontract.exe +EXTRA_DEBUG_TARGETS1 += cd util/otcreatemint && $(OT_MAKE_PLATFORM_INC_LIBS) debug && cp ./createmint.debug ../../ot-sample-data/server_data/createmint.debug +EXTRA_DEBUG_TARGETS2 += cd util/signcontract && $(OT_MAKE_PLATFORM_INC_LIBS) debug && cp ./signcontract.debug ../../ot-sample-data/client_data/signcontract.debug +EXTRA_RPC_TARGETS1 += cd util/otcreatemint && $(OT_MAKE_PLATFORM_INC_LIBS) && cp ./createmint.exe ../../ot-sample-data/server_data/createmint.exe +EXTRA_RPC_TARGETS2 += cd util/signcontract && $(OT_MAKE_PLATFORM_INC_LIBS) && cp ./signcontract.exe ../../ot-sample-data/client_data/signcontract.exe +EXTRA_DEBUGRPC_TARGETS1 += cd util/otcreatemint && $(OT_MAKE_PLATFORM_INC_LIBS) debug && cp ./createmint.debug ../../ot-sample-data/server_data/createmint.debug +EXTRA_DEBUGRPC_TARGETS2 += cd util/signcontract && $(OT_MAKE_PLATFORM_INC_LIBS) debug && cp ./signcontract.debug ../../ot-sample-data/client_data/signcontract.debug +EXTRA_CLEAN_TARGETS1 += cd util/otcreatemint && $(OT_MAKE_PLATFORM_INC_LIBS) clean && rm -f ../../ot-sample-data/server_data/createmint.* +EXTRA_CLEAN_TARGETS2 += cd util/signcontract && $(OT_MAKE_PLATFORM_INC_LIBS) clean && rm -f ../../ot-sample-data/client_data/signcontract.* + + +# ------------------------------------- + +all: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +debug: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) debug + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ debug + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ debug + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c debug + $(EXTRA_DEBUGRPC_TARGETS1) + $(EXTRA_DEBUGRPC_TARGETS2) + +tcp: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=c + $(EXTRA_TARGETS1) + $(EXTRA_TARGETS2) + +debugtcp: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) debug + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) debug + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) debug + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=c debug + $(EXTRA_DEBUG_TARGETS1) + $(EXTRA_DEBUG_TARGETS2) + +c: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=java clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=ruby clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=python clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=perl5 clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=php5 clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +java: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=java clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=java + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +javadebug: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) debug + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ debug + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=java clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=java debug + $(EXTRA_DEBUG_TARGETS1) + $(EXTRA_DEBUG_TARGETS1) + +csharp: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=csharp clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=csharp + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +ruby: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=ruby clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=ruby + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +perl5: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=perl5 clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=perl5 + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +python: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=ruby clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=python clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=python + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +php5: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) $(DYNAMIC_FLAG) + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=php5 clean + cd testwallet && $(OT_MAKE) -f Makefile.API $(DYNAMIC_FLAG) PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) TRANSPORT=ZMQ LANGUAGE=php5 + $(EXTRA_RPC_TARGETS1) + $(EXTRA_RPC_TARGETS2) + +install: + mkdir -p $(EXECUTABLE_INSTALL_FOLDER) + rm -f $(EXECUTABLE_INSTALL_FOLDER)/ot_server && cp ./transaction/transaction.exe $(EXECUTABLE_INSTALL_FOLDER)/ot_server + rm -f $(EXECUTABLE_INSTALL_FOLDER)/ot && cp ./testwallet/testwallet.exe $(EXECUTABLE_INSTALL_FOLDER)/ot + mkdir ~/.ot && cp -r ./ot-sample-data/* ~/.ot && chown -R $(SUDO_USER) ~/.ot + +uninstall: + rm -f $(EXECUTABLE_INSTALL_FOLDER)/ot_server + rm -f $(EXECUTABLE_INSTALL_FOLDER)/ot + rm -f ~/$(SUDO_USER)_OT_BACKUP_2.tgz + touch ~/$(SUDO_USER)_OT_BACKUP.tgz + mv ~/$(SUDO_USER)_OT_BACKUP.tgz ~/$(SUDO_USER)_OT_BACKUP_2.tgz + tar -czvf ~/$(SUDO_USER)_OT_BACKUP.tgz ~/.ot + rm -rf ~/.ot + +clean: + cd OTLib && $(OT_MAKE_PLATFORM_INC_LIBS) clean + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) clean + cd transaction && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ clean + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=c clean + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=ruby clean + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=python clean + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=perl5 clean + cd testwallet && $(OT_MAKE) -f Makefile.API PLATFORM=$(OT_PLATFORM) $(OT_SSL_INCLUDE_AND_LIBS) LANGUAGE=php5 clean + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) clean + cd testwallet && $(OT_MAKE_PLATFORM_INC_LIBS) TRANSPORT=ZMQ clean + $(EXTRA_CLEAN_TARGETS1) + $(EXTRA_CLEAN_TARGETS2) + diff --git a/OTLib/Android.mk b/OTLib/Android.mk new file mode 100644 index 000000000..2cb5ce60f --- /dev/null +++ b/OTLib/Android.mk @@ -0,0 +1,40 @@ +# +# OTLib +# +# Open Transactions by Fellow Traveler +# +# This is the Open Transactions library itself, minus the API and socket code +# (those can be found in the OTAPI library, which must be linked with this one.) +# +# See copyright notice that came with this distribution. +# Distributed as open-source under the AGPL. + +OTLIB_PATH := $(call my-dir) + +# OpenSSL 0.9.8 +OPENSSL_MAKE := external/openssl/Android.mk +OPENSSL_DIR := external/openssl +OPENSSL_INCLUDE_DIR := external/openssl/include + +# OpenSSL 1.0.0a +#OPENSSL_MAKE := sources/openssl/Android.mk +#OPENSSL_DIR := sources/openssl +#OPENSSL_INCLUDE_DIR := sources/openssl/include + +include $(OPENSSL_MAKE) + +include $(CLEAR_VARS) + +LOCAL_PATH := $(OTLIB_PATH) + +LOCAL_MODULE := libOTLib + +LOCAL_C_INCLUDES += $(OPENSSL_DIR) $(OPENSSL_INCLUDE_DIR) $(LOCAL_PATH) $(LOCAL_PATH)/irrxml $(LOCAL_PATH)/Lucre + +LOCAL_SRC_FILES := easyzlib.c Lucre/bankimp.cpp irrxml/irrXML.cpp OTData.cpp OTString.cpp OTStringXML.cpp OTASCIIArmor.cpp OTContract.cpp OTWallet.cpp OTSignedFile.cpp OTPseudonym.cpp OTMint.cpp OTInstrument.cpp OTCheque.cpp OTPurse.cpp OTToken.cpp OTTransactionType.cpp OTItem.cpp OTBasket.cpp OTTransaction.cpp OTLedger.cpp OTAccount.cpp OTEnvelope.cpp OTAssetContract.cpp OTServerContract.cpp OTPayload.cpp OTMessage.cpp OTMessageBuffer.cpp OTIdentifier.cpp OTAsymmetricKey.cpp OTSignature.cpp OTDataCheck.cpp OTLog.cpp OTOffer.cpp OTAgreement.cpp OTTrackable.cpp OTCron.cpp OTCronItem.cpp OTTrade.cpp OTPaymentPlan.cpp OTMarket.cpp + +LOCAL_LDLIBS += -ldl -lz -llog + +LOCAL_STATIC_LIBRARIES := libssl libcrypto + +include $(BUILD_STATIC_LIBRARY) diff --git a/OTLib/Bitcoin.pb.cpp b/OTLib/Bitcoin.pb.cpp new file mode 100644 index 000000000..bb69d15e5 --- /dev/null +++ b/OTLib/Bitcoin.pb.cpp @@ -0,0 +1,2423 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "Bitcoin.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +namespace { + +const ::google::protobuf::Descriptor* BitcoinAcct_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + BitcoinAcct_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* BitcoinServer_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + BitcoinServer_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* RippleServer_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + RippleServer_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* LoomServer_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + LoomServer_InternalPB_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_Bitcoin_2eproto() { + protobuf_AddDesc_Bitcoin_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "Bitcoin.proto"); + GOOGLE_CHECK(file != NULL); + BitcoinAcct_InternalPB_descriptor_ = file->message_type(0); + static const int BitcoinAcct_InternalPB_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, acct_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, bitcoin_acct_name_), + }; + BitcoinAcct_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + BitcoinAcct_InternalPB_descriptor_, + BitcoinAcct_InternalPB::default_instance_, + BitcoinAcct_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinAcct_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(BitcoinAcct_InternalPB)); + BitcoinServer_InternalPB_descriptor_ = file->message_type(1); + static const int BitcoinServer_InternalPB_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, server_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, server_host_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, server_port_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, bitcoin_username_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, bitcoin_password_), + }; + BitcoinServer_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + BitcoinServer_InternalPB_descriptor_, + BitcoinServer_InternalPB::default_instance_, + BitcoinServer_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(BitcoinServer_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(BitcoinServer_InternalPB)); + RippleServer_InternalPB_descriptor_ = file->message_type(2); + static const int RippleServer_InternalPB_offsets_[9] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, server_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, server_host_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, server_port_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, ripple_username_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, ripple_password_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, namefield_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, passfield_id_), + }; + RippleServer_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + RippleServer_InternalPB_descriptor_, + RippleServer_InternalPB::default_instance_, + RippleServer_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RippleServer_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(RippleServer_InternalPB)); + LoomServer_InternalPB_descriptor_ = file->message_type(3); + static const int LoomServer_InternalPB_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, server_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, server_host_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, server_port_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, loom_username_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, namefield_id_), + }; + LoomServer_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + LoomServer_InternalPB_descriptor_, + LoomServer_InternalPB::default_instance_, + LoomServer_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LoomServer_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(LoomServer_InternalPB)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_Bitcoin_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + BitcoinAcct_InternalPB_descriptor_, &BitcoinAcct_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + BitcoinServer_InternalPB_descriptor_, &BitcoinServer_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + RippleServer_InternalPB_descriptor_, &RippleServer_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + LoomServer_InternalPB_descriptor_, &LoomServer_InternalPB::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_Bitcoin_2eproto() { + delete BitcoinAcct_InternalPB::default_instance_; + delete BitcoinAcct_InternalPB_reflection_; + delete BitcoinServer_InternalPB::default_instance_; + delete BitcoinServer_InternalPB_reflection_; + delete RippleServer_InternalPB::default_instance_; + delete RippleServer_InternalPB_reflection_; + delete LoomServer_InternalPB::default_instance_; + delete LoomServer_InternalPB_reflection_; +} + +void protobuf_AddDesc_Bitcoin_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\rBitcoin.proto\022\004OTDB\"j\n\026BitcoinAcct_Int" + "ernalPB\022\021\n\tgui_label\030\001 \001(\t\022\021\n\tserver_id\030" + "\002 \001(\t\022\017\n\007acct_id\030\003 \001(\t\022\031\n\021bitcoin_acct_n" + "ame\030\004 \001(\t\"\263\001\n\030BitcoinServer_InternalPB\022\021" + "\n\tgui_label\030\001 \001(\t\022\021\n\tserver_id\030\002 \001(\t\022\023\n\013" + "server_type\030\003 \001(\t\022\023\n\013server_host\030\004 \001(\t\022\023" + "\n\013server_port\030\005 \001(\t\022\030\n\020bitcoin_username\030" + "\006 \001(\t\022\030\n\020bitcoin_password\030\007 \001(\t\"\334\001\n\027Ripp" + "leServer_InternalPB\022\021\n\tgui_label\030\001 \001(\t\022\021" + "\n\tserver_id\030\002 \001(\t\022\023\n\013server_type\030\003 \001(\t\022\023" + "\n\013server_host\030\004 \001(\t\022\023\n\013server_port\030\005 \001(\t" + "\022\027\n\017ripple_username\030\006 \001(\t\022\027\n\017ripple_pass" + "word\030\007 \001(\t\022\024\n\014namefield_id\030\010 \001(\t\022\024\n\014pass" + "field_id\030\t \001(\t\"\251\001\n\025LoomServer_InternalPB" + "\022\021\n\tgui_label\030\001 \001(\t\022\021\n\tserver_id\030\002 \001(\t\022\023" + "\n\013server_type\030\003 \001(\t\022\023\n\013server_host\030\004 \001(\t" + "\022\023\n\013server_port\030\005 \001(\t\022\025\n\rloom_username\030\006" + " \001(\t\022\024\n\014namefield_id\030\007 \001(\t", 706); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "Bitcoin.proto", &protobuf_RegisterTypes); + BitcoinAcct_InternalPB::default_instance_ = new BitcoinAcct_InternalPB(); + BitcoinServer_InternalPB::default_instance_ = new BitcoinServer_InternalPB(); + RippleServer_InternalPB::default_instance_ = new RippleServer_InternalPB(); + LoomServer_InternalPB::default_instance_ = new LoomServer_InternalPB(); + BitcoinAcct_InternalPB::default_instance_->InitAsDefaultInstance(); + BitcoinServer_InternalPB::default_instance_->InitAsDefaultInstance(); + RippleServer_InternalPB::default_instance_->InitAsDefaultInstance(); + LoomServer_InternalPB::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_Bitcoin_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_Bitcoin_2eproto { + StaticDescriptorInitializer_Bitcoin_2eproto() { + protobuf_AddDesc_Bitcoin_2eproto(); + } +} static_descriptor_initializer_Bitcoin_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int BitcoinAcct_InternalPB::kGuiLabelFieldNumber; +const int BitcoinAcct_InternalPB::kServerIdFieldNumber; +const int BitcoinAcct_InternalPB::kAcctIdFieldNumber; +const int BitcoinAcct_InternalPB::kBitcoinAcctNameFieldNumber; +#endif // !_MSC_VER + +BitcoinAcct_InternalPB::BitcoinAcct_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void BitcoinAcct_InternalPB::InitAsDefaultInstance() { +} + +BitcoinAcct_InternalPB::BitcoinAcct_InternalPB(const BitcoinAcct_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void BitcoinAcct_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + bitcoin_acct_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +BitcoinAcct_InternalPB::~BitcoinAcct_InternalPB() { + SharedDtor(); +} + +void BitcoinAcct_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + delete acct_id_; + } + if (bitcoin_acct_name_ != &::google::protobuf::internal::kEmptyString) { + delete bitcoin_acct_name_; + } + if (this != default_instance_) { + } +} + +void BitcoinAcct_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* BitcoinAcct_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return BitcoinAcct_InternalPB_descriptor_; +} + +const BitcoinAcct_InternalPB& BitcoinAcct_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Bitcoin_2eproto(); return *default_instance_; +} + +BitcoinAcct_InternalPB* BitcoinAcct_InternalPB::default_instance_ = NULL; + +BitcoinAcct_InternalPB* BitcoinAcct_InternalPB::New() const { + return new BitcoinAcct_InternalPB; +} + +void BitcoinAcct_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_acct_id()) { + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + acct_id_->clear(); + } + } + if (has_bitcoin_acct_name()) { + if (bitcoin_acct_name_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool BitcoinAcct_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_acct_id; + break; + } + + // optional string acct_id = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_acct_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_acct_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_bitcoin_acct_name; + break; + } + + // optional string bitcoin_acct_name = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bitcoin_acct_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_bitcoin_acct_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_acct_name().data(), this->bitcoin_acct_name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void BitcoinAcct_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + // optional string acct_id = 3; + if (has_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->acct_id(), output); + } + + // optional string bitcoin_acct_name = 4; + if (has_bitcoin_acct_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_acct_name().data(), this->bitcoin_acct_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->bitcoin_acct_name(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* BitcoinAcct_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + // optional string acct_id = 3; + if (has_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->acct_id(), target); + } + + // optional string bitcoin_acct_name = 4; + if (has_bitcoin_acct_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_acct_name().data(), this->bitcoin_acct_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->bitcoin_acct_name(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int BitcoinAcct_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string acct_id = 3; + if (has_acct_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->acct_id()); + } + + // optional string bitcoin_acct_name = 4; + if (has_bitcoin_acct_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->bitcoin_acct_name()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void BitcoinAcct_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const BitcoinAcct_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void BitcoinAcct_InternalPB::MergeFrom(const BitcoinAcct_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_acct_id()) { + set_acct_id(from.acct_id()); + } + if (from.has_bitcoin_acct_name()) { + set_bitcoin_acct_name(from.bitcoin_acct_name()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void BitcoinAcct_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void BitcoinAcct_InternalPB::CopyFrom(const BitcoinAcct_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool BitcoinAcct_InternalPB::IsInitialized() const { + + return true; +} + +void BitcoinAcct_InternalPB::Swap(BitcoinAcct_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_id_, other->server_id_); + std::swap(acct_id_, other->acct_id_); + std::swap(bitcoin_acct_name_, other->bitcoin_acct_name_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata BitcoinAcct_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = BitcoinAcct_InternalPB_descriptor_; + metadata.reflection = BitcoinAcct_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int BitcoinServer_InternalPB::kGuiLabelFieldNumber; +const int BitcoinServer_InternalPB::kServerIdFieldNumber; +const int BitcoinServer_InternalPB::kServerTypeFieldNumber; +const int BitcoinServer_InternalPB::kServerHostFieldNumber; +const int BitcoinServer_InternalPB::kServerPortFieldNumber; +const int BitcoinServer_InternalPB::kBitcoinUsernameFieldNumber; +const int BitcoinServer_InternalPB::kBitcoinPasswordFieldNumber; +#endif // !_MSC_VER + +BitcoinServer_InternalPB::BitcoinServer_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void BitcoinServer_InternalPB::InitAsDefaultInstance() { +} + +BitcoinServer_InternalPB::BitcoinServer_InternalPB(const BitcoinServer_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void BitcoinServer_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + bitcoin_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + bitcoin_password_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +BitcoinServer_InternalPB::~BitcoinServer_InternalPB() { + SharedDtor(); +} + +void BitcoinServer_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + delete server_type_; + } + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + delete server_host_; + } + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + delete server_port_; + } + if (bitcoin_username_ != &::google::protobuf::internal::kEmptyString) { + delete bitcoin_username_; + } + if (bitcoin_password_ != &::google::protobuf::internal::kEmptyString) { + delete bitcoin_password_; + } + if (this != default_instance_) { + } +} + +void BitcoinServer_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* BitcoinServer_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return BitcoinServer_InternalPB_descriptor_; +} + +const BitcoinServer_InternalPB& BitcoinServer_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Bitcoin_2eproto(); return *default_instance_; +} + +BitcoinServer_InternalPB* BitcoinServer_InternalPB::default_instance_ = NULL; + +BitcoinServer_InternalPB* BitcoinServer_InternalPB::New() const { + return new BitcoinServer_InternalPB; +} + +void BitcoinServer_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_server_type()) { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + } + if (has_server_host()) { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + } + if (has_server_port()) { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + } + if (has_bitcoin_username()) { + if (bitcoin_username_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_username_->clear(); + } + } + if (has_bitcoin_password()) { + if (bitcoin_password_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_password_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool BitcoinServer_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_server_type; + break; + } + + // optional string server_type = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_server_host; + break; + } + + // optional string server_host = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_host: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_host())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_server_port; + break; + } + + // optional string server_port = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_port: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_port())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_bitcoin_username; + break; + } + + // optional string bitcoin_username = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bitcoin_username: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_bitcoin_username())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_username().data(), this->bitcoin_username().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_bitcoin_password; + break; + } + + // optional string bitcoin_password = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bitcoin_password: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_bitcoin_password())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_password().data(), this->bitcoin_password().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void BitcoinServer_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->server_type(), output); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->server_host(), output); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->server_port(), output); + } + + // optional string bitcoin_username = 6; + if (has_bitcoin_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_username().data(), this->bitcoin_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->bitcoin_username(), output); + } + + // optional string bitcoin_password = 7; + if (has_bitcoin_password()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_password().data(), this->bitcoin_password().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->bitcoin_password(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* BitcoinServer_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->server_type(), target); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->server_host(), target); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->server_port(), target); + } + + // optional string bitcoin_username = 6; + if (has_bitcoin_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_username().data(), this->bitcoin_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->bitcoin_username(), target); + } + + // optional string bitcoin_password = 7; + if (has_bitcoin_password()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->bitcoin_password().data(), this->bitcoin_password().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->bitcoin_password(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int BitcoinServer_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string server_type = 3; + if (has_server_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_type()); + } + + // optional string server_host = 4; + if (has_server_host()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_host()); + } + + // optional string server_port = 5; + if (has_server_port()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_port()); + } + + // optional string bitcoin_username = 6; + if (has_bitcoin_username()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->bitcoin_username()); + } + + // optional string bitcoin_password = 7; + if (has_bitcoin_password()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->bitcoin_password()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void BitcoinServer_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const BitcoinServer_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void BitcoinServer_InternalPB::MergeFrom(const BitcoinServer_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_server_type()) { + set_server_type(from.server_type()); + } + if (from.has_server_host()) { + set_server_host(from.server_host()); + } + if (from.has_server_port()) { + set_server_port(from.server_port()); + } + if (from.has_bitcoin_username()) { + set_bitcoin_username(from.bitcoin_username()); + } + if (from.has_bitcoin_password()) { + set_bitcoin_password(from.bitcoin_password()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void BitcoinServer_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void BitcoinServer_InternalPB::CopyFrom(const BitcoinServer_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool BitcoinServer_InternalPB::IsInitialized() const { + + return true; +} + +void BitcoinServer_InternalPB::Swap(BitcoinServer_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_id_, other->server_id_); + std::swap(server_type_, other->server_type_); + std::swap(server_host_, other->server_host_); + std::swap(server_port_, other->server_port_); + std::swap(bitcoin_username_, other->bitcoin_username_); + std::swap(bitcoin_password_, other->bitcoin_password_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata BitcoinServer_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = BitcoinServer_InternalPB_descriptor_; + metadata.reflection = BitcoinServer_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int RippleServer_InternalPB::kGuiLabelFieldNumber; +const int RippleServer_InternalPB::kServerIdFieldNumber; +const int RippleServer_InternalPB::kServerTypeFieldNumber; +const int RippleServer_InternalPB::kServerHostFieldNumber; +const int RippleServer_InternalPB::kServerPortFieldNumber; +const int RippleServer_InternalPB::kRippleUsernameFieldNumber; +const int RippleServer_InternalPB::kRipplePasswordFieldNumber; +const int RippleServer_InternalPB::kNamefieldIdFieldNumber; +const int RippleServer_InternalPB::kPassfieldIdFieldNumber; +#endif // !_MSC_VER + +RippleServer_InternalPB::RippleServer_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void RippleServer_InternalPB::InitAsDefaultInstance() { +} + +RippleServer_InternalPB::RippleServer_InternalPB(const RippleServer_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void RippleServer_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ripple_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ripple_password_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + namefield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + passfield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +RippleServer_InternalPB::~RippleServer_InternalPB() { + SharedDtor(); +} + +void RippleServer_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + delete server_type_; + } + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + delete server_host_; + } + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + delete server_port_; + } + if (ripple_username_ != &::google::protobuf::internal::kEmptyString) { + delete ripple_username_; + } + if (ripple_password_ != &::google::protobuf::internal::kEmptyString) { + delete ripple_password_; + } + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + delete namefield_id_; + } + if (passfield_id_ != &::google::protobuf::internal::kEmptyString) { + delete passfield_id_; + } + if (this != default_instance_) { + } +} + +void RippleServer_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* RippleServer_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return RippleServer_InternalPB_descriptor_; +} + +const RippleServer_InternalPB& RippleServer_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Bitcoin_2eproto(); return *default_instance_; +} + +RippleServer_InternalPB* RippleServer_InternalPB::default_instance_ = NULL; + +RippleServer_InternalPB* RippleServer_InternalPB::New() const { + return new RippleServer_InternalPB; +} + +void RippleServer_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_server_type()) { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + } + if (has_server_host()) { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + } + if (has_server_port()) { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + } + if (has_ripple_username()) { + if (ripple_username_ != &::google::protobuf::internal::kEmptyString) { + ripple_username_->clear(); + } + } + if (has_ripple_password()) { + if (ripple_password_ != &::google::protobuf::internal::kEmptyString) { + ripple_password_->clear(); + } + } + if (has_namefield_id()) { + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + namefield_id_->clear(); + } + } + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (has_passfield_id()) { + if (passfield_id_ != &::google::protobuf::internal::kEmptyString) { + passfield_id_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool RippleServer_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_server_type; + break; + } + + // optional string server_type = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_server_host; + break; + } + + // optional string server_host = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_host: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_host())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_server_port; + break; + } + + // optional string server_port = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_port: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_port())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_ripple_username; + break; + } + + // optional string ripple_username = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_ripple_username: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_ripple_username())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_username().data(), this->ripple_username().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_ripple_password; + break; + } + + // optional string ripple_password = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_ripple_password: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_ripple_password())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_password().data(), this->ripple_password().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_namefield_id; + break; + } + + // optional string namefield_id = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_namefield_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_namefield_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_passfield_id; + break; + } + + // optional string passfield_id = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_passfield_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_passfield_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->passfield_id().data(), this->passfield_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void RippleServer_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->server_type(), output); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->server_host(), output); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->server_port(), output); + } + + // optional string ripple_username = 6; + if (has_ripple_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_username().data(), this->ripple_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->ripple_username(), output); + } + + // optional string ripple_password = 7; + if (has_ripple_password()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_password().data(), this->ripple_password().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->ripple_password(), output); + } + + // optional string namefield_id = 8; + if (has_namefield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->namefield_id(), output); + } + + // optional string passfield_id = 9; + if (has_passfield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->passfield_id().data(), this->passfield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 9, this->passfield_id(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* RippleServer_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->server_type(), target); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->server_host(), target); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->server_port(), target); + } + + // optional string ripple_username = 6; + if (has_ripple_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_username().data(), this->ripple_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->ripple_username(), target); + } + + // optional string ripple_password = 7; + if (has_ripple_password()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->ripple_password().data(), this->ripple_password().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->ripple_password(), target); + } + + // optional string namefield_id = 8; + if (has_namefield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->namefield_id(), target); + } + + // optional string passfield_id = 9; + if (has_passfield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->passfield_id().data(), this->passfield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 9, this->passfield_id(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int RippleServer_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string server_type = 3; + if (has_server_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_type()); + } + + // optional string server_host = 4; + if (has_server_host()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_host()); + } + + // optional string server_port = 5; + if (has_server_port()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_port()); + } + + // optional string ripple_username = 6; + if (has_ripple_username()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->ripple_username()); + } + + // optional string ripple_password = 7; + if (has_ripple_password()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->ripple_password()); + } + + // optional string namefield_id = 8; + if (has_namefield_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->namefield_id()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional string passfield_id = 9; + if (has_passfield_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->passfield_id()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void RippleServer_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const RippleServer_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void RippleServer_InternalPB::MergeFrom(const RippleServer_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_server_type()) { + set_server_type(from.server_type()); + } + if (from.has_server_host()) { + set_server_host(from.server_host()); + } + if (from.has_server_port()) { + set_server_port(from.server_port()); + } + if (from.has_ripple_username()) { + set_ripple_username(from.ripple_username()); + } + if (from.has_ripple_password()) { + set_ripple_password(from.ripple_password()); + } + if (from.has_namefield_id()) { + set_namefield_id(from.namefield_id()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_passfield_id()) { + set_passfield_id(from.passfield_id()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void RippleServer_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void RippleServer_InternalPB::CopyFrom(const RippleServer_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool RippleServer_InternalPB::IsInitialized() const { + + return true; +} + +void RippleServer_InternalPB::Swap(RippleServer_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_id_, other->server_id_); + std::swap(server_type_, other->server_type_); + std::swap(server_host_, other->server_host_); + std::swap(server_port_, other->server_port_); + std::swap(ripple_username_, other->ripple_username_); + std::swap(ripple_password_, other->ripple_password_); + std::swap(namefield_id_, other->namefield_id_); + std::swap(passfield_id_, other->passfield_id_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata RippleServer_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = RippleServer_InternalPB_descriptor_; + metadata.reflection = RippleServer_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int LoomServer_InternalPB::kGuiLabelFieldNumber; +const int LoomServer_InternalPB::kServerIdFieldNumber; +const int LoomServer_InternalPB::kServerTypeFieldNumber; +const int LoomServer_InternalPB::kServerHostFieldNumber; +const int LoomServer_InternalPB::kServerPortFieldNumber; +const int LoomServer_InternalPB::kLoomUsernameFieldNumber; +const int LoomServer_InternalPB::kNamefieldIdFieldNumber; +#endif // !_MSC_VER + +LoomServer_InternalPB::LoomServer_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void LoomServer_InternalPB::InitAsDefaultInstance() { +} + +LoomServer_InternalPB::LoomServer_InternalPB(const LoomServer_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void LoomServer_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + loom_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + namefield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LoomServer_InternalPB::~LoomServer_InternalPB() { + SharedDtor(); +} + +void LoomServer_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + delete server_type_; + } + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + delete server_host_; + } + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + delete server_port_; + } + if (loom_username_ != &::google::protobuf::internal::kEmptyString) { + delete loom_username_; + } + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + delete namefield_id_; + } + if (this != default_instance_) { + } +} + +void LoomServer_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LoomServer_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return LoomServer_InternalPB_descriptor_; +} + +const LoomServer_InternalPB& LoomServer_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Bitcoin_2eproto(); return *default_instance_; +} + +LoomServer_InternalPB* LoomServer_InternalPB::default_instance_ = NULL; + +LoomServer_InternalPB* LoomServer_InternalPB::New() const { + return new LoomServer_InternalPB; +} + +void LoomServer_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_server_type()) { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + } + if (has_server_host()) { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + } + if (has_server_port()) { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + } + if (has_loom_username()) { + if (loom_username_ != &::google::protobuf::internal::kEmptyString) { + loom_username_->clear(); + } + } + if (has_namefield_id()) { + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + namefield_id_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool LoomServer_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_server_type; + break; + } + + // optional string server_type = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_server_host; + break; + } + + // optional string server_host = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_host: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_host())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_server_port; + break; + } + + // optional string server_port = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_port: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_port())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_loom_username; + break; + } + + // optional string loom_username = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_loom_username: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_loom_username())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->loom_username().data(), this->loom_username().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_namefield_id; + break; + } + + // optional string namefield_id = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_namefield_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_namefield_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void LoomServer_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->server_type(), output); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->server_host(), output); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->server_port(), output); + } + + // optional string loom_username = 6; + if (has_loom_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->loom_username().data(), this->loom_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->loom_username(), output); + } + + // optional string namefield_id = 7; + if (has_namefield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->namefield_id(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* LoomServer_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + // optional string server_type = 3; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->server_type(), target); + } + + // optional string server_host = 4; + if (has_server_host()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_host().data(), this->server_host().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->server_host(), target); + } + + // optional string server_port = 5; + if (has_server_port()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_port().data(), this->server_port().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->server_port(), target); + } + + // optional string loom_username = 6; + if (has_loom_username()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->loom_username().data(), this->loom_username().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->loom_username(), target); + } + + // optional string namefield_id = 7; + if (has_namefield_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->namefield_id().data(), this->namefield_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->namefield_id(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int LoomServer_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string server_type = 3; + if (has_server_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_type()); + } + + // optional string server_host = 4; + if (has_server_host()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_host()); + } + + // optional string server_port = 5; + if (has_server_port()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_port()); + } + + // optional string loom_username = 6; + if (has_loom_username()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->loom_username()); + } + + // optional string namefield_id = 7; + if (has_namefield_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->namefield_id()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void LoomServer_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const LoomServer_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void LoomServer_InternalPB::MergeFrom(const LoomServer_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_server_type()) { + set_server_type(from.server_type()); + } + if (from.has_server_host()) { + set_server_host(from.server_host()); + } + if (from.has_server_port()) { + set_server_port(from.server_port()); + } + if (from.has_loom_username()) { + set_loom_username(from.loom_username()); + } + if (from.has_namefield_id()) { + set_namefield_id(from.namefield_id()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void LoomServer_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void LoomServer_InternalPB::CopyFrom(const LoomServer_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool LoomServer_InternalPB::IsInitialized() const { + + return true; +} + +void LoomServer_InternalPB::Swap(LoomServer_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_id_, other->server_id_); + std::swap(server_type_, other->server_type_); + std::swap(server_host_, other->server_host_); + std::swap(server_port_, other->server_port_); + std::swap(loom_username_, other->loom_username_); + std::swap(namefield_id_, other->namefield_id_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata LoomServer_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = LoomServer_InternalPB_descriptor_; + metadata.reflection = LoomServer_InternalPB_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +// @@protoc_insertion_point(global_scope) diff --git a/OTLib/Bitcoin.pb.h b/OTLib/Bitcoin.pb.h new file mode 100644 index 000000000..88a4845d8 --- /dev/null +++ b/OTLib/Bitcoin.pb.h @@ -0,0 +1,2307 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Bitcoin.proto + +#ifndef PROTOBUF_Bitcoin_2eproto__INCLUDED +#define PROTOBUF_Bitcoin_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_Bitcoin_2eproto(); +void protobuf_AssignDesc_Bitcoin_2eproto(); +void protobuf_ShutdownFile_Bitcoin_2eproto(); + +class BitcoinAcct_InternalPB; +class BitcoinServer_InternalPB; +class RippleServer_InternalPB; +class LoomServer_InternalPB; + +// =================================================================== + +class BitcoinAcct_InternalPB : public ::google::protobuf::Message { + public: + BitcoinAcct_InternalPB(); + virtual ~BitcoinAcct_InternalPB(); + + BitcoinAcct_InternalPB(const BitcoinAcct_InternalPB& from); + + inline BitcoinAcct_InternalPB& operator=(const BitcoinAcct_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const BitcoinAcct_InternalPB& default_instance(); + + void Swap(BitcoinAcct_InternalPB* other); + + // implements Message ---------------------------------------------- + + BitcoinAcct_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const BitcoinAcct_InternalPB& from); + void MergeFrom(const BitcoinAcct_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string acct_id = 3; + inline bool has_acct_id() const; + inline void clear_acct_id(); + static const int kAcctIdFieldNumber = 3; + inline const ::std::string& acct_id() const; + inline void set_acct_id(const ::std::string& value); + inline void set_acct_id(const char* value); + inline void set_acct_id(const char* value, size_t size); + inline ::std::string* mutable_acct_id(); + inline ::std::string* release_acct_id(); + + // optional string bitcoin_acct_name = 4; + inline bool has_bitcoin_acct_name() const; + inline void clear_bitcoin_acct_name(); + static const int kBitcoinAcctNameFieldNumber = 4; + inline const ::std::string& bitcoin_acct_name() const; + inline void set_bitcoin_acct_name(const ::std::string& value); + inline void set_bitcoin_acct_name(const char* value); + inline void set_bitcoin_acct_name(const char* value, size_t size); + inline ::std::string* mutable_bitcoin_acct_name(); + inline ::std::string* release_bitcoin_acct_name(); + + // @@protoc_insertion_point(class_scope:OTDB.BitcoinAcct_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_acct_id(); + inline void clear_has_acct_id(); + inline void set_has_bitcoin_acct_name(); + inline void clear_has_bitcoin_acct_name(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_id_; + ::std::string* acct_id_; + ::std::string* bitcoin_acct_name_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; + + friend void protobuf_AddDesc_Bitcoin_2eproto(); + friend void protobuf_AssignDesc_Bitcoin_2eproto(); + friend void protobuf_ShutdownFile_Bitcoin_2eproto(); + + void InitAsDefaultInstance(); + static BitcoinAcct_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class BitcoinServer_InternalPB : public ::google::protobuf::Message { + public: + BitcoinServer_InternalPB(); + virtual ~BitcoinServer_InternalPB(); + + BitcoinServer_InternalPB(const BitcoinServer_InternalPB& from); + + inline BitcoinServer_InternalPB& operator=(const BitcoinServer_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const BitcoinServer_InternalPB& default_instance(); + + void Swap(BitcoinServer_InternalPB* other); + + // implements Message ---------------------------------------------- + + BitcoinServer_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const BitcoinServer_InternalPB& from); + void MergeFrom(const BitcoinServer_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string server_type = 3; + inline bool has_server_type() const; + inline void clear_server_type(); + static const int kServerTypeFieldNumber = 3; + inline const ::std::string& server_type() const; + inline void set_server_type(const ::std::string& value); + inline void set_server_type(const char* value); + inline void set_server_type(const char* value, size_t size); + inline ::std::string* mutable_server_type(); + inline ::std::string* release_server_type(); + + // optional string server_host = 4; + inline bool has_server_host() const; + inline void clear_server_host(); + static const int kServerHostFieldNumber = 4; + inline const ::std::string& server_host() const; + inline void set_server_host(const ::std::string& value); + inline void set_server_host(const char* value); + inline void set_server_host(const char* value, size_t size); + inline ::std::string* mutable_server_host(); + inline ::std::string* release_server_host(); + + // optional string server_port = 5; + inline bool has_server_port() const; + inline void clear_server_port(); + static const int kServerPortFieldNumber = 5; + inline const ::std::string& server_port() const; + inline void set_server_port(const ::std::string& value); + inline void set_server_port(const char* value); + inline void set_server_port(const char* value, size_t size); + inline ::std::string* mutable_server_port(); + inline ::std::string* release_server_port(); + + // optional string bitcoin_username = 6; + inline bool has_bitcoin_username() const; + inline void clear_bitcoin_username(); + static const int kBitcoinUsernameFieldNumber = 6; + inline const ::std::string& bitcoin_username() const; + inline void set_bitcoin_username(const ::std::string& value); + inline void set_bitcoin_username(const char* value); + inline void set_bitcoin_username(const char* value, size_t size); + inline ::std::string* mutable_bitcoin_username(); + inline ::std::string* release_bitcoin_username(); + + // optional string bitcoin_password = 7; + inline bool has_bitcoin_password() const; + inline void clear_bitcoin_password(); + static const int kBitcoinPasswordFieldNumber = 7; + inline const ::std::string& bitcoin_password() const; + inline void set_bitcoin_password(const ::std::string& value); + inline void set_bitcoin_password(const char* value); + inline void set_bitcoin_password(const char* value, size_t size); + inline ::std::string* mutable_bitcoin_password(); + inline ::std::string* release_bitcoin_password(); + + // @@protoc_insertion_point(class_scope:OTDB.BitcoinServer_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_server_type(); + inline void clear_has_server_type(); + inline void set_has_server_host(); + inline void clear_has_server_host(); + inline void set_has_server_port(); + inline void clear_has_server_port(); + inline void set_has_bitcoin_username(); + inline void clear_has_bitcoin_username(); + inline void set_has_bitcoin_password(); + inline void clear_has_bitcoin_password(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_id_; + ::std::string* server_type_; + ::std::string* server_host_; + ::std::string* server_port_; + ::std::string* bitcoin_username_; + ::std::string* bitcoin_password_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + friend void protobuf_AddDesc_Bitcoin_2eproto(); + friend void protobuf_AssignDesc_Bitcoin_2eproto(); + friend void protobuf_ShutdownFile_Bitcoin_2eproto(); + + void InitAsDefaultInstance(); + static BitcoinServer_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class RippleServer_InternalPB : public ::google::protobuf::Message { + public: + RippleServer_InternalPB(); + virtual ~RippleServer_InternalPB(); + + RippleServer_InternalPB(const RippleServer_InternalPB& from); + + inline RippleServer_InternalPB& operator=(const RippleServer_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const RippleServer_InternalPB& default_instance(); + + void Swap(RippleServer_InternalPB* other); + + // implements Message ---------------------------------------------- + + RippleServer_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const RippleServer_InternalPB& from); + void MergeFrom(const RippleServer_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string server_type = 3; + inline bool has_server_type() const; + inline void clear_server_type(); + static const int kServerTypeFieldNumber = 3; + inline const ::std::string& server_type() const; + inline void set_server_type(const ::std::string& value); + inline void set_server_type(const char* value); + inline void set_server_type(const char* value, size_t size); + inline ::std::string* mutable_server_type(); + inline ::std::string* release_server_type(); + + // optional string server_host = 4; + inline bool has_server_host() const; + inline void clear_server_host(); + static const int kServerHostFieldNumber = 4; + inline const ::std::string& server_host() const; + inline void set_server_host(const ::std::string& value); + inline void set_server_host(const char* value); + inline void set_server_host(const char* value, size_t size); + inline ::std::string* mutable_server_host(); + inline ::std::string* release_server_host(); + + // optional string server_port = 5; + inline bool has_server_port() const; + inline void clear_server_port(); + static const int kServerPortFieldNumber = 5; + inline const ::std::string& server_port() const; + inline void set_server_port(const ::std::string& value); + inline void set_server_port(const char* value); + inline void set_server_port(const char* value, size_t size); + inline ::std::string* mutable_server_port(); + inline ::std::string* release_server_port(); + + // optional string ripple_username = 6; + inline bool has_ripple_username() const; + inline void clear_ripple_username(); + static const int kRippleUsernameFieldNumber = 6; + inline const ::std::string& ripple_username() const; + inline void set_ripple_username(const ::std::string& value); + inline void set_ripple_username(const char* value); + inline void set_ripple_username(const char* value, size_t size); + inline ::std::string* mutable_ripple_username(); + inline ::std::string* release_ripple_username(); + + // optional string ripple_password = 7; + inline bool has_ripple_password() const; + inline void clear_ripple_password(); + static const int kRipplePasswordFieldNumber = 7; + inline const ::std::string& ripple_password() const; + inline void set_ripple_password(const ::std::string& value); + inline void set_ripple_password(const char* value); + inline void set_ripple_password(const char* value, size_t size); + inline ::std::string* mutable_ripple_password(); + inline ::std::string* release_ripple_password(); + + // optional string namefield_id = 8; + inline bool has_namefield_id() const; + inline void clear_namefield_id(); + static const int kNamefieldIdFieldNumber = 8; + inline const ::std::string& namefield_id() const; + inline void set_namefield_id(const ::std::string& value); + inline void set_namefield_id(const char* value); + inline void set_namefield_id(const char* value, size_t size); + inline ::std::string* mutable_namefield_id(); + inline ::std::string* release_namefield_id(); + + // optional string passfield_id = 9; + inline bool has_passfield_id() const; + inline void clear_passfield_id(); + static const int kPassfieldIdFieldNumber = 9; + inline const ::std::string& passfield_id() const; + inline void set_passfield_id(const ::std::string& value); + inline void set_passfield_id(const char* value); + inline void set_passfield_id(const char* value, size_t size); + inline ::std::string* mutable_passfield_id(); + inline ::std::string* release_passfield_id(); + + // @@protoc_insertion_point(class_scope:OTDB.RippleServer_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_server_type(); + inline void clear_has_server_type(); + inline void set_has_server_host(); + inline void clear_has_server_host(); + inline void set_has_server_port(); + inline void clear_has_server_port(); + inline void set_has_ripple_username(); + inline void clear_has_ripple_username(); + inline void set_has_ripple_password(); + inline void clear_has_ripple_password(); + inline void set_has_namefield_id(); + inline void clear_has_namefield_id(); + inline void set_has_passfield_id(); + inline void clear_has_passfield_id(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_id_; + ::std::string* server_type_; + ::std::string* server_host_; + ::std::string* server_port_; + ::std::string* ripple_username_; + ::std::string* ripple_password_; + ::std::string* namefield_id_; + ::std::string* passfield_id_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32]; + + friend void protobuf_AddDesc_Bitcoin_2eproto(); + friend void protobuf_AssignDesc_Bitcoin_2eproto(); + friend void protobuf_ShutdownFile_Bitcoin_2eproto(); + + void InitAsDefaultInstance(); + static RippleServer_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class LoomServer_InternalPB : public ::google::protobuf::Message { + public: + LoomServer_InternalPB(); + virtual ~LoomServer_InternalPB(); + + LoomServer_InternalPB(const LoomServer_InternalPB& from); + + inline LoomServer_InternalPB& operator=(const LoomServer_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const LoomServer_InternalPB& default_instance(); + + void Swap(LoomServer_InternalPB* other); + + // implements Message ---------------------------------------------- + + LoomServer_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const LoomServer_InternalPB& from); + void MergeFrom(const LoomServer_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string server_type = 3; + inline bool has_server_type() const; + inline void clear_server_type(); + static const int kServerTypeFieldNumber = 3; + inline const ::std::string& server_type() const; + inline void set_server_type(const ::std::string& value); + inline void set_server_type(const char* value); + inline void set_server_type(const char* value, size_t size); + inline ::std::string* mutable_server_type(); + inline ::std::string* release_server_type(); + + // optional string server_host = 4; + inline bool has_server_host() const; + inline void clear_server_host(); + static const int kServerHostFieldNumber = 4; + inline const ::std::string& server_host() const; + inline void set_server_host(const ::std::string& value); + inline void set_server_host(const char* value); + inline void set_server_host(const char* value, size_t size); + inline ::std::string* mutable_server_host(); + inline ::std::string* release_server_host(); + + // optional string server_port = 5; + inline bool has_server_port() const; + inline void clear_server_port(); + static const int kServerPortFieldNumber = 5; + inline const ::std::string& server_port() const; + inline void set_server_port(const ::std::string& value); + inline void set_server_port(const char* value); + inline void set_server_port(const char* value, size_t size); + inline ::std::string* mutable_server_port(); + inline ::std::string* release_server_port(); + + // optional string loom_username = 6; + inline bool has_loom_username() const; + inline void clear_loom_username(); + static const int kLoomUsernameFieldNumber = 6; + inline const ::std::string& loom_username() const; + inline void set_loom_username(const ::std::string& value); + inline void set_loom_username(const char* value); + inline void set_loom_username(const char* value, size_t size); + inline ::std::string* mutable_loom_username(); + inline ::std::string* release_loom_username(); + + // optional string namefield_id = 7; + inline bool has_namefield_id() const; + inline void clear_namefield_id(); + static const int kNamefieldIdFieldNumber = 7; + inline const ::std::string& namefield_id() const; + inline void set_namefield_id(const ::std::string& value); + inline void set_namefield_id(const char* value); + inline void set_namefield_id(const char* value, size_t size); + inline ::std::string* mutable_namefield_id(); + inline ::std::string* release_namefield_id(); + + // @@protoc_insertion_point(class_scope:OTDB.LoomServer_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_server_type(); + inline void clear_has_server_type(); + inline void set_has_server_host(); + inline void clear_has_server_host(); + inline void set_has_server_port(); + inline void clear_has_server_port(); + inline void set_has_loom_username(); + inline void clear_has_loom_username(); + inline void set_has_namefield_id(); + inline void clear_has_namefield_id(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_id_; + ::std::string* server_type_; + ::std::string* server_host_; + ::std::string* server_port_; + ::std::string* loom_username_; + ::std::string* namefield_id_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + friend void protobuf_AddDesc_Bitcoin_2eproto(); + friend void protobuf_AssignDesc_Bitcoin_2eproto(); + friend void protobuf_ShutdownFile_Bitcoin_2eproto(); + + void InitAsDefaultInstance(); + static LoomServer_InternalPB* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// BitcoinAcct_InternalPB + +// optional string gui_label = 1; +inline bool BitcoinAcct_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void BitcoinAcct_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void BitcoinAcct_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void BitcoinAcct_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& BitcoinAcct_InternalPB::gui_label() const { + return *gui_label_; +} +inline void BitcoinAcct_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinAcct_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* BitcoinAcct_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool BitcoinAcct_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void BitcoinAcct_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void BitcoinAcct_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void BitcoinAcct_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& BitcoinAcct_InternalPB::server_id() const { + return *server_id_; +} +inline void BitcoinAcct_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinAcct_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* BitcoinAcct_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string acct_id = 3; +inline bool BitcoinAcct_InternalPB::has_acct_id() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void BitcoinAcct_InternalPB::set_has_acct_id() { + _has_bits_[0] |= 0x00000004u; +} +inline void BitcoinAcct_InternalPB::clear_has_acct_id() { + _has_bits_[0] &= ~0x00000004u; +} +inline void BitcoinAcct_InternalPB::clear_acct_id() { + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + acct_id_->clear(); + } + clear_has_acct_id(); +} +inline const ::std::string& BitcoinAcct_InternalPB::acct_id() const { + return *acct_id_; +} +inline void BitcoinAcct_InternalPB::set_acct_id(const ::std::string& value) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_acct_id(const char* value) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_acct_id(const char* value, size_t size) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinAcct_InternalPB::mutable_acct_id() { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + return acct_id_; +} +inline ::std::string* BitcoinAcct_InternalPB::release_acct_id() { + clear_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = acct_id_; + acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string bitcoin_acct_name = 4; +inline bool BitcoinAcct_InternalPB::has_bitcoin_acct_name() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void BitcoinAcct_InternalPB::set_has_bitcoin_acct_name() { + _has_bits_[0] |= 0x00000008u; +} +inline void BitcoinAcct_InternalPB::clear_has_bitcoin_acct_name() { + _has_bits_[0] &= ~0x00000008u; +} +inline void BitcoinAcct_InternalPB::clear_bitcoin_acct_name() { + if (bitcoin_acct_name_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_->clear(); + } + clear_has_bitcoin_acct_name(); +} +inline const ::std::string& BitcoinAcct_InternalPB::bitcoin_acct_name() const { + return *bitcoin_acct_name_; +} +inline void BitcoinAcct_InternalPB::set_bitcoin_acct_name(const ::std::string& value) { + set_has_bitcoin_acct_name(); + if (bitcoin_acct_name_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_ = new ::std::string; + } + bitcoin_acct_name_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_bitcoin_acct_name(const char* value) { + set_has_bitcoin_acct_name(); + if (bitcoin_acct_name_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_ = new ::std::string; + } + bitcoin_acct_name_->assign(value); +} +inline void BitcoinAcct_InternalPB::set_bitcoin_acct_name(const char* value, size_t size) { + set_has_bitcoin_acct_name(); + if (bitcoin_acct_name_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_ = new ::std::string; + } + bitcoin_acct_name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinAcct_InternalPB::mutable_bitcoin_acct_name() { + set_has_bitcoin_acct_name(); + if (bitcoin_acct_name_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_acct_name_ = new ::std::string; + } + return bitcoin_acct_name_; +} +inline ::std::string* BitcoinAcct_InternalPB::release_bitcoin_acct_name() { + clear_has_bitcoin_acct_name(); + if (bitcoin_acct_name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = bitcoin_acct_name_; + bitcoin_acct_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// BitcoinServer_InternalPB + +// optional string gui_label = 1; +inline bool BitcoinServer_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void BitcoinServer_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void BitcoinServer_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& BitcoinServer_InternalPB::gui_label() const { + return *gui_label_; +} +inline void BitcoinServer_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void BitcoinServer_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void BitcoinServer_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* BitcoinServer_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool BitcoinServer_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void BitcoinServer_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void BitcoinServer_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& BitcoinServer_InternalPB::server_id() const { + return *server_id_; +} +inline void BitcoinServer_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* BitcoinServer_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_type = 3; +inline bool BitcoinServer_InternalPB::has_server_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_server_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void BitcoinServer_InternalPB::clear_has_server_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void BitcoinServer_InternalPB::clear_server_type() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + clear_has_server_type(); +} +inline const ::std::string& BitcoinServer_InternalPB::server_type() const { + return *server_type_; +} +inline void BitcoinServer_InternalPB::set_server_type(const ::std::string& value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_type(const char* value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_type(const char* value, size_t size) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_server_type() { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + return server_type_; +} +inline ::std::string* BitcoinServer_InternalPB::release_server_type() { + clear_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_type_; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_host = 4; +inline bool BitcoinServer_InternalPB::has_server_host() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_server_host() { + _has_bits_[0] |= 0x00000008u; +} +inline void BitcoinServer_InternalPB::clear_has_server_host() { + _has_bits_[0] &= ~0x00000008u; +} +inline void BitcoinServer_InternalPB::clear_server_host() { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + clear_has_server_host(); +} +inline const ::std::string& BitcoinServer_InternalPB::server_host() const { + return *server_host_; +} +inline void BitcoinServer_InternalPB::set_server_host(const ::std::string& value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_host(const char* value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_host(const char* value, size_t size) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_server_host() { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + return server_host_; +} +inline ::std::string* BitcoinServer_InternalPB::release_server_host() { + clear_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_host_; + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_port = 5; +inline bool BitcoinServer_InternalPB::has_server_port() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_server_port() { + _has_bits_[0] |= 0x00000010u; +} +inline void BitcoinServer_InternalPB::clear_has_server_port() { + _has_bits_[0] &= ~0x00000010u; +} +inline void BitcoinServer_InternalPB::clear_server_port() { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + clear_has_server_port(); +} +inline const ::std::string& BitcoinServer_InternalPB::server_port() const { + return *server_port_; +} +inline void BitcoinServer_InternalPB::set_server_port(const ::std::string& value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_port(const char* value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void BitcoinServer_InternalPB::set_server_port(const char* value, size_t size) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_server_port() { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + return server_port_; +} +inline ::std::string* BitcoinServer_InternalPB::release_server_port() { + clear_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_port_; + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string bitcoin_username = 6; +inline bool BitcoinServer_InternalPB::has_bitcoin_username() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_bitcoin_username() { + _has_bits_[0] |= 0x00000020u; +} +inline void BitcoinServer_InternalPB::clear_has_bitcoin_username() { + _has_bits_[0] &= ~0x00000020u; +} +inline void BitcoinServer_InternalPB::clear_bitcoin_username() { + if (bitcoin_username_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_username_->clear(); + } + clear_has_bitcoin_username(); +} +inline const ::std::string& BitcoinServer_InternalPB::bitcoin_username() const { + return *bitcoin_username_; +} +inline void BitcoinServer_InternalPB::set_bitcoin_username(const ::std::string& value) { + set_has_bitcoin_username(); + if (bitcoin_username_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_username_ = new ::std::string; + } + bitcoin_username_->assign(value); +} +inline void BitcoinServer_InternalPB::set_bitcoin_username(const char* value) { + set_has_bitcoin_username(); + if (bitcoin_username_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_username_ = new ::std::string; + } + bitcoin_username_->assign(value); +} +inline void BitcoinServer_InternalPB::set_bitcoin_username(const char* value, size_t size) { + set_has_bitcoin_username(); + if (bitcoin_username_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_username_ = new ::std::string; + } + bitcoin_username_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_bitcoin_username() { + set_has_bitcoin_username(); + if (bitcoin_username_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_username_ = new ::std::string; + } + return bitcoin_username_; +} +inline ::std::string* BitcoinServer_InternalPB::release_bitcoin_username() { + clear_has_bitcoin_username(); + if (bitcoin_username_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = bitcoin_username_; + bitcoin_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string bitcoin_password = 7; +inline bool BitcoinServer_InternalPB::has_bitcoin_password() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void BitcoinServer_InternalPB::set_has_bitcoin_password() { + _has_bits_[0] |= 0x00000040u; +} +inline void BitcoinServer_InternalPB::clear_has_bitcoin_password() { + _has_bits_[0] &= ~0x00000040u; +} +inline void BitcoinServer_InternalPB::clear_bitcoin_password() { + if (bitcoin_password_ != &::google::protobuf::internal::kEmptyString) { + bitcoin_password_->clear(); + } + clear_has_bitcoin_password(); +} +inline const ::std::string& BitcoinServer_InternalPB::bitcoin_password() const { + return *bitcoin_password_; +} +inline void BitcoinServer_InternalPB::set_bitcoin_password(const ::std::string& value) { + set_has_bitcoin_password(); + if (bitcoin_password_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_password_ = new ::std::string; + } + bitcoin_password_->assign(value); +} +inline void BitcoinServer_InternalPB::set_bitcoin_password(const char* value) { + set_has_bitcoin_password(); + if (bitcoin_password_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_password_ = new ::std::string; + } + bitcoin_password_->assign(value); +} +inline void BitcoinServer_InternalPB::set_bitcoin_password(const char* value, size_t size) { + set_has_bitcoin_password(); + if (bitcoin_password_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_password_ = new ::std::string; + } + bitcoin_password_->assign(reinterpret_cast(value), size); +} +inline ::std::string* BitcoinServer_InternalPB::mutable_bitcoin_password() { + set_has_bitcoin_password(); + if (bitcoin_password_ == &::google::protobuf::internal::kEmptyString) { + bitcoin_password_ = new ::std::string; + } + return bitcoin_password_; +} +inline ::std::string* BitcoinServer_InternalPB::release_bitcoin_password() { + clear_has_bitcoin_password(); + if (bitcoin_password_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = bitcoin_password_; + bitcoin_password_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// RippleServer_InternalPB + +// optional string gui_label = 1; +inline bool RippleServer_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void RippleServer_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void RippleServer_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void RippleServer_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& RippleServer_InternalPB::gui_label() const { + return *gui_label_; +} +inline void RippleServer_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void RippleServer_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void RippleServer_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* RippleServer_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool RippleServer_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void RippleServer_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void RippleServer_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void RippleServer_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& RippleServer_InternalPB::server_id() const { + return *server_id_; +} +inline void RippleServer_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void RippleServer_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void RippleServer_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* RippleServer_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_type = 3; +inline bool RippleServer_InternalPB::has_server_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void RippleServer_InternalPB::set_has_server_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void RippleServer_InternalPB::clear_has_server_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void RippleServer_InternalPB::clear_server_type() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + clear_has_server_type(); +} +inline const ::std::string& RippleServer_InternalPB::server_type() const { + return *server_type_; +} +inline void RippleServer_InternalPB::set_server_type(const ::std::string& value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void RippleServer_InternalPB::set_server_type(const char* value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void RippleServer_InternalPB::set_server_type(const char* value, size_t size) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_server_type() { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + return server_type_; +} +inline ::std::string* RippleServer_InternalPB::release_server_type() { + clear_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_type_; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_host = 4; +inline bool RippleServer_InternalPB::has_server_host() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void RippleServer_InternalPB::set_has_server_host() { + _has_bits_[0] |= 0x00000008u; +} +inline void RippleServer_InternalPB::clear_has_server_host() { + _has_bits_[0] &= ~0x00000008u; +} +inline void RippleServer_InternalPB::clear_server_host() { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + clear_has_server_host(); +} +inline const ::std::string& RippleServer_InternalPB::server_host() const { + return *server_host_; +} +inline void RippleServer_InternalPB::set_server_host(const ::std::string& value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void RippleServer_InternalPB::set_server_host(const char* value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void RippleServer_InternalPB::set_server_host(const char* value, size_t size) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_server_host() { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + return server_host_; +} +inline ::std::string* RippleServer_InternalPB::release_server_host() { + clear_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_host_; + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_port = 5; +inline bool RippleServer_InternalPB::has_server_port() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void RippleServer_InternalPB::set_has_server_port() { + _has_bits_[0] |= 0x00000010u; +} +inline void RippleServer_InternalPB::clear_has_server_port() { + _has_bits_[0] &= ~0x00000010u; +} +inline void RippleServer_InternalPB::clear_server_port() { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + clear_has_server_port(); +} +inline const ::std::string& RippleServer_InternalPB::server_port() const { + return *server_port_; +} +inline void RippleServer_InternalPB::set_server_port(const ::std::string& value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void RippleServer_InternalPB::set_server_port(const char* value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void RippleServer_InternalPB::set_server_port(const char* value, size_t size) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_server_port() { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + return server_port_; +} +inline ::std::string* RippleServer_InternalPB::release_server_port() { + clear_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_port_; + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string ripple_username = 6; +inline bool RippleServer_InternalPB::has_ripple_username() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void RippleServer_InternalPB::set_has_ripple_username() { + _has_bits_[0] |= 0x00000020u; +} +inline void RippleServer_InternalPB::clear_has_ripple_username() { + _has_bits_[0] &= ~0x00000020u; +} +inline void RippleServer_InternalPB::clear_ripple_username() { + if (ripple_username_ != &::google::protobuf::internal::kEmptyString) { + ripple_username_->clear(); + } + clear_has_ripple_username(); +} +inline const ::std::string& RippleServer_InternalPB::ripple_username() const { + return *ripple_username_; +} +inline void RippleServer_InternalPB::set_ripple_username(const ::std::string& value) { + set_has_ripple_username(); + if (ripple_username_ == &::google::protobuf::internal::kEmptyString) { + ripple_username_ = new ::std::string; + } + ripple_username_->assign(value); +} +inline void RippleServer_InternalPB::set_ripple_username(const char* value) { + set_has_ripple_username(); + if (ripple_username_ == &::google::protobuf::internal::kEmptyString) { + ripple_username_ = new ::std::string; + } + ripple_username_->assign(value); +} +inline void RippleServer_InternalPB::set_ripple_username(const char* value, size_t size) { + set_has_ripple_username(); + if (ripple_username_ == &::google::protobuf::internal::kEmptyString) { + ripple_username_ = new ::std::string; + } + ripple_username_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_ripple_username() { + set_has_ripple_username(); + if (ripple_username_ == &::google::protobuf::internal::kEmptyString) { + ripple_username_ = new ::std::string; + } + return ripple_username_; +} +inline ::std::string* RippleServer_InternalPB::release_ripple_username() { + clear_has_ripple_username(); + if (ripple_username_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = ripple_username_; + ripple_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string ripple_password = 7; +inline bool RippleServer_InternalPB::has_ripple_password() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void RippleServer_InternalPB::set_has_ripple_password() { + _has_bits_[0] |= 0x00000040u; +} +inline void RippleServer_InternalPB::clear_has_ripple_password() { + _has_bits_[0] &= ~0x00000040u; +} +inline void RippleServer_InternalPB::clear_ripple_password() { + if (ripple_password_ != &::google::protobuf::internal::kEmptyString) { + ripple_password_->clear(); + } + clear_has_ripple_password(); +} +inline const ::std::string& RippleServer_InternalPB::ripple_password() const { + return *ripple_password_; +} +inline void RippleServer_InternalPB::set_ripple_password(const ::std::string& value) { + set_has_ripple_password(); + if (ripple_password_ == &::google::protobuf::internal::kEmptyString) { + ripple_password_ = new ::std::string; + } + ripple_password_->assign(value); +} +inline void RippleServer_InternalPB::set_ripple_password(const char* value) { + set_has_ripple_password(); + if (ripple_password_ == &::google::protobuf::internal::kEmptyString) { + ripple_password_ = new ::std::string; + } + ripple_password_->assign(value); +} +inline void RippleServer_InternalPB::set_ripple_password(const char* value, size_t size) { + set_has_ripple_password(); + if (ripple_password_ == &::google::protobuf::internal::kEmptyString) { + ripple_password_ = new ::std::string; + } + ripple_password_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_ripple_password() { + set_has_ripple_password(); + if (ripple_password_ == &::google::protobuf::internal::kEmptyString) { + ripple_password_ = new ::std::string; + } + return ripple_password_; +} +inline ::std::string* RippleServer_InternalPB::release_ripple_password() { + clear_has_ripple_password(); + if (ripple_password_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = ripple_password_; + ripple_password_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string namefield_id = 8; +inline bool RippleServer_InternalPB::has_namefield_id() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void RippleServer_InternalPB::set_has_namefield_id() { + _has_bits_[0] |= 0x00000080u; +} +inline void RippleServer_InternalPB::clear_has_namefield_id() { + _has_bits_[0] &= ~0x00000080u; +} +inline void RippleServer_InternalPB::clear_namefield_id() { + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + namefield_id_->clear(); + } + clear_has_namefield_id(); +} +inline const ::std::string& RippleServer_InternalPB::namefield_id() const { + return *namefield_id_; +} +inline void RippleServer_InternalPB::set_namefield_id(const ::std::string& value) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(value); +} +inline void RippleServer_InternalPB::set_namefield_id(const char* value) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(value); +} +inline void RippleServer_InternalPB::set_namefield_id(const char* value, size_t size) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_namefield_id() { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + return namefield_id_; +} +inline ::std::string* RippleServer_InternalPB::release_namefield_id() { + clear_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = namefield_id_; + namefield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string passfield_id = 9; +inline bool RippleServer_InternalPB::has_passfield_id() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void RippleServer_InternalPB::set_has_passfield_id() { + _has_bits_[0] |= 0x00000100u; +} +inline void RippleServer_InternalPB::clear_has_passfield_id() { + _has_bits_[0] &= ~0x00000100u; +} +inline void RippleServer_InternalPB::clear_passfield_id() { + if (passfield_id_ != &::google::protobuf::internal::kEmptyString) { + passfield_id_->clear(); + } + clear_has_passfield_id(); +} +inline const ::std::string& RippleServer_InternalPB::passfield_id() const { + return *passfield_id_; +} +inline void RippleServer_InternalPB::set_passfield_id(const ::std::string& value) { + set_has_passfield_id(); + if (passfield_id_ == &::google::protobuf::internal::kEmptyString) { + passfield_id_ = new ::std::string; + } + passfield_id_->assign(value); +} +inline void RippleServer_InternalPB::set_passfield_id(const char* value) { + set_has_passfield_id(); + if (passfield_id_ == &::google::protobuf::internal::kEmptyString) { + passfield_id_ = new ::std::string; + } + passfield_id_->assign(value); +} +inline void RippleServer_InternalPB::set_passfield_id(const char* value, size_t size) { + set_has_passfield_id(); + if (passfield_id_ == &::google::protobuf::internal::kEmptyString) { + passfield_id_ = new ::std::string; + } + passfield_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* RippleServer_InternalPB::mutable_passfield_id() { + set_has_passfield_id(); + if (passfield_id_ == &::google::protobuf::internal::kEmptyString) { + passfield_id_ = new ::std::string; + } + return passfield_id_; +} +inline ::std::string* RippleServer_InternalPB::release_passfield_id() { + clear_has_passfield_id(); + if (passfield_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = passfield_id_; + passfield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// LoomServer_InternalPB + +// optional string gui_label = 1; +inline bool LoomServer_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LoomServer_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void LoomServer_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void LoomServer_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& LoomServer_InternalPB::gui_label() const { + return *gui_label_; +} +inline void LoomServer_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void LoomServer_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void LoomServer_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* LoomServer_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool LoomServer_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void LoomServer_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void LoomServer_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void LoomServer_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& LoomServer_InternalPB::server_id() const { + return *server_id_; +} +inline void LoomServer_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void LoomServer_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void LoomServer_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* LoomServer_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_type = 3; +inline bool LoomServer_InternalPB::has_server_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void LoomServer_InternalPB::set_has_server_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void LoomServer_InternalPB::clear_has_server_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void LoomServer_InternalPB::clear_server_type() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + clear_has_server_type(); +} +inline const ::std::string& LoomServer_InternalPB::server_type() const { + return *server_type_; +} +inline void LoomServer_InternalPB::set_server_type(const ::std::string& value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void LoomServer_InternalPB::set_server_type(const char* value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void LoomServer_InternalPB::set_server_type(const char* value, size_t size) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_server_type() { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + return server_type_; +} +inline ::std::string* LoomServer_InternalPB::release_server_type() { + clear_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_type_; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_host = 4; +inline bool LoomServer_InternalPB::has_server_host() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void LoomServer_InternalPB::set_has_server_host() { + _has_bits_[0] |= 0x00000008u; +} +inline void LoomServer_InternalPB::clear_has_server_host() { + _has_bits_[0] &= ~0x00000008u; +} +inline void LoomServer_InternalPB::clear_server_host() { + if (server_host_ != &::google::protobuf::internal::kEmptyString) { + server_host_->clear(); + } + clear_has_server_host(); +} +inline const ::std::string& LoomServer_InternalPB::server_host() const { + return *server_host_; +} +inline void LoomServer_InternalPB::set_server_host(const ::std::string& value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void LoomServer_InternalPB::set_server_host(const char* value) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(value); +} +inline void LoomServer_InternalPB::set_server_host(const char* value, size_t size) { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + server_host_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_server_host() { + set_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + server_host_ = new ::std::string; + } + return server_host_; +} +inline ::std::string* LoomServer_InternalPB::release_server_host() { + clear_has_server_host(); + if (server_host_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_host_; + server_host_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_port = 5; +inline bool LoomServer_InternalPB::has_server_port() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void LoomServer_InternalPB::set_has_server_port() { + _has_bits_[0] |= 0x00000010u; +} +inline void LoomServer_InternalPB::clear_has_server_port() { + _has_bits_[0] &= ~0x00000010u; +} +inline void LoomServer_InternalPB::clear_server_port() { + if (server_port_ != &::google::protobuf::internal::kEmptyString) { + server_port_->clear(); + } + clear_has_server_port(); +} +inline const ::std::string& LoomServer_InternalPB::server_port() const { + return *server_port_; +} +inline void LoomServer_InternalPB::set_server_port(const ::std::string& value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void LoomServer_InternalPB::set_server_port(const char* value) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(value); +} +inline void LoomServer_InternalPB::set_server_port(const char* value, size_t size) { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + server_port_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_server_port() { + set_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + server_port_ = new ::std::string; + } + return server_port_; +} +inline ::std::string* LoomServer_InternalPB::release_server_port() { + clear_has_server_port(); + if (server_port_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_port_; + server_port_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string loom_username = 6; +inline bool LoomServer_InternalPB::has_loom_username() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void LoomServer_InternalPB::set_has_loom_username() { + _has_bits_[0] |= 0x00000020u; +} +inline void LoomServer_InternalPB::clear_has_loom_username() { + _has_bits_[0] &= ~0x00000020u; +} +inline void LoomServer_InternalPB::clear_loom_username() { + if (loom_username_ != &::google::protobuf::internal::kEmptyString) { + loom_username_->clear(); + } + clear_has_loom_username(); +} +inline const ::std::string& LoomServer_InternalPB::loom_username() const { + return *loom_username_; +} +inline void LoomServer_InternalPB::set_loom_username(const ::std::string& value) { + set_has_loom_username(); + if (loom_username_ == &::google::protobuf::internal::kEmptyString) { + loom_username_ = new ::std::string; + } + loom_username_->assign(value); +} +inline void LoomServer_InternalPB::set_loom_username(const char* value) { + set_has_loom_username(); + if (loom_username_ == &::google::protobuf::internal::kEmptyString) { + loom_username_ = new ::std::string; + } + loom_username_->assign(value); +} +inline void LoomServer_InternalPB::set_loom_username(const char* value, size_t size) { + set_has_loom_username(); + if (loom_username_ == &::google::protobuf::internal::kEmptyString) { + loom_username_ = new ::std::string; + } + loom_username_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_loom_username() { + set_has_loom_username(); + if (loom_username_ == &::google::protobuf::internal::kEmptyString) { + loom_username_ = new ::std::string; + } + return loom_username_; +} +inline ::std::string* LoomServer_InternalPB::release_loom_username() { + clear_has_loom_username(); + if (loom_username_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = loom_username_; + loom_username_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string namefield_id = 7; +inline bool LoomServer_InternalPB::has_namefield_id() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void LoomServer_InternalPB::set_has_namefield_id() { + _has_bits_[0] |= 0x00000040u; +} +inline void LoomServer_InternalPB::clear_has_namefield_id() { + _has_bits_[0] &= ~0x00000040u; +} +inline void LoomServer_InternalPB::clear_namefield_id() { + if (namefield_id_ != &::google::protobuf::internal::kEmptyString) { + namefield_id_->clear(); + } + clear_has_namefield_id(); +} +inline const ::std::string& LoomServer_InternalPB::namefield_id() const { + return *namefield_id_; +} +inline void LoomServer_InternalPB::set_namefield_id(const ::std::string& value) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(value); +} +inline void LoomServer_InternalPB::set_namefield_id(const char* value) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(value); +} +inline void LoomServer_InternalPB::set_namefield_id(const char* value, size_t size) { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + namefield_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* LoomServer_InternalPB::mutable_namefield_id() { + set_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + namefield_id_ = new ::std::string; + } + return namefield_id_; +} +inline ::std::string* LoomServer_InternalPB::release_namefield_id() { + clear_has_namefield_id(); + if (namefield_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = namefield_id_; + namefield_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_Bitcoin_2eproto__INCLUDED diff --git a/OTLib/Bitcoin.proto b/OTLib/Bitcoin.proto new file mode 100644 index 000000000..aa3476bfa --- /dev/null +++ b/OTLib/Bitcoin.proto @@ -0,0 +1,43 @@ +package OTDB; + +message BitcoinAcct_InternalPB { + optional string gui_label = 1; + optional string server_id = 2; + optional string acct_id = 3; + optional string bitcoin_acct_name = 4; +} + +message BitcoinServer_InternalPB { + optional string gui_label = 1; + optional string server_id = 2; + optional string server_type = 3; + optional string server_host = 4; + optional string server_port = 5; + optional string bitcoin_username = 6; + optional string bitcoin_password = 7; +} + +message RippleServer_InternalPB { + optional string gui_label = 1; + optional string server_id = 2; + optional string server_type = 3; + optional string server_host = 4; + optional string server_port = 5; + optional string ripple_username = 6; + optional string ripple_password = 7; + optional string namefield_id = 8; + optional string passfield_id = 9; +} + + +message LoomServer_InternalPB { + optional string gui_label = 1; + optional string server_id = 2; + optional string server_type = 3; + optional string server_host = 4; + optional string server_port = 5; + optional string loom_username = 6; + optional string namefield_id = 7; +} + + diff --git a/OTLib/Generics.pb.cpp b/OTLib/Generics.pb.cpp new file mode 100644 index 000000000..b88da57db --- /dev/null +++ b/OTLib/Generics.pb.cpp @@ -0,0 +1,1098 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "Generics.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +namespace { + +const ::google::protobuf::Descriptor* String_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + String_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* KeyValue_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + KeyValue_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* StringMap_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + StringMap_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* Blob_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Blob_InternalPB_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_Generics_2eproto() { + protobuf_AddDesc_Generics_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "Generics.proto"); + GOOGLE_CHECK(file != NULL); + String_InternalPB_descriptor_ = file->message_type(0); + static const int String_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(String_InternalPB, value_), + }; + String_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + String_InternalPB_descriptor_, + String_InternalPB::default_instance_, + String_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(String_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(String_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(String_InternalPB)); + KeyValue_InternalPB_descriptor_ = file->message_type(1); + static const int KeyValue_InternalPB_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(KeyValue_InternalPB, key_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(KeyValue_InternalPB, value_), + }; + KeyValue_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + KeyValue_InternalPB_descriptor_, + KeyValue_InternalPB::default_instance_, + KeyValue_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(KeyValue_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(KeyValue_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(KeyValue_InternalPB)); + StringMap_InternalPB_descriptor_ = file->message_type(2); + static const int StringMap_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringMap_InternalPB, node_), + }; + StringMap_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + StringMap_InternalPB_descriptor_, + StringMap_InternalPB::default_instance_, + StringMap_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringMap_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(StringMap_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(StringMap_InternalPB)); + Blob_InternalPB_descriptor_ = file->message_type(3); + static const int Blob_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Blob_InternalPB, value_), + }; + Blob_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Blob_InternalPB_descriptor_, + Blob_InternalPB::default_instance_, + Blob_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Blob_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Blob_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Blob_InternalPB)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_Generics_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + String_InternalPB_descriptor_, &String_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + KeyValue_InternalPB_descriptor_, &KeyValue_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + StringMap_InternalPB_descriptor_, &StringMap_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Blob_InternalPB_descriptor_, &Blob_InternalPB::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_Generics_2eproto() { + delete String_InternalPB::default_instance_; + delete String_InternalPB_reflection_; + delete KeyValue_InternalPB::default_instance_; + delete KeyValue_InternalPB_reflection_; + delete StringMap_InternalPB::default_instance_; + delete StringMap_InternalPB_reflection_; + delete Blob_InternalPB::default_instance_; + delete Blob_InternalPB_reflection_; +} + +void protobuf_AddDesc_Generics_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\016Generics.proto\022\004OTDB\"\"\n\021String_Interna" + "lPB\022\r\n\005value\030\001 \001(\t\"1\n\023KeyValue_InternalP" + "B\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"\?\n\024StringM" + "ap_InternalPB\022\'\n\004node\030\001 \003(\0132\031.OTDB.KeyVa" + "lue_InternalPB\" \n\017Blob_InternalPB\022\r\n\005val" + "ue\030\001 \001(\014", 208); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "Generics.proto", &protobuf_RegisterTypes); + String_InternalPB::default_instance_ = new String_InternalPB(); + KeyValue_InternalPB::default_instance_ = new KeyValue_InternalPB(); + StringMap_InternalPB::default_instance_ = new StringMap_InternalPB(); + Blob_InternalPB::default_instance_ = new Blob_InternalPB(); + String_InternalPB::default_instance_->InitAsDefaultInstance(); + KeyValue_InternalPB::default_instance_->InitAsDefaultInstance(); + StringMap_InternalPB::default_instance_->InitAsDefaultInstance(); + Blob_InternalPB::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_Generics_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_Generics_2eproto { + StaticDescriptorInitializer_Generics_2eproto() { + protobuf_AddDesc_Generics_2eproto(); + } +} static_descriptor_initializer_Generics_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int String_InternalPB::kValueFieldNumber; +#endif // !_MSC_VER + +String_InternalPB::String_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void String_InternalPB::InitAsDefaultInstance() { +} + +String_InternalPB::String_InternalPB(const String_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void String_InternalPB::SharedCtor() { + _cached_size_ = 0; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +String_InternalPB::~String_InternalPB() { + SharedDtor(); +} + +void String_InternalPB::SharedDtor() { + if (value_ != &::google::protobuf::internal::kEmptyString) { + delete value_; + } + if (this != default_instance_) { + } +} + +void String_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* String_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return String_InternalPB_descriptor_; +} + +const String_InternalPB& String_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Generics_2eproto(); return *default_instance_; +} + +String_InternalPB* String_InternalPB::default_instance_ = NULL; + +String_InternalPB* String_InternalPB::New() const { + return new String_InternalPB; +} + +void String_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_value()) { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool String_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string value = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void String_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* String_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int String_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string value = 1; + if (has_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->value()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void String_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const String_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void String_InternalPB::MergeFrom(const String_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void String_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void String_InternalPB::CopyFrom(const String_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool String_InternalPB::IsInitialized() const { + + return true; +} + +void String_InternalPB::Swap(String_InternalPB* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata String_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = String_InternalPB_descriptor_; + metadata.reflection = String_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int KeyValue_InternalPB::kKeyFieldNumber; +const int KeyValue_InternalPB::kValueFieldNumber; +#endif // !_MSC_VER + +KeyValue_InternalPB::KeyValue_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void KeyValue_InternalPB::InitAsDefaultInstance() { +} + +KeyValue_InternalPB::KeyValue_InternalPB(const KeyValue_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void KeyValue_InternalPB::SharedCtor() { + _cached_size_ = 0; + key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +KeyValue_InternalPB::~KeyValue_InternalPB() { + SharedDtor(); +} + +void KeyValue_InternalPB::SharedDtor() { + if (key_ != &::google::protobuf::internal::kEmptyString) { + delete key_; + } + if (value_ != &::google::protobuf::internal::kEmptyString) { + delete value_; + } + if (this != default_instance_) { + } +} + +void KeyValue_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* KeyValue_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return KeyValue_InternalPB_descriptor_; +} + +const KeyValue_InternalPB& KeyValue_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Generics_2eproto(); return *default_instance_; +} + +KeyValue_InternalPB* KeyValue_InternalPB::default_instance_ = NULL; + +KeyValue_InternalPB* KeyValue_InternalPB::New() const { + return new KeyValue_InternalPB; +} + +void KeyValue_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_key()) { + if (key_ != &::google::protobuf::internal::kEmptyString) { + key_->clear(); + } + } + if (has_value()) { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool KeyValue_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string key = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->key().data(), this->key().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_value; + break; + } + + // optional string value = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void KeyValue_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string key = 1; + if (has_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->key().data(), this->key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->key(), output); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* KeyValue_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string key = 1; + if (has_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->key().data(), this->key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->key(), target); + } + + // optional string value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->value().data(), this->value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int KeyValue_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string key = 1; + if (has_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->key()); + } + + // optional string value = 2; + if (has_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->value()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void KeyValue_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const KeyValue_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void KeyValue_InternalPB::MergeFrom(const KeyValue_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_key()) { + set_key(from.key()); + } + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void KeyValue_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void KeyValue_InternalPB::CopyFrom(const KeyValue_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool KeyValue_InternalPB::IsInitialized() const { + + return true; +} + +void KeyValue_InternalPB::Swap(KeyValue_InternalPB* other) { + if (other != this) { + std::swap(key_, other->key_); + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata KeyValue_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = KeyValue_InternalPB_descriptor_; + metadata.reflection = KeyValue_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int StringMap_InternalPB::kNodeFieldNumber; +#endif // !_MSC_VER + +StringMap_InternalPB::StringMap_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void StringMap_InternalPB::InitAsDefaultInstance() { +} + +StringMap_InternalPB::StringMap_InternalPB(const StringMap_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void StringMap_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +StringMap_InternalPB::~StringMap_InternalPB() { + SharedDtor(); +} + +void StringMap_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void StringMap_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* StringMap_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return StringMap_InternalPB_descriptor_; +} + +const StringMap_InternalPB& StringMap_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Generics_2eproto(); return *default_instance_; +} + +StringMap_InternalPB* StringMap_InternalPB::default_instance_ = NULL; + +StringMap_InternalPB* StringMap_InternalPB::New() const { + return new StringMap_InternalPB; +} + +void StringMap_InternalPB::Clear() { + node_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool StringMap_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.KeyValue_InternalPB node = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_node: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_node())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_node; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void StringMap_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.KeyValue_InternalPB node = 1; + for (int i = 0; i < this->node_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->node(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* StringMap_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.KeyValue_InternalPB node = 1; + for (int i = 0; i < this->node_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->node(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int StringMap_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.KeyValue_InternalPB node = 1; + total_size += 1 * this->node_size(); + for (int i = 0; i < this->node_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->node(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void StringMap_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const StringMap_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void StringMap_InternalPB::MergeFrom(const StringMap_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + node_.MergeFrom(from.node_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void StringMap_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void StringMap_InternalPB::CopyFrom(const StringMap_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool StringMap_InternalPB::IsInitialized() const { + + return true; +} + +void StringMap_InternalPB::Swap(StringMap_InternalPB* other) { + if (other != this) { + node_.Swap(&other->node_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata StringMap_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = StringMap_InternalPB_descriptor_; + metadata.reflection = StringMap_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Blob_InternalPB::kValueFieldNumber; +#endif // !_MSC_VER + +Blob_InternalPB::Blob_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void Blob_InternalPB::InitAsDefaultInstance() { +} + +Blob_InternalPB::Blob_InternalPB(const Blob_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void Blob_InternalPB::SharedCtor() { + _cached_size_ = 0; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Blob_InternalPB::~Blob_InternalPB() { + SharedDtor(); +} + +void Blob_InternalPB::SharedDtor() { + if (value_ != &::google::protobuf::internal::kEmptyString) { + delete value_; + } + if (this != default_instance_) { + } +} + +void Blob_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Blob_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Blob_InternalPB_descriptor_; +} + +const Blob_InternalPB& Blob_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Generics_2eproto(); return *default_instance_; +} + +Blob_InternalPB* Blob_InternalPB::default_instance_ = NULL; + +Blob_InternalPB* Blob_InternalPB::New() const { + return new Blob_InternalPB; +} + +void Blob_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_value()) { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Blob_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bytes value = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_value())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void Blob_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional bytes value = 1; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 1, this->value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* Blob_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional bytes value = 1; + if (has_value()) { + target = + ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( + 1, this->value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int Blob_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes value = 1; + if (has_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->value()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Blob_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Blob_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Blob_InternalPB::MergeFrom(const Blob_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_value()) { + set_value(from.value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Blob_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Blob_InternalPB::CopyFrom(const Blob_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Blob_InternalPB::IsInitialized() const { + + return true; +} + +void Blob_InternalPB::Swap(Blob_InternalPB* other) { + if (other != this) { + std::swap(value_, other->value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Blob_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Blob_InternalPB_descriptor_; + metadata.reflection = Blob_InternalPB_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +// @@protoc_insertion_point(global_scope) diff --git a/OTLib/Generics.pb.h b/OTLib/Generics.pb.h new file mode 100644 index 000000000..6aaa92b6b --- /dev/null +++ b/OTLib/Generics.pb.h @@ -0,0 +1,689 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Generics.proto + +#ifndef PROTOBUF_Generics_2eproto__INCLUDED +#define PROTOBUF_Generics_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_Generics_2eproto(); +void protobuf_AssignDesc_Generics_2eproto(); +void protobuf_ShutdownFile_Generics_2eproto(); + +class String_InternalPB; +class KeyValue_InternalPB; +class StringMap_InternalPB; +class Blob_InternalPB; + +// =================================================================== + +class String_InternalPB : public ::google::protobuf::Message { + public: + String_InternalPB(); + virtual ~String_InternalPB(); + + String_InternalPB(const String_InternalPB& from); + + inline String_InternalPB& operator=(const String_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const String_InternalPB& default_instance(); + + void Swap(String_InternalPB* other); + + // implements Message ---------------------------------------------- + + String_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const String_InternalPB& from); + void MergeFrom(const String_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline const ::std::string& value() const; + inline void set_value(const ::std::string& value); + inline void set_value(const char* value); + inline void set_value(const char* value, size_t size); + inline ::std::string* mutable_value(); + inline ::std::string* release_value(); + + // @@protoc_insertion_point(class_scope:OTDB.String_InternalPB) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* value_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Generics_2eproto(); + friend void protobuf_AssignDesc_Generics_2eproto(); + friend void protobuf_ShutdownFile_Generics_2eproto(); + + void InitAsDefaultInstance(); + static String_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class KeyValue_InternalPB : public ::google::protobuf::Message { + public: + KeyValue_InternalPB(); + virtual ~KeyValue_InternalPB(); + + KeyValue_InternalPB(const KeyValue_InternalPB& from); + + inline KeyValue_InternalPB& operator=(const KeyValue_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const KeyValue_InternalPB& default_instance(); + + void Swap(KeyValue_InternalPB* other); + + // implements Message ---------------------------------------------- + + KeyValue_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const KeyValue_InternalPB& from); + void MergeFrom(const KeyValue_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string key = 1; + inline bool has_key() const; + inline void clear_key(); + static const int kKeyFieldNumber = 1; + inline const ::std::string& key() const; + inline void set_key(const ::std::string& value); + inline void set_key(const char* value); + inline void set_key(const char* value, size_t size); + inline ::std::string* mutable_key(); + inline ::std::string* release_key(); + + // optional string value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline const ::std::string& value() const; + inline void set_value(const ::std::string& value); + inline void set_value(const char* value); + inline void set_value(const char* value, size_t size); + inline ::std::string* mutable_value(); + inline ::std::string* release_value(); + + // @@protoc_insertion_point(class_scope:OTDB.KeyValue_InternalPB) + private: + inline void set_has_key(); + inline void clear_has_key(); + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* key_; + ::std::string* value_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void protobuf_AddDesc_Generics_2eproto(); + friend void protobuf_AssignDesc_Generics_2eproto(); + friend void protobuf_ShutdownFile_Generics_2eproto(); + + void InitAsDefaultInstance(); + static KeyValue_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class StringMap_InternalPB : public ::google::protobuf::Message { + public: + StringMap_InternalPB(); + virtual ~StringMap_InternalPB(); + + StringMap_InternalPB(const StringMap_InternalPB& from); + + inline StringMap_InternalPB& operator=(const StringMap_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const StringMap_InternalPB& default_instance(); + + void Swap(StringMap_InternalPB* other); + + // implements Message ---------------------------------------------- + + StringMap_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const StringMap_InternalPB& from); + void MergeFrom(const StringMap_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.KeyValue_InternalPB node = 1; + inline int node_size() const; + inline void clear_node(); + static const int kNodeFieldNumber = 1; + inline const ::OTDB::KeyValue_InternalPB& node(int index) const; + inline ::OTDB::KeyValue_InternalPB* mutable_node(int index); + inline ::OTDB::KeyValue_InternalPB* add_node(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::KeyValue_InternalPB >& + node() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::KeyValue_InternalPB >* + mutable_node(); + + // @@protoc_insertion_point(class_scope:OTDB.StringMap_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::KeyValue_InternalPB > node_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Generics_2eproto(); + friend void protobuf_AssignDesc_Generics_2eproto(); + friend void protobuf_ShutdownFile_Generics_2eproto(); + + void InitAsDefaultInstance(); + static StringMap_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class Blob_InternalPB : public ::google::protobuf::Message { + public: + Blob_InternalPB(); + virtual ~Blob_InternalPB(); + + Blob_InternalPB(const Blob_InternalPB& from); + + inline Blob_InternalPB& operator=(const Blob_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Blob_InternalPB& default_instance(); + + void Swap(Blob_InternalPB* other); + + // implements Message ---------------------------------------------- + + Blob_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Blob_InternalPB& from); + void MergeFrom(const Blob_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bytes value = 1; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 1; + inline const ::std::string& value() const; + inline void set_value(const ::std::string& value); + inline void set_value(const char* value); + inline void set_value(const void* value, size_t size); + inline ::std::string* mutable_value(); + inline ::std::string* release_value(); + + // @@protoc_insertion_point(class_scope:OTDB.Blob_InternalPB) + private: + inline void set_has_value(); + inline void clear_has_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* value_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Generics_2eproto(); + friend void protobuf_AssignDesc_Generics_2eproto(); + friend void protobuf_ShutdownFile_Generics_2eproto(); + + void InitAsDefaultInstance(); + static Blob_InternalPB* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// String_InternalPB + +// optional string value = 1; +inline bool String_InternalPB::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void String_InternalPB::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void String_InternalPB::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void String_InternalPB::clear_value() { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + clear_has_value(); +} +inline const ::std::string& String_InternalPB::value() const { + return *value_; +} +inline void String_InternalPB::set_value(const ::std::string& value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void String_InternalPB::set_value(const char* value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void String_InternalPB::set_value(const char* value, size_t size) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* String_InternalPB::mutable_value() { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + return value_; +} +inline ::std::string* String_InternalPB::release_value() { + clear_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = value_; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// KeyValue_InternalPB + +// optional string key = 1; +inline bool KeyValue_InternalPB::has_key() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void KeyValue_InternalPB::set_has_key() { + _has_bits_[0] |= 0x00000001u; +} +inline void KeyValue_InternalPB::clear_has_key() { + _has_bits_[0] &= ~0x00000001u; +} +inline void KeyValue_InternalPB::clear_key() { + if (key_ != &::google::protobuf::internal::kEmptyString) { + key_->clear(); + } + clear_has_key(); +} +inline const ::std::string& KeyValue_InternalPB::key() const { + return *key_; +} +inline void KeyValue_InternalPB::set_key(const ::std::string& value) { + set_has_key(); + if (key_ == &::google::protobuf::internal::kEmptyString) { + key_ = new ::std::string; + } + key_->assign(value); +} +inline void KeyValue_InternalPB::set_key(const char* value) { + set_has_key(); + if (key_ == &::google::protobuf::internal::kEmptyString) { + key_ = new ::std::string; + } + key_->assign(value); +} +inline void KeyValue_InternalPB::set_key(const char* value, size_t size) { + set_has_key(); + if (key_ == &::google::protobuf::internal::kEmptyString) { + key_ = new ::std::string; + } + key_->assign(reinterpret_cast(value), size); +} +inline ::std::string* KeyValue_InternalPB::mutable_key() { + set_has_key(); + if (key_ == &::google::protobuf::internal::kEmptyString) { + key_ = new ::std::string; + } + return key_; +} +inline ::std::string* KeyValue_InternalPB::release_key() { + clear_has_key(); + if (key_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = key_; + key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string value = 2; +inline bool KeyValue_InternalPB::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void KeyValue_InternalPB::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void KeyValue_InternalPB::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void KeyValue_InternalPB::clear_value() { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + clear_has_value(); +} +inline const ::std::string& KeyValue_InternalPB::value() const { + return *value_; +} +inline void KeyValue_InternalPB::set_value(const ::std::string& value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void KeyValue_InternalPB::set_value(const char* value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void KeyValue_InternalPB::set_value(const char* value, size_t size) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* KeyValue_InternalPB::mutable_value() { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + return value_; +} +inline ::std::string* KeyValue_InternalPB::release_value() { + clear_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = value_; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// StringMap_InternalPB + +// repeated .OTDB.KeyValue_InternalPB node = 1; +inline int StringMap_InternalPB::node_size() const { + return node_.size(); +} +inline void StringMap_InternalPB::clear_node() { + node_.Clear(); +} +inline const ::OTDB::KeyValue_InternalPB& StringMap_InternalPB::node(int index) const { + return node_.Get(index); +} +inline ::OTDB::KeyValue_InternalPB* StringMap_InternalPB::mutable_node(int index) { + return node_.Mutable(index); +} +inline ::OTDB::KeyValue_InternalPB* StringMap_InternalPB::add_node() { + return node_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::KeyValue_InternalPB >& +StringMap_InternalPB::node() const { + return node_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::KeyValue_InternalPB >* +StringMap_InternalPB::mutable_node() { + return &node_; +} + +// ------------------------------------------------------------------- + +// Blob_InternalPB + +// optional bytes value = 1; +inline bool Blob_InternalPB::has_value() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Blob_InternalPB::set_has_value() { + _has_bits_[0] |= 0x00000001u; +} +inline void Blob_InternalPB::clear_has_value() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Blob_InternalPB::clear_value() { + if (value_ != &::google::protobuf::internal::kEmptyString) { + value_->clear(); + } + clear_has_value(); +} +inline const ::std::string& Blob_InternalPB::value() const { + return *value_; +} +inline void Blob_InternalPB::set_value(const ::std::string& value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void Blob_InternalPB::set_value(const char* value) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(value); +} +inline void Blob_InternalPB::set_value(const void* value, size_t size) { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Blob_InternalPB::mutable_value() { + set_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + value_ = new ::std::string; + } + return value_; +} +inline ::std::string* Blob_InternalPB::release_value() { + clear_has_value(); + if (value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = value_; + value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_Generics_2eproto__INCLUDED diff --git a/OTLib/Generics.proto b/OTLib/Generics.proto new file mode 100644 index 000000000..4a9f63395 --- /dev/null +++ b/OTLib/Generics.proto @@ -0,0 +1,20 @@ +package OTDB; + +message String_InternalPB { + optional string value = 1; +} + +message KeyValue_InternalPB { + optional string key = 1; + optional string value = 2; +} + +message StringMap_InternalPB { + repeated KeyValue_InternalPB node = 1; +} + +message Blob_InternalPB { + optional bytes value = 1; +} + + diff --git a/OTLib/Lucre/CHANGES b/OTLib/Lucre/CHANGES new file mode 100755 index 000000000..9cd0d32ed --- /dev/null +++ b/OTLib/Lucre/CHANGES @@ -0,0 +1,5 @@ +12th Nov 1999 + +Avoid an attack where a coin ID the same length as the prime is sent, +thus avoiding the hash checks. Such coins could easily be generated by +blinding an existing coin. [Pointed out by Hal Finney ] diff --git a/OTLib/Lucre/LUCRE_LICENSE.txt b/OTLib/Lucre/LUCRE_LICENSE.txt new file mode 100644 index 000000000..0658f8517 --- /dev/null +++ b/OTLib/Lucre/LUCRE_LICENSE.txt @@ -0,0 +1,48 @@ +/ + * ==================================================================== + * + * LUCRE -- Anonymous Electronic Tokens v1.8 + * Copyright (c) 1999, 2000, 2009 Ben Laurie. All rights reserved. + * + * OFFICIAL SITE: http://anoncvs.aldigital.co.uk/lucre/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * 4. The name "Lucre" must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 5. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR + * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ diff --git a/OTLib/Lucre/Makefile b/OTLib/Lucre/Makefile new file mode 100644 index 000000000..58e8610f6 --- /dev/null +++ b/OTLib/Lucre/Makefile @@ -0,0 +1,55 @@ +APPS=bankdemo banktest bank-new coin-request bank-sign coin-unblind \ + bank-verify banktest2 + +all: depend $(APPS) + +INCFLAGS=-I../../openssl/include -DBN_DEBUG -DREF_CHECK -DCRYPTO_MDEBUG -DPEDANTIC +#CFLAGS=-g $(INCFLAGS) -O2 -pedantic -Wall -Wshadow -Werror -pipe +CFLAGS=-g $(INCFLAGS) -O2 -Wall -Wshadow -Werror -pipe + +LFLAGS=-L../../openssl -lcrypto + +depend: + touch .depend + makedepend -f .depend $(INCFLAGS) -I/usr/include/g++ *.cpp + +banktest: banktest.o bankimp.o + $(CXX) $(CFLAGS) -o banktest banktest.o bankimp.o $(LFLAGS) + +banktest2: banktest2.o bankimp.o + $(CXX) $(CFLAGS) -o banktest2 banktest2.o bankimp.o $(LFLAGS) + +bank-new: bank-new.o bankimp.o + $(CXX) $(CFLAGS) -o bank-new bank-new.o bankimp.o $(LFLAGS) + +coin-request: coin-request.o bankimp.o + $(CXX) $(CFLAGS) -o coin-request coin-request.o bankimp.o $(LFLAGS) + +bank-sign: bank-sign.o bankimp.o + $(CXX) $(CFLAGS) -o bank-sign bank-sign.o bankimp.o $(LFLAGS) + +coin-unblind: coin-unblind.o bankimp.o + $(CXX) $(CFLAGS) -o coin-unblind coin-unblind.o bankimp.o $(LFLAGS) + +bank-verify: bank-verify.o bankimp.o + $(CXX) $(CFLAGS) -o bank-verify bank-verify.o bankimp.o $(LFLAGS) + +bankdemo: bankdemo.o + $(CXX) $(CFLAGS) -o bankdemo bankdemo.o $(LFLAGS) + +test: test-bank test-coin + +test-coin: all + ./coin-request /tmp/bank-public /tmp/coin-private /tmp/coin-request + ./bank-sign /tmp/bank-private /tmp/coin-request /tmp/coin-signature + ./coin-unblind /tmp/bank-public /tmp/coin-private /tmp/coin-signature /tmp/coin + ./bank-verify /tmp/bank-private /tmp/coin + +test-bank: all + ./bank-new 288 /tmp/bank-private /tmp/bank-public + +clean: + rm -f *.o $(APPS) *~ .depend .depend.bak *.core + +tar: clean + tar cvfz /home/ben/tmp/bank.tgz . diff --git a/OTLib/Lucre/bank-new.cpp b/OTLib/Lucre/bank-new.cpp new file mode 100755 index 000000000..adca05d83 --- /dev/null +++ b/OTLib/Lucre/bank-new.cpp @@ -0,0 +1,42 @@ +#include "bank.h" +#include +#include + +int LucreBankNew(int argc,char **argv) +{ + if(argc != 4) + { + fprintf(stderr,"%s \n", + argv[0]); + exit(1); + } + + int nPrimeLength=atoi(argv[1]); + const char *szFile=argv[2]; + const char *szPublicFile=argv[3]; + + if(nPrimeLength/8 < MIN_COIN_LENGTH+DIGEST_LENGTH) + { + fprintf(stderr,"Prime must be at least %d bits\n", + (MIN_COIN_LENGTH+DIGEST_LENGTH)*8); + exit(2); + } + + if(nPrimeLength%8) + { + fprintf(stderr,"Prime length must be a multiple of 8\n"); + exit(3); + } + + SetMonitor(stdout); + + BIO *bio=BIO_new_file(szFile,"w"); + BIO *bioPublic=BIO_new_file(szPublicFile,"w"); + + Bank bank(nPrimeLength/8); + bank.WriteBIO(bio); + PublicBank pbank(bank); + pbank.WriteBIO(bioPublic); + + return 1; +} diff --git a/OTLib/Lucre/bank-sign.cpp b/OTLib/Lucre/bank-sign.cpp new file mode 100755 index 000000000..8310854e3 --- /dev/null +++ b/OTLib/Lucre/bank-sign.cpp @@ -0,0 +1,37 @@ +#include "bank.h" + +int LucreBankSign(int argc,char **argv) +{ + if(argc != 4 && argc != 5) + { + fprintf(stderr,"%s []\n", + argv[0]); + exit(1); + } + const char *szBankFile=argv[1]; + const char *szRequest=argv[2]; + const char *szSignature=argv[3]; + int nRepeats=1; + if(argc >= 5) + nRepeats=atoi(argv[4]); + else + SetDumper(stderr); + + BIO *bioBank=BIO_new_file(szBankFile,"r"); + BIO *bioRequest=BIO_new_file(szRequest,"r"); + BIO *bioSignature=BIO_new_file(szSignature,"w"); + + Bank bank(bioBank); + PublicCoinRequest req(bioRequest); + for(int n=0 ; n < nRepeats-1 ; ++n) + { + BIGNUM *bnSignature=bank.SignRequest(req); + BN_free(bnSignature); + } + BIGNUM *bnSignature=bank.SignRequest(req); + req.WriteBIO(bioSignature); + DumpNumber(bioSignature,"signature=",bnSignature); + + return 1; +} + diff --git a/OTLib/Lucre/bank-verify.cpp b/OTLib/Lucre/bank-verify.cpp new file mode 100755 index 000000000..659846549 --- /dev/null +++ b/OTLib/Lucre/bank-verify.cpp @@ -0,0 +1,27 @@ +#include "bank.h" + +int LucreBankVerify(int argc,char **argv) + { + if(argc != 3) + { + fprintf(stderr,"%s \n",argv[0]); + exit(1); + } + const char *szBankFile=argv[1]; + const char *szCoinFile=argv[2]; + + SetDumper(stderr); + + BIO *bioBank=BIO_new_file(szBankFile,"r"); + BIO *bioCoin=BIO_new_file(szCoinFile,"r"); + + Bank bank(bioBank); + Coin coin(bioCoin); + + if(!bank.Verify(coin)) + { + fprintf(stderr,"Bad coin!\n"); + exit(1); + } + exit(0); + } diff --git a/OTLib/Lucre/bank.h b/OTLib/Lucre/bank.h new file mode 100755 index 000000000..67ab25afe --- /dev/null +++ b/OTLib/Lucre/bank.h @@ -0,0 +1,353 @@ +//-*-C++-*- + +#ifndef __LUCRE_WRAPPER__ +#define __LUCRE_WRAPPER__ + +extern "C" +{ +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif +} + +//#define SAMY_DIGEST_LENGTH 64 // 64 bytes aka 512 bits output for the SAMY hash. +//#define DIGEST_LENGTH SAMY_DIGEST_LENGTH +//#define MIN_COIN_LENGTH 64 +//#define BLINDING_LENGTH 32 +#define MIN_COIN_LENGTH 16 +#define BLINDING_LENGTH 8 +#define DIGEST_LENGTH SHA_DIGEST_LENGTH + +typedef int LAURIE_BOOLEAN; + +class Bank; +class PublicCoinRequest; +class CoinRequest; +class Coin; + +extern const char _NL[]; +void SetDumper(BIO *out); +void SetDumper(FILE *f); +void SetMonitor(BIO *out); +void SetMonitor(FILE *f); +void DumpNumber(BIO *out,const char *szTitle,const BIGNUM *bn, + const char *szTrailer=_NL); +void DumpNumber(const char *szTitle,const BIGNUM *bn, + const char *szTrailer=_NL); +void HexDump(BIO *out,const char *szTitle,const unsigned char *acBuf, + int nLength); +void HexDump(const char *szTitle,const unsigned char *acBuf,int nLength); +BIGNUM *ReadNumber(BIO *in,const char *szTitle); + +class PublicBank + { +protected: + DH *m_pDH; +public: + PublicBank(Bank &bank); + PublicBank(BIO *bio) + { + m_pDH=NULL; + ReadBIO(bio); + } + PublicBank() + { m_pDH=NULL; } + ~PublicBank() + { DH_free(m_pDH); } + const BIGNUM *p() const + { return m_pDH->p; } + /*const*/ BIGNUM *g() // regrettably not const, coz C doesn't support mutable + { return m_pDH->g; } + /*const*/ BIGNUM *pub_key() // see above + { return m_pDH->pub_key; } + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + void Dump() + { + DumpNumber("p= ",m_pDH->p); + DumpNumber("g= ",m_pDH->g); + DumpNumber("g^k= ",m_pDH->pub_key); + } + int CoinLength() const + { + return MIN_COIN_LENGTH+(PrimeLength()-MIN_COIN_LENGTH)%DIGEST_LENGTH; + } + int PrimeLength() const + { return BN_num_bytes(p()); } + }; + +class Bank : public PublicBank + { + BN_CTX *m_ctx; + + static void cb(int p, int, void *arg); +public: + Bank(int nPrimeLength) + { + assert(nPrimeLength >= MIN_COIN_LENGTH+DIGEST_LENGTH); + m_pDH=DH_generate_parameters(nPrimeLength*8,DH_GENERATOR_5,cb,NULL); + assert(m_pDH); + assert(BN_num_bytes(m_pDH->p) == nPrimeLength); // can this fail? i.e. does OpenSSL check for length when generating? + int nRet=DH_generate_key(m_pDH); + assert(nRet); + m_ctx=NULL; + } + Bank(BIO *bio) + { + m_ctx=NULL; + ReadBIO(bio); + } + ~Bank() + { BN_CTX_free(m_ctx); } + void InitCTX() + { + if(!m_ctx) + m_ctx=BN_CTX_new(); + } + void Dump() + { + PublicBank::Dump(); + DumpNumber("k= ",m_pDH->priv_key); + } + const BIGNUM *priv_key() + { return m_pDH->priv_key; } + /*const*/ BIGNUM *SignRequest(PublicCoinRequest &req); + LAURIE_BOOLEAN Verify(Coin &coin); + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + }; + +class UnsignedCoin + { +protected: + BIGNUM *m_bnCoinID; +public: + UnsignedCoin() + { m_bnCoinID=NULL; } + UnsignedCoin(BIGNUM *bnCoinID) + { m_bnCoinID=BN_dup(bnCoinID); } + ~UnsignedCoin() + { BN_free(m_bnCoinID); } + void Clear() + { + BN_free(m_bnCoinID); + m_bnCoinID=NULL; + } + void Set(const BIGNUM *bnCoinID) + { + Clear(); + m_bnCoinID=BN_dup(bnCoinID); + } + void Random(int nCoinLength) + { + if(!m_bnCoinID) + m_bnCoinID=BN_new(); + // choose x + BN_rand(m_bnCoinID,nCoinLength*8,0,1); + DumpNumber("x= ",m_bnCoinID); + + assert(BN_num_bytes(m_bnCoinID) == nCoinLength); + } + + BIGNUM *ID() + { return m_bnCoinID; } + LAURIE_BOOLEAN GenerateCoinNumber(BIGNUM *bnNumber,const PublicBank &bank) + { + int nCoinLength=BN_num_bytes(m_bnCoinID); + int nDigestIterations=(bank.PrimeLength()-nCoinLength)/DIGEST_LENGTH; + + if(nCoinLength != bank.CoinLength()) + return false; + + unsigned char *xplusd= + static_cast(alloca(bank.PrimeLength())); + + // generate y=x|hash(x) + memset(xplusd,'\0',nCoinLength); + BN_bn2bin(m_bnCoinID,xplusd); + + // Made some changes here... to use SAMY hash instead of SHA1... + // spoke too soon... Changed back until I can have experts on this. + for(int n = 0 ; n < nDigestIterations ; ++n) + { + /* + OTData theContents(xplusd, nCoinLength+DIGEST_LENGTH*n); + + OTIdentifier theHash; + theHash.CalculateDigest(theContents); + theHash.CopyTo(&xplusd[nCoinLength+DIGEST_LENGTH*n]); + */ + + SHA1(xplusd, + nCoinLength+DIGEST_LENGTH*n, + &xplusd[nCoinLength+DIGEST_LENGTH*n] + ); + } + + HexDump("x|hash(x)=",xplusd, + nCoinLength+nDigestIterations*DIGEST_LENGTH); + + BN_bin2bn(xplusd,nCoinLength+nDigestIterations*DIGEST_LENGTH,bnNumber); + DumpNumber("y= ",bnNumber); + + return true; + } + void Dump() + { + DumpNumber("coin= ",m_bnCoinID); + } + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + }; + +class Coin : public UnsignedCoin + { + BIGNUM *m_bnCoinSignature; +public: + Coin() + { m_bnCoinSignature=NULL; } + Coin(BIO *bio) + { + m_bnCoinSignature=NULL; + ReadBIO(bio); + } + Coin(BIGNUM *bnCoinID,BIGNUM *bnCoinSignature) + : UnsignedCoin(bnCoinID) + { m_bnCoinSignature=BN_dup(bnCoinSignature); } + ~Coin() + { BN_free(m_bnCoinSignature); } + void Clear() + { + BN_free(m_bnCoinSignature); + m_bnCoinSignature=NULL; + UnsignedCoin::Clear(); + } + void Set(BIGNUM *bnCoinID,BIGNUM *bnCoinSignature) + { + Clear(); + m_bnCoinSignature=BN_dup(bnCoinSignature); + UnsignedCoin::Set(bnCoinID); + } + void Set(UnsignedCoin &ucoin,BIGNUM *bnCoinSignature) + { Set(ucoin.ID(),bnCoinSignature); } + void Dump() + { + DumpNumber("coin= (",m_bnCoinID,""); + DumpNumber(",",m_bnCoinSignature,")\n"); + } + BIGNUM *Signature() + { return m_bnCoinSignature; } + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + }; + +class PublicCoinRequest + { +protected: + BIGNUM *m_bnCoinRequest; +public: + PublicCoinRequest() + { m_bnCoinRequest=NULL; } + PublicCoinRequest(BIO *bio) + { + m_bnCoinRequest=NULL; + ReadBIO(bio); + } + ~PublicCoinRequest() + { BN_free(m_bnCoinRequest); } + /*const*/ BIGNUM *Request() + { return m_bnCoinRequest; } + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + + void Dump() + { DumpNumber("request= ",m_bnCoinRequest); } + }; + +class CoinRequest : public PublicCoinRequest + { + BIGNUM *m_bnBlindingFactor; + UnsignedCoin m_coin; + BN_CTX *m_ctx; + + void CheckCTX() + { + if(m_ctx) + return; + m_ctx=BN_CTX_new(); + } +public: + CoinRequest(BIO *bio) + { + m_ctx=NULL; + ReadBIO(bio); + } + CoinRequest(PublicBank &bank) + { + m_ctx=NULL; + + BIGNUM *y=BN_new(); + for( ; ; ) + { + m_coin.Random(bank.CoinLength()); + + m_coin.GenerateCoinNumber(y,bank); + + if(BN_cmp(y,bank.p()) < 0) + break; + } + + // choose b + m_bnBlindingFactor=BN_new(); + BN_rand(m_bnBlindingFactor,BLINDING_LENGTH*8,0,0); + DumpNumber("b= ",m_bnBlindingFactor); + + // calculate A->B: y g^b + m_bnCoinRequest=BN_new(); + CheckCTX(); + + BN_mod_exp(m_bnCoinRequest,bank.g(),m_bnBlindingFactor,bank.p(),m_ctx); + BN_mod_mul(m_bnCoinRequest,m_bnCoinRequest,y,bank.p(),m_ctx); + DumpNumber("A->B= ",m_bnCoinRequest); + + BN_free(y); + } + ~CoinRequest() + { + BN_free(m_bnBlindingFactor); + BN_CTX_free(m_ctx); + } + BIGNUM *Unblind(BIGNUM *bnSignedCoin,PublicBank &bank) + { + CheckCTX(); + BIGNUM *z=BN_new(); + BN_mod_exp(z,bank.pub_key(),m_bnBlindingFactor,bank.p(),m_ctx); + BN_mod_inverse(z,z,bank.p(),m_ctx); + BN_mod_mul(z,bnSignedCoin,z,bank.p(),m_ctx); + return z; + } + void ProcessResponse(Coin *pCoin,PublicBank &bank, + BIGNUM *bnSignedCoinRequest) + { + BIGNUM *bnCoinSignature=Unblind(bnSignedCoinRequest,bank); + DumpNumber("z= ",bnCoinSignature); + pCoin->Set(m_coin,bnCoinSignature); + } + void WriteBIO(BIO *bio); + void ReadBIO(BIO *bio); + + void Dump() + { + PublicCoinRequest::Dump(); + m_coin.Dump(); + DumpNumber("blinding= ",m_bnBlindingFactor); + } + }; + +#endif // __LUCRE_WRAPPER__ \ No newline at end of file diff --git a/OTLib/Lucre/bankdemo.cpp b/OTLib/Lucre/bankdemo.cpp new file mode 100755 index 000000000..28412e642 --- /dev/null +++ b/OTLib/Lucre/bankdemo.cpp @@ -0,0 +1,159 @@ +#include +#include +#include +#include +#include + +#define COIN_LENGTH 8 +#define BLINDING_LENGTH 8 + +#define PRIME_LENGTH (COIN_LENGTH+SHA_DIGEST_LENGTH) + +static void cb(int p, int, void *arg) + { + char c='*'; + + if (p == 0) c='.'; + if (p == 1) c='+'; + if (p == 2) c='*'; + if (p == 3) c='\n'; + BIO_write((BIO *)arg,&c,1); + BIO_flush((BIO *)arg); + } + +static void Hex(const unsigned char *acBuf,int nLength) + { + for(int n=0 ; n < nLength ; ++n) + printf("%02X",acBuf[n]); + printf("\n"); + } + +int LucreBankDemo(int /*argc*/,char **/*argv*/) + { + DH *a; + BIO *out; + + out=BIO_new(BIO_s_file()); + if(out == NULL) + exit(1); + BIO_set_fp(out,stdout,BIO_NOCLOSE); + + a=DH_generate_parameters(PRIME_LENGTH*8,DH_GENERATOR_5,cb,out); + assert(a); + assert(BN_num_bytes(a->p) == PRIME_LENGTH); // can this fail? i.e. does OpenSSL check for length when generating? + + BIO_puts(out,"\np= "); + BN_print(out,a->p); + BIO_puts(out,"\ng= "); + BN_print(out,a->g); + BIO_puts(out,"\n"); + + int nRet=DH_generate_key(a); + assert(nRet); + BIO_puts(out,"k= "); + BN_print(out,a->priv_key); + BIO_puts(out,"\ng^k= "); + BN_print(out,a->pub_key); + BIO_puts(out,"\n"); + + // now generate the coin request + BIGNUM *x=BN_new(); + unsigned char xplusd[COIN_LENGTH+SHA_DIGEST_LENGTH]; + BIGNUM *y=BN_new(); + for( ; ; ) + { + // choose x + BN_rand(x,COIN_LENGTH*8,0,1); // make sure we use the whole length + BIO_puts(out,"x= "); + BN_print(out,x); + BIO_puts(out,"\n"); + + assert(BN_num_bytes(x) == COIN_LENGTH); + + // generate y=x|hash(x) + memset(xplusd,'\0',COIN_LENGTH); + assert(BN_num_bytes(x) <= COIN_LENGTH); + BN_bn2bin(x,xplusd); + + SHA_CTX c; + SHA_Init(&c); + SHA_Update(&c,xplusd,COIN_LENGTH); + SHA_Final(&xplusd[COIN_LENGTH],&c); + + BIO_puts(out,"x|hash(x)="); + Hex(xplusd,COIN_LENGTH+SHA_DIGEST_LENGTH); + + BN_bin2bn(xplusd,COIN_LENGTH+SHA_DIGEST_LENGTH,y); + BIO_puts(out,"y= "); + BN_print(out,y); + BIO_puts(out,"\n"); + + if(BN_cmp(y,a->p) < 0) + break; + } + + // choose b + BIGNUM *b=BN_new(); + BN_rand(b,BLINDING_LENGTH*8,0,0); + BIO_puts(out,"b= "); + BN_print(out,b); + BIO_puts(out,"\n"); + + // calculate A->B: y g^b + BIGNUM *AtoB=BN_new(); + BN_CTX *ctx=BN_CTX_new(); + + BN_mod_exp(AtoB,a->g,b,a->p,ctx); + BN_mod_mul(AtoB,AtoB,y,a->p,ctx); + BIO_puts(out,"A->B= "); + BN_print(out,AtoB); + BIO_puts(out,"\n"); + + // calculate B->A: (A->B)^k=(y g^b)^k + BIGNUM *BtoA=BN_new(); + BN_mod_exp(BtoA,AtoB,a->priv_key,a->p,ctx); + BIO_puts(out,"B->A= "); + BN_print(out,BtoA); + BIO_puts(out,"\n"); + + // calculate z=(y g^b)^k (g^k)^-b=(BtoA) (g^k)^-b + BIGNUM *z=BN_new(); + BN_mod_exp(z,a->pub_key,b,a->p,ctx); + BN_mod_inverse(z,z,a->p,ctx); + BN_mod_mul(z,BtoA,z,a->p,ctx); + BIO_puts(out,"z= "); + BN_print(out,z); + BIO_puts(out,"\n"); + + // confirm z == y^k (not possible in a real system, because that's the whole dang point!) + BIGNUM *t=BN_new(); + BN_mod_exp(t,y,a->priv_key,a->p,ctx); + BIO_puts(out,"y^k= "); + BN_print(out,t); + BIO_puts(out,"\n"); + + BN_sub(t,t,z); + assert(BN_is_zero(t)); + + // for clarity, show the coin: + BIO_puts(out,"coin= ("); + BN_print(out,x); + BIO_puts(out,","); + BN_print(out,z); + BIO_puts(out,")\n"); + + // and convert it to hex... + unsigned char coin[COIN_LENGTH+PRIME_LENGTH]; + BN_bn2bin(x,coin); + BN_bn2bin(z,&coin[COIN_LENGTH]); + + BIO_puts(out,"hexcoin= "); + Hex(coin,sizeof coin); + + // and finally, check the coin (pointless here, but included for completeness) + // unsigned char check_xplusd[COIN_LENGTH+SHA_DIGEST_LENGTH]; + + + return 1; + } + diff --git a/OTLib/Lucre/bankimp.cpp b/OTLib/Lucre/bankimp.cpp new file mode 100755 index 000000000..b9bf0b096 --- /dev/null +++ b/OTLib/Lucre/bankimp.cpp @@ -0,0 +1,245 @@ +#include "bank.h" + +#ifdef _WIN32 +#include +#endif + +extern "C" +{ +#include +} + +static BIO *dout; +static BIO *mout; + +const char _NL[]="\n"; + +void SetDumper(BIO *out) + { + dout=out; + if(!mout) + mout=out; + } + +void SetDumper(FILE *f) + { + BIO *out=BIO_new(BIO_s_file()); + assert(out); + BIO_set_fp(out,f,BIO_NOCLOSE); + SetDumper(out); + } + +void SetMonitor(BIO *out) + { mout=out; } + +void SetMonitor(FILE *f) + { + BIO *out=BIO_new(BIO_s_file()); + assert(out); + BIO_set_fp(out,f,BIO_NOCLOSE); + SetMonitor(out); + } + +BIGNUM *ReadNumber(BIO *in,const char *szTitle) + { + char szLine[10240]; + unsigned char aucBN[1024]; + int nTLen=strlen(szTitle); + + BIO_gets(in,szLine,sizeof szLine-1); + if(strncmp(szLine,szTitle,nTLen)) + { +#ifndef ANDROID + fprintf(stderr,"Got %s, expected %s\n",szLine,szTitle); +#endif + assert(!"Unexpected input"); // TODO Find out what this exclamation point is for... + return NULL; + } + BIGNUM *bn=BN_new(); + + int n=strcspn(szLine+nTLen,"\r\n"); + szLine[nTLen+n]='\0'; + if(n&1) + { + memmove(szLine+nTLen+1,szLine+nTLen,n+1); + szLine[nTLen]='0'; + } + + for(n=0 ; szLine[nTLen+n*2] ; ++n) + { + int h; + + sscanf(&szLine[nTLen+n*2],"%02x",&h); + aucBN[n]=(unsigned char)h; + } + + BN_bin2bn(aucBN,n,bn); + + return bn; + } + +void DumpNumber(BIO *out,const char *szTitle,const BIGNUM *bn, + const char *szTrailer) + { + if(!out) + return; + BIO_puts(out,szTitle); + if(!bn) + BIO_puts(out,"(null)"); + else + BN_print(out,bn); + BIO_puts(out,szTrailer); + } + +void DumpNumber(const char *szTitle,const BIGNUM *bn,const char *szTrailer) + { DumpNumber(dout,szTitle,bn,szTrailer); } + +void HexDump(BIO *out,const char *szTitle,const unsigned char *acBuf, + int nLength) + { + if(!out) + return; + BIO_puts(out,szTitle); + for(int n=0 ; n < nLength ; ++n) + { + char buf[3]; + sprintf(buf,"%02X",acBuf[n]); + BIO_puts(out,buf); + } + BIO_puts(out,"\n"); + } + +void HexDump(const char *szTitle,const unsigned char *acBuf,int nLength) + { HexDump(dout,szTitle,acBuf,nLength); } + +PublicBank::PublicBank(Bank &bank) + { + m_pDH=DH_new(); + m_pDH->g=BN_dup(bank.g()); + m_pDH->p=BN_dup(bank.p()); + m_pDH->pub_key=BN_dup(bank.pub_key()); + } + +void Bank::cb(int n, int, void * /*arg*/) + { + if(!mout) + return; + + char c='*'; + + if (n == 0) c='.'; + if (n == 1) c='+'; + if (n == 2) c='*'; + if (n == 3) c='\n'; + BIO_write(mout,&c,1); + BIO_flush(mout); + } + +/*const*/ BIGNUM *Bank::SignRequest(PublicCoinRequest &req) + { + InitCTX(); + + BIGNUM *BtoA=BN_new(); + BN_mod_exp(BtoA,req.Request(),priv_key(),p(),m_ctx); + DumpNumber("B->A= ",BtoA); + + return BtoA; + } + +LAURIE_BOOLEAN Bank::Verify(Coin &coin) + { + InitCTX(); + + BIGNUM *t=BN_new(); + if(!coin.GenerateCoinNumber(t,*this)) + return false; + BN_mod_exp(t,t,priv_key(),p(),m_ctx); + DumpNumber("y^k= ",t); + + BN_sub(t,t,coin.Signature()); + LAURIE_BOOLEAN bRet=BN_is_zero(t); + + BN_free(t); + + return bRet; + } + +void Bank::WriteBIO(BIO *bio) + { + PublicBank::WriteBIO(bio); + DumpNumber(bio,"private=",priv_key()); + } + +void Bank::ReadBIO(BIO *bio) + { + PublicBank::ReadBIO(bio); + m_pDH->priv_key=ReadNumber(bio,"private="); + } + +void PublicBank::WriteBIO(BIO *bio) + { + DumpNumber(bio,"g=",g()); + DumpNumber(bio,"p=",p()); + DumpNumber(bio,"public=",pub_key()); + } + +void PublicBank::ReadBIO(BIO *bio) + { + m_pDH=DH_new(); + + m_pDH->g=ReadNumber(bio,"g="); + m_pDH->p=ReadNumber(bio,"p="); + m_pDH->pub_key=ReadNumber(bio,"public="); + + Dump(); + } + +void UnsignedCoin::WriteBIO(BIO *bio) + { + DumpNumber(bio,"id=",m_bnCoinID); + } + +void UnsignedCoin::ReadBIO(BIO *bio) + { + m_bnCoinID=ReadNumber(bio,"id="); + } + +void Coin::WriteBIO(BIO *bio) + { + UnsignedCoin::WriteBIO(bio); + DumpNumber(bio,"signature=",m_bnCoinSignature); + } + +void Coin::ReadBIO(BIO *bio) + { + UnsignedCoin::ReadBIO(bio); + m_bnCoinSignature=ReadNumber(bio,"signature="); + Dump(); + } + +void PublicCoinRequest::WriteBIO(BIO *bio) + { + DumpNumber(bio,"request=",m_bnCoinRequest); + } + +void PublicCoinRequest::ReadBIO(BIO *bio) + { + m_bnCoinRequest=ReadNumber(bio,"request="); + } + +void CoinRequest::WriteBIO(BIO *bio) + { + PublicCoinRequest::WriteBIO(bio); + m_coin.WriteBIO(bio); + DumpNumber(bio,"blinding=",m_bnBlindingFactor); + } + +void CoinRequest::ReadBIO(BIO *bio) + { + PublicCoinRequest::ReadBIO(bio); + m_coin.ReadBIO(bio); + m_bnBlindingFactor=ReadNumber(bio,"blinding="); + + Dump(); + } + diff --git a/OTLib/Lucre/banktest.cpp b/OTLib/Lucre/banktest.cpp new file mode 100755 index 000000000..7fa53859f --- /dev/null +++ b/OTLib/Lucre/banktest.cpp @@ -0,0 +1,68 @@ +#include "bank.h" +#include + +int LucreBankTest(int argc,char **argv) +{ + BIO *dout; + + if (argc != 3) + { + fprintf(stderr,"%s \n",argv[0]); + exit(1); + } + + int nPrimeLength = atoi(argv[1]); + int nCoins = atoi(argv[2]); + + if ( (nPrimeLength/8) < (MIN_COIN_LENGTH+DIGEST_LENGTH) ) + { + fprintf(stderr,"Prime must be at least %d bits\n", + (MIN_COIN_LENGTH+DIGEST_LENGTH)*8); + exit(2); + } + + if (nPrimeLength%8) + { + fprintf(stderr,"Prime length must be a multiple of 8\n"); + exit(3); + } + + dout=BIO_new(BIO_s_file()); + if(dout == NULL) + exit(1); + BIO_set_fp(dout,stdout,BIO_NOCLOSE); + SetDumper(dout); + + Bank _bank(nPrimeLength/8); + _bank.Dump(); + + PublicBank bank(_bank); + + for(int n=0 ; n < nCoins ; ++n) + { + printf("\nCoin %d\n\n",n); + + + // *** now GENERATE the coin request + CoinRequest request(bank); + + // *** THE BANK SIGNS THE REQUEST + // calculate B->A: (A->B)^k=(y g^b)^k + BIGNUM *bnSignedCoin = _bank.SignRequest(request); + + // THE CLIENT UNBLINDS THE COIN HE RECEIVES FROM SERVER + // calculate z=(y g^b)^k (g^k)^-b=(BtoA) (g^k)^-b + Coin coin; + request.ProcessResponse(&coin,bank,bnSignedCoin); + + coin.Dump(); + + // **** VERIFY THE TOKEN WHEN REDEEMED AT THE SERVER + boolean bRet=_bank.Verify(coin); + + assert(bRet); + } + + return 1; +} + diff --git a/OTLib/Lucre/banktest2.cpp b/OTLib/Lucre/banktest2.cpp new file mode 100755 index 000000000..87b76aeba --- /dev/null +++ b/OTLib/Lucre/banktest2.cpp @@ -0,0 +1,57 @@ +#include "bank.h" +#include + +static const char acBankPrivate[]= +"g=5\n" +"p=FE1D6186F8993ACAA8BA41C605B784B31A313314122580F20C7304CC19183D16CDC673D3\n" +"public=3BCF8D4AB8E48373B0B221671DFE769825FF4C88807B94DCEE977FB04AB0A06EDABC512E\n" +"private=77560C6F9E99AB2E3B8FE32DCF5BF75E477CF0D2977EBCC60AF32911F6D62DD4626A2E3C\n"; + +static const char acCoinPrivate[]= +"request=8AA33FFA7D3096CE4D2E933923D31A4769ACF8BB8421E32EC6D9190E63690E58E44D012C\n" +"id=C8A941A01D0B316094C4455117A2B947\n" +"blinding=C6FE1F070531D18B\n"; + + +int LucreBankTest2(int /*argc*/,char **/*argv*/) + { + BIO *dout; + int nCoins=1; + + dout=BIO_new(BIO_s_file()); + if(dout == NULL) + exit(1); + BIO_set_fp(dout,stdout,BIO_NOCLOSE); + SetDumper(dout); + + BIO *mem=BIO_new(BIO_s_mem()); + BIO_write(mem,acBankPrivate,strlen(acBankPrivate)); + Bank _bank(mem); + _bank.Dump(); + + PublicBank bank(_bank); + + for(int n=0 ; n < nCoins ; ++n) + { + printf("\nCoin %d\n\n",n); + // now generate the coin request + // CoinRequest request(bank); + BIO_write(mem,acCoinPrivate,strlen(acCoinPrivate)); + CoinRequest request(mem); + + // calculate B->A: (A->B)^k=(y g^b)^k + BIGNUM *bnSignedCoin=_bank.SignRequest(request); + DumpNumber("signature=",bnSignedCoin); + + // calculate z=(y g^b)^k (g^k)^-b=(BtoA) (g^k)^-b + Coin coin; + request.ProcessResponse(&coin,bank,bnSignedCoin); + coin.Dump(); + + boolean bRet=_bank.Verify(coin); + assert(bRet); + } + + return 1; +} + diff --git a/OTLib/Lucre/coin-request.cpp b/OTLib/Lucre/coin-request.cpp new file mode 100755 index 000000000..8e469f169 --- /dev/null +++ b/OTLib/Lucre/coin-request.cpp @@ -0,0 +1,31 @@ + + + +#include "bank.h" + +int LucreCoinRequest(int argc,char **argv) +{ + if(argc != 4) + { + fprintf(stderr,"%s \n", argv[0]); + exit(1); + } + const char *szBankFile=argv[1]; + const char *szCoinFile=argv[2]; + const char *szPublicCoinFile=argv[3]; + + SetDumper(stderr); + + BIO *bioBank=BIO_new_file(szBankFile,"r"); + BIO *bioCoin=BIO_new_file(szCoinFile,"w"); + BIO *bioPublicCoin=BIO_new_file(szPublicCoinFile,"w"); + + PublicBank bank; + bank.ReadBIO(bioBank); + + CoinRequest req(bank); + req.WriteBIO(bioCoin); + ((PublicCoinRequest *)&req)->WriteBIO(bioPublicCoin); + + return 1; +} diff --git a/OTLib/Lucre/coin-unblind.cpp b/OTLib/Lucre/coin-unblind.cpp new file mode 100755 index 000000000..2f40df1d9 --- /dev/null +++ b/OTLib/Lucre/coin-unblind.cpp @@ -0,0 +1,32 @@ +#include "bank.h" + +int LucreCoinUnblind(int argc,char **argv) +{ + if(argc != 5) + { + fprintf(stderr,"%s \n", + argv[0]); + exit(1); + } + const char *szBankFile=argv[1]; + const char *szPrivateRequestFile=argv[2]; + const char *szSignatureFile=argv[3]; + const char *szCoinFile=argv[4]; + + SetDumper(stderr); + + BIO *bioBank=BIO_new_file(szBankFile,"r"); + BIO *bioPrivateRequest=BIO_new_file(szPrivateRequestFile,"r"); + BIO *bioSignature=BIO_new_file(szSignatureFile,"r"); + BIO *bioCoin=BIO_new_file(szCoinFile,"w"); + + PublicBank bank(bioBank); + CoinRequest req(bioPrivateRequest); + ReadNumber(bioSignature,"request="); + BIGNUM *bnSignature=ReadNumber(bioSignature,"signature="); + DumpNumber("signature=",bnSignature); + Coin coin; + req.ProcessResponse(&coin,bank,bnSignature); + coin.WriteBIO(bioCoin); + return 1; +} diff --git a/OTLib/Makefile b/OTLib/Makefile new file mode 100644 index 000000000..ebfdbc199 --- /dev/null +++ b/OTLib/Makefile @@ -0,0 +1,377 @@ +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = libOTLib.a +DEBUG_PROGRAM = libOTLibd.a + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := UNKNOWN_PLATFORM + + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif + +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif + +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif + +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif + +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + + +OT_INCLUDEDIRS = \ + -I./irrxml \ + -I./Lucre \ + -I./bigint \ + -I./simpleini \ + -I./ + + +OT_LIBDIRS = \ + -L./ + + +# ----------------------------------------- + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +endif + +# ----------------------------------------- + +# SSL Folders! +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(OT_PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(OT_PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(OT_PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0d +endif + + +# ----------------------------------------- + + +ifeq ($(DSP), 1) +PLATFORM_INCLUDEDIRS = -I../openssl/include +PLATFORM_LIBDIRS = -L../openssl +else +PLATFORM_INCLUDEDIRS = #empty +PLATFORM_LIBDIRS = #empty +endif + +# ----------------------------------------- + + +INCLUDEDIRS = $(PLATFORM_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) +LIBDIRS = $(PLATFORM_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + + +LIBS = -lssl -lcrypto -lprotobuf -lmsgpack +DEBUG_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack + +# +# The CXXSOURCES macro contains a list of source files. +# +# The CXXOBJECTS macro converts the CXXSOURCES macro into a list +# of object files. +# +# The CXXFLAGS macro contains a list of options to be passed to +# the compiler. Adding "-g" to this line will cause the compiler +# to add debugging information to the executable. +# +# The CXX macro defines the C++ compiler. +# +# The LDFLAGS macro contains all of the library and library +# directory information to be passed to the linker. +# + +BIGINTSOURCES = bigint/BigUnsigned.o \ + bigint/BigInteger.o \ + bigint/BigIntegerAlgorithms.o \ + bigint/BigUnsignedInABase.o \ + bigint/BigIntegerUtils.o + + +LUCRESOURCES = Lucre/bankimp.cpp + +IRRXMLSOURCES = irrxml/irrXML.cpp + +CSOURCES = easyzlib.c mkcert.c simpleini/ConvertUTF.c + +CXXSOURCES = $(BIGINTSOURCES) $(LUCRESOURCES) $(IRRXMLSOURCES) \ + OTData.cpp \ + OTString.cpp \ + OTStringXML.cpp \ + OTASCIIArmor.cpp \ + OTContract.cpp \ + OTWallet.cpp \ + OTSignedFile.cpp \ + OTPseudonym.cpp \ + OTMint.cpp \ + OTInstrument.cpp \ + OTCheque.cpp \ + OTPurse.cpp \ + OTLog.cpp \ + OTToken.cpp \ + OTTransactionType.cpp \ + OTItem.cpp \ + OTBasket.cpp \ + OTTransaction.cpp \ + OTLedger.cpp \ + OTAccount.cpp \ + OTEnvelope.cpp \ + OTAssetContract.cpp \ + OTServerContract.cpp \ + OTOffer.cpp \ + OTAgreement.cpp \ + OTTrackable.cpp \ + OTCron.cpp \ + OTCronItem.cpp \ + OTTrade.cpp \ + OTPaymentPlan.cpp \ + OTMarket.cpp \ + OTPayload.cpp \ + OTMessage.cpp \ + OTMessageBuffer.cpp \ + OTIdentifier.cpp \ + OTAsymmetricKey.cpp \ + OTSignature.cpp \ + OTStorage.cpp \ + OTDataCheck.cpp \ + Generics.pb.cpp \ + Markets.pb.cpp \ + Bitcoin.pb.cpp \ + Moneychanger.pb.cpp \ + anyoption.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +COBJECTS = $(CSOURCES:.c=.o) +#CXXFLAGS = $(INCLUDEDIRS) -Wall -Werror +#CFLAGS = $(INCLUDEDIRS) -Wall -Werror +DEBUG_FLAGS = -g +CXX = g++ +CC = gcc +LDFLAGS = $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(LIBDIRS) $(DEBUG_LIBS) + +CXXFLAGS := _____FLAGS_NOT_SET____ +CFLAGS := _____FLAGS_NOT_SET____ + +ifeq ($(DYNAMIC_OTLIB), 1) +CXXFLAGS = $(INCLUDEDIRS) $(FT_FLAGS) -Wall -fPIC +CFLAGS = $(INCLUDEDIRS) $(FT_FLAGS) -Wall -fPIC +else +CXXFLAGS = $(INCLUDEDIRS) $(FT_FLAGS) -Wall +CFLAGS = $(INCLUDEDIRS) $(FT_FLAGS) -Wall +endif + +# +# Default target: the first target is the default target. +# Just type "make" to build it. +# + +all: $(PROGRAM) + +debug: CXXFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + ar rc $(DEBUG_PROGRAM) $(CXXOBJECTS) $(COBJECTS) + +# +# Link target: automatically builds its object dependencies before +# executing its link command. +# + +$(PROGRAM): $(CXXOBJECTS) $(COBJECTS) + ar rc $(PROGRAM) $(CXXOBJECTS) $(COBJECTS) + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +easyzlib.o: easyzlib.c easyzlib.h + $(CC) $(CFLAGS) -c -o easyzlib.o easyzlib.c + +irrxml/irrXML.o: irrxml/irrXML.cpp irrxml/irrXML.h + $(CXX) $(CXXFLAGS) -c -o irrxml/irrXML.o irrxml/irrXML.cpp + +Lucre/bankimp.o: Lucre/bankimp.cpp Lucre/bank.h + $(CXX) $(CXXFLAGS) -c -o Lucre/bankimp.o Lucre/bankimp.cpp + +bigint/BigUnsigned.o: bigint/BigUnsigned.cc bigint/BigUnsigned.hh + $(CXX) $(CXXFLAGS) -c -o bigint/BigUnsigned.o bigint/BigUnsigned.cc +bigint/BigInteger.o: bigint/BigInteger.cc bigint/BigInteger.hh + $(CXX) $(CXXFLAGS) -c -o bigint/BigInteger.o bigint/BigInteger.cc +bigint/BigIntegerAlgorithms.o: bigint/BigIntegerAlgorithms.cc bigint/BigIntegerAlgorithms.hh + $(CXX) $(CXXFLAGS) -c -o bigint/BigIntegerAlgorithms.o bigint/BigIntegerAlgorithms.cc +bigint/BigUnsignedInABase.o: bigint/BigUnsignedInABase.cc bigint/BigUnsignedInABase.hh + $(CXX) $(CXXFLAGS) -c -o bigint/BigUnsignedInABase.o bigint/BigUnsignedInABase.cc +bigint/BigIntegerUtils.o: bigint/BigIntegerUtils.cc bigint/BigIntegerUtils.hh + $(CXX) $(CXXFLAGS) -c -o bigint/BigIntegerUtils.o bigint/BigIntegerUtils.cc + +OTData.o: OTData.cpp OTData.h + $(CXX) $(CXXFLAGS) -c -o OTData.o OTData.cpp +OTString.o: OTString.cpp OTString.h + $(CXX) $(CXXFLAGS) -c -o OTString.o OTString.cpp +OTStringXML.o: OTStringXML.cpp OTStringXML.h + $(CXX) $(CXXFLAGS) -c -o OTStringXML.o OTStringXML.cpp +OTIdentifier.o: OTIdentifier.cpp OTIdentifier.h + $(CXX) $(CXXFLAGS) -c -o OTIdentifier.o OTIdentifier.cpp +OTASCIIArmor.o: OTASCIIArmor.cpp OTASCIIArmor.h + $(CXX) $(CXXFLAGS) -c -o OTASCIIArmor.o OTASCIIArmor.cpp +OTSignature.o: OTSignature.cpp OTSignature.h + $(CXX) $(CXXFLAGS) -c -o OTSignature.o OTSignature.cpp +OTLog.o: OTLog.cpp OTLog.h + $(CXX) $(CXXFLAGS) -c -o OTLog.o OTLog.cpp +OTPseudonym.o: OTPseudonym.cpp OTPseudonym.h + $(CXX) $(CXXFLAGS) -c -o OTPseudonym.o OTPseudonym.cpp +OTContract.o: OTContract.cpp OTContract.h + $(CXX) $(CXXFLAGS) -c -o OTContract.o OTContract.cpp +OTWallet.o: OTWallet.cpp OTWallet.h + $(CXX) $(CXXFLAGS) -c -o OTWallet.o OTWallet.cpp +OTSignedFile.o: OTSignedFile.cpp OTSignedFile.h + $(CXX) $(CXXFLAGS) -c -o OTSignedFile.o OTSignedFile.cpp +OTInstrument.o: OTInstrument.cpp OTInstrument.h + $(CXX) $(CXXFLAGS) -c -o OTInstrument.o OTInstrument.cpp +OTCheque.o: OTCheque.cpp OTCheque.h + $(CXX) $(CXXFLAGS) -c -o OTCheque.o OTCheque.cpp +OTToken.o: OTToken.cpp OTToken.h + $(CXX) $(CXXFLAGS) -c -o OTToken.o OTToken.cpp +OTPurse.o: OTPurse.cpp OTPurse.h + $(CXX) $(CXXFLAGS) -c -o OTPurse.o OTPurse.cpp +OTMint.o: OTMint.cpp OTMint.h + $(CXX) $(CXXFLAGS) -c -o OTMint.o OTMint.cpp +OTTransactionType.o: OTTransactionType.cpp OTTransactionType.h + $(CXX) $(CXXFLAGS) -c -o OTTransactionType.o OTTransactionType.cpp +OTItem.o: OTItem.cpp OTItem.h + $(CXX) $(CXXFLAGS) -c -o OTItem.o OTItem.cpp +OTBasket.o: OTBasket.cpp OTBasket.h + $(CXX) $(CXXFLAGS) -c -o OTBasket.o OTBasket.cpp +OTTransaction.o: OTTransaction.cpp OTTransaction.h + $(CXX) $(CXXFLAGS) -c -o OTTransaction.o OTTransaction.cpp +OTLedger.o: OTLedger.cpp OTLedger.h + $(CXX) $(CXXFLAGS) -c -o OTLedger.o OTLedger.cpp +OTAccount.o: OTAccount.cpp OTAccount.h + $(CXX) $(CXXFLAGS) -c -o OTAccount.o OTAccount.cpp +OTEnvelope.o: OTEnvelope.cpp OTEnvelope.h + $(CXX) $(CXXFLAGS) -c -o OTEnvelope.o OTEnvelope.cpp +OTAssetContract.o: OTAssetContract.cpp OTAssetContract.h + $(CXX) $(CXXFLAGS) -c -o OTAssetContract.o OTAssetContract.cpp +OTServerContract.o: OTServerContract.cpp OTServerContract.h + $(CXX) $(CXXFLAGS) -c -o OTServerContract.o OTServerContract.cpp +OTPayload.o: OTPayload.cpp OTPayload.h + $(CXX) $(CXXFLAGS) -c -o OTPayload.o OTPayload.cpp +OTMessage.o: OTMessage.cpp OTMessage.h + $(CXX) $(CXXFLAGS) -c -o OTMessage.o OTMessage.cpp +OTMessageBuffer.o: OTMessageBuffer.cpp OTMessageBuffer.h + $(CXX) $(CXXFLAGS) -c -o OTMessageBuffer.o OTMessageBuffer.cpp +OTAsymmetricKey.o: OTAsymmetricKey.cpp OTAsymmetricKey.h + $(CXX) $(CXXFLAGS) -c -o OTAsymmetricKey.o OTAsymmetricKey.cpp +OTDataCheck.o: OTDataCheck.cpp OTDataCheck.h + $(CXX) $(CXXFLAGS) -c -o OTDataCheck.o OTDataCheck.cpp +OTAgreement.o: OTAgreement.cpp OTAgreement.h + $(CXX) $(CXXFLAGS) -c -o OTAgreement.o OTAgreement.cpp +OTTrackable.o: OTTrackable.cpp OTTrackable.h + $(CXX) $(CXXFLAGS) -c -o OTTrackable.o OTTrackable.cpp +OTCron.o: OTCron.cpp OTCron.h + $(CXX) $(CXXFLAGS) -c -o OTCron.o OTCron.cpp +OTCronItem.o: OTCronItem.cpp OTCronItem.h + $(CXX) $(CXXFLAGS) -c -o OTCronItem.o OTCronItem.cpp +OTMarket.o: OTMarket.cpp OTMarket.h + $(CXX) $(CXXFLAGS) -c -o OTMarket.o OTMarket.cpp +OTOffer.o: OTOffer.cpp OTOffer.h + $(CXX) $(CXXFLAGS) -c -o OTOffer.o OTOffer.cpp +OTTrade.o: OTTrade.cpp OTTrade.h + $(CXX) $(CXXFLAGS) -c -o OTTrade.o OTTrade.cpp +OTPaymentPlan.o: OTPaymentPlan.cpp OTPaymentPlan.h + $(CXX) $(CXXFLAGS) -c -o OTPaymentPlan.o OTPaymentPlan.cpp +OTStorage.o: OTStorage.cpp OTStorage.h + $(CXX) $(CXXFLAGS) -c -o OTStorage.o OTStorage.cpp +Generics.pb.o: Generics.pb.cpp Generics.pb.h + $(CXX) $(CXXFLAGS) -c -o Generics.pb.o Generics.pb.cpp +Markets.pb.o: Markets.pb.cpp Markets.pb.h + $(CXX) $(CXXFLAGS) -c -o Markets.pb.o Markets.pb.cpp +Bitcoin.pb.o: Bitcoin.pb.cpp Bitcoin.pb.h + $(CXX) $(CXXFLAGS) -c -o Bitcoin.pb.o Bitcoin.pb.cpp +Moneychanger.pb.o: Moneychanger.pb.cpp Moneychanger.pb.h + $(CXX) $(CXXFLAGS) -c -o Moneychanger.pb.o Moneychanger.pb.cpp +anyoption.o: anyoption.cpp anyoption.h + $(CXX) $(CXXFLAGS) -c -o anyoption.o anyoption.cpp + +# +# Clean target: "make -f Makefile.Linux clean" to remove unwanted objects and executables. +# +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(COBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make -f Makefile.Linux run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) + + diff --git a/OTLib/Markets.pb.cpp b/OTLib/Markets.pb.cpp new file mode 100644 index 000000000..09b88d3b8 --- /dev/null +++ b/OTLib/Markets.pb.cpp @@ -0,0 +1,5141 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "Markets.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +namespace { + +const ::google::protobuf::Descriptor* MarketData_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MarketData_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* MarketList_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MarketList_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* OfferDataMarket_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + OfferDataMarket_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* OfferListMarket_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + OfferListMarket_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* TradeDataMarket_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + TradeDataMarket_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* TradeListMarket_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + TradeListMarket_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* OfferDataNym_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + OfferDataNym_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* OfferListNym_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + OfferListNym_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* TradeDataNym_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + TradeDataNym_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* TradeListNym_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + TradeListNym_InternalPB_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_Markets_2eproto() { + protobuf_AddDesc_Markets_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "Markets.proto"); + GOOGLE_CHECK(file != NULL); + MarketData_InternalPB_descriptor_ = file->message_type(0); + static const int MarketData_InternalPB_offsets_[17] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, market_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, asset_type_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, currency_type_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, scale_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, total_assets_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, number_bids_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, number_asks_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, last_sale_price_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, current_bid_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, current_ask_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, volume_trades_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, volume_assets_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, volume_currency_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, recent_highest_bid_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, recent_lowest_ask_), + }; + MarketData_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MarketData_InternalPB_descriptor_, + MarketData_InternalPB::default_instance_, + MarketData_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketData_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MarketData_InternalPB)); + MarketList_InternalPB_descriptor_ = file->message_type(1); + static const int MarketList_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketList_InternalPB, market_data_), + }; + MarketList_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MarketList_InternalPB_descriptor_, + MarketList_InternalPB::default_instance_, + MarketList_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketList_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MarketList_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MarketList_InternalPB)); + OfferDataMarket_InternalPB_descriptor_ = file->message_type(2); + static const int OfferDataMarket_InternalPB_offsets_[5] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, transaction_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, price_per_scale_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, available_assets_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, minimum_increment_), + }; + OfferDataMarket_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + OfferDataMarket_InternalPB_descriptor_, + OfferDataMarket_InternalPB::default_instance_, + OfferDataMarket_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataMarket_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(OfferDataMarket_InternalPB)); + OfferListMarket_InternalPB_descriptor_ = file->message_type(3); + static const int OfferListMarket_InternalPB_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListMarket_InternalPB, bids_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListMarket_InternalPB, asks_), + }; + OfferListMarket_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + OfferListMarket_InternalPB_descriptor_, + OfferListMarket_InternalPB::default_instance_, + OfferListMarket_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListMarket_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListMarket_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(OfferListMarket_InternalPB)); + TradeDataMarket_InternalPB_descriptor_ = file->message_type(4); + static const int TradeDataMarket_InternalPB_offsets_[5] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, transaction_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, date_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, price_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, amount_sold_), + }; + TradeDataMarket_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + TradeDataMarket_InternalPB_descriptor_, + TradeDataMarket_InternalPB::default_instance_, + TradeDataMarket_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataMarket_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(TradeDataMarket_InternalPB)); + TradeListMarket_InternalPB_descriptor_ = file->message_type(5); + static const int TradeListMarket_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListMarket_InternalPB, trades_), + }; + TradeListMarket_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + TradeListMarket_InternalPB_descriptor_, + TradeListMarket_InternalPB::default_instance_, + TradeListMarket_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListMarket_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListMarket_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(TradeListMarket_InternalPB)); + OfferDataNym_InternalPB_descriptor_ = file->message_type(6); + static const int OfferDataNym_InternalPB_offsets_[17] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, valid_from_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, valid_to_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, asset_type_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, asset_acct_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, currency_type_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, currency_acct_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, selling_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, scale_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, price_per_scale_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, transaction_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, total_assets_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, finished_so_far_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, minimum_increment_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, stop_sign_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, stop_price_), + }; + OfferDataNym_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + OfferDataNym_InternalPB_descriptor_, + OfferDataNym_InternalPB::default_instance_, + OfferDataNym_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferDataNym_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(OfferDataNym_InternalPB)); + OfferListNym_InternalPB_descriptor_ = file->message_type(7); + static const int OfferListNym_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListNym_InternalPB, offers_), + }; + OfferListNym_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + OfferListNym_InternalPB_descriptor_, + OfferListNym_InternalPB::default_instance_, + OfferListNym_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListNym_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OfferListNym_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(OfferListNym_InternalPB)); + TradeDataNym_InternalPB_descriptor_ = file->message_type(8); + static const int TradeDataNym_InternalPB_offsets_[6] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, completed_count_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, date_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, price_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, amount_sold_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, transaction_id_), + }; + TradeDataNym_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + TradeDataNym_InternalPB_descriptor_, + TradeDataNym_InternalPB::default_instance_, + TradeDataNym_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeDataNym_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(TradeDataNym_InternalPB)); + TradeListNym_InternalPB_descriptor_ = file->message_type(9); + static const int TradeListNym_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListNym_InternalPB, trades_), + }; + TradeListNym_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + TradeListNym_InternalPB_descriptor_, + TradeListNym_InternalPB::default_instance_, + TradeListNym_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListNym_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TradeListNym_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(TradeListNym_InternalPB)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_Markets_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MarketData_InternalPB_descriptor_, &MarketData_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MarketList_InternalPB_descriptor_, &MarketList_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + OfferDataMarket_InternalPB_descriptor_, &OfferDataMarket_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + OfferListMarket_InternalPB_descriptor_, &OfferListMarket_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + TradeDataMarket_InternalPB_descriptor_, &TradeDataMarket_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + TradeListMarket_InternalPB_descriptor_, &TradeListMarket_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + OfferDataNym_InternalPB_descriptor_, &OfferDataNym_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + OfferListNym_InternalPB_descriptor_, &OfferListNym_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + TradeDataNym_InternalPB_descriptor_, &TradeDataNym_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + TradeListNym_InternalPB_descriptor_, &TradeListNym_InternalPB::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_Markets_2eproto() { + delete MarketData_InternalPB::default_instance_; + delete MarketData_InternalPB_reflection_; + delete MarketList_InternalPB::default_instance_; + delete MarketList_InternalPB_reflection_; + delete OfferDataMarket_InternalPB::default_instance_; + delete OfferDataMarket_InternalPB_reflection_; + delete OfferListMarket_InternalPB::default_instance_; + delete OfferListMarket_InternalPB_reflection_; + delete TradeDataMarket_InternalPB::default_instance_; + delete TradeDataMarket_InternalPB_reflection_; + delete TradeListMarket_InternalPB::default_instance_; + delete TradeListMarket_InternalPB_reflection_; + delete OfferDataNym_InternalPB::default_instance_; + delete OfferDataNym_InternalPB_reflection_; + delete OfferListNym_InternalPB::default_instance_; + delete OfferListNym_InternalPB_reflection_; + delete TradeDataNym_InternalPB::default_instance_; + delete TradeDataNym_InternalPB_reflection_; + delete TradeListNym_InternalPB::default_instance_; + delete TradeListNym_InternalPB_reflection_; +} + +void protobuf_AddDesc_Markets_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\rMarkets.proto\022\004OTDB\"\221\003\n\025MarketData_Int" + "ernalPB\022\021\n\tgui_label\030\001 \001(\t\022\021\n\tserver_id\030" + "\002 \001(\t\022\021\n\tmarket_id\030\003 \001(\t\022\025\n\rasset_type_i" + "d\030\004 \001(\t\022\030\n\020currency_type_id\030\005 \001(\t\022\r\n\005sca" + "le\030\006 \001(\t\022\024\n\014total_assets\030\007 \001(\t\022\023\n\013number" + "_bids\030\010 \001(\t\022\023\n\013number_asks\030\t \001(\t\022\027\n\017last" + "_sale_price\030\n \001(\t\022\023\n\013current_bid\030\013 \001(\t\022\023" + "\n\013current_ask\030\014 \001(\t\022\025\n\rvolume_trades\030\r \001" + "(\t\022\025\n\rvolume_assets\030\016 \001(\t\022\027\n\017volume_curr" + "ency\030\017 \001(\t\022\032\n\022recent_highest_bid\030\020 \001(\t\022\031" + "\n\021recent_lowest_ask\030\021 \001(\t\"I\n\025MarketList_" + "InternalPB\0220\n\013market_data\030\001 \003(\0132\033.OTDB.M" + "arketData_InternalPB\"\225\001\n\032OfferDataMarket" + "_InternalPB\022\021\n\tgui_label\030\001 \001(\t\022\026\n\016transa" + "ction_id\030\002 \001(\t\022\027\n\017price_per_scale\030\003 \001(\t\022" + "\030\n\020available_assets\030\004 \001(\t\022\031\n\021minimum_inc" + "rement\030\005 \001(\t\"|\n\032OfferListMarket_Internal" + "PB\022.\n\004bids\030\001 \003(\0132 .OTDB.OfferDataMarket_" + "InternalPB\022.\n\004asks\030\002 \003(\0132 .OTDB.OfferDat" + "aMarket_InternalPB\"y\n\032TradeDataMarket_In" + "ternalPB\022\021\n\tgui_label\030\001 \001(\t\022\026\n\016transacti" + "on_id\030\002 \001(\t\022\014\n\004date\030\003 \001(\t\022\r\n\005price\030\004 \001(\t" + "\022\023\n\013amount_sold\030\005 \001(\t\"N\n\032TradeListMarket" + "_InternalPB\0220\n\006trades\030\001 \003(\0132 .OTDB.Trade" + "DataMarket_InternalPB\"\211\003\n\027OfferDataNym_I" + "nternalPB\022\021\n\tgui_label\030\001 \001(\t\022\022\n\nvalid_fr" + "om\030\002 \001(\t\022\020\n\010valid_to\030\003 \001(\t\022\021\n\tserver_id\030" + "\004 \001(\t\022\025\n\rasset_type_id\030\005 \001(\t\022\025\n\rasset_ac" + "ct_id\030\006 \001(\t\022\030\n\020currency_type_id\030\007 \001(\t\022\030\n" + "\020currency_acct_id\030\010 \001(\t\022\017\n\007selling\030\t \001(\010" + "\022\r\n\005scale\030\n \001(\t\022\027\n\017price_per_scale\030\013 \001(\t" + "\022\026\n\016transaction_id\030\014 \001(\t\022\024\n\014total_assets" + "\030\r \001(\t\022\027\n\017finished_so_far\030\016 \001(\t\022\031\n\021minim" + "um_increment\030\017 \001(\t\022\021\n\tstop_sign\030\020 \001(\t\022\022\n" + "\nstop_price\030\021 \001(\t\"H\n\027OfferListNym_Intern" + "alPB\022-\n\006offers\030\001 \003(\0132\035.OTDB.OfferDataNym" + "_InternalPB\"\217\001\n\027TradeDataNym_InternalPB\022" + "\021\n\tgui_label\030\001 \001(\t\022\027\n\017completed_count\030\002 " + "\001(\t\022\014\n\004date\030\003 \001(\t\022\r\n\005price\030\004 \001(\t\022\023\n\013amou" + "nt_sold\030\005 \001(\t\022\026\n\016transaction_id\030\006 \001(\t\"H\n" + "\027TradeListNym_InternalPB\022-\n\006trades\030\001 \003(\013" + "2\035.OTDB.TradeDataNym_InternalPB", 1671); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "Markets.proto", &protobuf_RegisterTypes); + MarketData_InternalPB::default_instance_ = new MarketData_InternalPB(); + MarketList_InternalPB::default_instance_ = new MarketList_InternalPB(); + OfferDataMarket_InternalPB::default_instance_ = new OfferDataMarket_InternalPB(); + OfferListMarket_InternalPB::default_instance_ = new OfferListMarket_InternalPB(); + TradeDataMarket_InternalPB::default_instance_ = new TradeDataMarket_InternalPB(); + TradeListMarket_InternalPB::default_instance_ = new TradeListMarket_InternalPB(); + OfferDataNym_InternalPB::default_instance_ = new OfferDataNym_InternalPB(); + OfferListNym_InternalPB::default_instance_ = new OfferListNym_InternalPB(); + TradeDataNym_InternalPB::default_instance_ = new TradeDataNym_InternalPB(); + TradeListNym_InternalPB::default_instance_ = new TradeListNym_InternalPB(); + MarketData_InternalPB::default_instance_->InitAsDefaultInstance(); + MarketList_InternalPB::default_instance_->InitAsDefaultInstance(); + OfferDataMarket_InternalPB::default_instance_->InitAsDefaultInstance(); + OfferListMarket_InternalPB::default_instance_->InitAsDefaultInstance(); + TradeDataMarket_InternalPB::default_instance_->InitAsDefaultInstance(); + TradeListMarket_InternalPB::default_instance_->InitAsDefaultInstance(); + OfferDataNym_InternalPB::default_instance_->InitAsDefaultInstance(); + OfferListNym_InternalPB::default_instance_->InitAsDefaultInstance(); + TradeDataNym_InternalPB::default_instance_->InitAsDefaultInstance(); + TradeListNym_InternalPB::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_Markets_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_Markets_2eproto { + StaticDescriptorInitializer_Markets_2eproto() { + protobuf_AddDesc_Markets_2eproto(); + } +} static_descriptor_initializer_Markets_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int MarketData_InternalPB::kGuiLabelFieldNumber; +const int MarketData_InternalPB::kServerIdFieldNumber; +const int MarketData_InternalPB::kMarketIdFieldNumber; +const int MarketData_InternalPB::kAssetTypeIdFieldNumber; +const int MarketData_InternalPB::kCurrencyTypeIdFieldNumber; +const int MarketData_InternalPB::kScaleFieldNumber; +const int MarketData_InternalPB::kTotalAssetsFieldNumber; +const int MarketData_InternalPB::kNumberBidsFieldNumber; +const int MarketData_InternalPB::kNumberAsksFieldNumber; +const int MarketData_InternalPB::kLastSalePriceFieldNumber; +const int MarketData_InternalPB::kCurrentBidFieldNumber; +const int MarketData_InternalPB::kCurrentAskFieldNumber; +const int MarketData_InternalPB::kVolumeTradesFieldNumber; +const int MarketData_InternalPB::kVolumeAssetsFieldNumber; +const int MarketData_InternalPB::kVolumeCurrencyFieldNumber; +const int MarketData_InternalPB::kRecentHighestBidFieldNumber; +const int MarketData_InternalPB::kRecentLowestAskFieldNumber; +#endif // !_MSC_VER + +MarketData_InternalPB::MarketData_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void MarketData_InternalPB::InitAsDefaultInstance() { +} + +MarketData_InternalPB::MarketData_InternalPB(const MarketData_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void MarketData_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + market_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + currency_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + total_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + number_bids_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + number_asks_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + last_sale_price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + current_bid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + current_ask_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + volume_trades_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + volume_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + volume_currency_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + recent_highest_bid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + recent_lowest_ask_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MarketData_InternalPB::~MarketData_InternalPB() { + SharedDtor(); +} + +void MarketData_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (market_id_ != &::google::protobuf::internal::kEmptyString) { + delete market_id_; + } + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + delete asset_type_id_; + } + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + delete currency_type_id_; + } + if (scale_ != &::google::protobuf::internal::kEmptyString) { + delete scale_; + } + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + delete total_assets_; + } + if (number_bids_ != &::google::protobuf::internal::kEmptyString) { + delete number_bids_; + } + if (number_asks_ != &::google::protobuf::internal::kEmptyString) { + delete number_asks_; + } + if (last_sale_price_ != &::google::protobuf::internal::kEmptyString) { + delete last_sale_price_; + } + if (current_bid_ != &::google::protobuf::internal::kEmptyString) { + delete current_bid_; + } + if (current_ask_ != &::google::protobuf::internal::kEmptyString) { + delete current_ask_; + } + if (volume_trades_ != &::google::protobuf::internal::kEmptyString) { + delete volume_trades_; + } + if (volume_assets_ != &::google::protobuf::internal::kEmptyString) { + delete volume_assets_; + } + if (volume_currency_ != &::google::protobuf::internal::kEmptyString) { + delete volume_currency_; + } + if (recent_highest_bid_ != &::google::protobuf::internal::kEmptyString) { + delete recent_highest_bid_; + } + if (recent_lowest_ask_ != &::google::protobuf::internal::kEmptyString) { + delete recent_lowest_ask_; + } + if (this != default_instance_) { + } +} + +void MarketData_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MarketData_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MarketData_InternalPB_descriptor_; +} + +const MarketData_InternalPB& MarketData_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +MarketData_InternalPB* MarketData_InternalPB::default_instance_ = NULL; + +MarketData_InternalPB* MarketData_InternalPB::New() const { + return new MarketData_InternalPB; +} + +void MarketData_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_market_id()) { + if (market_id_ != &::google::protobuf::internal::kEmptyString) { + market_id_->clear(); + } + } + if (has_asset_type_id()) { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + } + if (has_currency_type_id()) { + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + currency_type_id_->clear(); + } + } + if (has_scale()) { + if (scale_ != &::google::protobuf::internal::kEmptyString) { + scale_->clear(); + } + } + if (has_total_assets()) { + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + total_assets_->clear(); + } + } + if (has_number_bids()) { + if (number_bids_ != &::google::protobuf::internal::kEmptyString) { + number_bids_->clear(); + } + } + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (has_number_asks()) { + if (number_asks_ != &::google::protobuf::internal::kEmptyString) { + number_asks_->clear(); + } + } + if (has_last_sale_price()) { + if (last_sale_price_ != &::google::protobuf::internal::kEmptyString) { + last_sale_price_->clear(); + } + } + if (has_current_bid()) { + if (current_bid_ != &::google::protobuf::internal::kEmptyString) { + current_bid_->clear(); + } + } + if (has_current_ask()) { + if (current_ask_ != &::google::protobuf::internal::kEmptyString) { + current_ask_->clear(); + } + } + if (has_volume_trades()) { + if (volume_trades_ != &::google::protobuf::internal::kEmptyString) { + volume_trades_->clear(); + } + } + if (has_volume_assets()) { + if (volume_assets_ != &::google::protobuf::internal::kEmptyString) { + volume_assets_->clear(); + } + } + if (has_volume_currency()) { + if (volume_currency_ != &::google::protobuf::internal::kEmptyString) { + volume_currency_->clear(); + } + } + if (has_recent_highest_bid()) { + if (recent_highest_bid_ != &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_->clear(); + } + } + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (has_recent_lowest_ask()) { + if (recent_lowest_ask_ != &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MarketData_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_market_id; + break; + } + + // optional string market_id = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_market_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_market_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->market_id().data(), this->market_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_asset_type_id; + break; + } + + // optional string asset_type_id = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_asset_type_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_asset_type_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_currency_type_id; + break; + } + + // optional string currency_type_id = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_currency_type_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_currency_type_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_scale; + break; + } + + // optional string scale = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_scale: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_scale())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_total_assets; + break; + } + + // optional string total_assets = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_total_assets: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_total_assets())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_number_bids; + break; + } + + // optional string number_bids = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_number_bids: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_number_bids())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_bids().data(), this->number_bids().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_number_asks; + break; + } + + // optional string number_asks = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_number_asks: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_number_asks())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_asks().data(), this->number_asks().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(82)) goto parse_last_sale_price; + break; + } + + // optional string last_sale_price = 10; + case 10: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_last_sale_price: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_last_sale_price())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->last_sale_price().data(), this->last_sale_price().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(90)) goto parse_current_bid; + break; + } + + // optional string current_bid = 11; + case 11: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_current_bid: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_current_bid())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_bid().data(), this->current_bid().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(98)) goto parse_current_ask; + break; + } + + // optional string current_ask = 12; + case 12: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_current_ask: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_current_ask())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_ask().data(), this->current_ask().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(106)) goto parse_volume_trades; + break; + } + + // optional string volume_trades = 13; + case 13: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_volume_trades: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_volume_trades())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_trades().data(), this->volume_trades().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(114)) goto parse_volume_assets; + break; + } + + // optional string volume_assets = 14; + case 14: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_volume_assets: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_volume_assets())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_assets().data(), this->volume_assets().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_volume_currency; + break; + } + + // optional string volume_currency = 15; + case 15: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_volume_currency: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_volume_currency())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_currency().data(), this->volume_currency().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(130)) goto parse_recent_highest_bid; + break; + } + + // optional string recent_highest_bid = 16; + case 16: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_recent_highest_bid: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_recent_highest_bid())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_highest_bid().data(), this->recent_highest_bid().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(138)) goto parse_recent_lowest_ask; + break; + } + + // optional string recent_lowest_ask = 17; + case 17: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_recent_lowest_ask: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_recent_lowest_ask())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_lowest_ask().data(), this->recent_lowest_ask().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void MarketData_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + // optional string market_id = 3; + if (has_market_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->market_id().data(), this->market_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->market_id(), output); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->asset_type_id(), output); + } + + // optional string currency_type_id = 5; + if (has_currency_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->currency_type_id(), output); + } + + // optional string scale = 6; + if (has_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->scale(), output); + } + + // optional string total_assets = 7; + if (has_total_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->total_assets(), output); + } + + // optional string number_bids = 8; + if (has_number_bids()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_bids().data(), this->number_bids().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->number_bids(), output); + } + + // optional string number_asks = 9; + if (has_number_asks()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_asks().data(), this->number_asks().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 9, this->number_asks(), output); + } + + // optional string last_sale_price = 10; + if (has_last_sale_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->last_sale_price().data(), this->last_sale_price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 10, this->last_sale_price(), output); + } + + // optional string current_bid = 11; + if (has_current_bid()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_bid().data(), this->current_bid().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 11, this->current_bid(), output); + } + + // optional string current_ask = 12; + if (has_current_ask()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_ask().data(), this->current_ask().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 12, this->current_ask(), output); + } + + // optional string volume_trades = 13; + if (has_volume_trades()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_trades().data(), this->volume_trades().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 13, this->volume_trades(), output); + } + + // optional string volume_assets = 14; + if (has_volume_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_assets().data(), this->volume_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 14, this->volume_assets(), output); + } + + // optional string volume_currency = 15; + if (has_volume_currency()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_currency().data(), this->volume_currency().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 15, this->volume_currency(), output); + } + + // optional string recent_highest_bid = 16; + if (has_recent_highest_bid()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_highest_bid().data(), this->recent_highest_bid().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 16, this->recent_highest_bid(), output); + } + + // optional string recent_lowest_ask = 17; + if (has_recent_lowest_ask()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_lowest_ask().data(), this->recent_lowest_ask().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 17, this->recent_lowest_ask(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* MarketData_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + // optional string market_id = 3; + if (has_market_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->market_id().data(), this->market_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->market_id(), target); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->asset_type_id(), target); + } + + // optional string currency_type_id = 5; + if (has_currency_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->currency_type_id(), target); + } + + // optional string scale = 6; + if (has_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->scale(), target); + } + + // optional string total_assets = 7; + if (has_total_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->total_assets(), target); + } + + // optional string number_bids = 8; + if (has_number_bids()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_bids().data(), this->number_bids().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->number_bids(), target); + } + + // optional string number_asks = 9; + if (has_number_asks()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->number_asks().data(), this->number_asks().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 9, this->number_asks(), target); + } + + // optional string last_sale_price = 10; + if (has_last_sale_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->last_sale_price().data(), this->last_sale_price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 10, this->last_sale_price(), target); + } + + // optional string current_bid = 11; + if (has_current_bid()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_bid().data(), this->current_bid().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 11, this->current_bid(), target); + } + + // optional string current_ask = 12; + if (has_current_ask()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->current_ask().data(), this->current_ask().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 12, this->current_ask(), target); + } + + // optional string volume_trades = 13; + if (has_volume_trades()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_trades().data(), this->volume_trades().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 13, this->volume_trades(), target); + } + + // optional string volume_assets = 14; + if (has_volume_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_assets().data(), this->volume_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 14, this->volume_assets(), target); + } + + // optional string volume_currency = 15; + if (has_volume_currency()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->volume_currency().data(), this->volume_currency().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 15, this->volume_currency(), target); + } + + // optional string recent_highest_bid = 16; + if (has_recent_highest_bid()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_highest_bid().data(), this->recent_highest_bid().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 16, this->recent_highest_bid(), target); + } + + // optional string recent_lowest_ask = 17; + if (has_recent_lowest_ask()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->recent_lowest_ask().data(), this->recent_lowest_ask().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 17, this->recent_lowest_ask(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int MarketData_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string market_id = 3; + if (has_market_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->market_id()); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->asset_type_id()); + } + + // optional string currency_type_id = 5; + if (has_currency_type_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->currency_type_id()); + } + + // optional string scale = 6; + if (has_scale()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->scale()); + } + + // optional string total_assets = 7; + if (has_total_assets()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->total_assets()); + } + + // optional string number_bids = 8; + if (has_number_bids()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->number_bids()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional string number_asks = 9; + if (has_number_asks()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->number_asks()); + } + + // optional string last_sale_price = 10; + if (has_last_sale_price()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->last_sale_price()); + } + + // optional string current_bid = 11; + if (has_current_bid()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->current_bid()); + } + + // optional string current_ask = 12; + if (has_current_ask()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->current_ask()); + } + + // optional string volume_trades = 13; + if (has_volume_trades()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->volume_trades()); + } + + // optional string volume_assets = 14; + if (has_volume_assets()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->volume_assets()); + } + + // optional string volume_currency = 15; + if (has_volume_currency()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->volume_currency()); + } + + // optional string recent_highest_bid = 16; + if (has_recent_highest_bid()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->recent_highest_bid()); + } + + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + // optional string recent_lowest_ask = 17; + if (has_recent_lowest_ask()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->recent_lowest_ask()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MarketData_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MarketData_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MarketData_InternalPB::MergeFrom(const MarketData_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_market_id()) { + set_market_id(from.market_id()); + } + if (from.has_asset_type_id()) { + set_asset_type_id(from.asset_type_id()); + } + if (from.has_currency_type_id()) { + set_currency_type_id(from.currency_type_id()); + } + if (from.has_scale()) { + set_scale(from.scale()); + } + if (from.has_total_assets()) { + set_total_assets(from.total_assets()); + } + if (from.has_number_bids()) { + set_number_bids(from.number_bids()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_number_asks()) { + set_number_asks(from.number_asks()); + } + if (from.has_last_sale_price()) { + set_last_sale_price(from.last_sale_price()); + } + if (from.has_current_bid()) { + set_current_bid(from.current_bid()); + } + if (from.has_current_ask()) { + set_current_ask(from.current_ask()); + } + if (from.has_volume_trades()) { + set_volume_trades(from.volume_trades()); + } + if (from.has_volume_assets()) { + set_volume_assets(from.volume_assets()); + } + if (from.has_volume_currency()) { + set_volume_currency(from.volume_currency()); + } + if (from.has_recent_highest_bid()) { + set_recent_highest_bid(from.recent_highest_bid()); + } + } + if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (from.has_recent_lowest_ask()) { + set_recent_lowest_ask(from.recent_lowest_ask()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MarketData_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MarketData_InternalPB::CopyFrom(const MarketData_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MarketData_InternalPB::IsInitialized() const { + + return true; +} + +void MarketData_InternalPB::Swap(MarketData_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_id_, other->server_id_); + std::swap(market_id_, other->market_id_); + std::swap(asset_type_id_, other->asset_type_id_); + std::swap(currency_type_id_, other->currency_type_id_); + std::swap(scale_, other->scale_); + std::swap(total_assets_, other->total_assets_); + std::swap(number_bids_, other->number_bids_); + std::swap(number_asks_, other->number_asks_); + std::swap(last_sale_price_, other->last_sale_price_); + std::swap(current_bid_, other->current_bid_); + std::swap(current_ask_, other->current_ask_); + std::swap(volume_trades_, other->volume_trades_); + std::swap(volume_assets_, other->volume_assets_); + std::swap(volume_currency_, other->volume_currency_); + std::swap(recent_highest_bid_, other->recent_highest_bid_); + std::swap(recent_lowest_ask_, other->recent_lowest_ask_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MarketData_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MarketData_InternalPB_descriptor_; + metadata.reflection = MarketData_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MarketList_InternalPB::kMarketDataFieldNumber; +#endif // !_MSC_VER + +MarketList_InternalPB::MarketList_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void MarketList_InternalPB::InitAsDefaultInstance() { +} + +MarketList_InternalPB::MarketList_InternalPB(const MarketList_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void MarketList_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MarketList_InternalPB::~MarketList_InternalPB() { + SharedDtor(); +} + +void MarketList_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void MarketList_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MarketList_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MarketList_InternalPB_descriptor_; +} + +const MarketList_InternalPB& MarketList_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +MarketList_InternalPB* MarketList_InternalPB::default_instance_ = NULL; + +MarketList_InternalPB* MarketList_InternalPB::New() const { + return new MarketList_InternalPB; +} + +void MarketList_InternalPB::Clear() { + market_data_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MarketList_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.MarketData_InternalPB market_data = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_market_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_market_data())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_market_data; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void MarketList_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.MarketData_InternalPB market_data = 1; + for (int i = 0; i < this->market_data_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->market_data(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* MarketList_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.MarketData_InternalPB market_data = 1; + for (int i = 0; i < this->market_data_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->market_data(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int MarketList_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.MarketData_InternalPB market_data = 1; + total_size += 1 * this->market_data_size(); + for (int i = 0; i < this->market_data_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->market_data(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MarketList_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MarketList_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MarketList_InternalPB::MergeFrom(const MarketList_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + market_data_.MergeFrom(from.market_data_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MarketList_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MarketList_InternalPB::CopyFrom(const MarketList_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MarketList_InternalPB::IsInitialized() const { + + return true; +} + +void MarketList_InternalPB::Swap(MarketList_InternalPB* other) { + if (other != this) { + market_data_.Swap(&other->market_data_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MarketList_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MarketList_InternalPB_descriptor_; + metadata.reflection = MarketList_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int OfferDataMarket_InternalPB::kGuiLabelFieldNumber; +const int OfferDataMarket_InternalPB::kTransactionIdFieldNumber; +const int OfferDataMarket_InternalPB::kPricePerScaleFieldNumber; +const int OfferDataMarket_InternalPB::kAvailableAssetsFieldNumber; +const int OfferDataMarket_InternalPB::kMinimumIncrementFieldNumber; +#endif // !_MSC_VER + +OfferDataMarket_InternalPB::OfferDataMarket_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void OfferDataMarket_InternalPB::InitAsDefaultInstance() { +} + +OfferDataMarket_InternalPB::OfferDataMarket_InternalPB(const OfferDataMarket_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void OfferDataMarket_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + price_per_scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + available_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + minimum_increment_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +OfferDataMarket_InternalPB::~OfferDataMarket_InternalPB() { + SharedDtor(); +} + +void OfferDataMarket_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + delete transaction_id_; + } + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + delete price_per_scale_; + } + if (available_assets_ != &::google::protobuf::internal::kEmptyString) { + delete available_assets_; + } + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + delete minimum_increment_; + } + if (this != default_instance_) { + } +} + +void OfferDataMarket_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* OfferDataMarket_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return OfferDataMarket_InternalPB_descriptor_; +} + +const OfferDataMarket_InternalPB& OfferDataMarket_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +OfferDataMarket_InternalPB* OfferDataMarket_InternalPB::default_instance_ = NULL; + +OfferDataMarket_InternalPB* OfferDataMarket_InternalPB::New() const { + return new OfferDataMarket_InternalPB; +} + +void OfferDataMarket_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_transaction_id()) { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + } + if (has_price_per_scale()) { + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + price_per_scale_->clear(); + } + } + if (has_available_assets()) { + if (available_assets_ != &::google::protobuf::internal::kEmptyString) { + available_assets_->clear(); + } + } + if (has_minimum_increment()) { + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + minimum_increment_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool OfferDataMarket_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_transaction_id; + break; + } + + // optional string transaction_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_transaction_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_transaction_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_price_per_scale; + break; + } + + // optional string price_per_scale = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_price_per_scale: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_price_per_scale())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_available_assets; + break; + } + + // optional string available_assets = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_available_assets: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_available_assets())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->available_assets().data(), this->available_assets().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_minimum_increment; + break; + } + + // optional string minimum_increment = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_minimum_increment: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_minimum_increment())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void OfferDataMarket_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->transaction_id(), output); + } + + // optional string price_per_scale = 3; + if (has_price_per_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->price_per_scale(), output); + } + + // optional string available_assets = 4; + if (has_available_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->available_assets().data(), this->available_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->available_assets(), output); + } + + // optional string minimum_increment = 5; + if (has_minimum_increment()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->minimum_increment(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* OfferDataMarket_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->transaction_id(), target); + } + + // optional string price_per_scale = 3; + if (has_price_per_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->price_per_scale(), target); + } + + // optional string available_assets = 4; + if (has_available_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->available_assets().data(), this->available_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->available_assets(), target); + } + + // optional string minimum_increment = 5; + if (has_minimum_increment()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->minimum_increment(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int OfferDataMarket_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->transaction_id()); + } + + // optional string price_per_scale = 3; + if (has_price_per_scale()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->price_per_scale()); + } + + // optional string available_assets = 4; + if (has_available_assets()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->available_assets()); + } + + // optional string minimum_increment = 5; + if (has_minimum_increment()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->minimum_increment()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void OfferDataMarket_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const OfferDataMarket_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void OfferDataMarket_InternalPB::MergeFrom(const OfferDataMarket_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_transaction_id()) { + set_transaction_id(from.transaction_id()); + } + if (from.has_price_per_scale()) { + set_price_per_scale(from.price_per_scale()); + } + if (from.has_available_assets()) { + set_available_assets(from.available_assets()); + } + if (from.has_minimum_increment()) { + set_minimum_increment(from.minimum_increment()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void OfferDataMarket_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OfferDataMarket_InternalPB::CopyFrom(const OfferDataMarket_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OfferDataMarket_InternalPB::IsInitialized() const { + + return true; +} + +void OfferDataMarket_InternalPB::Swap(OfferDataMarket_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(transaction_id_, other->transaction_id_); + std::swap(price_per_scale_, other->price_per_scale_); + std::swap(available_assets_, other->available_assets_); + std::swap(minimum_increment_, other->minimum_increment_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata OfferDataMarket_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = OfferDataMarket_InternalPB_descriptor_; + metadata.reflection = OfferDataMarket_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int OfferListMarket_InternalPB::kBidsFieldNumber; +const int OfferListMarket_InternalPB::kAsksFieldNumber; +#endif // !_MSC_VER + +OfferListMarket_InternalPB::OfferListMarket_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void OfferListMarket_InternalPB::InitAsDefaultInstance() { +} + +OfferListMarket_InternalPB::OfferListMarket_InternalPB(const OfferListMarket_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void OfferListMarket_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +OfferListMarket_InternalPB::~OfferListMarket_InternalPB() { + SharedDtor(); +} + +void OfferListMarket_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void OfferListMarket_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* OfferListMarket_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return OfferListMarket_InternalPB_descriptor_; +} + +const OfferListMarket_InternalPB& OfferListMarket_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +OfferListMarket_InternalPB* OfferListMarket_InternalPB::default_instance_ = NULL; + +OfferListMarket_InternalPB* OfferListMarket_InternalPB::New() const { + return new OfferListMarket_InternalPB; +} + +void OfferListMarket_InternalPB::Clear() { + bids_.Clear(); + asks_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool OfferListMarket_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.OfferDataMarket_InternalPB bids = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bids: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bids())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_bids; + if (input->ExpectTag(18)) goto parse_asks; + break; + } + + // repeated .OTDB.OfferDataMarket_InternalPB asks = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_asks: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_asks())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_asks; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void OfferListMarket_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.OfferDataMarket_InternalPB bids = 1; + for (int i = 0; i < this->bids_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->bids(i), output); + } + + // repeated .OTDB.OfferDataMarket_InternalPB asks = 2; + for (int i = 0; i < this->asks_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->asks(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* OfferListMarket_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.OfferDataMarket_InternalPB bids = 1; + for (int i = 0; i < this->bids_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->bids(i), target); + } + + // repeated .OTDB.OfferDataMarket_InternalPB asks = 2; + for (int i = 0; i < this->asks_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->asks(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int OfferListMarket_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.OfferDataMarket_InternalPB bids = 1; + total_size += 1 * this->bids_size(); + for (int i = 0; i < this->bids_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bids(i)); + } + + // repeated .OTDB.OfferDataMarket_InternalPB asks = 2; + total_size += 1 * this->asks_size(); + for (int i = 0; i < this->asks_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->asks(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void OfferListMarket_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const OfferListMarket_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void OfferListMarket_InternalPB::MergeFrom(const OfferListMarket_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + bids_.MergeFrom(from.bids_); + asks_.MergeFrom(from.asks_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void OfferListMarket_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OfferListMarket_InternalPB::CopyFrom(const OfferListMarket_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OfferListMarket_InternalPB::IsInitialized() const { + + return true; +} + +void OfferListMarket_InternalPB::Swap(OfferListMarket_InternalPB* other) { + if (other != this) { + bids_.Swap(&other->bids_); + asks_.Swap(&other->asks_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata OfferListMarket_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = OfferListMarket_InternalPB_descriptor_; + metadata.reflection = OfferListMarket_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int TradeDataMarket_InternalPB::kGuiLabelFieldNumber; +const int TradeDataMarket_InternalPB::kTransactionIdFieldNumber; +const int TradeDataMarket_InternalPB::kDateFieldNumber; +const int TradeDataMarket_InternalPB::kPriceFieldNumber; +const int TradeDataMarket_InternalPB::kAmountSoldFieldNumber; +#endif // !_MSC_VER + +TradeDataMarket_InternalPB::TradeDataMarket_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void TradeDataMarket_InternalPB::InitAsDefaultInstance() { +} + +TradeDataMarket_InternalPB::TradeDataMarket_InternalPB(const TradeDataMarket_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void TradeDataMarket_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + date_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + amount_sold_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +TradeDataMarket_InternalPB::~TradeDataMarket_InternalPB() { + SharedDtor(); +} + +void TradeDataMarket_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + delete transaction_id_; + } + if (date_ != &::google::protobuf::internal::kEmptyString) { + delete date_; + } + if (price_ != &::google::protobuf::internal::kEmptyString) { + delete price_; + } + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + delete amount_sold_; + } + if (this != default_instance_) { + } +} + +void TradeDataMarket_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* TradeDataMarket_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return TradeDataMarket_InternalPB_descriptor_; +} + +const TradeDataMarket_InternalPB& TradeDataMarket_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +TradeDataMarket_InternalPB* TradeDataMarket_InternalPB::default_instance_ = NULL; + +TradeDataMarket_InternalPB* TradeDataMarket_InternalPB::New() const { + return new TradeDataMarket_InternalPB; +} + +void TradeDataMarket_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_transaction_id()) { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + } + if (has_date()) { + if (date_ != &::google::protobuf::internal::kEmptyString) { + date_->clear(); + } + } + if (has_price()) { + if (price_ != &::google::protobuf::internal::kEmptyString) { + price_->clear(); + } + } + if (has_amount_sold()) { + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + amount_sold_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool TradeDataMarket_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_transaction_id; + break; + } + + // optional string transaction_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_transaction_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_transaction_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_date; + break; + } + + // optional string date = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_date: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_date())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_price; + break; + } + + // optional string price = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_price: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_price())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_amount_sold; + break; + } + + // optional string amount_sold = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_amount_sold: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_amount_sold())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void TradeDataMarket_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->transaction_id(), output); + } + + // optional string date = 3; + if (has_date()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->date(), output); + } + + // optional string price = 4; + if (has_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->price(), output); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->amount_sold(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* TradeDataMarket_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->transaction_id(), target); + } + + // optional string date = 3; + if (has_date()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->date(), target); + } + + // optional string price = 4; + if (has_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->price(), target); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->amount_sold(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int TradeDataMarket_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string transaction_id = 2; + if (has_transaction_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->transaction_id()); + } + + // optional string date = 3; + if (has_date()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->date()); + } + + // optional string price = 4; + if (has_price()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->price()); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->amount_sold()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void TradeDataMarket_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const TradeDataMarket_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void TradeDataMarket_InternalPB::MergeFrom(const TradeDataMarket_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_transaction_id()) { + set_transaction_id(from.transaction_id()); + } + if (from.has_date()) { + set_date(from.date()); + } + if (from.has_price()) { + set_price(from.price()); + } + if (from.has_amount_sold()) { + set_amount_sold(from.amount_sold()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void TradeDataMarket_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void TradeDataMarket_InternalPB::CopyFrom(const TradeDataMarket_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool TradeDataMarket_InternalPB::IsInitialized() const { + + return true; +} + +void TradeDataMarket_InternalPB::Swap(TradeDataMarket_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(transaction_id_, other->transaction_id_); + std::swap(date_, other->date_); + std::swap(price_, other->price_); + std::swap(amount_sold_, other->amount_sold_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata TradeDataMarket_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = TradeDataMarket_InternalPB_descriptor_; + metadata.reflection = TradeDataMarket_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int TradeListMarket_InternalPB::kTradesFieldNumber; +#endif // !_MSC_VER + +TradeListMarket_InternalPB::TradeListMarket_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void TradeListMarket_InternalPB::InitAsDefaultInstance() { +} + +TradeListMarket_InternalPB::TradeListMarket_InternalPB(const TradeListMarket_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void TradeListMarket_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +TradeListMarket_InternalPB::~TradeListMarket_InternalPB() { + SharedDtor(); +} + +void TradeListMarket_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void TradeListMarket_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* TradeListMarket_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return TradeListMarket_InternalPB_descriptor_; +} + +const TradeListMarket_InternalPB& TradeListMarket_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +TradeListMarket_InternalPB* TradeListMarket_InternalPB::default_instance_ = NULL; + +TradeListMarket_InternalPB* TradeListMarket_InternalPB::New() const { + return new TradeListMarket_InternalPB; +} + +void TradeListMarket_InternalPB::Clear() { + trades_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool TradeListMarket_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.TradeDataMarket_InternalPB trades = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_trades: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_trades())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_trades; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void TradeListMarket_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.TradeDataMarket_InternalPB trades = 1; + for (int i = 0; i < this->trades_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->trades(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* TradeListMarket_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.TradeDataMarket_InternalPB trades = 1; + for (int i = 0; i < this->trades_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->trades(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int TradeListMarket_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.TradeDataMarket_InternalPB trades = 1; + total_size += 1 * this->trades_size(); + for (int i = 0; i < this->trades_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->trades(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void TradeListMarket_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const TradeListMarket_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void TradeListMarket_InternalPB::MergeFrom(const TradeListMarket_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + trades_.MergeFrom(from.trades_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void TradeListMarket_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void TradeListMarket_InternalPB::CopyFrom(const TradeListMarket_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool TradeListMarket_InternalPB::IsInitialized() const { + + return true; +} + +void TradeListMarket_InternalPB::Swap(TradeListMarket_InternalPB* other) { + if (other != this) { + trades_.Swap(&other->trades_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata TradeListMarket_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = TradeListMarket_InternalPB_descriptor_; + metadata.reflection = TradeListMarket_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int OfferDataNym_InternalPB::kGuiLabelFieldNumber; +const int OfferDataNym_InternalPB::kValidFromFieldNumber; +const int OfferDataNym_InternalPB::kValidToFieldNumber; +const int OfferDataNym_InternalPB::kServerIdFieldNumber; +const int OfferDataNym_InternalPB::kAssetTypeIdFieldNumber; +const int OfferDataNym_InternalPB::kAssetAcctIdFieldNumber; +const int OfferDataNym_InternalPB::kCurrencyTypeIdFieldNumber; +const int OfferDataNym_InternalPB::kCurrencyAcctIdFieldNumber; +const int OfferDataNym_InternalPB::kSellingFieldNumber; +const int OfferDataNym_InternalPB::kScaleFieldNumber; +const int OfferDataNym_InternalPB::kPricePerScaleFieldNumber; +const int OfferDataNym_InternalPB::kTransactionIdFieldNumber; +const int OfferDataNym_InternalPB::kTotalAssetsFieldNumber; +const int OfferDataNym_InternalPB::kFinishedSoFarFieldNumber; +const int OfferDataNym_InternalPB::kMinimumIncrementFieldNumber; +const int OfferDataNym_InternalPB::kStopSignFieldNumber; +const int OfferDataNym_InternalPB::kStopPriceFieldNumber; +#endif // !_MSC_VER + +OfferDataNym_InternalPB::OfferDataNym_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void OfferDataNym_InternalPB::InitAsDefaultInstance() { +} + +OfferDataNym_InternalPB::OfferDataNym_InternalPB(const OfferDataNym_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void OfferDataNym_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + valid_from_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + valid_to_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + asset_acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + currency_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + currency_acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + selling_ = false; + scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + price_per_scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + total_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + finished_so_far_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + minimum_increment_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + stop_sign_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + stop_price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +OfferDataNym_InternalPB::~OfferDataNym_InternalPB() { + SharedDtor(); +} + +void OfferDataNym_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (valid_from_ != &::google::protobuf::internal::kEmptyString) { + delete valid_from_; + } + if (valid_to_ != &::google::protobuf::internal::kEmptyString) { + delete valid_to_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + delete asset_type_id_; + } + if (asset_acct_id_ != &::google::protobuf::internal::kEmptyString) { + delete asset_acct_id_; + } + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + delete currency_type_id_; + } + if (currency_acct_id_ != &::google::protobuf::internal::kEmptyString) { + delete currency_acct_id_; + } + if (scale_ != &::google::protobuf::internal::kEmptyString) { + delete scale_; + } + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + delete price_per_scale_; + } + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + delete transaction_id_; + } + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + delete total_assets_; + } + if (finished_so_far_ != &::google::protobuf::internal::kEmptyString) { + delete finished_so_far_; + } + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + delete minimum_increment_; + } + if (stop_sign_ != &::google::protobuf::internal::kEmptyString) { + delete stop_sign_; + } + if (stop_price_ != &::google::protobuf::internal::kEmptyString) { + delete stop_price_; + } + if (this != default_instance_) { + } +} + +void OfferDataNym_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* OfferDataNym_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return OfferDataNym_InternalPB_descriptor_; +} + +const OfferDataNym_InternalPB& OfferDataNym_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +OfferDataNym_InternalPB* OfferDataNym_InternalPB::default_instance_ = NULL; + +OfferDataNym_InternalPB* OfferDataNym_InternalPB::New() const { + return new OfferDataNym_InternalPB; +} + +void OfferDataNym_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_valid_from()) { + if (valid_from_ != &::google::protobuf::internal::kEmptyString) { + valid_from_->clear(); + } + } + if (has_valid_to()) { + if (valid_to_ != &::google::protobuf::internal::kEmptyString) { + valid_to_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_asset_type_id()) { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + } + if (has_asset_acct_id()) { + if (asset_acct_id_ != &::google::protobuf::internal::kEmptyString) { + asset_acct_id_->clear(); + } + } + if (has_currency_type_id()) { + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + currency_type_id_->clear(); + } + } + if (has_currency_acct_id()) { + if (currency_acct_id_ != &::google::protobuf::internal::kEmptyString) { + currency_acct_id_->clear(); + } + } + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + selling_ = false; + if (has_scale()) { + if (scale_ != &::google::protobuf::internal::kEmptyString) { + scale_->clear(); + } + } + if (has_price_per_scale()) { + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + price_per_scale_->clear(); + } + } + if (has_transaction_id()) { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + } + if (has_total_assets()) { + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + total_assets_->clear(); + } + } + if (has_finished_so_far()) { + if (finished_so_far_ != &::google::protobuf::internal::kEmptyString) { + finished_so_far_->clear(); + } + } + if (has_minimum_increment()) { + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + minimum_increment_->clear(); + } + } + if (has_stop_sign()) { + if (stop_sign_ != &::google::protobuf::internal::kEmptyString) { + stop_sign_->clear(); + } + } + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (has_stop_price()) { + if (stop_price_ != &::google::protobuf::internal::kEmptyString) { + stop_price_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool OfferDataNym_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_valid_from; + break; + } + + // optional string valid_from = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_valid_from: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_valid_from())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_from().data(), this->valid_from().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_valid_to; + break; + } + + // optional string valid_to = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_valid_to: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_valid_to())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_to().data(), this->valid_to().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_server_id; + break; + } + + // optional string server_id = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_asset_type_id; + break; + } + + // optional string asset_type_id = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_asset_type_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_asset_type_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_asset_acct_id; + break; + } + + // optional string asset_acct_id = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_asset_acct_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_asset_acct_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_acct_id().data(), this->asset_acct_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_currency_type_id; + break; + } + + // optional string currency_type_id = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_currency_type_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_currency_type_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_currency_acct_id; + break; + } + + // optional string currency_acct_id = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_currency_acct_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_currency_acct_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_acct_id().data(), this->currency_acct_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(72)) goto parse_selling; + break; + } + + // optional bool selling = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_selling: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &selling_))); + set_has_selling(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(82)) goto parse_scale; + break; + } + + // optional string scale = 10; + case 10: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_scale: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_scale())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(90)) goto parse_price_per_scale; + break; + } + + // optional string price_per_scale = 11; + case 11: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_price_per_scale: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_price_per_scale())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(98)) goto parse_transaction_id; + break; + } + + // optional string transaction_id = 12; + case 12: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_transaction_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_transaction_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(106)) goto parse_total_assets; + break; + } + + // optional string total_assets = 13; + case 13: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_total_assets: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_total_assets())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(114)) goto parse_finished_so_far; + break; + } + + // optional string finished_so_far = 14; + case 14: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_finished_so_far: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_finished_so_far())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->finished_so_far().data(), this->finished_so_far().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_minimum_increment; + break; + } + + // optional string minimum_increment = 15; + case 15: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_minimum_increment: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_minimum_increment())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(130)) goto parse_stop_sign; + break; + } + + // optional string stop_sign = 16; + case 16: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_stop_sign: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_stop_sign())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_sign().data(), this->stop_sign().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(138)) goto parse_stop_price; + break; + } + + // optional string stop_price = 17; + case 17: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_stop_price: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_stop_price())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_price().data(), this->stop_price().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void OfferDataNym_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string valid_from = 2; + if (has_valid_from()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_from().data(), this->valid_from().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->valid_from(), output); + } + + // optional string valid_to = 3; + if (has_valid_to()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_to().data(), this->valid_to().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->valid_to(), output); + } + + // optional string server_id = 4; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->server_id(), output); + } + + // optional string asset_type_id = 5; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->asset_type_id(), output); + } + + // optional string asset_acct_id = 6; + if (has_asset_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_acct_id().data(), this->asset_acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->asset_acct_id(), output); + } + + // optional string currency_type_id = 7; + if (has_currency_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->currency_type_id(), output); + } + + // optional string currency_acct_id = 8; + if (has_currency_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_acct_id().data(), this->currency_acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->currency_acct_id(), output); + } + + // optional bool selling = 9; + if (has_selling()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(9, this->selling(), output); + } + + // optional string scale = 10; + if (has_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 10, this->scale(), output); + } + + // optional string price_per_scale = 11; + if (has_price_per_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 11, this->price_per_scale(), output); + } + + // optional string transaction_id = 12; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 12, this->transaction_id(), output); + } + + // optional string total_assets = 13; + if (has_total_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 13, this->total_assets(), output); + } + + // optional string finished_so_far = 14; + if (has_finished_so_far()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->finished_so_far().data(), this->finished_so_far().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 14, this->finished_so_far(), output); + } + + // optional string minimum_increment = 15; + if (has_minimum_increment()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 15, this->minimum_increment(), output); + } + + // optional string stop_sign = 16; + if (has_stop_sign()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_sign().data(), this->stop_sign().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 16, this->stop_sign(), output); + } + + // optional string stop_price = 17; + if (has_stop_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_price().data(), this->stop_price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 17, this->stop_price(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* OfferDataNym_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string valid_from = 2; + if (has_valid_from()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_from().data(), this->valid_from().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->valid_from(), target); + } + + // optional string valid_to = 3; + if (has_valid_to()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->valid_to().data(), this->valid_to().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->valid_to(), target); + } + + // optional string server_id = 4; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->server_id(), target); + } + + // optional string asset_type_id = 5; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->asset_type_id(), target); + } + + // optional string asset_acct_id = 6; + if (has_asset_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_acct_id().data(), this->asset_acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->asset_acct_id(), target); + } + + // optional string currency_type_id = 7; + if (has_currency_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_type_id().data(), this->currency_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->currency_type_id(), target); + } + + // optional string currency_acct_id = 8; + if (has_currency_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->currency_acct_id().data(), this->currency_acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->currency_acct_id(), target); + } + + // optional bool selling = 9; + if (has_selling()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(9, this->selling(), target); + } + + // optional string scale = 10; + if (has_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->scale().data(), this->scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 10, this->scale(), target); + } + + // optional string price_per_scale = 11; + if (has_price_per_scale()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price_per_scale().data(), this->price_per_scale().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 11, this->price_per_scale(), target); + } + + // optional string transaction_id = 12; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 12, this->transaction_id(), target); + } + + // optional string total_assets = 13; + if (has_total_assets()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->total_assets().data(), this->total_assets().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 13, this->total_assets(), target); + } + + // optional string finished_so_far = 14; + if (has_finished_so_far()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->finished_so_far().data(), this->finished_so_far().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 14, this->finished_so_far(), target); + } + + // optional string minimum_increment = 15; + if (has_minimum_increment()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->minimum_increment().data(), this->minimum_increment().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 15, this->minimum_increment(), target); + } + + // optional string stop_sign = 16; + if (has_stop_sign()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_sign().data(), this->stop_sign().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 16, this->stop_sign(), target); + } + + // optional string stop_price = 17; + if (has_stop_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->stop_price().data(), this->stop_price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 17, this->stop_price(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int OfferDataNym_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string valid_from = 2; + if (has_valid_from()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->valid_from()); + } + + // optional string valid_to = 3; + if (has_valid_to()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->valid_to()); + } + + // optional string server_id = 4; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string asset_type_id = 5; + if (has_asset_type_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->asset_type_id()); + } + + // optional string asset_acct_id = 6; + if (has_asset_acct_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->asset_acct_id()); + } + + // optional string currency_type_id = 7; + if (has_currency_type_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->currency_type_id()); + } + + // optional string currency_acct_id = 8; + if (has_currency_acct_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->currency_acct_id()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional bool selling = 9; + if (has_selling()) { + total_size += 1 + 1; + } + + // optional string scale = 10; + if (has_scale()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->scale()); + } + + // optional string price_per_scale = 11; + if (has_price_per_scale()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->price_per_scale()); + } + + // optional string transaction_id = 12; + if (has_transaction_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->transaction_id()); + } + + // optional string total_assets = 13; + if (has_total_assets()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->total_assets()); + } + + // optional string finished_so_far = 14; + if (has_finished_so_far()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->finished_so_far()); + } + + // optional string minimum_increment = 15; + if (has_minimum_increment()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->minimum_increment()); + } + + // optional string stop_sign = 16; + if (has_stop_sign()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->stop_sign()); + } + + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + // optional string stop_price = 17; + if (has_stop_price()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->stop_price()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void OfferDataNym_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const OfferDataNym_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void OfferDataNym_InternalPB::MergeFrom(const OfferDataNym_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_valid_from()) { + set_valid_from(from.valid_from()); + } + if (from.has_valid_to()) { + set_valid_to(from.valid_to()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_asset_type_id()) { + set_asset_type_id(from.asset_type_id()); + } + if (from.has_asset_acct_id()) { + set_asset_acct_id(from.asset_acct_id()); + } + if (from.has_currency_type_id()) { + set_currency_type_id(from.currency_type_id()); + } + if (from.has_currency_acct_id()) { + set_currency_acct_id(from.currency_acct_id()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_selling()) { + set_selling(from.selling()); + } + if (from.has_scale()) { + set_scale(from.scale()); + } + if (from.has_price_per_scale()) { + set_price_per_scale(from.price_per_scale()); + } + if (from.has_transaction_id()) { + set_transaction_id(from.transaction_id()); + } + if (from.has_total_assets()) { + set_total_assets(from.total_assets()); + } + if (from.has_finished_so_far()) { + set_finished_so_far(from.finished_so_far()); + } + if (from.has_minimum_increment()) { + set_minimum_increment(from.minimum_increment()); + } + if (from.has_stop_sign()) { + set_stop_sign(from.stop_sign()); + } + } + if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (from.has_stop_price()) { + set_stop_price(from.stop_price()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void OfferDataNym_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OfferDataNym_InternalPB::CopyFrom(const OfferDataNym_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OfferDataNym_InternalPB::IsInitialized() const { + + return true; +} + +void OfferDataNym_InternalPB::Swap(OfferDataNym_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(valid_from_, other->valid_from_); + std::swap(valid_to_, other->valid_to_); + std::swap(server_id_, other->server_id_); + std::swap(asset_type_id_, other->asset_type_id_); + std::swap(asset_acct_id_, other->asset_acct_id_); + std::swap(currency_type_id_, other->currency_type_id_); + std::swap(currency_acct_id_, other->currency_acct_id_); + std::swap(selling_, other->selling_); + std::swap(scale_, other->scale_); + std::swap(price_per_scale_, other->price_per_scale_); + std::swap(transaction_id_, other->transaction_id_); + std::swap(total_assets_, other->total_assets_); + std::swap(finished_so_far_, other->finished_so_far_); + std::swap(minimum_increment_, other->minimum_increment_); + std::swap(stop_sign_, other->stop_sign_); + std::swap(stop_price_, other->stop_price_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata OfferDataNym_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = OfferDataNym_InternalPB_descriptor_; + metadata.reflection = OfferDataNym_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int OfferListNym_InternalPB::kOffersFieldNumber; +#endif // !_MSC_VER + +OfferListNym_InternalPB::OfferListNym_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void OfferListNym_InternalPB::InitAsDefaultInstance() { +} + +OfferListNym_InternalPB::OfferListNym_InternalPB(const OfferListNym_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void OfferListNym_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +OfferListNym_InternalPB::~OfferListNym_InternalPB() { + SharedDtor(); +} + +void OfferListNym_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void OfferListNym_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* OfferListNym_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return OfferListNym_InternalPB_descriptor_; +} + +const OfferListNym_InternalPB& OfferListNym_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +OfferListNym_InternalPB* OfferListNym_InternalPB::default_instance_ = NULL; + +OfferListNym_InternalPB* OfferListNym_InternalPB::New() const { + return new OfferListNym_InternalPB; +} + +void OfferListNym_InternalPB::Clear() { + offers_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool OfferListNym_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.OfferDataNym_InternalPB offers = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_offers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_offers())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_offers; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void OfferListNym_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.OfferDataNym_InternalPB offers = 1; + for (int i = 0; i < this->offers_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->offers(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* OfferListNym_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.OfferDataNym_InternalPB offers = 1; + for (int i = 0; i < this->offers_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->offers(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int OfferListNym_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.OfferDataNym_InternalPB offers = 1; + total_size += 1 * this->offers_size(); + for (int i = 0; i < this->offers_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->offers(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void OfferListNym_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const OfferListNym_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void OfferListNym_InternalPB::MergeFrom(const OfferListNym_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + offers_.MergeFrom(from.offers_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void OfferListNym_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OfferListNym_InternalPB::CopyFrom(const OfferListNym_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OfferListNym_InternalPB::IsInitialized() const { + + return true; +} + +void OfferListNym_InternalPB::Swap(OfferListNym_InternalPB* other) { + if (other != this) { + offers_.Swap(&other->offers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata OfferListNym_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = OfferListNym_InternalPB_descriptor_; + metadata.reflection = OfferListNym_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int TradeDataNym_InternalPB::kGuiLabelFieldNumber; +const int TradeDataNym_InternalPB::kCompletedCountFieldNumber; +const int TradeDataNym_InternalPB::kDateFieldNumber; +const int TradeDataNym_InternalPB::kPriceFieldNumber; +const int TradeDataNym_InternalPB::kAmountSoldFieldNumber; +const int TradeDataNym_InternalPB::kTransactionIdFieldNumber; +#endif // !_MSC_VER + +TradeDataNym_InternalPB::TradeDataNym_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void TradeDataNym_InternalPB::InitAsDefaultInstance() { +} + +TradeDataNym_InternalPB::TradeDataNym_InternalPB(const TradeDataNym_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void TradeDataNym_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + completed_count_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + date_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + amount_sold_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +TradeDataNym_InternalPB::~TradeDataNym_InternalPB() { + SharedDtor(); +} + +void TradeDataNym_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (completed_count_ != &::google::protobuf::internal::kEmptyString) { + delete completed_count_; + } + if (date_ != &::google::protobuf::internal::kEmptyString) { + delete date_; + } + if (price_ != &::google::protobuf::internal::kEmptyString) { + delete price_; + } + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + delete amount_sold_; + } + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + delete transaction_id_; + } + if (this != default_instance_) { + } +} + +void TradeDataNym_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* TradeDataNym_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return TradeDataNym_InternalPB_descriptor_; +} + +const TradeDataNym_InternalPB& TradeDataNym_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +TradeDataNym_InternalPB* TradeDataNym_InternalPB::default_instance_ = NULL; + +TradeDataNym_InternalPB* TradeDataNym_InternalPB::New() const { + return new TradeDataNym_InternalPB; +} + +void TradeDataNym_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_completed_count()) { + if (completed_count_ != &::google::protobuf::internal::kEmptyString) { + completed_count_->clear(); + } + } + if (has_date()) { + if (date_ != &::google::protobuf::internal::kEmptyString) { + date_->clear(); + } + } + if (has_price()) { + if (price_ != &::google::protobuf::internal::kEmptyString) { + price_->clear(); + } + } + if (has_amount_sold()) { + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + amount_sold_->clear(); + } + } + if (has_transaction_id()) { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool TradeDataNym_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_completed_count; + break; + } + + // optional string completed_count = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_completed_count: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_completed_count())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->completed_count().data(), this->completed_count().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_date; + break; + } + + // optional string date = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_date: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_date())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_price; + break; + } + + // optional string price = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_price: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_price())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_amount_sold; + break; + } + + // optional string amount_sold = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_amount_sold: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_amount_sold())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_transaction_id; + break; + } + + // optional string transaction_id = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_transaction_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_transaction_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void TradeDataNym_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string completed_count = 2; + if (has_completed_count()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->completed_count().data(), this->completed_count().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->completed_count(), output); + } + + // optional string date = 3; + if (has_date()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->date(), output); + } + + // optional string price = 4; + if (has_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->price(), output); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->amount_sold(), output); + } + + // optional string transaction_id = 6; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->transaction_id(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* TradeDataNym_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string completed_count = 2; + if (has_completed_count()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->completed_count().data(), this->completed_count().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->completed_count(), target); + } + + // optional string date = 3; + if (has_date()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->date().data(), this->date().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->date(), target); + } + + // optional string price = 4; + if (has_price()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->price().data(), this->price().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->price(), target); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->amount_sold().data(), this->amount_sold().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->amount_sold(), target); + } + + // optional string transaction_id = 6; + if (has_transaction_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->transaction_id().data(), this->transaction_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->transaction_id(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int TradeDataNym_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string completed_count = 2; + if (has_completed_count()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->completed_count()); + } + + // optional string date = 3; + if (has_date()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->date()); + } + + // optional string price = 4; + if (has_price()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->price()); + } + + // optional string amount_sold = 5; + if (has_amount_sold()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->amount_sold()); + } + + // optional string transaction_id = 6; + if (has_transaction_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->transaction_id()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void TradeDataNym_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const TradeDataNym_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void TradeDataNym_InternalPB::MergeFrom(const TradeDataNym_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_completed_count()) { + set_completed_count(from.completed_count()); + } + if (from.has_date()) { + set_date(from.date()); + } + if (from.has_price()) { + set_price(from.price()); + } + if (from.has_amount_sold()) { + set_amount_sold(from.amount_sold()); + } + if (from.has_transaction_id()) { + set_transaction_id(from.transaction_id()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void TradeDataNym_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void TradeDataNym_InternalPB::CopyFrom(const TradeDataNym_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool TradeDataNym_InternalPB::IsInitialized() const { + + return true; +} + +void TradeDataNym_InternalPB::Swap(TradeDataNym_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(completed_count_, other->completed_count_); + std::swap(date_, other->date_); + std::swap(price_, other->price_); + std::swap(amount_sold_, other->amount_sold_); + std::swap(transaction_id_, other->transaction_id_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata TradeDataNym_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = TradeDataNym_InternalPB_descriptor_; + metadata.reflection = TradeDataNym_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int TradeListNym_InternalPB::kTradesFieldNumber; +#endif // !_MSC_VER + +TradeListNym_InternalPB::TradeListNym_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void TradeListNym_InternalPB::InitAsDefaultInstance() { +} + +TradeListNym_InternalPB::TradeListNym_InternalPB(const TradeListNym_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void TradeListNym_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +TradeListNym_InternalPB::~TradeListNym_InternalPB() { + SharedDtor(); +} + +void TradeListNym_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void TradeListNym_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* TradeListNym_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return TradeListNym_InternalPB_descriptor_; +} + +const TradeListNym_InternalPB& TradeListNym_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Markets_2eproto(); return *default_instance_; +} + +TradeListNym_InternalPB* TradeListNym_InternalPB::default_instance_ = NULL; + +TradeListNym_InternalPB* TradeListNym_InternalPB::New() const { + return new TradeListNym_InternalPB; +} + +void TradeListNym_InternalPB::Clear() { + trades_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool TradeListNym_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.TradeDataNym_InternalPB trades = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_trades: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_trades())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_trades; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void TradeListNym_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.TradeDataNym_InternalPB trades = 1; + for (int i = 0; i < this->trades_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->trades(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* TradeListNym_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.TradeDataNym_InternalPB trades = 1; + for (int i = 0; i < this->trades_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->trades(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int TradeListNym_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.TradeDataNym_InternalPB trades = 1; + total_size += 1 * this->trades_size(); + for (int i = 0; i < this->trades_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->trades(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void TradeListNym_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const TradeListNym_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void TradeListNym_InternalPB::MergeFrom(const TradeListNym_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + trades_.MergeFrom(from.trades_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void TradeListNym_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void TradeListNym_InternalPB::CopyFrom(const TradeListNym_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool TradeListNym_InternalPB::IsInitialized() const { + + return true; +} + +void TradeListNym_InternalPB::Swap(TradeListNym_InternalPB* other) { + if (other != this) { + trades_.Swap(&other->trades_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata TradeListNym_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = TradeListNym_InternalPB_descriptor_; + metadata.reflection = TradeListNym_InternalPB_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +// @@protoc_insertion_point(global_scope) diff --git a/OTLib/Markets.pb.h b/OTLib/Markets.pb.h new file mode 100644 index 000000000..f03108fc8 --- /dev/null +++ b/OTLib/Markets.pb.h @@ -0,0 +1,4613 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Markets.proto + +#ifndef PROTOBUF_Markets_2eproto__INCLUDED +#define PROTOBUF_Markets_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_Markets_2eproto(); +void protobuf_AssignDesc_Markets_2eproto(); +void protobuf_ShutdownFile_Markets_2eproto(); + +class MarketData_InternalPB; +class MarketList_InternalPB; +class OfferDataMarket_InternalPB; +class OfferListMarket_InternalPB; +class TradeDataMarket_InternalPB; +class TradeListMarket_InternalPB; +class OfferDataNym_InternalPB; +class OfferListNym_InternalPB; +class TradeDataNym_InternalPB; +class TradeListNym_InternalPB; + +// =================================================================== + +class MarketData_InternalPB : public ::google::protobuf::Message { + public: + MarketData_InternalPB(); + virtual ~MarketData_InternalPB(); + + MarketData_InternalPB(const MarketData_InternalPB& from); + + inline MarketData_InternalPB& operator=(const MarketData_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MarketData_InternalPB& default_instance(); + + void Swap(MarketData_InternalPB* other); + + // implements Message ---------------------------------------------- + + MarketData_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MarketData_InternalPB& from); + void MergeFrom(const MarketData_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string market_id = 3; + inline bool has_market_id() const; + inline void clear_market_id(); + static const int kMarketIdFieldNumber = 3; + inline const ::std::string& market_id() const; + inline void set_market_id(const ::std::string& value); + inline void set_market_id(const char* value); + inline void set_market_id(const char* value, size_t size); + inline ::std::string* mutable_market_id(); + inline ::std::string* release_market_id(); + + // optional string asset_type_id = 4; + inline bool has_asset_type_id() const; + inline void clear_asset_type_id(); + static const int kAssetTypeIdFieldNumber = 4; + inline const ::std::string& asset_type_id() const; + inline void set_asset_type_id(const ::std::string& value); + inline void set_asset_type_id(const char* value); + inline void set_asset_type_id(const char* value, size_t size); + inline ::std::string* mutable_asset_type_id(); + inline ::std::string* release_asset_type_id(); + + // optional string currency_type_id = 5; + inline bool has_currency_type_id() const; + inline void clear_currency_type_id(); + static const int kCurrencyTypeIdFieldNumber = 5; + inline const ::std::string& currency_type_id() const; + inline void set_currency_type_id(const ::std::string& value); + inline void set_currency_type_id(const char* value); + inline void set_currency_type_id(const char* value, size_t size); + inline ::std::string* mutable_currency_type_id(); + inline ::std::string* release_currency_type_id(); + + // optional string scale = 6; + inline bool has_scale() const; + inline void clear_scale(); + static const int kScaleFieldNumber = 6; + inline const ::std::string& scale() const; + inline void set_scale(const ::std::string& value); + inline void set_scale(const char* value); + inline void set_scale(const char* value, size_t size); + inline ::std::string* mutable_scale(); + inline ::std::string* release_scale(); + + // optional string total_assets = 7; + inline bool has_total_assets() const; + inline void clear_total_assets(); + static const int kTotalAssetsFieldNumber = 7; + inline const ::std::string& total_assets() const; + inline void set_total_assets(const ::std::string& value); + inline void set_total_assets(const char* value); + inline void set_total_assets(const char* value, size_t size); + inline ::std::string* mutable_total_assets(); + inline ::std::string* release_total_assets(); + + // optional string number_bids = 8; + inline bool has_number_bids() const; + inline void clear_number_bids(); + static const int kNumberBidsFieldNumber = 8; + inline const ::std::string& number_bids() const; + inline void set_number_bids(const ::std::string& value); + inline void set_number_bids(const char* value); + inline void set_number_bids(const char* value, size_t size); + inline ::std::string* mutable_number_bids(); + inline ::std::string* release_number_bids(); + + // optional string number_asks = 9; + inline bool has_number_asks() const; + inline void clear_number_asks(); + static const int kNumberAsksFieldNumber = 9; + inline const ::std::string& number_asks() const; + inline void set_number_asks(const ::std::string& value); + inline void set_number_asks(const char* value); + inline void set_number_asks(const char* value, size_t size); + inline ::std::string* mutable_number_asks(); + inline ::std::string* release_number_asks(); + + // optional string last_sale_price = 10; + inline bool has_last_sale_price() const; + inline void clear_last_sale_price(); + static const int kLastSalePriceFieldNumber = 10; + inline const ::std::string& last_sale_price() const; + inline void set_last_sale_price(const ::std::string& value); + inline void set_last_sale_price(const char* value); + inline void set_last_sale_price(const char* value, size_t size); + inline ::std::string* mutable_last_sale_price(); + inline ::std::string* release_last_sale_price(); + + // optional string current_bid = 11; + inline bool has_current_bid() const; + inline void clear_current_bid(); + static const int kCurrentBidFieldNumber = 11; + inline const ::std::string& current_bid() const; + inline void set_current_bid(const ::std::string& value); + inline void set_current_bid(const char* value); + inline void set_current_bid(const char* value, size_t size); + inline ::std::string* mutable_current_bid(); + inline ::std::string* release_current_bid(); + + // optional string current_ask = 12; + inline bool has_current_ask() const; + inline void clear_current_ask(); + static const int kCurrentAskFieldNumber = 12; + inline const ::std::string& current_ask() const; + inline void set_current_ask(const ::std::string& value); + inline void set_current_ask(const char* value); + inline void set_current_ask(const char* value, size_t size); + inline ::std::string* mutable_current_ask(); + inline ::std::string* release_current_ask(); + + // optional string volume_trades = 13; + inline bool has_volume_trades() const; + inline void clear_volume_trades(); + static const int kVolumeTradesFieldNumber = 13; + inline const ::std::string& volume_trades() const; + inline void set_volume_trades(const ::std::string& value); + inline void set_volume_trades(const char* value); + inline void set_volume_trades(const char* value, size_t size); + inline ::std::string* mutable_volume_trades(); + inline ::std::string* release_volume_trades(); + + // optional string volume_assets = 14; + inline bool has_volume_assets() const; + inline void clear_volume_assets(); + static const int kVolumeAssetsFieldNumber = 14; + inline const ::std::string& volume_assets() const; + inline void set_volume_assets(const ::std::string& value); + inline void set_volume_assets(const char* value); + inline void set_volume_assets(const char* value, size_t size); + inline ::std::string* mutable_volume_assets(); + inline ::std::string* release_volume_assets(); + + // optional string volume_currency = 15; + inline bool has_volume_currency() const; + inline void clear_volume_currency(); + static const int kVolumeCurrencyFieldNumber = 15; + inline const ::std::string& volume_currency() const; + inline void set_volume_currency(const ::std::string& value); + inline void set_volume_currency(const char* value); + inline void set_volume_currency(const char* value, size_t size); + inline ::std::string* mutable_volume_currency(); + inline ::std::string* release_volume_currency(); + + // optional string recent_highest_bid = 16; + inline bool has_recent_highest_bid() const; + inline void clear_recent_highest_bid(); + static const int kRecentHighestBidFieldNumber = 16; + inline const ::std::string& recent_highest_bid() const; + inline void set_recent_highest_bid(const ::std::string& value); + inline void set_recent_highest_bid(const char* value); + inline void set_recent_highest_bid(const char* value, size_t size); + inline ::std::string* mutable_recent_highest_bid(); + inline ::std::string* release_recent_highest_bid(); + + // optional string recent_lowest_ask = 17; + inline bool has_recent_lowest_ask() const; + inline void clear_recent_lowest_ask(); + static const int kRecentLowestAskFieldNumber = 17; + inline const ::std::string& recent_lowest_ask() const; + inline void set_recent_lowest_ask(const ::std::string& value); + inline void set_recent_lowest_ask(const char* value); + inline void set_recent_lowest_ask(const char* value, size_t size); + inline ::std::string* mutable_recent_lowest_ask(); + inline ::std::string* release_recent_lowest_ask(); + + // @@protoc_insertion_point(class_scope:OTDB.MarketData_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_market_id(); + inline void clear_has_market_id(); + inline void set_has_asset_type_id(); + inline void clear_has_asset_type_id(); + inline void set_has_currency_type_id(); + inline void clear_has_currency_type_id(); + inline void set_has_scale(); + inline void clear_has_scale(); + inline void set_has_total_assets(); + inline void clear_has_total_assets(); + inline void set_has_number_bids(); + inline void clear_has_number_bids(); + inline void set_has_number_asks(); + inline void clear_has_number_asks(); + inline void set_has_last_sale_price(); + inline void clear_has_last_sale_price(); + inline void set_has_current_bid(); + inline void clear_has_current_bid(); + inline void set_has_current_ask(); + inline void clear_has_current_ask(); + inline void set_has_volume_trades(); + inline void clear_has_volume_trades(); + inline void set_has_volume_assets(); + inline void clear_has_volume_assets(); + inline void set_has_volume_currency(); + inline void clear_has_volume_currency(); + inline void set_has_recent_highest_bid(); + inline void clear_has_recent_highest_bid(); + inline void set_has_recent_lowest_ask(); + inline void clear_has_recent_lowest_ask(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_id_; + ::std::string* market_id_; + ::std::string* asset_type_id_; + ::std::string* currency_type_id_; + ::std::string* scale_; + ::std::string* total_assets_; + ::std::string* number_bids_; + ::std::string* number_asks_; + ::std::string* last_sale_price_; + ::std::string* current_bid_; + ::std::string* current_ask_; + ::std::string* volume_trades_; + ::std::string* volume_assets_; + ::std::string* volume_currency_; + ::std::string* recent_highest_bid_; + ::std::string* recent_lowest_ask_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(17 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static MarketData_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class MarketList_InternalPB : public ::google::protobuf::Message { + public: + MarketList_InternalPB(); + virtual ~MarketList_InternalPB(); + + MarketList_InternalPB(const MarketList_InternalPB& from); + + inline MarketList_InternalPB& operator=(const MarketList_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MarketList_InternalPB& default_instance(); + + void Swap(MarketList_InternalPB* other); + + // implements Message ---------------------------------------------- + + MarketList_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MarketList_InternalPB& from); + void MergeFrom(const MarketList_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.MarketData_InternalPB market_data = 1; + inline int market_data_size() const; + inline void clear_market_data(); + static const int kMarketDataFieldNumber = 1; + inline const ::OTDB::MarketData_InternalPB& market_data(int index) const; + inline ::OTDB::MarketData_InternalPB* mutable_market_data(int index); + inline ::OTDB::MarketData_InternalPB* add_market_data(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::MarketData_InternalPB >& + market_data() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::MarketData_InternalPB >* + mutable_market_data(); + + // @@protoc_insertion_point(class_scope:OTDB.MarketList_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::MarketData_InternalPB > market_data_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static MarketList_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class OfferDataMarket_InternalPB : public ::google::protobuf::Message { + public: + OfferDataMarket_InternalPB(); + virtual ~OfferDataMarket_InternalPB(); + + OfferDataMarket_InternalPB(const OfferDataMarket_InternalPB& from); + + inline OfferDataMarket_InternalPB& operator=(const OfferDataMarket_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const OfferDataMarket_InternalPB& default_instance(); + + void Swap(OfferDataMarket_InternalPB* other); + + // implements Message ---------------------------------------------- + + OfferDataMarket_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const OfferDataMarket_InternalPB& from); + void MergeFrom(const OfferDataMarket_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string transaction_id = 2; + inline bool has_transaction_id() const; + inline void clear_transaction_id(); + static const int kTransactionIdFieldNumber = 2; + inline const ::std::string& transaction_id() const; + inline void set_transaction_id(const ::std::string& value); + inline void set_transaction_id(const char* value); + inline void set_transaction_id(const char* value, size_t size); + inline ::std::string* mutable_transaction_id(); + inline ::std::string* release_transaction_id(); + + // optional string price_per_scale = 3; + inline bool has_price_per_scale() const; + inline void clear_price_per_scale(); + static const int kPricePerScaleFieldNumber = 3; + inline const ::std::string& price_per_scale() const; + inline void set_price_per_scale(const ::std::string& value); + inline void set_price_per_scale(const char* value); + inline void set_price_per_scale(const char* value, size_t size); + inline ::std::string* mutable_price_per_scale(); + inline ::std::string* release_price_per_scale(); + + // optional string available_assets = 4; + inline bool has_available_assets() const; + inline void clear_available_assets(); + static const int kAvailableAssetsFieldNumber = 4; + inline const ::std::string& available_assets() const; + inline void set_available_assets(const ::std::string& value); + inline void set_available_assets(const char* value); + inline void set_available_assets(const char* value, size_t size); + inline ::std::string* mutable_available_assets(); + inline ::std::string* release_available_assets(); + + // optional string minimum_increment = 5; + inline bool has_minimum_increment() const; + inline void clear_minimum_increment(); + static const int kMinimumIncrementFieldNumber = 5; + inline const ::std::string& minimum_increment() const; + inline void set_minimum_increment(const ::std::string& value); + inline void set_minimum_increment(const char* value); + inline void set_minimum_increment(const char* value, size_t size); + inline ::std::string* mutable_minimum_increment(); + inline ::std::string* release_minimum_increment(); + + // @@protoc_insertion_point(class_scope:OTDB.OfferDataMarket_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_transaction_id(); + inline void clear_has_transaction_id(); + inline void set_has_price_per_scale(); + inline void clear_has_price_per_scale(); + inline void set_has_available_assets(); + inline void clear_has_available_assets(); + inline void set_has_minimum_increment(); + inline void clear_has_minimum_increment(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* transaction_id_; + ::std::string* price_per_scale_; + ::std::string* available_assets_; + ::std::string* minimum_increment_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static OfferDataMarket_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class OfferListMarket_InternalPB : public ::google::protobuf::Message { + public: + OfferListMarket_InternalPB(); + virtual ~OfferListMarket_InternalPB(); + + OfferListMarket_InternalPB(const OfferListMarket_InternalPB& from); + + inline OfferListMarket_InternalPB& operator=(const OfferListMarket_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const OfferListMarket_InternalPB& default_instance(); + + void Swap(OfferListMarket_InternalPB* other); + + // implements Message ---------------------------------------------- + + OfferListMarket_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const OfferListMarket_InternalPB& from); + void MergeFrom(const OfferListMarket_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.OfferDataMarket_InternalPB bids = 1; + inline int bids_size() const; + inline void clear_bids(); + static const int kBidsFieldNumber = 1; + inline const ::OTDB::OfferDataMarket_InternalPB& bids(int index) const; + inline ::OTDB::OfferDataMarket_InternalPB* mutable_bids(int index); + inline ::OTDB::OfferDataMarket_InternalPB* add_bids(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >& + bids() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >* + mutable_bids(); + + // repeated .OTDB.OfferDataMarket_InternalPB asks = 2; + inline int asks_size() const; + inline void clear_asks(); + static const int kAsksFieldNumber = 2; + inline const ::OTDB::OfferDataMarket_InternalPB& asks(int index) const; + inline ::OTDB::OfferDataMarket_InternalPB* mutable_asks(int index); + inline ::OTDB::OfferDataMarket_InternalPB* add_asks(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >& + asks() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >* + mutable_asks(); + + // @@protoc_insertion_point(class_scope:OTDB.OfferListMarket_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB > bids_; + ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB > asks_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static OfferListMarket_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class TradeDataMarket_InternalPB : public ::google::protobuf::Message { + public: + TradeDataMarket_InternalPB(); + virtual ~TradeDataMarket_InternalPB(); + + TradeDataMarket_InternalPB(const TradeDataMarket_InternalPB& from); + + inline TradeDataMarket_InternalPB& operator=(const TradeDataMarket_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const TradeDataMarket_InternalPB& default_instance(); + + void Swap(TradeDataMarket_InternalPB* other); + + // implements Message ---------------------------------------------- + + TradeDataMarket_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const TradeDataMarket_InternalPB& from); + void MergeFrom(const TradeDataMarket_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string transaction_id = 2; + inline bool has_transaction_id() const; + inline void clear_transaction_id(); + static const int kTransactionIdFieldNumber = 2; + inline const ::std::string& transaction_id() const; + inline void set_transaction_id(const ::std::string& value); + inline void set_transaction_id(const char* value); + inline void set_transaction_id(const char* value, size_t size); + inline ::std::string* mutable_transaction_id(); + inline ::std::string* release_transaction_id(); + + // optional string date = 3; + inline bool has_date() const; + inline void clear_date(); + static const int kDateFieldNumber = 3; + inline const ::std::string& date() const; + inline void set_date(const ::std::string& value); + inline void set_date(const char* value); + inline void set_date(const char* value, size_t size); + inline ::std::string* mutable_date(); + inline ::std::string* release_date(); + + // optional string price = 4; + inline bool has_price() const; + inline void clear_price(); + static const int kPriceFieldNumber = 4; + inline const ::std::string& price() const; + inline void set_price(const ::std::string& value); + inline void set_price(const char* value); + inline void set_price(const char* value, size_t size); + inline ::std::string* mutable_price(); + inline ::std::string* release_price(); + + // optional string amount_sold = 5; + inline bool has_amount_sold() const; + inline void clear_amount_sold(); + static const int kAmountSoldFieldNumber = 5; + inline const ::std::string& amount_sold() const; + inline void set_amount_sold(const ::std::string& value); + inline void set_amount_sold(const char* value); + inline void set_amount_sold(const char* value, size_t size); + inline ::std::string* mutable_amount_sold(); + inline ::std::string* release_amount_sold(); + + // @@protoc_insertion_point(class_scope:OTDB.TradeDataMarket_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_transaction_id(); + inline void clear_has_transaction_id(); + inline void set_has_date(); + inline void clear_has_date(); + inline void set_has_price(); + inline void clear_has_price(); + inline void set_has_amount_sold(); + inline void clear_has_amount_sold(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* transaction_id_; + ::std::string* date_; + ::std::string* price_; + ::std::string* amount_sold_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static TradeDataMarket_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class TradeListMarket_InternalPB : public ::google::protobuf::Message { + public: + TradeListMarket_InternalPB(); + virtual ~TradeListMarket_InternalPB(); + + TradeListMarket_InternalPB(const TradeListMarket_InternalPB& from); + + inline TradeListMarket_InternalPB& operator=(const TradeListMarket_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const TradeListMarket_InternalPB& default_instance(); + + void Swap(TradeListMarket_InternalPB* other); + + // implements Message ---------------------------------------------- + + TradeListMarket_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const TradeListMarket_InternalPB& from); + void MergeFrom(const TradeListMarket_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.TradeDataMarket_InternalPB trades = 1; + inline int trades_size() const; + inline void clear_trades(); + static const int kTradesFieldNumber = 1; + inline const ::OTDB::TradeDataMarket_InternalPB& trades(int index) const; + inline ::OTDB::TradeDataMarket_InternalPB* mutable_trades(int index); + inline ::OTDB::TradeDataMarket_InternalPB* add_trades(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataMarket_InternalPB >& + trades() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataMarket_InternalPB >* + mutable_trades(); + + // @@protoc_insertion_point(class_scope:OTDB.TradeListMarket_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataMarket_InternalPB > trades_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static TradeListMarket_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class OfferDataNym_InternalPB : public ::google::protobuf::Message { + public: + OfferDataNym_InternalPB(); + virtual ~OfferDataNym_InternalPB(); + + OfferDataNym_InternalPB(const OfferDataNym_InternalPB& from); + + inline OfferDataNym_InternalPB& operator=(const OfferDataNym_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const OfferDataNym_InternalPB& default_instance(); + + void Swap(OfferDataNym_InternalPB* other); + + // implements Message ---------------------------------------------- + + OfferDataNym_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const OfferDataNym_InternalPB& from); + void MergeFrom(const OfferDataNym_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string valid_from = 2; + inline bool has_valid_from() const; + inline void clear_valid_from(); + static const int kValidFromFieldNumber = 2; + inline const ::std::string& valid_from() const; + inline void set_valid_from(const ::std::string& value); + inline void set_valid_from(const char* value); + inline void set_valid_from(const char* value, size_t size); + inline ::std::string* mutable_valid_from(); + inline ::std::string* release_valid_from(); + + // optional string valid_to = 3; + inline bool has_valid_to() const; + inline void clear_valid_to(); + static const int kValidToFieldNumber = 3; + inline const ::std::string& valid_to() const; + inline void set_valid_to(const ::std::string& value); + inline void set_valid_to(const char* value); + inline void set_valid_to(const char* value, size_t size); + inline ::std::string* mutable_valid_to(); + inline ::std::string* release_valid_to(); + + // optional string server_id = 4; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 4; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string asset_type_id = 5; + inline bool has_asset_type_id() const; + inline void clear_asset_type_id(); + static const int kAssetTypeIdFieldNumber = 5; + inline const ::std::string& asset_type_id() const; + inline void set_asset_type_id(const ::std::string& value); + inline void set_asset_type_id(const char* value); + inline void set_asset_type_id(const char* value, size_t size); + inline ::std::string* mutable_asset_type_id(); + inline ::std::string* release_asset_type_id(); + + // optional string asset_acct_id = 6; + inline bool has_asset_acct_id() const; + inline void clear_asset_acct_id(); + static const int kAssetAcctIdFieldNumber = 6; + inline const ::std::string& asset_acct_id() const; + inline void set_asset_acct_id(const ::std::string& value); + inline void set_asset_acct_id(const char* value); + inline void set_asset_acct_id(const char* value, size_t size); + inline ::std::string* mutable_asset_acct_id(); + inline ::std::string* release_asset_acct_id(); + + // optional string currency_type_id = 7; + inline bool has_currency_type_id() const; + inline void clear_currency_type_id(); + static const int kCurrencyTypeIdFieldNumber = 7; + inline const ::std::string& currency_type_id() const; + inline void set_currency_type_id(const ::std::string& value); + inline void set_currency_type_id(const char* value); + inline void set_currency_type_id(const char* value, size_t size); + inline ::std::string* mutable_currency_type_id(); + inline ::std::string* release_currency_type_id(); + + // optional string currency_acct_id = 8; + inline bool has_currency_acct_id() const; + inline void clear_currency_acct_id(); + static const int kCurrencyAcctIdFieldNumber = 8; + inline const ::std::string& currency_acct_id() const; + inline void set_currency_acct_id(const ::std::string& value); + inline void set_currency_acct_id(const char* value); + inline void set_currency_acct_id(const char* value, size_t size); + inline ::std::string* mutable_currency_acct_id(); + inline ::std::string* release_currency_acct_id(); + + // optional bool selling = 9; + inline bool has_selling() const; + inline void clear_selling(); + static const int kSellingFieldNumber = 9; + inline bool selling() const; + inline void set_selling(bool value); + + // optional string scale = 10; + inline bool has_scale() const; + inline void clear_scale(); + static const int kScaleFieldNumber = 10; + inline const ::std::string& scale() const; + inline void set_scale(const ::std::string& value); + inline void set_scale(const char* value); + inline void set_scale(const char* value, size_t size); + inline ::std::string* mutable_scale(); + inline ::std::string* release_scale(); + + // optional string price_per_scale = 11; + inline bool has_price_per_scale() const; + inline void clear_price_per_scale(); + static const int kPricePerScaleFieldNumber = 11; + inline const ::std::string& price_per_scale() const; + inline void set_price_per_scale(const ::std::string& value); + inline void set_price_per_scale(const char* value); + inline void set_price_per_scale(const char* value, size_t size); + inline ::std::string* mutable_price_per_scale(); + inline ::std::string* release_price_per_scale(); + + // optional string transaction_id = 12; + inline bool has_transaction_id() const; + inline void clear_transaction_id(); + static const int kTransactionIdFieldNumber = 12; + inline const ::std::string& transaction_id() const; + inline void set_transaction_id(const ::std::string& value); + inline void set_transaction_id(const char* value); + inline void set_transaction_id(const char* value, size_t size); + inline ::std::string* mutable_transaction_id(); + inline ::std::string* release_transaction_id(); + + // optional string total_assets = 13; + inline bool has_total_assets() const; + inline void clear_total_assets(); + static const int kTotalAssetsFieldNumber = 13; + inline const ::std::string& total_assets() const; + inline void set_total_assets(const ::std::string& value); + inline void set_total_assets(const char* value); + inline void set_total_assets(const char* value, size_t size); + inline ::std::string* mutable_total_assets(); + inline ::std::string* release_total_assets(); + + // optional string finished_so_far = 14; + inline bool has_finished_so_far() const; + inline void clear_finished_so_far(); + static const int kFinishedSoFarFieldNumber = 14; + inline const ::std::string& finished_so_far() const; + inline void set_finished_so_far(const ::std::string& value); + inline void set_finished_so_far(const char* value); + inline void set_finished_so_far(const char* value, size_t size); + inline ::std::string* mutable_finished_so_far(); + inline ::std::string* release_finished_so_far(); + + // optional string minimum_increment = 15; + inline bool has_minimum_increment() const; + inline void clear_minimum_increment(); + static const int kMinimumIncrementFieldNumber = 15; + inline const ::std::string& minimum_increment() const; + inline void set_minimum_increment(const ::std::string& value); + inline void set_minimum_increment(const char* value); + inline void set_minimum_increment(const char* value, size_t size); + inline ::std::string* mutable_minimum_increment(); + inline ::std::string* release_minimum_increment(); + + // optional string stop_sign = 16; + inline bool has_stop_sign() const; + inline void clear_stop_sign(); + static const int kStopSignFieldNumber = 16; + inline const ::std::string& stop_sign() const; + inline void set_stop_sign(const ::std::string& value); + inline void set_stop_sign(const char* value); + inline void set_stop_sign(const char* value, size_t size); + inline ::std::string* mutable_stop_sign(); + inline ::std::string* release_stop_sign(); + + // optional string stop_price = 17; + inline bool has_stop_price() const; + inline void clear_stop_price(); + static const int kStopPriceFieldNumber = 17; + inline const ::std::string& stop_price() const; + inline void set_stop_price(const ::std::string& value); + inline void set_stop_price(const char* value); + inline void set_stop_price(const char* value, size_t size); + inline ::std::string* mutable_stop_price(); + inline ::std::string* release_stop_price(); + + // @@protoc_insertion_point(class_scope:OTDB.OfferDataNym_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_valid_from(); + inline void clear_has_valid_from(); + inline void set_has_valid_to(); + inline void clear_has_valid_to(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_asset_type_id(); + inline void clear_has_asset_type_id(); + inline void set_has_asset_acct_id(); + inline void clear_has_asset_acct_id(); + inline void set_has_currency_type_id(); + inline void clear_has_currency_type_id(); + inline void set_has_currency_acct_id(); + inline void clear_has_currency_acct_id(); + inline void set_has_selling(); + inline void clear_has_selling(); + inline void set_has_scale(); + inline void clear_has_scale(); + inline void set_has_price_per_scale(); + inline void clear_has_price_per_scale(); + inline void set_has_transaction_id(); + inline void clear_has_transaction_id(); + inline void set_has_total_assets(); + inline void clear_has_total_assets(); + inline void set_has_finished_so_far(); + inline void clear_has_finished_so_far(); + inline void set_has_minimum_increment(); + inline void clear_has_minimum_increment(); + inline void set_has_stop_sign(); + inline void clear_has_stop_sign(); + inline void set_has_stop_price(); + inline void clear_has_stop_price(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* valid_from_; + ::std::string* valid_to_; + ::std::string* server_id_; + ::std::string* asset_type_id_; + ::std::string* asset_acct_id_; + ::std::string* currency_type_id_; + ::std::string* currency_acct_id_; + ::std::string* scale_; + ::std::string* price_per_scale_; + ::std::string* transaction_id_; + ::std::string* total_assets_; + ::std::string* finished_so_far_; + ::std::string* minimum_increment_; + ::std::string* stop_sign_; + ::std::string* stop_price_; + bool selling_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(17 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static OfferDataNym_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class OfferListNym_InternalPB : public ::google::protobuf::Message { + public: + OfferListNym_InternalPB(); + virtual ~OfferListNym_InternalPB(); + + OfferListNym_InternalPB(const OfferListNym_InternalPB& from); + + inline OfferListNym_InternalPB& operator=(const OfferListNym_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const OfferListNym_InternalPB& default_instance(); + + void Swap(OfferListNym_InternalPB* other); + + // implements Message ---------------------------------------------- + + OfferListNym_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const OfferListNym_InternalPB& from); + void MergeFrom(const OfferListNym_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.OfferDataNym_InternalPB offers = 1; + inline int offers_size() const; + inline void clear_offers(); + static const int kOffersFieldNumber = 1; + inline const ::OTDB::OfferDataNym_InternalPB& offers(int index) const; + inline ::OTDB::OfferDataNym_InternalPB* mutable_offers(int index); + inline ::OTDB::OfferDataNym_InternalPB* add_offers(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataNym_InternalPB >& + offers() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataNym_InternalPB >* + mutable_offers(); + + // @@protoc_insertion_point(class_scope:OTDB.OfferListNym_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataNym_InternalPB > offers_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static OfferListNym_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class TradeDataNym_InternalPB : public ::google::protobuf::Message { + public: + TradeDataNym_InternalPB(); + virtual ~TradeDataNym_InternalPB(); + + TradeDataNym_InternalPB(const TradeDataNym_InternalPB& from); + + inline TradeDataNym_InternalPB& operator=(const TradeDataNym_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const TradeDataNym_InternalPB& default_instance(); + + void Swap(TradeDataNym_InternalPB* other); + + // implements Message ---------------------------------------------- + + TradeDataNym_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const TradeDataNym_InternalPB& from); + void MergeFrom(const TradeDataNym_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string completed_count = 2; + inline bool has_completed_count() const; + inline void clear_completed_count(); + static const int kCompletedCountFieldNumber = 2; + inline const ::std::string& completed_count() const; + inline void set_completed_count(const ::std::string& value); + inline void set_completed_count(const char* value); + inline void set_completed_count(const char* value, size_t size); + inline ::std::string* mutable_completed_count(); + inline ::std::string* release_completed_count(); + + // optional string date = 3; + inline bool has_date() const; + inline void clear_date(); + static const int kDateFieldNumber = 3; + inline const ::std::string& date() const; + inline void set_date(const ::std::string& value); + inline void set_date(const char* value); + inline void set_date(const char* value, size_t size); + inline ::std::string* mutable_date(); + inline ::std::string* release_date(); + + // optional string price = 4; + inline bool has_price() const; + inline void clear_price(); + static const int kPriceFieldNumber = 4; + inline const ::std::string& price() const; + inline void set_price(const ::std::string& value); + inline void set_price(const char* value); + inline void set_price(const char* value, size_t size); + inline ::std::string* mutable_price(); + inline ::std::string* release_price(); + + // optional string amount_sold = 5; + inline bool has_amount_sold() const; + inline void clear_amount_sold(); + static const int kAmountSoldFieldNumber = 5; + inline const ::std::string& amount_sold() const; + inline void set_amount_sold(const ::std::string& value); + inline void set_amount_sold(const char* value); + inline void set_amount_sold(const char* value, size_t size); + inline ::std::string* mutable_amount_sold(); + inline ::std::string* release_amount_sold(); + + // optional string transaction_id = 6; + inline bool has_transaction_id() const; + inline void clear_transaction_id(); + static const int kTransactionIdFieldNumber = 6; + inline const ::std::string& transaction_id() const; + inline void set_transaction_id(const ::std::string& value); + inline void set_transaction_id(const char* value); + inline void set_transaction_id(const char* value, size_t size); + inline ::std::string* mutable_transaction_id(); + inline ::std::string* release_transaction_id(); + + // @@protoc_insertion_point(class_scope:OTDB.TradeDataNym_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_completed_count(); + inline void clear_has_completed_count(); + inline void set_has_date(); + inline void clear_has_date(); + inline void set_has_price(); + inline void clear_has_price(); + inline void set_has_amount_sold(); + inline void clear_has_amount_sold(); + inline void set_has_transaction_id(); + inline void clear_has_transaction_id(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* completed_count_; + ::std::string* date_; + ::std::string* price_; + ::std::string* amount_sold_; + ::std::string* transaction_id_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static TradeDataNym_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class TradeListNym_InternalPB : public ::google::protobuf::Message { + public: + TradeListNym_InternalPB(); + virtual ~TradeListNym_InternalPB(); + + TradeListNym_InternalPB(const TradeListNym_InternalPB& from); + + inline TradeListNym_InternalPB& operator=(const TradeListNym_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const TradeListNym_InternalPB& default_instance(); + + void Swap(TradeListNym_InternalPB* other); + + // implements Message ---------------------------------------------- + + TradeListNym_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const TradeListNym_InternalPB& from); + void MergeFrom(const TradeListNym_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.TradeDataNym_InternalPB trades = 1; + inline int trades_size() const; + inline void clear_trades(); + static const int kTradesFieldNumber = 1; + inline const ::OTDB::TradeDataNym_InternalPB& trades(int index) const; + inline ::OTDB::TradeDataNym_InternalPB* mutable_trades(int index); + inline ::OTDB::TradeDataNym_InternalPB* add_trades(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataNym_InternalPB >& + trades() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataNym_InternalPB >* + mutable_trades(); + + // @@protoc_insertion_point(class_scope:OTDB.TradeListNym_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataNym_InternalPB > trades_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Markets_2eproto(); + friend void protobuf_AssignDesc_Markets_2eproto(); + friend void protobuf_ShutdownFile_Markets_2eproto(); + + void InitAsDefaultInstance(); + static TradeListNym_InternalPB* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// MarketData_InternalPB + +// optional string gui_label = 1; +inline bool MarketData_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MarketData_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void MarketData_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MarketData_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& MarketData_InternalPB::gui_label() const { + return *gui_label_; +} +inline void MarketData_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void MarketData_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void MarketData_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* MarketData_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool MarketData_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MarketData_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void MarketData_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MarketData_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& MarketData_InternalPB::server_id() const { + return *server_id_; +} +inline void MarketData_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void MarketData_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void MarketData_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* MarketData_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string market_id = 3; +inline bool MarketData_InternalPB::has_market_id() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MarketData_InternalPB::set_has_market_id() { + _has_bits_[0] |= 0x00000004u; +} +inline void MarketData_InternalPB::clear_has_market_id() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MarketData_InternalPB::clear_market_id() { + if (market_id_ != &::google::protobuf::internal::kEmptyString) { + market_id_->clear(); + } + clear_has_market_id(); +} +inline const ::std::string& MarketData_InternalPB::market_id() const { + return *market_id_; +} +inline void MarketData_InternalPB::set_market_id(const ::std::string& value) { + set_has_market_id(); + if (market_id_ == &::google::protobuf::internal::kEmptyString) { + market_id_ = new ::std::string; + } + market_id_->assign(value); +} +inline void MarketData_InternalPB::set_market_id(const char* value) { + set_has_market_id(); + if (market_id_ == &::google::protobuf::internal::kEmptyString) { + market_id_ = new ::std::string; + } + market_id_->assign(value); +} +inline void MarketData_InternalPB::set_market_id(const char* value, size_t size) { + set_has_market_id(); + if (market_id_ == &::google::protobuf::internal::kEmptyString) { + market_id_ = new ::std::string; + } + market_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_market_id() { + set_has_market_id(); + if (market_id_ == &::google::protobuf::internal::kEmptyString) { + market_id_ = new ::std::string; + } + return market_id_; +} +inline ::std::string* MarketData_InternalPB::release_market_id() { + clear_has_market_id(); + if (market_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = market_id_; + market_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string asset_type_id = 4; +inline bool MarketData_InternalPB::has_asset_type_id() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void MarketData_InternalPB::set_has_asset_type_id() { + _has_bits_[0] |= 0x00000008u; +} +inline void MarketData_InternalPB::clear_has_asset_type_id() { + _has_bits_[0] &= ~0x00000008u; +} +inline void MarketData_InternalPB::clear_asset_type_id() { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + clear_has_asset_type_id(); +} +inline const ::std::string& MarketData_InternalPB::asset_type_id() const { + return *asset_type_id_; +} +inline void MarketData_InternalPB::set_asset_type_id(const ::std::string& value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void MarketData_InternalPB::set_asset_type_id(const char* value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void MarketData_InternalPB::set_asset_type_id(const char* value, size_t size) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_asset_type_id() { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + return asset_type_id_; +} +inline ::std::string* MarketData_InternalPB::release_asset_type_id() { + clear_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = asset_type_id_; + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string currency_type_id = 5; +inline bool MarketData_InternalPB::has_currency_type_id() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void MarketData_InternalPB::set_has_currency_type_id() { + _has_bits_[0] |= 0x00000010u; +} +inline void MarketData_InternalPB::clear_has_currency_type_id() { + _has_bits_[0] &= ~0x00000010u; +} +inline void MarketData_InternalPB::clear_currency_type_id() { + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + currency_type_id_->clear(); + } + clear_has_currency_type_id(); +} +inline const ::std::string& MarketData_InternalPB::currency_type_id() const { + return *currency_type_id_; +} +inline void MarketData_InternalPB::set_currency_type_id(const ::std::string& value) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(value); +} +inline void MarketData_InternalPB::set_currency_type_id(const char* value) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(value); +} +inline void MarketData_InternalPB::set_currency_type_id(const char* value, size_t size) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_currency_type_id() { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + return currency_type_id_; +} +inline ::std::string* MarketData_InternalPB::release_currency_type_id() { + clear_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = currency_type_id_; + currency_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string scale = 6; +inline bool MarketData_InternalPB::has_scale() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void MarketData_InternalPB::set_has_scale() { + _has_bits_[0] |= 0x00000020u; +} +inline void MarketData_InternalPB::clear_has_scale() { + _has_bits_[0] &= ~0x00000020u; +} +inline void MarketData_InternalPB::clear_scale() { + if (scale_ != &::google::protobuf::internal::kEmptyString) { + scale_->clear(); + } + clear_has_scale(); +} +inline const ::std::string& MarketData_InternalPB::scale() const { + return *scale_; +} +inline void MarketData_InternalPB::set_scale(const ::std::string& value) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(value); +} +inline void MarketData_InternalPB::set_scale(const char* value) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(value); +} +inline void MarketData_InternalPB::set_scale(const char* value, size_t size) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_scale() { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + return scale_; +} +inline ::std::string* MarketData_InternalPB::release_scale() { + clear_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = scale_; + scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string total_assets = 7; +inline bool MarketData_InternalPB::has_total_assets() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void MarketData_InternalPB::set_has_total_assets() { + _has_bits_[0] |= 0x00000040u; +} +inline void MarketData_InternalPB::clear_has_total_assets() { + _has_bits_[0] &= ~0x00000040u; +} +inline void MarketData_InternalPB::clear_total_assets() { + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + total_assets_->clear(); + } + clear_has_total_assets(); +} +inline const ::std::string& MarketData_InternalPB::total_assets() const { + return *total_assets_; +} +inline void MarketData_InternalPB::set_total_assets(const ::std::string& value) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(value); +} +inline void MarketData_InternalPB::set_total_assets(const char* value) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(value); +} +inline void MarketData_InternalPB::set_total_assets(const char* value, size_t size) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_total_assets() { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + return total_assets_; +} +inline ::std::string* MarketData_InternalPB::release_total_assets() { + clear_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = total_assets_; + total_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string number_bids = 8; +inline bool MarketData_InternalPB::has_number_bids() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void MarketData_InternalPB::set_has_number_bids() { + _has_bits_[0] |= 0x00000080u; +} +inline void MarketData_InternalPB::clear_has_number_bids() { + _has_bits_[0] &= ~0x00000080u; +} +inline void MarketData_InternalPB::clear_number_bids() { + if (number_bids_ != &::google::protobuf::internal::kEmptyString) { + number_bids_->clear(); + } + clear_has_number_bids(); +} +inline const ::std::string& MarketData_InternalPB::number_bids() const { + return *number_bids_; +} +inline void MarketData_InternalPB::set_number_bids(const ::std::string& value) { + set_has_number_bids(); + if (number_bids_ == &::google::protobuf::internal::kEmptyString) { + number_bids_ = new ::std::string; + } + number_bids_->assign(value); +} +inline void MarketData_InternalPB::set_number_bids(const char* value) { + set_has_number_bids(); + if (number_bids_ == &::google::protobuf::internal::kEmptyString) { + number_bids_ = new ::std::string; + } + number_bids_->assign(value); +} +inline void MarketData_InternalPB::set_number_bids(const char* value, size_t size) { + set_has_number_bids(); + if (number_bids_ == &::google::protobuf::internal::kEmptyString) { + number_bids_ = new ::std::string; + } + number_bids_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_number_bids() { + set_has_number_bids(); + if (number_bids_ == &::google::protobuf::internal::kEmptyString) { + number_bids_ = new ::std::string; + } + return number_bids_; +} +inline ::std::string* MarketData_InternalPB::release_number_bids() { + clear_has_number_bids(); + if (number_bids_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = number_bids_; + number_bids_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string number_asks = 9; +inline bool MarketData_InternalPB::has_number_asks() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void MarketData_InternalPB::set_has_number_asks() { + _has_bits_[0] |= 0x00000100u; +} +inline void MarketData_InternalPB::clear_has_number_asks() { + _has_bits_[0] &= ~0x00000100u; +} +inline void MarketData_InternalPB::clear_number_asks() { + if (number_asks_ != &::google::protobuf::internal::kEmptyString) { + number_asks_->clear(); + } + clear_has_number_asks(); +} +inline const ::std::string& MarketData_InternalPB::number_asks() const { + return *number_asks_; +} +inline void MarketData_InternalPB::set_number_asks(const ::std::string& value) { + set_has_number_asks(); + if (number_asks_ == &::google::protobuf::internal::kEmptyString) { + number_asks_ = new ::std::string; + } + number_asks_->assign(value); +} +inline void MarketData_InternalPB::set_number_asks(const char* value) { + set_has_number_asks(); + if (number_asks_ == &::google::protobuf::internal::kEmptyString) { + number_asks_ = new ::std::string; + } + number_asks_->assign(value); +} +inline void MarketData_InternalPB::set_number_asks(const char* value, size_t size) { + set_has_number_asks(); + if (number_asks_ == &::google::protobuf::internal::kEmptyString) { + number_asks_ = new ::std::string; + } + number_asks_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_number_asks() { + set_has_number_asks(); + if (number_asks_ == &::google::protobuf::internal::kEmptyString) { + number_asks_ = new ::std::string; + } + return number_asks_; +} +inline ::std::string* MarketData_InternalPB::release_number_asks() { + clear_has_number_asks(); + if (number_asks_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = number_asks_; + number_asks_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string last_sale_price = 10; +inline bool MarketData_InternalPB::has_last_sale_price() const { + return (_has_bits_[0] & 0x00000200u) != 0; +} +inline void MarketData_InternalPB::set_has_last_sale_price() { + _has_bits_[0] |= 0x00000200u; +} +inline void MarketData_InternalPB::clear_has_last_sale_price() { + _has_bits_[0] &= ~0x00000200u; +} +inline void MarketData_InternalPB::clear_last_sale_price() { + if (last_sale_price_ != &::google::protobuf::internal::kEmptyString) { + last_sale_price_->clear(); + } + clear_has_last_sale_price(); +} +inline const ::std::string& MarketData_InternalPB::last_sale_price() const { + return *last_sale_price_; +} +inline void MarketData_InternalPB::set_last_sale_price(const ::std::string& value) { + set_has_last_sale_price(); + if (last_sale_price_ == &::google::protobuf::internal::kEmptyString) { + last_sale_price_ = new ::std::string; + } + last_sale_price_->assign(value); +} +inline void MarketData_InternalPB::set_last_sale_price(const char* value) { + set_has_last_sale_price(); + if (last_sale_price_ == &::google::protobuf::internal::kEmptyString) { + last_sale_price_ = new ::std::string; + } + last_sale_price_->assign(value); +} +inline void MarketData_InternalPB::set_last_sale_price(const char* value, size_t size) { + set_has_last_sale_price(); + if (last_sale_price_ == &::google::protobuf::internal::kEmptyString) { + last_sale_price_ = new ::std::string; + } + last_sale_price_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_last_sale_price() { + set_has_last_sale_price(); + if (last_sale_price_ == &::google::protobuf::internal::kEmptyString) { + last_sale_price_ = new ::std::string; + } + return last_sale_price_; +} +inline ::std::string* MarketData_InternalPB::release_last_sale_price() { + clear_has_last_sale_price(); + if (last_sale_price_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = last_sale_price_; + last_sale_price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string current_bid = 11; +inline bool MarketData_InternalPB::has_current_bid() const { + return (_has_bits_[0] & 0x00000400u) != 0; +} +inline void MarketData_InternalPB::set_has_current_bid() { + _has_bits_[0] |= 0x00000400u; +} +inline void MarketData_InternalPB::clear_has_current_bid() { + _has_bits_[0] &= ~0x00000400u; +} +inline void MarketData_InternalPB::clear_current_bid() { + if (current_bid_ != &::google::protobuf::internal::kEmptyString) { + current_bid_->clear(); + } + clear_has_current_bid(); +} +inline const ::std::string& MarketData_InternalPB::current_bid() const { + return *current_bid_; +} +inline void MarketData_InternalPB::set_current_bid(const ::std::string& value) { + set_has_current_bid(); + if (current_bid_ == &::google::protobuf::internal::kEmptyString) { + current_bid_ = new ::std::string; + } + current_bid_->assign(value); +} +inline void MarketData_InternalPB::set_current_bid(const char* value) { + set_has_current_bid(); + if (current_bid_ == &::google::protobuf::internal::kEmptyString) { + current_bid_ = new ::std::string; + } + current_bid_->assign(value); +} +inline void MarketData_InternalPB::set_current_bid(const char* value, size_t size) { + set_has_current_bid(); + if (current_bid_ == &::google::protobuf::internal::kEmptyString) { + current_bid_ = new ::std::string; + } + current_bid_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_current_bid() { + set_has_current_bid(); + if (current_bid_ == &::google::protobuf::internal::kEmptyString) { + current_bid_ = new ::std::string; + } + return current_bid_; +} +inline ::std::string* MarketData_InternalPB::release_current_bid() { + clear_has_current_bid(); + if (current_bid_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = current_bid_; + current_bid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string current_ask = 12; +inline bool MarketData_InternalPB::has_current_ask() const { + return (_has_bits_[0] & 0x00000800u) != 0; +} +inline void MarketData_InternalPB::set_has_current_ask() { + _has_bits_[0] |= 0x00000800u; +} +inline void MarketData_InternalPB::clear_has_current_ask() { + _has_bits_[0] &= ~0x00000800u; +} +inline void MarketData_InternalPB::clear_current_ask() { + if (current_ask_ != &::google::protobuf::internal::kEmptyString) { + current_ask_->clear(); + } + clear_has_current_ask(); +} +inline const ::std::string& MarketData_InternalPB::current_ask() const { + return *current_ask_; +} +inline void MarketData_InternalPB::set_current_ask(const ::std::string& value) { + set_has_current_ask(); + if (current_ask_ == &::google::protobuf::internal::kEmptyString) { + current_ask_ = new ::std::string; + } + current_ask_->assign(value); +} +inline void MarketData_InternalPB::set_current_ask(const char* value) { + set_has_current_ask(); + if (current_ask_ == &::google::protobuf::internal::kEmptyString) { + current_ask_ = new ::std::string; + } + current_ask_->assign(value); +} +inline void MarketData_InternalPB::set_current_ask(const char* value, size_t size) { + set_has_current_ask(); + if (current_ask_ == &::google::protobuf::internal::kEmptyString) { + current_ask_ = new ::std::string; + } + current_ask_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_current_ask() { + set_has_current_ask(); + if (current_ask_ == &::google::protobuf::internal::kEmptyString) { + current_ask_ = new ::std::string; + } + return current_ask_; +} +inline ::std::string* MarketData_InternalPB::release_current_ask() { + clear_has_current_ask(); + if (current_ask_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = current_ask_; + current_ask_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string volume_trades = 13; +inline bool MarketData_InternalPB::has_volume_trades() const { + return (_has_bits_[0] & 0x00001000u) != 0; +} +inline void MarketData_InternalPB::set_has_volume_trades() { + _has_bits_[0] |= 0x00001000u; +} +inline void MarketData_InternalPB::clear_has_volume_trades() { + _has_bits_[0] &= ~0x00001000u; +} +inline void MarketData_InternalPB::clear_volume_trades() { + if (volume_trades_ != &::google::protobuf::internal::kEmptyString) { + volume_trades_->clear(); + } + clear_has_volume_trades(); +} +inline const ::std::string& MarketData_InternalPB::volume_trades() const { + return *volume_trades_; +} +inline void MarketData_InternalPB::set_volume_trades(const ::std::string& value) { + set_has_volume_trades(); + if (volume_trades_ == &::google::protobuf::internal::kEmptyString) { + volume_trades_ = new ::std::string; + } + volume_trades_->assign(value); +} +inline void MarketData_InternalPB::set_volume_trades(const char* value) { + set_has_volume_trades(); + if (volume_trades_ == &::google::protobuf::internal::kEmptyString) { + volume_trades_ = new ::std::string; + } + volume_trades_->assign(value); +} +inline void MarketData_InternalPB::set_volume_trades(const char* value, size_t size) { + set_has_volume_trades(); + if (volume_trades_ == &::google::protobuf::internal::kEmptyString) { + volume_trades_ = new ::std::string; + } + volume_trades_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_volume_trades() { + set_has_volume_trades(); + if (volume_trades_ == &::google::protobuf::internal::kEmptyString) { + volume_trades_ = new ::std::string; + } + return volume_trades_; +} +inline ::std::string* MarketData_InternalPB::release_volume_trades() { + clear_has_volume_trades(); + if (volume_trades_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = volume_trades_; + volume_trades_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string volume_assets = 14; +inline bool MarketData_InternalPB::has_volume_assets() const { + return (_has_bits_[0] & 0x00002000u) != 0; +} +inline void MarketData_InternalPB::set_has_volume_assets() { + _has_bits_[0] |= 0x00002000u; +} +inline void MarketData_InternalPB::clear_has_volume_assets() { + _has_bits_[0] &= ~0x00002000u; +} +inline void MarketData_InternalPB::clear_volume_assets() { + if (volume_assets_ != &::google::protobuf::internal::kEmptyString) { + volume_assets_->clear(); + } + clear_has_volume_assets(); +} +inline const ::std::string& MarketData_InternalPB::volume_assets() const { + return *volume_assets_; +} +inline void MarketData_InternalPB::set_volume_assets(const ::std::string& value) { + set_has_volume_assets(); + if (volume_assets_ == &::google::protobuf::internal::kEmptyString) { + volume_assets_ = new ::std::string; + } + volume_assets_->assign(value); +} +inline void MarketData_InternalPB::set_volume_assets(const char* value) { + set_has_volume_assets(); + if (volume_assets_ == &::google::protobuf::internal::kEmptyString) { + volume_assets_ = new ::std::string; + } + volume_assets_->assign(value); +} +inline void MarketData_InternalPB::set_volume_assets(const char* value, size_t size) { + set_has_volume_assets(); + if (volume_assets_ == &::google::protobuf::internal::kEmptyString) { + volume_assets_ = new ::std::string; + } + volume_assets_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_volume_assets() { + set_has_volume_assets(); + if (volume_assets_ == &::google::protobuf::internal::kEmptyString) { + volume_assets_ = new ::std::string; + } + return volume_assets_; +} +inline ::std::string* MarketData_InternalPB::release_volume_assets() { + clear_has_volume_assets(); + if (volume_assets_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = volume_assets_; + volume_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string volume_currency = 15; +inline bool MarketData_InternalPB::has_volume_currency() const { + return (_has_bits_[0] & 0x00004000u) != 0; +} +inline void MarketData_InternalPB::set_has_volume_currency() { + _has_bits_[0] |= 0x00004000u; +} +inline void MarketData_InternalPB::clear_has_volume_currency() { + _has_bits_[0] &= ~0x00004000u; +} +inline void MarketData_InternalPB::clear_volume_currency() { + if (volume_currency_ != &::google::protobuf::internal::kEmptyString) { + volume_currency_->clear(); + } + clear_has_volume_currency(); +} +inline const ::std::string& MarketData_InternalPB::volume_currency() const { + return *volume_currency_; +} +inline void MarketData_InternalPB::set_volume_currency(const ::std::string& value) { + set_has_volume_currency(); + if (volume_currency_ == &::google::protobuf::internal::kEmptyString) { + volume_currency_ = new ::std::string; + } + volume_currency_->assign(value); +} +inline void MarketData_InternalPB::set_volume_currency(const char* value) { + set_has_volume_currency(); + if (volume_currency_ == &::google::protobuf::internal::kEmptyString) { + volume_currency_ = new ::std::string; + } + volume_currency_->assign(value); +} +inline void MarketData_InternalPB::set_volume_currency(const char* value, size_t size) { + set_has_volume_currency(); + if (volume_currency_ == &::google::protobuf::internal::kEmptyString) { + volume_currency_ = new ::std::string; + } + volume_currency_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_volume_currency() { + set_has_volume_currency(); + if (volume_currency_ == &::google::protobuf::internal::kEmptyString) { + volume_currency_ = new ::std::string; + } + return volume_currency_; +} +inline ::std::string* MarketData_InternalPB::release_volume_currency() { + clear_has_volume_currency(); + if (volume_currency_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = volume_currency_; + volume_currency_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string recent_highest_bid = 16; +inline bool MarketData_InternalPB::has_recent_highest_bid() const { + return (_has_bits_[0] & 0x00008000u) != 0; +} +inline void MarketData_InternalPB::set_has_recent_highest_bid() { + _has_bits_[0] |= 0x00008000u; +} +inline void MarketData_InternalPB::clear_has_recent_highest_bid() { + _has_bits_[0] &= ~0x00008000u; +} +inline void MarketData_InternalPB::clear_recent_highest_bid() { + if (recent_highest_bid_ != &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_->clear(); + } + clear_has_recent_highest_bid(); +} +inline const ::std::string& MarketData_InternalPB::recent_highest_bid() const { + return *recent_highest_bid_; +} +inline void MarketData_InternalPB::set_recent_highest_bid(const ::std::string& value) { + set_has_recent_highest_bid(); + if (recent_highest_bid_ == &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_ = new ::std::string; + } + recent_highest_bid_->assign(value); +} +inline void MarketData_InternalPB::set_recent_highest_bid(const char* value) { + set_has_recent_highest_bid(); + if (recent_highest_bid_ == &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_ = new ::std::string; + } + recent_highest_bid_->assign(value); +} +inline void MarketData_InternalPB::set_recent_highest_bid(const char* value, size_t size) { + set_has_recent_highest_bid(); + if (recent_highest_bid_ == &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_ = new ::std::string; + } + recent_highest_bid_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_recent_highest_bid() { + set_has_recent_highest_bid(); + if (recent_highest_bid_ == &::google::protobuf::internal::kEmptyString) { + recent_highest_bid_ = new ::std::string; + } + return recent_highest_bid_; +} +inline ::std::string* MarketData_InternalPB::release_recent_highest_bid() { + clear_has_recent_highest_bid(); + if (recent_highest_bid_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = recent_highest_bid_; + recent_highest_bid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string recent_lowest_ask = 17; +inline bool MarketData_InternalPB::has_recent_lowest_ask() const { + return (_has_bits_[0] & 0x00010000u) != 0; +} +inline void MarketData_InternalPB::set_has_recent_lowest_ask() { + _has_bits_[0] |= 0x00010000u; +} +inline void MarketData_InternalPB::clear_has_recent_lowest_ask() { + _has_bits_[0] &= ~0x00010000u; +} +inline void MarketData_InternalPB::clear_recent_lowest_ask() { + if (recent_lowest_ask_ != &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_->clear(); + } + clear_has_recent_lowest_ask(); +} +inline const ::std::string& MarketData_InternalPB::recent_lowest_ask() const { + return *recent_lowest_ask_; +} +inline void MarketData_InternalPB::set_recent_lowest_ask(const ::std::string& value) { + set_has_recent_lowest_ask(); + if (recent_lowest_ask_ == &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_ = new ::std::string; + } + recent_lowest_ask_->assign(value); +} +inline void MarketData_InternalPB::set_recent_lowest_ask(const char* value) { + set_has_recent_lowest_ask(); + if (recent_lowest_ask_ == &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_ = new ::std::string; + } + recent_lowest_ask_->assign(value); +} +inline void MarketData_InternalPB::set_recent_lowest_ask(const char* value, size_t size) { + set_has_recent_lowest_ask(); + if (recent_lowest_ask_ == &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_ = new ::std::string; + } + recent_lowest_ask_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MarketData_InternalPB::mutable_recent_lowest_ask() { + set_has_recent_lowest_ask(); + if (recent_lowest_ask_ == &::google::protobuf::internal::kEmptyString) { + recent_lowest_ask_ = new ::std::string; + } + return recent_lowest_ask_; +} +inline ::std::string* MarketData_InternalPB::release_recent_lowest_ask() { + clear_has_recent_lowest_ask(); + if (recent_lowest_ask_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = recent_lowest_ask_; + recent_lowest_ask_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// MarketList_InternalPB + +// repeated .OTDB.MarketData_InternalPB market_data = 1; +inline int MarketList_InternalPB::market_data_size() const { + return market_data_.size(); +} +inline void MarketList_InternalPB::clear_market_data() { + market_data_.Clear(); +} +inline const ::OTDB::MarketData_InternalPB& MarketList_InternalPB::market_data(int index) const { + return market_data_.Get(index); +} +inline ::OTDB::MarketData_InternalPB* MarketList_InternalPB::mutable_market_data(int index) { + return market_data_.Mutable(index); +} +inline ::OTDB::MarketData_InternalPB* MarketList_InternalPB::add_market_data() { + return market_data_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::MarketData_InternalPB >& +MarketList_InternalPB::market_data() const { + return market_data_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::MarketData_InternalPB >* +MarketList_InternalPB::mutable_market_data() { + return &market_data_; +} + +// ------------------------------------------------------------------- + +// OfferDataMarket_InternalPB + +// optional string gui_label = 1; +inline bool OfferDataMarket_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void OfferDataMarket_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void OfferDataMarket_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void OfferDataMarket_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& OfferDataMarket_InternalPB::gui_label() const { + return *gui_label_; +} +inline void OfferDataMarket_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataMarket_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* OfferDataMarket_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string transaction_id = 2; +inline bool OfferDataMarket_InternalPB::has_transaction_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void OfferDataMarket_InternalPB::set_has_transaction_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void OfferDataMarket_InternalPB::clear_has_transaction_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void OfferDataMarket_InternalPB::clear_transaction_id() { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + clear_has_transaction_id(); +} +inline const ::std::string& OfferDataMarket_InternalPB::transaction_id() const { + return *transaction_id_; +} +inline void OfferDataMarket_InternalPB::set_transaction_id(const ::std::string& value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_transaction_id(const char* value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_transaction_id(const char* value, size_t size) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataMarket_InternalPB::mutable_transaction_id() { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + return transaction_id_; +} +inline ::std::string* OfferDataMarket_InternalPB::release_transaction_id() { + clear_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = transaction_id_; + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string price_per_scale = 3; +inline bool OfferDataMarket_InternalPB::has_price_per_scale() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void OfferDataMarket_InternalPB::set_has_price_per_scale() { + _has_bits_[0] |= 0x00000004u; +} +inline void OfferDataMarket_InternalPB::clear_has_price_per_scale() { + _has_bits_[0] &= ~0x00000004u; +} +inline void OfferDataMarket_InternalPB::clear_price_per_scale() { + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + price_per_scale_->clear(); + } + clear_has_price_per_scale(); +} +inline const ::std::string& OfferDataMarket_InternalPB::price_per_scale() const { + return *price_per_scale_; +} +inline void OfferDataMarket_InternalPB::set_price_per_scale(const ::std::string& value) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_price_per_scale(const char* value) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_price_per_scale(const char* value, size_t size) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataMarket_InternalPB::mutable_price_per_scale() { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + return price_per_scale_; +} +inline ::std::string* OfferDataMarket_InternalPB::release_price_per_scale() { + clear_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = price_per_scale_; + price_per_scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string available_assets = 4; +inline bool OfferDataMarket_InternalPB::has_available_assets() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void OfferDataMarket_InternalPB::set_has_available_assets() { + _has_bits_[0] |= 0x00000008u; +} +inline void OfferDataMarket_InternalPB::clear_has_available_assets() { + _has_bits_[0] &= ~0x00000008u; +} +inline void OfferDataMarket_InternalPB::clear_available_assets() { + if (available_assets_ != &::google::protobuf::internal::kEmptyString) { + available_assets_->clear(); + } + clear_has_available_assets(); +} +inline const ::std::string& OfferDataMarket_InternalPB::available_assets() const { + return *available_assets_; +} +inline void OfferDataMarket_InternalPB::set_available_assets(const ::std::string& value) { + set_has_available_assets(); + if (available_assets_ == &::google::protobuf::internal::kEmptyString) { + available_assets_ = new ::std::string; + } + available_assets_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_available_assets(const char* value) { + set_has_available_assets(); + if (available_assets_ == &::google::protobuf::internal::kEmptyString) { + available_assets_ = new ::std::string; + } + available_assets_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_available_assets(const char* value, size_t size) { + set_has_available_assets(); + if (available_assets_ == &::google::protobuf::internal::kEmptyString) { + available_assets_ = new ::std::string; + } + available_assets_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataMarket_InternalPB::mutable_available_assets() { + set_has_available_assets(); + if (available_assets_ == &::google::protobuf::internal::kEmptyString) { + available_assets_ = new ::std::string; + } + return available_assets_; +} +inline ::std::string* OfferDataMarket_InternalPB::release_available_assets() { + clear_has_available_assets(); + if (available_assets_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = available_assets_; + available_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string minimum_increment = 5; +inline bool OfferDataMarket_InternalPB::has_minimum_increment() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void OfferDataMarket_InternalPB::set_has_minimum_increment() { + _has_bits_[0] |= 0x00000010u; +} +inline void OfferDataMarket_InternalPB::clear_has_minimum_increment() { + _has_bits_[0] &= ~0x00000010u; +} +inline void OfferDataMarket_InternalPB::clear_minimum_increment() { + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + minimum_increment_->clear(); + } + clear_has_minimum_increment(); +} +inline const ::std::string& OfferDataMarket_InternalPB::minimum_increment() const { + return *minimum_increment_; +} +inline void OfferDataMarket_InternalPB::set_minimum_increment(const ::std::string& value) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_minimum_increment(const char* value) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(value); +} +inline void OfferDataMarket_InternalPB::set_minimum_increment(const char* value, size_t size) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataMarket_InternalPB::mutable_minimum_increment() { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + return minimum_increment_; +} +inline ::std::string* OfferDataMarket_InternalPB::release_minimum_increment() { + clear_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = minimum_increment_; + minimum_increment_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// OfferListMarket_InternalPB + +// repeated .OTDB.OfferDataMarket_InternalPB bids = 1; +inline int OfferListMarket_InternalPB::bids_size() const { + return bids_.size(); +} +inline void OfferListMarket_InternalPB::clear_bids() { + bids_.Clear(); +} +inline const ::OTDB::OfferDataMarket_InternalPB& OfferListMarket_InternalPB::bids(int index) const { + return bids_.Get(index); +} +inline ::OTDB::OfferDataMarket_InternalPB* OfferListMarket_InternalPB::mutable_bids(int index) { + return bids_.Mutable(index); +} +inline ::OTDB::OfferDataMarket_InternalPB* OfferListMarket_InternalPB::add_bids() { + return bids_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >& +OfferListMarket_InternalPB::bids() const { + return bids_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >* +OfferListMarket_InternalPB::mutable_bids() { + return &bids_; +} + +// repeated .OTDB.OfferDataMarket_InternalPB asks = 2; +inline int OfferListMarket_InternalPB::asks_size() const { + return asks_.size(); +} +inline void OfferListMarket_InternalPB::clear_asks() { + asks_.Clear(); +} +inline const ::OTDB::OfferDataMarket_InternalPB& OfferListMarket_InternalPB::asks(int index) const { + return asks_.Get(index); +} +inline ::OTDB::OfferDataMarket_InternalPB* OfferListMarket_InternalPB::mutable_asks(int index) { + return asks_.Mutable(index); +} +inline ::OTDB::OfferDataMarket_InternalPB* OfferListMarket_InternalPB::add_asks() { + return asks_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >& +OfferListMarket_InternalPB::asks() const { + return asks_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataMarket_InternalPB >* +OfferListMarket_InternalPB::mutable_asks() { + return &asks_; +} + +// ------------------------------------------------------------------- + +// TradeDataMarket_InternalPB + +// optional string gui_label = 1; +inline bool TradeDataMarket_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void TradeDataMarket_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void TradeDataMarket_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void TradeDataMarket_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& TradeDataMarket_InternalPB::gui_label() const { + return *gui_label_; +} +inline void TradeDataMarket_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataMarket_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* TradeDataMarket_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string transaction_id = 2; +inline bool TradeDataMarket_InternalPB::has_transaction_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void TradeDataMarket_InternalPB::set_has_transaction_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void TradeDataMarket_InternalPB::clear_has_transaction_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void TradeDataMarket_InternalPB::clear_transaction_id() { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + clear_has_transaction_id(); +} +inline const ::std::string& TradeDataMarket_InternalPB::transaction_id() const { + return *transaction_id_; +} +inline void TradeDataMarket_InternalPB::set_transaction_id(const ::std::string& value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_transaction_id(const char* value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_transaction_id(const char* value, size_t size) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataMarket_InternalPB::mutable_transaction_id() { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + return transaction_id_; +} +inline ::std::string* TradeDataMarket_InternalPB::release_transaction_id() { + clear_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = transaction_id_; + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string date = 3; +inline bool TradeDataMarket_InternalPB::has_date() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void TradeDataMarket_InternalPB::set_has_date() { + _has_bits_[0] |= 0x00000004u; +} +inline void TradeDataMarket_InternalPB::clear_has_date() { + _has_bits_[0] &= ~0x00000004u; +} +inline void TradeDataMarket_InternalPB::clear_date() { + if (date_ != &::google::protobuf::internal::kEmptyString) { + date_->clear(); + } + clear_has_date(); +} +inline const ::std::string& TradeDataMarket_InternalPB::date() const { + return *date_; +} +inline void TradeDataMarket_InternalPB::set_date(const ::std::string& value) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_date(const char* value) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_date(const char* value, size_t size) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataMarket_InternalPB::mutable_date() { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + return date_; +} +inline ::std::string* TradeDataMarket_InternalPB::release_date() { + clear_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = date_; + date_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string price = 4; +inline bool TradeDataMarket_InternalPB::has_price() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void TradeDataMarket_InternalPB::set_has_price() { + _has_bits_[0] |= 0x00000008u; +} +inline void TradeDataMarket_InternalPB::clear_has_price() { + _has_bits_[0] &= ~0x00000008u; +} +inline void TradeDataMarket_InternalPB::clear_price() { + if (price_ != &::google::protobuf::internal::kEmptyString) { + price_->clear(); + } + clear_has_price(); +} +inline const ::std::string& TradeDataMarket_InternalPB::price() const { + return *price_; +} +inline void TradeDataMarket_InternalPB::set_price(const ::std::string& value) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_price(const char* value) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_price(const char* value, size_t size) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataMarket_InternalPB::mutable_price() { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + return price_; +} +inline ::std::string* TradeDataMarket_InternalPB::release_price() { + clear_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = price_; + price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string amount_sold = 5; +inline bool TradeDataMarket_InternalPB::has_amount_sold() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void TradeDataMarket_InternalPB::set_has_amount_sold() { + _has_bits_[0] |= 0x00000010u; +} +inline void TradeDataMarket_InternalPB::clear_has_amount_sold() { + _has_bits_[0] &= ~0x00000010u; +} +inline void TradeDataMarket_InternalPB::clear_amount_sold() { + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + amount_sold_->clear(); + } + clear_has_amount_sold(); +} +inline const ::std::string& TradeDataMarket_InternalPB::amount_sold() const { + return *amount_sold_; +} +inline void TradeDataMarket_InternalPB::set_amount_sold(const ::std::string& value) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_amount_sold(const char* value) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(value); +} +inline void TradeDataMarket_InternalPB::set_amount_sold(const char* value, size_t size) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataMarket_InternalPB::mutable_amount_sold() { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + return amount_sold_; +} +inline ::std::string* TradeDataMarket_InternalPB::release_amount_sold() { + clear_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = amount_sold_; + amount_sold_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// TradeListMarket_InternalPB + +// repeated .OTDB.TradeDataMarket_InternalPB trades = 1; +inline int TradeListMarket_InternalPB::trades_size() const { + return trades_.size(); +} +inline void TradeListMarket_InternalPB::clear_trades() { + trades_.Clear(); +} +inline const ::OTDB::TradeDataMarket_InternalPB& TradeListMarket_InternalPB::trades(int index) const { + return trades_.Get(index); +} +inline ::OTDB::TradeDataMarket_InternalPB* TradeListMarket_InternalPB::mutable_trades(int index) { + return trades_.Mutable(index); +} +inline ::OTDB::TradeDataMarket_InternalPB* TradeListMarket_InternalPB::add_trades() { + return trades_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataMarket_InternalPB >& +TradeListMarket_InternalPB::trades() const { + return trades_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataMarket_InternalPB >* +TradeListMarket_InternalPB::mutable_trades() { + return &trades_; +} + +// ------------------------------------------------------------------- + +// OfferDataNym_InternalPB + +// optional string gui_label = 1; +inline bool OfferDataNym_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void OfferDataNym_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void OfferDataNym_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& OfferDataNym_InternalPB::gui_label() const { + return *gui_label_; +} +inline void OfferDataNym_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void OfferDataNym_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void OfferDataNym_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* OfferDataNym_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string valid_from = 2; +inline bool OfferDataNym_InternalPB::has_valid_from() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_valid_from() { + _has_bits_[0] |= 0x00000002u; +} +inline void OfferDataNym_InternalPB::clear_has_valid_from() { + _has_bits_[0] &= ~0x00000002u; +} +inline void OfferDataNym_InternalPB::clear_valid_from() { + if (valid_from_ != &::google::protobuf::internal::kEmptyString) { + valid_from_->clear(); + } + clear_has_valid_from(); +} +inline const ::std::string& OfferDataNym_InternalPB::valid_from() const { + return *valid_from_; +} +inline void OfferDataNym_InternalPB::set_valid_from(const ::std::string& value) { + set_has_valid_from(); + if (valid_from_ == &::google::protobuf::internal::kEmptyString) { + valid_from_ = new ::std::string; + } + valid_from_->assign(value); +} +inline void OfferDataNym_InternalPB::set_valid_from(const char* value) { + set_has_valid_from(); + if (valid_from_ == &::google::protobuf::internal::kEmptyString) { + valid_from_ = new ::std::string; + } + valid_from_->assign(value); +} +inline void OfferDataNym_InternalPB::set_valid_from(const char* value, size_t size) { + set_has_valid_from(); + if (valid_from_ == &::google::protobuf::internal::kEmptyString) { + valid_from_ = new ::std::string; + } + valid_from_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_valid_from() { + set_has_valid_from(); + if (valid_from_ == &::google::protobuf::internal::kEmptyString) { + valid_from_ = new ::std::string; + } + return valid_from_; +} +inline ::std::string* OfferDataNym_InternalPB::release_valid_from() { + clear_has_valid_from(); + if (valid_from_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = valid_from_; + valid_from_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string valid_to = 3; +inline bool OfferDataNym_InternalPB::has_valid_to() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_valid_to() { + _has_bits_[0] |= 0x00000004u; +} +inline void OfferDataNym_InternalPB::clear_has_valid_to() { + _has_bits_[0] &= ~0x00000004u; +} +inline void OfferDataNym_InternalPB::clear_valid_to() { + if (valid_to_ != &::google::protobuf::internal::kEmptyString) { + valid_to_->clear(); + } + clear_has_valid_to(); +} +inline const ::std::string& OfferDataNym_InternalPB::valid_to() const { + return *valid_to_; +} +inline void OfferDataNym_InternalPB::set_valid_to(const ::std::string& value) { + set_has_valid_to(); + if (valid_to_ == &::google::protobuf::internal::kEmptyString) { + valid_to_ = new ::std::string; + } + valid_to_->assign(value); +} +inline void OfferDataNym_InternalPB::set_valid_to(const char* value) { + set_has_valid_to(); + if (valid_to_ == &::google::protobuf::internal::kEmptyString) { + valid_to_ = new ::std::string; + } + valid_to_->assign(value); +} +inline void OfferDataNym_InternalPB::set_valid_to(const char* value, size_t size) { + set_has_valid_to(); + if (valid_to_ == &::google::protobuf::internal::kEmptyString) { + valid_to_ = new ::std::string; + } + valid_to_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_valid_to() { + set_has_valid_to(); + if (valid_to_ == &::google::protobuf::internal::kEmptyString) { + valid_to_ = new ::std::string; + } + return valid_to_; +} +inline ::std::string* OfferDataNym_InternalPB::release_valid_to() { + clear_has_valid_to(); + if (valid_to_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = valid_to_; + valid_to_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 4; +inline bool OfferDataNym_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000008u; +} +inline void OfferDataNym_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000008u; +} +inline void OfferDataNym_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::server_id() const { + return *server_id_; +} +inline void OfferDataNym_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string asset_type_id = 5; +inline bool OfferDataNym_InternalPB::has_asset_type_id() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_asset_type_id() { + _has_bits_[0] |= 0x00000010u; +} +inline void OfferDataNym_InternalPB::clear_has_asset_type_id() { + _has_bits_[0] &= ~0x00000010u; +} +inline void OfferDataNym_InternalPB::clear_asset_type_id() { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + clear_has_asset_type_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::asset_type_id() const { + return *asset_type_id_; +} +inline void OfferDataNym_InternalPB::set_asset_type_id(const ::std::string& value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_asset_type_id(const char* value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_asset_type_id(const char* value, size_t size) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_asset_type_id() { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + return asset_type_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_asset_type_id() { + clear_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = asset_type_id_; + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string asset_acct_id = 6; +inline bool OfferDataNym_InternalPB::has_asset_acct_id() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_asset_acct_id() { + _has_bits_[0] |= 0x00000020u; +} +inline void OfferDataNym_InternalPB::clear_has_asset_acct_id() { + _has_bits_[0] &= ~0x00000020u; +} +inline void OfferDataNym_InternalPB::clear_asset_acct_id() { + if (asset_acct_id_ != &::google::protobuf::internal::kEmptyString) { + asset_acct_id_->clear(); + } + clear_has_asset_acct_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::asset_acct_id() const { + return *asset_acct_id_; +} +inline void OfferDataNym_InternalPB::set_asset_acct_id(const ::std::string& value) { + set_has_asset_acct_id(); + if (asset_acct_id_ == &::google::protobuf::internal::kEmptyString) { + asset_acct_id_ = new ::std::string; + } + asset_acct_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_asset_acct_id(const char* value) { + set_has_asset_acct_id(); + if (asset_acct_id_ == &::google::protobuf::internal::kEmptyString) { + asset_acct_id_ = new ::std::string; + } + asset_acct_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_asset_acct_id(const char* value, size_t size) { + set_has_asset_acct_id(); + if (asset_acct_id_ == &::google::protobuf::internal::kEmptyString) { + asset_acct_id_ = new ::std::string; + } + asset_acct_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_asset_acct_id() { + set_has_asset_acct_id(); + if (asset_acct_id_ == &::google::protobuf::internal::kEmptyString) { + asset_acct_id_ = new ::std::string; + } + return asset_acct_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_asset_acct_id() { + clear_has_asset_acct_id(); + if (asset_acct_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = asset_acct_id_; + asset_acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string currency_type_id = 7; +inline bool OfferDataNym_InternalPB::has_currency_type_id() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_currency_type_id() { + _has_bits_[0] |= 0x00000040u; +} +inline void OfferDataNym_InternalPB::clear_has_currency_type_id() { + _has_bits_[0] &= ~0x00000040u; +} +inline void OfferDataNym_InternalPB::clear_currency_type_id() { + if (currency_type_id_ != &::google::protobuf::internal::kEmptyString) { + currency_type_id_->clear(); + } + clear_has_currency_type_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::currency_type_id() const { + return *currency_type_id_; +} +inline void OfferDataNym_InternalPB::set_currency_type_id(const ::std::string& value) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_currency_type_id(const char* value) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_currency_type_id(const char* value, size_t size) { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + currency_type_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_currency_type_id() { + set_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + currency_type_id_ = new ::std::string; + } + return currency_type_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_currency_type_id() { + clear_has_currency_type_id(); + if (currency_type_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = currency_type_id_; + currency_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string currency_acct_id = 8; +inline bool OfferDataNym_InternalPB::has_currency_acct_id() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_currency_acct_id() { + _has_bits_[0] |= 0x00000080u; +} +inline void OfferDataNym_InternalPB::clear_has_currency_acct_id() { + _has_bits_[0] &= ~0x00000080u; +} +inline void OfferDataNym_InternalPB::clear_currency_acct_id() { + if (currency_acct_id_ != &::google::protobuf::internal::kEmptyString) { + currency_acct_id_->clear(); + } + clear_has_currency_acct_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::currency_acct_id() const { + return *currency_acct_id_; +} +inline void OfferDataNym_InternalPB::set_currency_acct_id(const ::std::string& value) { + set_has_currency_acct_id(); + if (currency_acct_id_ == &::google::protobuf::internal::kEmptyString) { + currency_acct_id_ = new ::std::string; + } + currency_acct_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_currency_acct_id(const char* value) { + set_has_currency_acct_id(); + if (currency_acct_id_ == &::google::protobuf::internal::kEmptyString) { + currency_acct_id_ = new ::std::string; + } + currency_acct_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_currency_acct_id(const char* value, size_t size) { + set_has_currency_acct_id(); + if (currency_acct_id_ == &::google::protobuf::internal::kEmptyString) { + currency_acct_id_ = new ::std::string; + } + currency_acct_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_currency_acct_id() { + set_has_currency_acct_id(); + if (currency_acct_id_ == &::google::protobuf::internal::kEmptyString) { + currency_acct_id_ = new ::std::string; + } + return currency_acct_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_currency_acct_id() { + clear_has_currency_acct_id(); + if (currency_acct_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = currency_acct_id_; + currency_acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional bool selling = 9; +inline bool OfferDataNym_InternalPB::has_selling() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_selling() { + _has_bits_[0] |= 0x00000100u; +} +inline void OfferDataNym_InternalPB::clear_has_selling() { + _has_bits_[0] &= ~0x00000100u; +} +inline void OfferDataNym_InternalPB::clear_selling() { + selling_ = false; + clear_has_selling(); +} +inline bool OfferDataNym_InternalPB::selling() const { + return selling_; +} +inline void OfferDataNym_InternalPB::set_selling(bool value) { + set_has_selling(); + selling_ = value; +} + +// optional string scale = 10; +inline bool OfferDataNym_InternalPB::has_scale() const { + return (_has_bits_[0] & 0x00000200u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_scale() { + _has_bits_[0] |= 0x00000200u; +} +inline void OfferDataNym_InternalPB::clear_has_scale() { + _has_bits_[0] &= ~0x00000200u; +} +inline void OfferDataNym_InternalPB::clear_scale() { + if (scale_ != &::google::protobuf::internal::kEmptyString) { + scale_->clear(); + } + clear_has_scale(); +} +inline const ::std::string& OfferDataNym_InternalPB::scale() const { + return *scale_; +} +inline void OfferDataNym_InternalPB::set_scale(const ::std::string& value) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(value); +} +inline void OfferDataNym_InternalPB::set_scale(const char* value) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(value); +} +inline void OfferDataNym_InternalPB::set_scale(const char* value, size_t size) { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + scale_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_scale() { + set_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + scale_ = new ::std::string; + } + return scale_; +} +inline ::std::string* OfferDataNym_InternalPB::release_scale() { + clear_has_scale(); + if (scale_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = scale_; + scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string price_per_scale = 11; +inline bool OfferDataNym_InternalPB::has_price_per_scale() const { + return (_has_bits_[0] & 0x00000400u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_price_per_scale() { + _has_bits_[0] |= 0x00000400u; +} +inline void OfferDataNym_InternalPB::clear_has_price_per_scale() { + _has_bits_[0] &= ~0x00000400u; +} +inline void OfferDataNym_InternalPB::clear_price_per_scale() { + if (price_per_scale_ != &::google::protobuf::internal::kEmptyString) { + price_per_scale_->clear(); + } + clear_has_price_per_scale(); +} +inline const ::std::string& OfferDataNym_InternalPB::price_per_scale() const { + return *price_per_scale_; +} +inline void OfferDataNym_InternalPB::set_price_per_scale(const ::std::string& value) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(value); +} +inline void OfferDataNym_InternalPB::set_price_per_scale(const char* value) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(value); +} +inline void OfferDataNym_InternalPB::set_price_per_scale(const char* value, size_t size) { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + price_per_scale_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_price_per_scale() { + set_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + price_per_scale_ = new ::std::string; + } + return price_per_scale_; +} +inline ::std::string* OfferDataNym_InternalPB::release_price_per_scale() { + clear_has_price_per_scale(); + if (price_per_scale_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = price_per_scale_; + price_per_scale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string transaction_id = 12; +inline bool OfferDataNym_InternalPB::has_transaction_id() const { + return (_has_bits_[0] & 0x00000800u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_transaction_id() { + _has_bits_[0] |= 0x00000800u; +} +inline void OfferDataNym_InternalPB::clear_has_transaction_id() { + _has_bits_[0] &= ~0x00000800u; +} +inline void OfferDataNym_InternalPB::clear_transaction_id() { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + clear_has_transaction_id(); +} +inline const ::std::string& OfferDataNym_InternalPB::transaction_id() const { + return *transaction_id_; +} +inline void OfferDataNym_InternalPB::set_transaction_id(const ::std::string& value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_transaction_id(const char* value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void OfferDataNym_InternalPB::set_transaction_id(const char* value, size_t size) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_transaction_id() { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + return transaction_id_; +} +inline ::std::string* OfferDataNym_InternalPB::release_transaction_id() { + clear_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = transaction_id_; + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string total_assets = 13; +inline bool OfferDataNym_InternalPB::has_total_assets() const { + return (_has_bits_[0] & 0x00001000u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_total_assets() { + _has_bits_[0] |= 0x00001000u; +} +inline void OfferDataNym_InternalPB::clear_has_total_assets() { + _has_bits_[0] &= ~0x00001000u; +} +inline void OfferDataNym_InternalPB::clear_total_assets() { + if (total_assets_ != &::google::protobuf::internal::kEmptyString) { + total_assets_->clear(); + } + clear_has_total_assets(); +} +inline const ::std::string& OfferDataNym_InternalPB::total_assets() const { + return *total_assets_; +} +inline void OfferDataNym_InternalPB::set_total_assets(const ::std::string& value) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(value); +} +inline void OfferDataNym_InternalPB::set_total_assets(const char* value) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(value); +} +inline void OfferDataNym_InternalPB::set_total_assets(const char* value, size_t size) { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + total_assets_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_total_assets() { + set_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + total_assets_ = new ::std::string; + } + return total_assets_; +} +inline ::std::string* OfferDataNym_InternalPB::release_total_assets() { + clear_has_total_assets(); + if (total_assets_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = total_assets_; + total_assets_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string finished_so_far = 14; +inline bool OfferDataNym_InternalPB::has_finished_so_far() const { + return (_has_bits_[0] & 0x00002000u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_finished_so_far() { + _has_bits_[0] |= 0x00002000u; +} +inline void OfferDataNym_InternalPB::clear_has_finished_so_far() { + _has_bits_[0] &= ~0x00002000u; +} +inline void OfferDataNym_InternalPB::clear_finished_so_far() { + if (finished_so_far_ != &::google::protobuf::internal::kEmptyString) { + finished_so_far_->clear(); + } + clear_has_finished_so_far(); +} +inline const ::std::string& OfferDataNym_InternalPB::finished_so_far() const { + return *finished_so_far_; +} +inline void OfferDataNym_InternalPB::set_finished_so_far(const ::std::string& value) { + set_has_finished_so_far(); + if (finished_so_far_ == &::google::protobuf::internal::kEmptyString) { + finished_so_far_ = new ::std::string; + } + finished_so_far_->assign(value); +} +inline void OfferDataNym_InternalPB::set_finished_so_far(const char* value) { + set_has_finished_so_far(); + if (finished_so_far_ == &::google::protobuf::internal::kEmptyString) { + finished_so_far_ = new ::std::string; + } + finished_so_far_->assign(value); +} +inline void OfferDataNym_InternalPB::set_finished_so_far(const char* value, size_t size) { + set_has_finished_so_far(); + if (finished_so_far_ == &::google::protobuf::internal::kEmptyString) { + finished_so_far_ = new ::std::string; + } + finished_so_far_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_finished_so_far() { + set_has_finished_so_far(); + if (finished_so_far_ == &::google::protobuf::internal::kEmptyString) { + finished_so_far_ = new ::std::string; + } + return finished_so_far_; +} +inline ::std::string* OfferDataNym_InternalPB::release_finished_so_far() { + clear_has_finished_so_far(); + if (finished_so_far_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = finished_so_far_; + finished_so_far_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string minimum_increment = 15; +inline bool OfferDataNym_InternalPB::has_minimum_increment() const { + return (_has_bits_[0] & 0x00004000u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_minimum_increment() { + _has_bits_[0] |= 0x00004000u; +} +inline void OfferDataNym_InternalPB::clear_has_minimum_increment() { + _has_bits_[0] &= ~0x00004000u; +} +inline void OfferDataNym_InternalPB::clear_minimum_increment() { + if (minimum_increment_ != &::google::protobuf::internal::kEmptyString) { + minimum_increment_->clear(); + } + clear_has_minimum_increment(); +} +inline const ::std::string& OfferDataNym_InternalPB::minimum_increment() const { + return *minimum_increment_; +} +inline void OfferDataNym_InternalPB::set_minimum_increment(const ::std::string& value) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(value); +} +inline void OfferDataNym_InternalPB::set_minimum_increment(const char* value) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(value); +} +inline void OfferDataNym_InternalPB::set_minimum_increment(const char* value, size_t size) { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + minimum_increment_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_minimum_increment() { + set_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + minimum_increment_ = new ::std::string; + } + return minimum_increment_; +} +inline ::std::string* OfferDataNym_InternalPB::release_minimum_increment() { + clear_has_minimum_increment(); + if (minimum_increment_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = minimum_increment_; + minimum_increment_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string stop_sign = 16; +inline bool OfferDataNym_InternalPB::has_stop_sign() const { + return (_has_bits_[0] & 0x00008000u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_stop_sign() { + _has_bits_[0] |= 0x00008000u; +} +inline void OfferDataNym_InternalPB::clear_has_stop_sign() { + _has_bits_[0] &= ~0x00008000u; +} +inline void OfferDataNym_InternalPB::clear_stop_sign() { + if (stop_sign_ != &::google::protobuf::internal::kEmptyString) { + stop_sign_->clear(); + } + clear_has_stop_sign(); +} +inline const ::std::string& OfferDataNym_InternalPB::stop_sign() const { + return *stop_sign_; +} +inline void OfferDataNym_InternalPB::set_stop_sign(const ::std::string& value) { + set_has_stop_sign(); + if (stop_sign_ == &::google::protobuf::internal::kEmptyString) { + stop_sign_ = new ::std::string; + } + stop_sign_->assign(value); +} +inline void OfferDataNym_InternalPB::set_stop_sign(const char* value) { + set_has_stop_sign(); + if (stop_sign_ == &::google::protobuf::internal::kEmptyString) { + stop_sign_ = new ::std::string; + } + stop_sign_->assign(value); +} +inline void OfferDataNym_InternalPB::set_stop_sign(const char* value, size_t size) { + set_has_stop_sign(); + if (stop_sign_ == &::google::protobuf::internal::kEmptyString) { + stop_sign_ = new ::std::string; + } + stop_sign_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_stop_sign() { + set_has_stop_sign(); + if (stop_sign_ == &::google::protobuf::internal::kEmptyString) { + stop_sign_ = new ::std::string; + } + return stop_sign_; +} +inline ::std::string* OfferDataNym_InternalPB::release_stop_sign() { + clear_has_stop_sign(); + if (stop_sign_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = stop_sign_; + stop_sign_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string stop_price = 17; +inline bool OfferDataNym_InternalPB::has_stop_price() const { + return (_has_bits_[0] & 0x00010000u) != 0; +} +inline void OfferDataNym_InternalPB::set_has_stop_price() { + _has_bits_[0] |= 0x00010000u; +} +inline void OfferDataNym_InternalPB::clear_has_stop_price() { + _has_bits_[0] &= ~0x00010000u; +} +inline void OfferDataNym_InternalPB::clear_stop_price() { + if (stop_price_ != &::google::protobuf::internal::kEmptyString) { + stop_price_->clear(); + } + clear_has_stop_price(); +} +inline const ::std::string& OfferDataNym_InternalPB::stop_price() const { + return *stop_price_; +} +inline void OfferDataNym_InternalPB::set_stop_price(const ::std::string& value) { + set_has_stop_price(); + if (stop_price_ == &::google::protobuf::internal::kEmptyString) { + stop_price_ = new ::std::string; + } + stop_price_->assign(value); +} +inline void OfferDataNym_InternalPB::set_stop_price(const char* value) { + set_has_stop_price(); + if (stop_price_ == &::google::protobuf::internal::kEmptyString) { + stop_price_ = new ::std::string; + } + stop_price_->assign(value); +} +inline void OfferDataNym_InternalPB::set_stop_price(const char* value, size_t size) { + set_has_stop_price(); + if (stop_price_ == &::google::protobuf::internal::kEmptyString) { + stop_price_ = new ::std::string; + } + stop_price_->assign(reinterpret_cast(value), size); +} +inline ::std::string* OfferDataNym_InternalPB::mutable_stop_price() { + set_has_stop_price(); + if (stop_price_ == &::google::protobuf::internal::kEmptyString) { + stop_price_ = new ::std::string; + } + return stop_price_; +} +inline ::std::string* OfferDataNym_InternalPB::release_stop_price() { + clear_has_stop_price(); + if (stop_price_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = stop_price_; + stop_price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// OfferListNym_InternalPB + +// repeated .OTDB.OfferDataNym_InternalPB offers = 1; +inline int OfferListNym_InternalPB::offers_size() const { + return offers_.size(); +} +inline void OfferListNym_InternalPB::clear_offers() { + offers_.Clear(); +} +inline const ::OTDB::OfferDataNym_InternalPB& OfferListNym_InternalPB::offers(int index) const { + return offers_.Get(index); +} +inline ::OTDB::OfferDataNym_InternalPB* OfferListNym_InternalPB::mutable_offers(int index) { + return offers_.Mutable(index); +} +inline ::OTDB::OfferDataNym_InternalPB* OfferListNym_InternalPB::add_offers() { + return offers_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataNym_InternalPB >& +OfferListNym_InternalPB::offers() const { + return offers_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::OfferDataNym_InternalPB >* +OfferListNym_InternalPB::mutable_offers() { + return &offers_; +} + +// ------------------------------------------------------------------- + +// TradeDataNym_InternalPB + +// optional string gui_label = 1; +inline bool TradeDataNym_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void TradeDataNym_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void TradeDataNym_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& TradeDataNym_InternalPB::gui_label() const { + return *gui_label_; +} +inline void TradeDataNym_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void TradeDataNym_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void TradeDataNym_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* TradeDataNym_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string completed_count = 2; +inline bool TradeDataNym_InternalPB::has_completed_count() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_completed_count() { + _has_bits_[0] |= 0x00000002u; +} +inline void TradeDataNym_InternalPB::clear_has_completed_count() { + _has_bits_[0] &= ~0x00000002u; +} +inline void TradeDataNym_InternalPB::clear_completed_count() { + if (completed_count_ != &::google::protobuf::internal::kEmptyString) { + completed_count_->clear(); + } + clear_has_completed_count(); +} +inline const ::std::string& TradeDataNym_InternalPB::completed_count() const { + return *completed_count_; +} +inline void TradeDataNym_InternalPB::set_completed_count(const ::std::string& value) { + set_has_completed_count(); + if (completed_count_ == &::google::protobuf::internal::kEmptyString) { + completed_count_ = new ::std::string; + } + completed_count_->assign(value); +} +inline void TradeDataNym_InternalPB::set_completed_count(const char* value) { + set_has_completed_count(); + if (completed_count_ == &::google::protobuf::internal::kEmptyString) { + completed_count_ = new ::std::string; + } + completed_count_->assign(value); +} +inline void TradeDataNym_InternalPB::set_completed_count(const char* value, size_t size) { + set_has_completed_count(); + if (completed_count_ == &::google::protobuf::internal::kEmptyString) { + completed_count_ = new ::std::string; + } + completed_count_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_completed_count() { + set_has_completed_count(); + if (completed_count_ == &::google::protobuf::internal::kEmptyString) { + completed_count_ = new ::std::string; + } + return completed_count_; +} +inline ::std::string* TradeDataNym_InternalPB::release_completed_count() { + clear_has_completed_count(); + if (completed_count_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = completed_count_; + completed_count_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string date = 3; +inline bool TradeDataNym_InternalPB::has_date() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_date() { + _has_bits_[0] |= 0x00000004u; +} +inline void TradeDataNym_InternalPB::clear_has_date() { + _has_bits_[0] &= ~0x00000004u; +} +inline void TradeDataNym_InternalPB::clear_date() { + if (date_ != &::google::protobuf::internal::kEmptyString) { + date_->clear(); + } + clear_has_date(); +} +inline const ::std::string& TradeDataNym_InternalPB::date() const { + return *date_; +} +inline void TradeDataNym_InternalPB::set_date(const ::std::string& value) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(value); +} +inline void TradeDataNym_InternalPB::set_date(const char* value) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(value); +} +inline void TradeDataNym_InternalPB::set_date(const char* value, size_t size) { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + date_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_date() { + set_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + date_ = new ::std::string; + } + return date_; +} +inline ::std::string* TradeDataNym_InternalPB::release_date() { + clear_has_date(); + if (date_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = date_; + date_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string price = 4; +inline bool TradeDataNym_InternalPB::has_price() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_price() { + _has_bits_[0] |= 0x00000008u; +} +inline void TradeDataNym_InternalPB::clear_has_price() { + _has_bits_[0] &= ~0x00000008u; +} +inline void TradeDataNym_InternalPB::clear_price() { + if (price_ != &::google::protobuf::internal::kEmptyString) { + price_->clear(); + } + clear_has_price(); +} +inline const ::std::string& TradeDataNym_InternalPB::price() const { + return *price_; +} +inline void TradeDataNym_InternalPB::set_price(const ::std::string& value) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(value); +} +inline void TradeDataNym_InternalPB::set_price(const char* value) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(value); +} +inline void TradeDataNym_InternalPB::set_price(const char* value, size_t size) { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + price_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_price() { + set_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + price_ = new ::std::string; + } + return price_; +} +inline ::std::string* TradeDataNym_InternalPB::release_price() { + clear_has_price(); + if (price_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = price_; + price_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string amount_sold = 5; +inline bool TradeDataNym_InternalPB::has_amount_sold() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_amount_sold() { + _has_bits_[0] |= 0x00000010u; +} +inline void TradeDataNym_InternalPB::clear_has_amount_sold() { + _has_bits_[0] &= ~0x00000010u; +} +inline void TradeDataNym_InternalPB::clear_amount_sold() { + if (amount_sold_ != &::google::protobuf::internal::kEmptyString) { + amount_sold_->clear(); + } + clear_has_amount_sold(); +} +inline const ::std::string& TradeDataNym_InternalPB::amount_sold() const { + return *amount_sold_; +} +inline void TradeDataNym_InternalPB::set_amount_sold(const ::std::string& value) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(value); +} +inline void TradeDataNym_InternalPB::set_amount_sold(const char* value) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(value); +} +inline void TradeDataNym_InternalPB::set_amount_sold(const char* value, size_t size) { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + amount_sold_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_amount_sold() { + set_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + amount_sold_ = new ::std::string; + } + return amount_sold_; +} +inline ::std::string* TradeDataNym_InternalPB::release_amount_sold() { + clear_has_amount_sold(); + if (amount_sold_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = amount_sold_; + amount_sold_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string transaction_id = 6; +inline bool TradeDataNym_InternalPB::has_transaction_id() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void TradeDataNym_InternalPB::set_has_transaction_id() { + _has_bits_[0] |= 0x00000020u; +} +inline void TradeDataNym_InternalPB::clear_has_transaction_id() { + _has_bits_[0] &= ~0x00000020u; +} +inline void TradeDataNym_InternalPB::clear_transaction_id() { + if (transaction_id_ != &::google::protobuf::internal::kEmptyString) { + transaction_id_->clear(); + } + clear_has_transaction_id(); +} +inline const ::std::string& TradeDataNym_InternalPB::transaction_id() const { + return *transaction_id_; +} +inline void TradeDataNym_InternalPB::set_transaction_id(const ::std::string& value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void TradeDataNym_InternalPB::set_transaction_id(const char* value) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(value); +} +inline void TradeDataNym_InternalPB::set_transaction_id(const char* value, size_t size) { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + transaction_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* TradeDataNym_InternalPB::mutable_transaction_id() { + set_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + transaction_id_ = new ::std::string; + } + return transaction_id_; +} +inline ::std::string* TradeDataNym_InternalPB::release_transaction_id() { + clear_has_transaction_id(); + if (transaction_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = transaction_id_; + transaction_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// TradeListNym_InternalPB + +// repeated .OTDB.TradeDataNym_InternalPB trades = 1; +inline int TradeListNym_InternalPB::trades_size() const { + return trades_.size(); +} +inline void TradeListNym_InternalPB::clear_trades() { + trades_.Clear(); +} +inline const ::OTDB::TradeDataNym_InternalPB& TradeListNym_InternalPB::trades(int index) const { + return trades_.Get(index); +} +inline ::OTDB::TradeDataNym_InternalPB* TradeListNym_InternalPB::mutable_trades(int index) { + return trades_.Mutable(index); +} +inline ::OTDB::TradeDataNym_InternalPB* TradeListNym_InternalPB::add_trades() { + return trades_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataNym_InternalPB >& +TradeListNym_InternalPB::trades() const { + return trades_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::TradeDataNym_InternalPB >* +TradeListNym_InternalPB::mutable_trades() { + return &trades_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_Markets_2eproto__INCLUDED diff --git a/OTLib/Markets.proto b/OTLib/Markets.proto new file mode 100644 index 000000000..1cd3c6878 --- /dev/null +++ b/OTLib/Markets.proto @@ -0,0 +1,162 @@ + + +package OTDB; + + +// ---------------------------------------------------- + + +message MarketData_InternalPB { + optional string gui_label = 1; + + optional string server_id = 2; + optional string market_id = 3; + + optional string asset_type_id = 4; // Perhaps this is the gold market. + optional string currency_type_id = 5; // Perhaps the gold is trading for dollars. + // Based on that example, gold is the asset type, and dollars are the currency. + optional string scale = 6; // the Market scale. (A trade in any particular asset is measured in X units of SCALE.) + // IOW, if the scale is 5000 on the gold market, that means "3 units" is 15000 gold (on that market.) + optional string total_assets = 7; // total amount of assets available on market for purchase. + + optional string number_bids = 8; // number of bids that are currently on the market. + optional string number_asks = 9; // number of asks that are currently on the market. + + optional string last_sale_price = 10; // The price at which the most recent trade occurred on this market. + optional string current_bid = 11; // The highest bid currently on the market. + optional string current_ask = 12; // The lowest ask price currently available on the market. + + optional string volume_trades = 13; // 24-hour period, number of trades. + + optional string volume_assets = 14; // 24-hour volume, amount of assets traded. + optional string volume_currency = 15; // 24-hour volume, amount of currency paid for assets traded. + + optional string recent_highest_bid = 16; // in a 24hour period, the highest bid to hit the market. + optional string recent_lowest_ask = 17; // in a 24hour period, the lowest ask to hit the market. +} + +// ---------------------------------------------------- + + +message MarketList_InternalPB { + repeated MarketData_InternalPB market_data = 1; +} + + +// ****************************************************** + +message OfferDataMarket_InternalPB { + optional string gui_label = 1; + optional string transaction_id = 2; + optional string price_per_scale = 3; + + // This is public data, so we only show the amount available. +// optional string total_assets; +// optional string finished_so_far; + optional string available_assets = 4; + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + optional string minimum_increment = 5; +} + +// +// MARKET DEPTH (for a given market) +// 1. Bids (Price per scale, amount for sale/purchase, minimum_increment) +// 2. Asks (Price per scale, amount for sale/purchase, minimum_increment) +// + +message OfferListMarket_InternalPB { + repeated OfferDataMarket_InternalPB bids = 1; + repeated OfferDataMarket_InternalPB asks = 2; +} + +// ****************************************************** + +message TradeDataMarket_InternalPB { + optional string gui_label = 1; + optional string transaction_id = 2; // (transaction number for this trade.) + optional string date = 3; // (The date of this trade's execution) + optional string price = 4; // (The price this trade executed at.) + optional string amount_sold = 5; // (Amount of asset sold for that price.) +} + + +// ---------------------------------------------------- + +message TradeListMarket_InternalPB { + repeated TradeDataMarket_InternalPB trades = 1; +} + +// ****************************************************** + +message OfferDataNym_InternalPB { + optional string gui_label = 1; + + optional string valid_from = 2; + optional string valid_to = 3; + + optional string server_id = 4; + optional string asset_type_id = 5; // the asset type on offer. + optional string asset_acct_id = 6; // the account where asset is. + optional string currency_type_id = 7; // the currency being used to purchase the asset. + optional string currency_acct_id = 8; // the account where currency is. + + optional bool selling = 9; // true for ask, false for bid. + + optional string scale = 10; // 1oz market? 100oz market? 10,000oz market? This determines size and granularity. + optional string price_per_scale = 11; + + optional string transaction_id = 12; + + optional string total_assets = 13; + optional string finished_so_far = 14; + + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + optional string minimum_increment = 15; + + optional string stop_sign = 16; // If this is a stop order, this will contain '<' or '>'. + optional string stop_price = 17; // The price at which the stop order activates (less than X or greater than X, based on sign.) +} + +// ---------------------------------------------------- + +message OfferListNym_InternalPB { + repeated OfferDataNym_InternalPB offers = 1; +} + + +// ****************************************************** + +message TradeDataNym_InternalPB { + optional string gui_label = 1; + optional string completed_count = 2;// (How many trades have processed for the associated offer? We keep count for each trade.) + optional string date = 3; // (The date of this trade's execution) + optional string price = 4; // (The price this trade executed at.) + optional string amount_sold = 5; // (Amount of asset sold for that price.) + optional string transaction_id = 6; // (transaction number for this trade.) +} + +// ---------------------------------------------------- + +message TradeListNym_InternalPB { + repeated TradeDataNym_InternalPB trades = 1; +} + +// ****************************************************** + + + + + + + + + diff --git a/OTLib/Moneychanger.pb.cpp b/OTLib/Moneychanger.pb.cpp new file mode 100644 index 000000000..846105ee8 --- /dev/null +++ b/OTLib/Moneychanger.pb.cpp @@ -0,0 +1,2718 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "Moneychanger.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace OTDB { + +namespace { + +const ::google::protobuf::Descriptor* ServerInfo_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ServerInfo_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* ContactNym_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ContactNym_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* ContactAcct_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ContactAcct_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* Contact_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Contact_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* AddressBook_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + AddressBook_InternalPB_reflection_ = NULL; +const ::google::protobuf::Descriptor* WalletData_InternalPB_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + WalletData_InternalPB_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_Moneychanger_2eproto() { + protobuf_AddDesc_Moneychanger_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "Moneychanger.proto"); + GOOGLE_CHECK(file != NULL); + ServerInfo_InternalPB_descriptor_ = file->message_type(0); + static const int ServerInfo_InternalPB_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServerInfo_InternalPB, server_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServerInfo_InternalPB, server_id_), + }; + ServerInfo_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ServerInfo_InternalPB_descriptor_, + ServerInfo_InternalPB::default_instance_, + ServerInfo_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServerInfo_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServerInfo_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ServerInfo_InternalPB)); + ContactNym_InternalPB_descriptor_ = file->message_type(1); + static const int ContactNym_InternalPB_offsets_[6] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, nym_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, nym_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, public_key_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, memo_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, servers_), + }; + ContactNym_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ContactNym_InternalPB_descriptor_, + ContactNym_InternalPB::default_instance_, + ContactNym_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactNym_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ContactNym_InternalPB)); + ContactAcct_InternalPB_descriptor_ = file->message_type(2); + static const int ContactAcct_InternalPB_offsets_[8] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, server_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, server_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, asset_type_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, acct_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, nym_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, memo_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, public_key_), + }; + ContactAcct_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ContactAcct_InternalPB_descriptor_, + ContactAcct_InternalPB::default_instance_, + ContactAcct_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ContactAcct_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ContactAcct_InternalPB)); + Contact_InternalPB_descriptor_ = file->message_type(3); + static const int Contact_InternalPB_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, gui_label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, contact_id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, email_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, memo_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, public_key_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, nyms_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, accounts_), + }; + Contact_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Contact_InternalPB_descriptor_, + Contact_InternalPB::default_instance_, + Contact_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Contact_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Contact_InternalPB)); + AddressBook_InternalPB_descriptor_ = file->message_type(4); + static const int AddressBook_InternalPB_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AddressBook_InternalPB, contacts_), + }; + AddressBook_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + AddressBook_InternalPB_descriptor_, + AddressBook_InternalPB::default_instance_, + AddressBook_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AddressBook_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(AddressBook_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(AddressBook_InternalPB)); + WalletData_InternalPB_descriptor_ = file->message_type(5); + static const int WalletData_InternalPB_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, bitcoin_server_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, bitcoin_acct_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, ripple_server_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, loom_server_), + }; + WalletData_InternalPB_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + WalletData_InternalPB_descriptor_, + WalletData_InternalPB::default_instance_, + WalletData_InternalPB_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(WalletData_InternalPB, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(WalletData_InternalPB)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_Moneychanger_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ServerInfo_InternalPB_descriptor_, &ServerInfo_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ContactNym_InternalPB_descriptor_, &ContactNym_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ContactAcct_InternalPB_descriptor_, &ContactAcct_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Contact_InternalPB_descriptor_, &Contact_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + AddressBook_InternalPB_descriptor_, &AddressBook_InternalPB::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + WalletData_InternalPB_descriptor_, &WalletData_InternalPB::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_Moneychanger_2eproto() { + delete ServerInfo_InternalPB::default_instance_; + delete ServerInfo_InternalPB_reflection_; + delete ContactNym_InternalPB::default_instance_; + delete ContactNym_InternalPB_reflection_; + delete ContactAcct_InternalPB::default_instance_; + delete ContactAcct_InternalPB_reflection_; + delete Contact_InternalPB::default_instance_; + delete Contact_InternalPB_reflection_; + delete AddressBook_InternalPB::default_instance_; + delete AddressBook_InternalPB_reflection_; + delete WalletData_InternalPB::default_instance_; + delete WalletData_InternalPB_reflection_; +} + +void protobuf_AddDesc_Moneychanger_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::OTDB::protobuf_AddDesc_Generics_2eproto(); + ::OTDB::protobuf_AddDesc_Bitcoin_2eproto(); + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\022Moneychanger.proto\022\004OTDB\032\016Generics.pro" + "to\032\rBitcoin.proto\"\?\n\025ServerInfo_Internal" + "PB\022\023\n\013server_type\030\001 \001(\t\022\021\n\tserver_id\030\002 \001" + "(\t\"\234\001\n\025ContactNym_InternalPB\022\021\n\tgui_labe" + "l\030\001 \001(\t\022\020\n\010nym_type\030\002 \001(\t\022\016\n\006nym_id\030\003 \001(" + "\t\022\022\n\npublic_key\030\004 \001(\t\022\014\n\004memo\030\005 \001(\t\022,\n\007s" + "ervers\030\006 \003(\0132\033.OTDB.ServerInfo_InternalP" + "B\"\255\001\n\026ContactAcct_InternalPB\022\021\n\tgui_labe" + "l\030\001 \001(\t\022\023\n\013server_type\030\002 \001(\t\022\021\n\tserver_i" + "d\030\003 \001(\t\022\025\n\rasset_type_id\030\004 \001(\t\022\017\n\007acct_i" + "d\030\005 \001(\t\022\016\n\006nym_id\030\006 \001(\t\022\014\n\004memo\030\007 \001(\t\022\022\n" + "\npublic_key\030\010 \001(\t\"\307\001\n\022Contact_InternalPB" + "\022\021\n\tgui_label\030\001 \001(\t\022\022\n\ncontact_id\030\002 \001(\t\022" + "\r\n\005email\030\003 \001(\t\022\014\n\004memo\030\004 \001(\t\022\022\n\npublic_k" + "ey\030\005 \001(\t\022)\n\004nyms\030\006 \003(\0132\033.OTDB.ContactNym" + "_InternalPB\022.\n\010accounts\030\007 \003(\0132\034.OTDB.Con" + "tactAcct_InternalPB\"D\n\026AddressBook_Inter" + "nalPB\022*\n\010contacts\030\001 \003(\0132\030.OTDB.Contact_I" + "nternalPB\"\353\001\n\025WalletData_InternalPB\0226\n\016b" + "itcoin_server\030\001 \003(\0132\036.OTDB.BitcoinServer" + "_InternalPB\0222\n\014bitcoin_acct\030\002 \003(\0132\034.OTDB" + ".BitcoinAcct_InternalPB\0224\n\rripple_server" + "\030\003 \003(\0132\035.OTDB.RippleServer_InternalPB\0220\n" + "\013loom_server\030\004 \003(\0132\033.OTDB.LoomServer_Int" + "ernalPB", 967); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "Moneychanger.proto", &protobuf_RegisterTypes); + ServerInfo_InternalPB::default_instance_ = new ServerInfo_InternalPB(); + ContactNym_InternalPB::default_instance_ = new ContactNym_InternalPB(); + ContactAcct_InternalPB::default_instance_ = new ContactAcct_InternalPB(); + Contact_InternalPB::default_instance_ = new Contact_InternalPB(); + AddressBook_InternalPB::default_instance_ = new AddressBook_InternalPB(); + WalletData_InternalPB::default_instance_ = new WalletData_InternalPB(); + ServerInfo_InternalPB::default_instance_->InitAsDefaultInstance(); + ContactNym_InternalPB::default_instance_->InitAsDefaultInstance(); + ContactAcct_InternalPB::default_instance_->InitAsDefaultInstance(); + Contact_InternalPB::default_instance_->InitAsDefaultInstance(); + AddressBook_InternalPB::default_instance_->InitAsDefaultInstance(); + WalletData_InternalPB::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_Moneychanger_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_Moneychanger_2eproto { + StaticDescriptorInitializer_Moneychanger_2eproto() { + protobuf_AddDesc_Moneychanger_2eproto(); + } +} static_descriptor_initializer_Moneychanger_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int ServerInfo_InternalPB::kServerTypeFieldNumber; +const int ServerInfo_InternalPB::kServerIdFieldNumber; +#endif // !_MSC_VER + +ServerInfo_InternalPB::ServerInfo_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void ServerInfo_InternalPB::InitAsDefaultInstance() { +} + +ServerInfo_InternalPB::ServerInfo_InternalPB(const ServerInfo_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void ServerInfo_InternalPB::SharedCtor() { + _cached_size_ = 0; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ServerInfo_InternalPB::~ServerInfo_InternalPB() { + SharedDtor(); +} + +void ServerInfo_InternalPB::SharedDtor() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + delete server_type_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (this != default_instance_) { + } +} + +void ServerInfo_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ServerInfo_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ServerInfo_InternalPB_descriptor_; +} + +const ServerInfo_InternalPB& ServerInfo_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +ServerInfo_InternalPB* ServerInfo_InternalPB::default_instance_ = NULL; + +ServerInfo_InternalPB* ServerInfo_InternalPB::New() const { + return new ServerInfo_InternalPB; +} + +void ServerInfo_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_server_type()) { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ServerInfo_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string server_type = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_id; + break; + } + + // optional string server_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void ServerInfo_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string server_type = 1; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->server_type(), output); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_id(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* ServerInfo_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string server_type = 1; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->server_type(), target); + } + + // optional string server_id = 2; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_id(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int ServerInfo_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string server_type = 1; + if (has_server_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_type()); + } + + // optional string server_id = 2; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ServerInfo_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ServerInfo_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ServerInfo_InternalPB::MergeFrom(const ServerInfo_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_server_type()) { + set_server_type(from.server_type()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ServerInfo_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ServerInfo_InternalPB::CopyFrom(const ServerInfo_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ServerInfo_InternalPB::IsInitialized() const { + + return true; +} + +void ServerInfo_InternalPB::Swap(ServerInfo_InternalPB* other) { + if (other != this) { + std::swap(server_type_, other->server_type_); + std::swap(server_id_, other->server_id_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata ServerInfo_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ServerInfo_InternalPB_descriptor_; + metadata.reflection = ServerInfo_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ContactNym_InternalPB::kGuiLabelFieldNumber; +const int ContactNym_InternalPB::kNymTypeFieldNumber; +const int ContactNym_InternalPB::kNymIdFieldNumber; +const int ContactNym_InternalPB::kPublicKeyFieldNumber; +const int ContactNym_InternalPB::kMemoFieldNumber; +const int ContactNym_InternalPB::kServersFieldNumber; +#endif // !_MSC_VER + +ContactNym_InternalPB::ContactNym_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void ContactNym_InternalPB::InitAsDefaultInstance() { +} + +ContactNym_InternalPB::ContactNym_InternalPB(const ContactNym_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void ContactNym_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + nym_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + nym_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ContactNym_InternalPB::~ContactNym_InternalPB() { + SharedDtor(); +} + +void ContactNym_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (nym_type_ != &::google::protobuf::internal::kEmptyString) { + delete nym_type_; + } + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + delete nym_id_; + } + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + delete public_key_; + } + if (memo_ != &::google::protobuf::internal::kEmptyString) { + delete memo_; + } + if (this != default_instance_) { + } +} + +void ContactNym_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ContactNym_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ContactNym_InternalPB_descriptor_; +} + +const ContactNym_InternalPB& ContactNym_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +ContactNym_InternalPB* ContactNym_InternalPB::default_instance_ = NULL; + +ContactNym_InternalPB* ContactNym_InternalPB::New() const { + return new ContactNym_InternalPB; +} + +void ContactNym_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_nym_type()) { + if (nym_type_ != &::google::protobuf::internal::kEmptyString) { + nym_type_->clear(); + } + } + if (has_nym_id()) { + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + nym_id_->clear(); + } + } + if (has_public_key()) { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + } + if (has_memo()) { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + } + } + servers_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ContactNym_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_nym_type; + break; + } + + // optional string nym_type = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nym_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_nym_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_type().data(), this->nym_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_nym_id; + break; + } + + // optional string nym_id = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nym_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_nym_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_public_key; + break; + } + + // optional string public_key = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_public_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_public_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_memo; + break; + } + + // optional string memo = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_memo: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_memo())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_servers; + break; + } + + // repeated .OTDB.ServerInfo_InternalPB servers = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_servers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_servers())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_servers; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void ContactNym_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string nym_type = 2; + if (has_nym_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_type().data(), this->nym_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->nym_type(), output); + } + + // optional string nym_id = 3; + if (has_nym_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->nym_id(), output); + } + + // optional string public_key = 4; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->public_key(), output); + } + + // optional string memo = 5; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->memo(), output); + } + + // repeated .OTDB.ServerInfo_InternalPB servers = 6; + for (int i = 0; i < this->servers_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->servers(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* ContactNym_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string nym_type = 2; + if (has_nym_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_type().data(), this->nym_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->nym_type(), target); + } + + // optional string nym_id = 3; + if (has_nym_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->nym_id(), target); + } + + // optional string public_key = 4; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->public_key(), target); + } + + // optional string memo = 5; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->memo(), target); + } + + // repeated .OTDB.ServerInfo_InternalPB servers = 6; + for (int i = 0; i < this->servers_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->servers(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int ContactNym_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string nym_type = 2; + if (has_nym_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->nym_type()); + } + + // optional string nym_id = 3; + if (has_nym_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->nym_id()); + } + + // optional string public_key = 4; + if (has_public_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->public_key()); + } + + // optional string memo = 5; + if (has_memo()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->memo()); + } + + } + // repeated .OTDB.ServerInfo_InternalPB servers = 6; + total_size += 1 * this->servers_size(); + for (int i = 0; i < this->servers_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->servers(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ContactNym_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ContactNym_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ContactNym_InternalPB::MergeFrom(const ContactNym_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + servers_.MergeFrom(from.servers_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_nym_type()) { + set_nym_type(from.nym_type()); + } + if (from.has_nym_id()) { + set_nym_id(from.nym_id()); + } + if (from.has_public_key()) { + set_public_key(from.public_key()); + } + if (from.has_memo()) { + set_memo(from.memo()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ContactNym_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ContactNym_InternalPB::CopyFrom(const ContactNym_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ContactNym_InternalPB::IsInitialized() const { + + return true; +} + +void ContactNym_InternalPB::Swap(ContactNym_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(nym_type_, other->nym_type_); + std::swap(nym_id_, other->nym_id_); + std::swap(public_key_, other->public_key_); + std::swap(memo_, other->memo_); + servers_.Swap(&other->servers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata ContactNym_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ContactNym_InternalPB_descriptor_; + metadata.reflection = ContactNym_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ContactAcct_InternalPB::kGuiLabelFieldNumber; +const int ContactAcct_InternalPB::kServerTypeFieldNumber; +const int ContactAcct_InternalPB::kServerIdFieldNumber; +const int ContactAcct_InternalPB::kAssetTypeIdFieldNumber; +const int ContactAcct_InternalPB::kAcctIdFieldNumber; +const int ContactAcct_InternalPB::kNymIdFieldNumber; +const int ContactAcct_InternalPB::kMemoFieldNumber; +const int ContactAcct_InternalPB::kPublicKeyFieldNumber; +#endif // !_MSC_VER + +ContactAcct_InternalPB::ContactAcct_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void ContactAcct_InternalPB::InitAsDefaultInstance() { +} + +ContactAcct_InternalPB::ContactAcct_InternalPB(const ContactAcct_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void ContactAcct_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + nym_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ContactAcct_InternalPB::~ContactAcct_InternalPB() { + SharedDtor(); +} + +void ContactAcct_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + delete server_type_; + } + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + delete server_id_; + } + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + delete asset_type_id_; + } + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + delete acct_id_; + } + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + delete nym_id_; + } + if (memo_ != &::google::protobuf::internal::kEmptyString) { + delete memo_; + } + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + delete public_key_; + } + if (this != default_instance_) { + } +} + +void ContactAcct_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ContactAcct_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ContactAcct_InternalPB_descriptor_; +} + +const ContactAcct_InternalPB& ContactAcct_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +ContactAcct_InternalPB* ContactAcct_InternalPB::default_instance_ = NULL; + +ContactAcct_InternalPB* ContactAcct_InternalPB::New() const { + return new ContactAcct_InternalPB; +} + +void ContactAcct_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_server_type()) { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + } + if (has_server_id()) { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + } + if (has_asset_type_id()) { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + } + if (has_acct_id()) { + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + acct_id_->clear(); + } + } + if (has_nym_id()) { + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + nym_id_->clear(); + } + } + if (has_memo()) { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + } + if (has_public_key()) { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ContactAcct_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_server_type; + break; + } + + // optional string server_type = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_server_id; + break; + } + + // optional string server_id = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_server_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_server_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_asset_type_id; + break; + } + + // optional string asset_type_id = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_asset_type_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_asset_type_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_acct_id; + break; + } + + // optional string acct_id = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_acct_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_acct_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_nym_id; + break; + } + + // optional string nym_id = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nym_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_nym_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_memo; + break; + } + + // optional string memo = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_memo: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_memo())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_public_key; + break; + } + + // optional string public_key = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_public_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_public_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void ContactAcct_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string server_type = 2; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->server_type(), output); + } + + // optional string server_id = 3; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->server_id(), output); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->asset_type_id(), output); + } + + // optional string acct_id = 5; + if (has_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->acct_id(), output); + } + + // optional string nym_id = 6; + if (has_nym_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->nym_id(), output); + } + + // optional string memo = 7; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->memo(), output); + } + + // optional string public_key = 8; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->public_key(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* ContactAcct_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string server_type = 2; + if (has_server_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_type().data(), this->server_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->server_type(), target); + } + + // optional string server_id = 3; + if (has_server_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->server_id().data(), this->server_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->server_id(), target); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->asset_type_id().data(), this->asset_type_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->asset_type_id(), target); + } + + // optional string acct_id = 5; + if (has_acct_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->acct_id().data(), this->acct_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->acct_id(), target); + } + + // optional string nym_id = 6; + if (has_nym_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->nym_id().data(), this->nym_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->nym_id(), target); + } + + // optional string memo = 7; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->memo(), target); + } + + // optional string public_key = 8; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->public_key(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int ContactAcct_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string server_type = 2; + if (has_server_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_type()); + } + + // optional string server_id = 3; + if (has_server_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->server_id()); + } + + // optional string asset_type_id = 4; + if (has_asset_type_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->asset_type_id()); + } + + // optional string acct_id = 5; + if (has_acct_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->acct_id()); + } + + // optional string nym_id = 6; + if (has_nym_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->nym_id()); + } + + // optional string memo = 7; + if (has_memo()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->memo()); + } + + // optional string public_key = 8; + if (has_public_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->public_key()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ContactAcct_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ContactAcct_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ContactAcct_InternalPB::MergeFrom(const ContactAcct_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_server_type()) { + set_server_type(from.server_type()); + } + if (from.has_server_id()) { + set_server_id(from.server_id()); + } + if (from.has_asset_type_id()) { + set_asset_type_id(from.asset_type_id()); + } + if (from.has_acct_id()) { + set_acct_id(from.acct_id()); + } + if (from.has_nym_id()) { + set_nym_id(from.nym_id()); + } + if (from.has_memo()) { + set_memo(from.memo()); + } + if (from.has_public_key()) { + set_public_key(from.public_key()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ContactAcct_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ContactAcct_InternalPB::CopyFrom(const ContactAcct_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ContactAcct_InternalPB::IsInitialized() const { + + return true; +} + +void ContactAcct_InternalPB::Swap(ContactAcct_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(server_type_, other->server_type_); + std::swap(server_id_, other->server_id_); + std::swap(asset_type_id_, other->asset_type_id_); + std::swap(acct_id_, other->acct_id_); + std::swap(nym_id_, other->nym_id_); + std::swap(memo_, other->memo_); + std::swap(public_key_, other->public_key_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata ContactAcct_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ContactAcct_InternalPB_descriptor_; + metadata.reflection = ContactAcct_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Contact_InternalPB::kGuiLabelFieldNumber; +const int Contact_InternalPB::kContactIdFieldNumber; +const int Contact_InternalPB::kEmailFieldNumber; +const int Contact_InternalPB::kMemoFieldNumber; +const int Contact_InternalPB::kPublicKeyFieldNumber; +const int Contact_InternalPB::kNymsFieldNumber; +const int Contact_InternalPB::kAccountsFieldNumber; +#endif // !_MSC_VER + +Contact_InternalPB::Contact_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void Contact_InternalPB::InitAsDefaultInstance() { +} + +Contact_InternalPB::Contact_InternalPB(const Contact_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void Contact_InternalPB::SharedCtor() { + _cached_size_ = 0; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + contact_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + email_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Contact_InternalPB::~Contact_InternalPB() { + SharedDtor(); +} + +void Contact_InternalPB::SharedDtor() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + delete gui_label_; + } + if (contact_id_ != &::google::protobuf::internal::kEmptyString) { + delete contact_id_; + } + if (email_ != &::google::protobuf::internal::kEmptyString) { + delete email_; + } + if (memo_ != &::google::protobuf::internal::kEmptyString) { + delete memo_; + } + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + delete public_key_; + } + if (this != default_instance_) { + } +} + +void Contact_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Contact_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Contact_InternalPB_descriptor_; +} + +const Contact_InternalPB& Contact_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +Contact_InternalPB* Contact_InternalPB::default_instance_ = NULL; + +Contact_InternalPB* Contact_InternalPB::New() const { + return new Contact_InternalPB; +} + +void Contact_InternalPB::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_gui_label()) { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + } + if (has_contact_id()) { + if (contact_id_ != &::google::protobuf::internal::kEmptyString) { + contact_id_->clear(); + } + } + if (has_email()) { + if (email_ != &::google::protobuf::internal::kEmptyString) { + email_->clear(); + } + } + if (has_memo()) { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + } + if (has_public_key()) { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + } + } + nyms_.Clear(); + accounts_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Contact_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string gui_label = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_gui_label())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_contact_id; + break; + } + + // optional string contact_id = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_contact_id: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_contact_id())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->contact_id().data(), this->contact_id().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_email; + break; + } + + // optional string email = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_email: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_email())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->email().data(), this->email().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_memo; + break; + } + + // optional string memo = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_memo: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_memo())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_public_key; + break; + } + + // optional string public_key = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_public_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_public_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_nyms; + break; + } + + // repeated .OTDB.ContactNym_InternalPB nyms = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nyms: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_nyms())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_nyms; + if (input->ExpectTag(58)) goto parse_accounts; + break; + } + + // repeated .OTDB.ContactAcct_InternalPB accounts = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_accounts: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_accounts())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_accounts; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void Contact_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->gui_label(), output); + } + + // optional string contact_id = 2; + if (has_contact_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->contact_id().data(), this->contact_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->contact_id(), output); + } + + // optional string email = 3; + if (has_email()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->email().data(), this->email().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->email(), output); + } + + // optional string memo = 4; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 4, this->memo(), output); + } + + // optional string public_key = 5; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 5, this->public_key(), output); + } + + // repeated .OTDB.ContactNym_InternalPB nyms = 6; + for (int i = 0; i < this->nyms_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->nyms(i), output); + } + + // repeated .OTDB.ContactAcct_InternalPB accounts = 7; + for (int i = 0; i < this->accounts_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->accounts(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* Contact_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string gui_label = 1; + if (has_gui_label()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->gui_label().data(), this->gui_label().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->gui_label(), target); + } + + // optional string contact_id = 2; + if (has_contact_id()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->contact_id().data(), this->contact_id().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->contact_id(), target); + } + + // optional string email = 3; + if (has_email()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->email().data(), this->email().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->email(), target); + } + + // optional string memo = 4; + if (has_memo()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->memo().data(), this->memo().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->memo(), target); + } + + // optional string public_key = 5; + if (has_public_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->public_key().data(), this->public_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 5, this->public_key(), target); + } + + // repeated .OTDB.ContactNym_InternalPB nyms = 6; + for (int i = 0; i < this->nyms_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->nyms(i), target); + } + + // repeated .OTDB.ContactAcct_InternalPB accounts = 7; + for (int i = 0; i < this->accounts_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->accounts(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int Contact_InternalPB::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string gui_label = 1; + if (has_gui_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->gui_label()); + } + + // optional string contact_id = 2; + if (has_contact_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->contact_id()); + } + + // optional string email = 3; + if (has_email()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->email()); + } + + // optional string memo = 4; + if (has_memo()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->memo()); + } + + // optional string public_key = 5; + if (has_public_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->public_key()); + } + + } + // repeated .OTDB.ContactNym_InternalPB nyms = 6; + total_size += 1 * this->nyms_size(); + for (int i = 0; i < this->nyms_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->nyms(i)); + } + + // repeated .OTDB.ContactAcct_InternalPB accounts = 7; + total_size += 1 * this->accounts_size(); + for (int i = 0; i < this->accounts_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->accounts(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Contact_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Contact_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Contact_InternalPB::MergeFrom(const Contact_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + nyms_.MergeFrom(from.nyms_); + accounts_.MergeFrom(from.accounts_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_gui_label()) { + set_gui_label(from.gui_label()); + } + if (from.has_contact_id()) { + set_contact_id(from.contact_id()); + } + if (from.has_email()) { + set_email(from.email()); + } + if (from.has_memo()) { + set_memo(from.memo()); + } + if (from.has_public_key()) { + set_public_key(from.public_key()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Contact_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Contact_InternalPB::CopyFrom(const Contact_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Contact_InternalPB::IsInitialized() const { + + return true; +} + +void Contact_InternalPB::Swap(Contact_InternalPB* other) { + if (other != this) { + std::swap(gui_label_, other->gui_label_); + std::swap(contact_id_, other->contact_id_); + std::swap(email_, other->email_); + std::swap(memo_, other->memo_); + std::swap(public_key_, other->public_key_); + nyms_.Swap(&other->nyms_); + accounts_.Swap(&other->accounts_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Contact_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Contact_InternalPB_descriptor_; + metadata.reflection = Contact_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int AddressBook_InternalPB::kContactsFieldNumber; +#endif // !_MSC_VER + +AddressBook_InternalPB::AddressBook_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void AddressBook_InternalPB::InitAsDefaultInstance() { +} + +AddressBook_InternalPB::AddressBook_InternalPB(const AddressBook_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void AddressBook_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +AddressBook_InternalPB::~AddressBook_InternalPB() { + SharedDtor(); +} + +void AddressBook_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void AddressBook_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* AddressBook_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return AddressBook_InternalPB_descriptor_; +} + +const AddressBook_InternalPB& AddressBook_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +AddressBook_InternalPB* AddressBook_InternalPB::default_instance_ = NULL; + +AddressBook_InternalPB* AddressBook_InternalPB::New() const { + return new AddressBook_InternalPB; +} + +void AddressBook_InternalPB::Clear() { + contacts_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool AddressBook_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.Contact_InternalPB contacts = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_contacts: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_contacts())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_contacts; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void AddressBook_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.Contact_InternalPB contacts = 1; + for (int i = 0; i < this->contacts_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->contacts(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* AddressBook_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.Contact_InternalPB contacts = 1; + for (int i = 0; i < this->contacts_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->contacts(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int AddressBook_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.Contact_InternalPB contacts = 1; + total_size += 1 * this->contacts_size(); + for (int i = 0; i < this->contacts_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->contacts(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void AddressBook_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const AddressBook_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void AddressBook_InternalPB::MergeFrom(const AddressBook_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + contacts_.MergeFrom(from.contacts_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void AddressBook_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void AddressBook_InternalPB::CopyFrom(const AddressBook_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool AddressBook_InternalPB::IsInitialized() const { + + return true; +} + +void AddressBook_InternalPB::Swap(AddressBook_InternalPB* other) { + if (other != this) { + contacts_.Swap(&other->contacts_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata AddressBook_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = AddressBook_InternalPB_descriptor_; + metadata.reflection = AddressBook_InternalPB_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int WalletData_InternalPB::kBitcoinServerFieldNumber; +const int WalletData_InternalPB::kBitcoinAcctFieldNumber; +const int WalletData_InternalPB::kRippleServerFieldNumber; +const int WalletData_InternalPB::kLoomServerFieldNumber; +#endif // !_MSC_VER + +WalletData_InternalPB::WalletData_InternalPB() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void WalletData_InternalPB::InitAsDefaultInstance() { +} + +WalletData_InternalPB::WalletData_InternalPB(const WalletData_InternalPB& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void WalletData_InternalPB::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +WalletData_InternalPB::~WalletData_InternalPB() { + SharedDtor(); +} + +void WalletData_InternalPB::SharedDtor() { + if (this != default_instance_) { + } +} + +void WalletData_InternalPB::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* WalletData_InternalPB::descriptor() { + protobuf_AssignDescriptorsOnce(); + return WalletData_InternalPB_descriptor_; +} + +const WalletData_InternalPB& WalletData_InternalPB::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_Moneychanger_2eproto(); return *default_instance_; +} + +WalletData_InternalPB* WalletData_InternalPB::default_instance_ = NULL; + +WalletData_InternalPB* WalletData_InternalPB::New() const { + return new WalletData_InternalPB; +} + +void WalletData_InternalPB::Clear() { + bitcoin_server_.Clear(); + bitcoin_acct_.Clear(); + ripple_server_.Clear(); + loom_server_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool WalletData_InternalPB::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bitcoin_server: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bitcoin_server())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_bitcoin_server; + if (input->ExpectTag(18)) goto parse_bitcoin_acct; + break; + } + + // repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_bitcoin_acct: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bitcoin_acct())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_bitcoin_acct; + if (input->ExpectTag(26)) goto parse_ripple_server; + break; + } + + // repeated .OTDB.RippleServer_InternalPB ripple_server = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_ripple_server: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_ripple_server())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_ripple_server; + if (input->ExpectTag(34)) goto parse_loom_server; + break; + } + + // repeated .OTDB.LoomServer_InternalPB loom_server = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_loom_server: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_loom_server())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_loom_server; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void WalletData_InternalPB::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; + for (int i = 0; i < this->bitcoin_server_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->bitcoin_server(i), output); + } + + // repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; + for (int i = 0; i < this->bitcoin_acct_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->bitcoin_acct(i), output); + } + + // repeated .OTDB.RippleServer_InternalPB ripple_server = 3; + for (int i = 0; i < this->ripple_server_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->ripple_server(i), output); + } + + // repeated .OTDB.LoomServer_InternalPB loom_server = 4; + for (int i = 0; i < this->loom_server_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->loom_server(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* WalletData_InternalPB::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; + for (int i = 0; i < this->bitcoin_server_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->bitcoin_server(i), target); + } + + // repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; + for (int i = 0; i < this->bitcoin_acct_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->bitcoin_acct(i), target); + } + + // repeated .OTDB.RippleServer_InternalPB ripple_server = 3; + for (int i = 0; i < this->ripple_server_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->ripple_server(i), target); + } + + // repeated .OTDB.LoomServer_InternalPB loom_server = 4; + for (int i = 0; i < this->loom_server_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->loom_server(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int WalletData_InternalPB::ByteSize() const { + int total_size = 0; + + // repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; + total_size += 1 * this->bitcoin_server_size(); + for (int i = 0; i < this->bitcoin_server_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bitcoin_server(i)); + } + + // repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; + total_size += 1 * this->bitcoin_acct_size(); + for (int i = 0; i < this->bitcoin_acct_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->bitcoin_acct(i)); + } + + // repeated .OTDB.RippleServer_InternalPB ripple_server = 3; + total_size += 1 * this->ripple_server_size(); + for (int i = 0; i < this->ripple_server_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->ripple_server(i)); + } + + // repeated .OTDB.LoomServer_InternalPB loom_server = 4; + total_size += 1 * this->loom_server_size(); + for (int i = 0; i < this->loom_server_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->loom_server(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void WalletData_InternalPB::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const WalletData_InternalPB* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void WalletData_InternalPB::MergeFrom(const WalletData_InternalPB& from) { + GOOGLE_CHECK_NE(&from, this); + bitcoin_server_.MergeFrom(from.bitcoin_server_); + bitcoin_acct_.MergeFrom(from.bitcoin_acct_); + ripple_server_.MergeFrom(from.ripple_server_); + loom_server_.MergeFrom(from.loom_server_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void WalletData_InternalPB::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void WalletData_InternalPB::CopyFrom(const WalletData_InternalPB& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool WalletData_InternalPB::IsInitialized() const { + + return true; +} + +void WalletData_InternalPB::Swap(WalletData_InternalPB* other) { + if (other != this) { + bitcoin_server_.Swap(&other->bitcoin_server_); + bitcoin_acct_.Swap(&other->bitcoin_acct_); + ripple_server_.Swap(&other->ripple_server_); + loom_server_.Swap(&other->loom_server_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata WalletData_InternalPB::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = WalletData_InternalPB_descriptor_; + metadata.reflection = WalletData_InternalPB_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +// @@protoc_insertion_point(global_scope) diff --git a/OTLib/Moneychanger.pb.h b/OTLib/Moneychanger.pb.h new file mode 100644 index 000000000..076551cb3 --- /dev/null +++ b/OTLib/Moneychanger.pb.h @@ -0,0 +1,2263 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Moneychanger.proto + +#ifndef PROTOBUF_Moneychanger_2eproto__INCLUDED +#define PROTOBUF_Moneychanger_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include "Generics.pb.h" +#include "Bitcoin.pb.h" +// @@protoc_insertion_point(includes) + +namespace OTDB { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_Moneychanger_2eproto(); +void protobuf_AssignDesc_Moneychanger_2eproto(); +void protobuf_ShutdownFile_Moneychanger_2eproto(); + +class ServerInfo_InternalPB; +class ContactNym_InternalPB; +class ContactAcct_InternalPB; +class Contact_InternalPB; +class AddressBook_InternalPB; +class WalletData_InternalPB; + +// =================================================================== + +class ServerInfo_InternalPB : public ::google::protobuf::Message { + public: + ServerInfo_InternalPB(); + virtual ~ServerInfo_InternalPB(); + + ServerInfo_InternalPB(const ServerInfo_InternalPB& from); + + inline ServerInfo_InternalPB& operator=(const ServerInfo_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ServerInfo_InternalPB& default_instance(); + + void Swap(ServerInfo_InternalPB* other); + + // implements Message ---------------------------------------------- + + ServerInfo_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ServerInfo_InternalPB& from); + void MergeFrom(const ServerInfo_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string server_type = 1; + inline bool has_server_type() const; + inline void clear_server_type(); + static const int kServerTypeFieldNumber = 1; + inline const ::std::string& server_type() const; + inline void set_server_type(const ::std::string& value); + inline void set_server_type(const char* value); + inline void set_server_type(const char* value, size_t size); + inline ::std::string* mutable_server_type(); + inline ::std::string* release_server_type(); + + // optional string server_id = 2; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 2; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // @@protoc_insertion_point(class_scope:OTDB.ServerInfo_InternalPB) + private: + inline void set_has_server_type(); + inline void clear_has_server_type(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* server_type_; + ::std::string* server_id_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static ServerInfo_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class ContactNym_InternalPB : public ::google::protobuf::Message { + public: + ContactNym_InternalPB(); + virtual ~ContactNym_InternalPB(); + + ContactNym_InternalPB(const ContactNym_InternalPB& from); + + inline ContactNym_InternalPB& operator=(const ContactNym_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ContactNym_InternalPB& default_instance(); + + void Swap(ContactNym_InternalPB* other); + + // implements Message ---------------------------------------------- + + ContactNym_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ContactNym_InternalPB& from); + void MergeFrom(const ContactNym_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string nym_type = 2; + inline bool has_nym_type() const; + inline void clear_nym_type(); + static const int kNymTypeFieldNumber = 2; + inline const ::std::string& nym_type() const; + inline void set_nym_type(const ::std::string& value); + inline void set_nym_type(const char* value); + inline void set_nym_type(const char* value, size_t size); + inline ::std::string* mutable_nym_type(); + inline ::std::string* release_nym_type(); + + // optional string nym_id = 3; + inline bool has_nym_id() const; + inline void clear_nym_id(); + static const int kNymIdFieldNumber = 3; + inline const ::std::string& nym_id() const; + inline void set_nym_id(const ::std::string& value); + inline void set_nym_id(const char* value); + inline void set_nym_id(const char* value, size_t size); + inline ::std::string* mutable_nym_id(); + inline ::std::string* release_nym_id(); + + // optional string public_key = 4; + inline bool has_public_key() const; + inline void clear_public_key(); + static const int kPublicKeyFieldNumber = 4; + inline const ::std::string& public_key() const; + inline void set_public_key(const ::std::string& value); + inline void set_public_key(const char* value); + inline void set_public_key(const char* value, size_t size); + inline ::std::string* mutable_public_key(); + inline ::std::string* release_public_key(); + + // optional string memo = 5; + inline bool has_memo() const; + inline void clear_memo(); + static const int kMemoFieldNumber = 5; + inline const ::std::string& memo() const; + inline void set_memo(const ::std::string& value); + inline void set_memo(const char* value); + inline void set_memo(const char* value, size_t size); + inline ::std::string* mutable_memo(); + inline ::std::string* release_memo(); + + // repeated .OTDB.ServerInfo_InternalPB servers = 6; + inline int servers_size() const; + inline void clear_servers(); + static const int kServersFieldNumber = 6; + inline const ::OTDB::ServerInfo_InternalPB& servers(int index) const; + inline ::OTDB::ServerInfo_InternalPB* mutable_servers(int index); + inline ::OTDB::ServerInfo_InternalPB* add_servers(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ServerInfo_InternalPB >& + servers() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::ServerInfo_InternalPB >* + mutable_servers(); + + // @@protoc_insertion_point(class_scope:OTDB.ContactNym_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_nym_type(); + inline void clear_has_nym_type(); + inline void set_has_nym_id(); + inline void clear_has_nym_id(); + inline void set_has_public_key(); + inline void clear_has_public_key(); + inline void set_has_memo(); + inline void clear_has_memo(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* nym_type_; + ::std::string* nym_id_; + ::std::string* public_key_; + ::std::string* memo_; + ::google::protobuf::RepeatedPtrField< ::OTDB::ServerInfo_InternalPB > servers_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static ContactNym_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class ContactAcct_InternalPB : public ::google::protobuf::Message { + public: + ContactAcct_InternalPB(); + virtual ~ContactAcct_InternalPB(); + + ContactAcct_InternalPB(const ContactAcct_InternalPB& from); + + inline ContactAcct_InternalPB& operator=(const ContactAcct_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ContactAcct_InternalPB& default_instance(); + + void Swap(ContactAcct_InternalPB* other); + + // implements Message ---------------------------------------------- + + ContactAcct_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ContactAcct_InternalPB& from); + void MergeFrom(const ContactAcct_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string server_type = 2; + inline bool has_server_type() const; + inline void clear_server_type(); + static const int kServerTypeFieldNumber = 2; + inline const ::std::string& server_type() const; + inline void set_server_type(const ::std::string& value); + inline void set_server_type(const char* value); + inline void set_server_type(const char* value, size_t size); + inline ::std::string* mutable_server_type(); + inline ::std::string* release_server_type(); + + // optional string server_id = 3; + inline bool has_server_id() const; + inline void clear_server_id(); + static const int kServerIdFieldNumber = 3; + inline const ::std::string& server_id() const; + inline void set_server_id(const ::std::string& value); + inline void set_server_id(const char* value); + inline void set_server_id(const char* value, size_t size); + inline ::std::string* mutable_server_id(); + inline ::std::string* release_server_id(); + + // optional string asset_type_id = 4; + inline bool has_asset_type_id() const; + inline void clear_asset_type_id(); + static const int kAssetTypeIdFieldNumber = 4; + inline const ::std::string& asset_type_id() const; + inline void set_asset_type_id(const ::std::string& value); + inline void set_asset_type_id(const char* value); + inline void set_asset_type_id(const char* value, size_t size); + inline ::std::string* mutable_asset_type_id(); + inline ::std::string* release_asset_type_id(); + + // optional string acct_id = 5; + inline bool has_acct_id() const; + inline void clear_acct_id(); + static const int kAcctIdFieldNumber = 5; + inline const ::std::string& acct_id() const; + inline void set_acct_id(const ::std::string& value); + inline void set_acct_id(const char* value); + inline void set_acct_id(const char* value, size_t size); + inline ::std::string* mutable_acct_id(); + inline ::std::string* release_acct_id(); + + // optional string nym_id = 6; + inline bool has_nym_id() const; + inline void clear_nym_id(); + static const int kNymIdFieldNumber = 6; + inline const ::std::string& nym_id() const; + inline void set_nym_id(const ::std::string& value); + inline void set_nym_id(const char* value); + inline void set_nym_id(const char* value, size_t size); + inline ::std::string* mutable_nym_id(); + inline ::std::string* release_nym_id(); + + // optional string memo = 7; + inline bool has_memo() const; + inline void clear_memo(); + static const int kMemoFieldNumber = 7; + inline const ::std::string& memo() const; + inline void set_memo(const ::std::string& value); + inline void set_memo(const char* value); + inline void set_memo(const char* value, size_t size); + inline ::std::string* mutable_memo(); + inline ::std::string* release_memo(); + + // optional string public_key = 8; + inline bool has_public_key() const; + inline void clear_public_key(); + static const int kPublicKeyFieldNumber = 8; + inline const ::std::string& public_key() const; + inline void set_public_key(const ::std::string& value); + inline void set_public_key(const char* value); + inline void set_public_key(const char* value, size_t size); + inline ::std::string* mutable_public_key(); + inline ::std::string* release_public_key(); + + // @@protoc_insertion_point(class_scope:OTDB.ContactAcct_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_server_type(); + inline void clear_has_server_type(); + inline void set_has_server_id(); + inline void clear_has_server_id(); + inline void set_has_asset_type_id(); + inline void clear_has_asset_type_id(); + inline void set_has_acct_id(); + inline void clear_has_acct_id(); + inline void set_has_nym_id(); + inline void clear_has_nym_id(); + inline void set_has_memo(); + inline void clear_has_memo(); + inline void set_has_public_key(); + inline void clear_has_public_key(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* server_type_; + ::std::string* server_id_; + ::std::string* asset_type_id_; + ::std::string* acct_id_; + ::std::string* nym_id_; + ::std::string* memo_; + ::std::string* public_key_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(8 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static ContactAcct_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class Contact_InternalPB : public ::google::protobuf::Message { + public: + Contact_InternalPB(); + virtual ~Contact_InternalPB(); + + Contact_InternalPB(const Contact_InternalPB& from); + + inline Contact_InternalPB& operator=(const Contact_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Contact_InternalPB& default_instance(); + + void Swap(Contact_InternalPB* other); + + // implements Message ---------------------------------------------- + + Contact_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Contact_InternalPB& from); + void MergeFrom(const Contact_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string gui_label = 1; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 1; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + + // optional string contact_id = 2; + inline bool has_contact_id() const; + inline void clear_contact_id(); + static const int kContactIdFieldNumber = 2; + inline const ::std::string& contact_id() const; + inline void set_contact_id(const ::std::string& value); + inline void set_contact_id(const char* value); + inline void set_contact_id(const char* value, size_t size); + inline ::std::string* mutable_contact_id(); + inline ::std::string* release_contact_id(); + + // optional string email = 3; + inline bool has_email() const; + inline void clear_email(); + static const int kEmailFieldNumber = 3; + inline const ::std::string& email() const; + inline void set_email(const ::std::string& value); + inline void set_email(const char* value); + inline void set_email(const char* value, size_t size); + inline ::std::string* mutable_email(); + inline ::std::string* release_email(); + + // optional string memo = 4; + inline bool has_memo() const; + inline void clear_memo(); + static const int kMemoFieldNumber = 4; + inline const ::std::string& memo() const; + inline void set_memo(const ::std::string& value); + inline void set_memo(const char* value); + inline void set_memo(const char* value, size_t size); + inline ::std::string* mutable_memo(); + inline ::std::string* release_memo(); + + // optional string public_key = 5; + inline bool has_public_key() const; + inline void clear_public_key(); + static const int kPublicKeyFieldNumber = 5; + inline const ::std::string& public_key() const; + inline void set_public_key(const ::std::string& value); + inline void set_public_key(const char* value); + inline void set_public_key(const char* value, size_t size); + inline ::std::string* mutable_public_key(); + inline ::std::string* release_public_key(); + + // repeated .OTDB.ContactNym_InternalPB nyms = 6; + inline int nyms_size() const; + inline void clear_nyms(); + static const int kNymsFieldNumber = 6; + inline const ::OTDB::ContactNym_InternalPB& nyms(int index) const; + inline ::OTDB::ContactNym_InternalPB* mutable_nyms(int index); + inline ::OTDB::ContactNym_InternalPB* add_nyms(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ContactNym_InternalPB >& + nyms() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::ContactNym_InternalPB >* + mutable_nyms(); + + // repeated .OTDB.ContactAcct_InternalPB accounts = 7; + inline int accounts_size() const; + inline void clear_accounts(); + static const int kAccountsFieldNumber = 7; + inline const ::OTDB::ContactAcct_InternalPB& accounts(int index) const; + inline ::OTDB::ContactAcct_InternalPB* mutable_accounts(int index); + inline ::OTDB::ContactAcct_InternalPB* add_accounts(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ContactAcct_InternalPB >& + accounts() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::ContactAcct_InternalPB >* + mutable_accounts(); + + // @@protoc_insertion_point(class_scope:OTDB.Contact_InternalPB) + private: + inline void set_has_gui_label(); + inline void clear_has_gui_label(); + inline void set_has_contact_id(); + inline void clear_has_contact_id(); + inline void set_has_email(); + inline void clear_has_email(); + inline void set_has_memo(); + inline void clear_has_memo(); + inline void set_has_public_key(); + inline void clear_has_public_key(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* gui_label_; + ::std::string* contact_id_; + ::std::string* email_; + ::std::string* memo_; + ::std::string* public_key_; + ::google::protobuf::RepeatedPtrField< ::OTDB::ContactNym_InternalPB > nyms_; + ::google::protobuf::RepeatedPtrField< ::OTDB::ContactAcct_InternalPB > accounts_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static Contact_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class AddressBook_InternalPB : public ::google::protobuf::Message { + public: + AddressBook_InternalPB(); + virtual ~AddressBook_InternalPB(); + + AddressBook_InternalPB(const AddressBook_InternalPB& from); + + inline AddressBook_InternalPB& operator=(const AddressBook_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const AddressBook_InternalPB& default_instance(); + + void Swap(AddressBook_InternalPB* other); + + // implements Message ---------------------------------------------- + + AddressBook_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const AddressBook_InternalPB& from); + void MergeFrom(const AddressBook_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.Contact_InternalPB contacts = 1; + inline int contacts_size() const; + inline void clear_contacts(); + static const int kContactsFieldNumber = 1; + inline const ::OTDB::Contact_InternalPB& contacts(int index) const; + inline ::OTDB::Contact_InternalPB* mutable_contacts(int index); + inline ::OTDB::Contact_InternalPB* add_contacts(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::Contact_InternalPB >& + contacts() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::Contact_InternalPB >* + mutable_contacts(); + + // @@protoc_insertion_point(class_scope:OTDB.AddressBook_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::Contact_InternalPB > contacts_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static AddressBook_InternalPB* default_instance_; +}; +// ------------------------------------------------------------------- + +class WalletData_InternalPB : public ::google::protobuf::Message { + public: + WalletData_InternalPB(); + virtual ~WalletData_InternalPB(); + + WalletData_InternalPB(const WalletData_InternalPB& from); + + inline WalletData_InternalPB& operator=(const WalletData_InternalPB& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const WalletData_InternalPB& default_instance(); + + void Swap(WalletData_InternalPB* other); + + // implements Message ---------------------------------------------- + + WalletData_InternalPB* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const WalletData_InternalPB& from); + void MergeFrom(const WalletData_InternalPB& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; + inline int bitcoin_server_size() const; + inline void clear_bitcoin_server(); + static const int kBitcoinServerFieldNumber = 1; + inline const ::OTDB::BitcoinServer_InternalPB& bitcoin_server(int index) const; + inline ::OTDB::BitcoinServer_InternalPB* mutable_bitcoin_server(int index); + inline ::OTDB::BitcoinServer_InternalPB* add_bitcoin_server(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinServer_InternalPB >& + bitcoin_server() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinServer_InternalPB >* + mutable_bitcoin_server(); + + // repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; + inline int bitcoin_acct_size() const; + inline void clear_bitcoin_acct(); + static const int kBitcoinAcctFieldNumber = 2; + inline const ::OTDB::BitcoinAcct_InternalPB& bitcoin_acct(int index) const; + inline ::OTDB::BitcoinAcct_InternalPB* mutable_bitcoin_acct(int index); + inline ::OTDB::BitcoinAcct_InternalPB* add_bitcoin_acct(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinAcct_InternalPB >& + bitcoin_acct() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinAcct_InternalPB >* + mutable_bitcoin_acct(); + + // repeated .OTDB.RippleServer_InternalPB ripple_server = 3; + inline int ripple_server_size() const; + inline void clear_ripple_server(); + static const int kRippleServerFieldNumber = 3; + inline const ::OTDB::RippleServer_InternalPB& ripple_server(int index) const; + inline ::OTDB::RippleServer_InternalPB* mutable_ripple_server(int index); + inline ::OTDB::RippleServer_InternalPB* add_ripple_server(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::RippleServer_InternalPB >& + ripple_server() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::RippleServer_InternalPB >* + mutable_ripple_server(); + + // repeated .OTDB.LoomServer_InternalPB loom_server = 4; + inline int loom_server_size() const; + inline void clear_loom_server(); + static const int kLoomServerFieldNumber = 4; + inline const ::OTDB::LoomServer_InternalPB& loom_server(int index) const; + inline ::OTDB::LoomServer_InternalPB* mutable_loom_server(int index); + inline ::OTDB::LoomServer_InternalPB* add_loom_server(); + inline const ::google::protobuf::RepeatedPtrField< ::OTDB::LoomServer_InternalPB >& + loom_server() const; + inline ::google::protobuf::RepeatedPtrField< ::OTDB::LoomServer_InternalPB >* + mutable_loom_server(); + + // @@protoc_insertion_point(class_scope:OTDB.WalletData_InternalPB) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinServer_InternalPB > bitcoin_server_; + ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinAcct_InternalPB > bitcoin_acct_; + ::google::protobuf::RepeatedPtrField< ::OTDB::RippleServer_InternalPB > ripple_server_; + ::google::protobuf::RepeatedPtrField< ::OTDB::LoomServer_InternalPB > loom_server_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; + + friend void protobuf_AddDesc_Moneychanger_2eproto(); + friend void protobuf_AssignDesc_Moneychanger_2eproto(); + friend void protobuf_ShutdownFile_Moneychanger_2eproto(); + + void InitAsDefaultInstance(); + static WalletData_InternalPB* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// ServerInfo_InternalPB + +// optional string server_type = 1; +inline bool ServerInfo_InternalPB::has_server_type() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ServerInfo_InternalPB::set_has_server_type() { + _has_bits_[0] |= 0x00000001u; +} +inline void ServerInfo_InternalPB::clear_has_server_type() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ServerInfo_InternalPB::clear_server_type() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + clear_has_server_type(); +} +inline const ::std::string& ServerInfo_InternalPB::server_type() const { + return *server_type_; +} +inline void ServerInfo_InternalPB::set_server_type(const ::std::string& value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void ServerInfo_InternalPB::set_server_type(const char* value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void ServerInfo_InternalPB::set_server_type(const char* value, size_t size) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ServerInfo_InternalPB::mutable_server_type() { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + return server_type_; +} +inline ::std::string* ServerInfo_InternalPB::release_server_type() { + clear_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_type_; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 2; +inline bool ServerInfo_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ServerInfo_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void ServerInfo_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ServerInfo_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& ServerInfo_InternalPB::server_id() const { + return *server_id_; +} +inline void ServerInfo_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void ServerInfo_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void ServerInfo_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ServerInfo_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* ServerInfo_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// ContactNym_InternalPB + +// optional string gui_label = 1; +inline bool ContactNym_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ContactNym_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void ContactNym_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ContactNym_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& ContactNym_InternalPB::gui_label() const { + return *gui_label_; +} +inline void ContactNym_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void ContactNym_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void ContactNym_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactNym_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* ContactNym_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string nym_type = 2; +inline bool ContactNym_InternalPB::has_nym_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ContactNym_InternalPB::set_has_nym_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void ContactNym_InternalPB::clear_has_nym_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ContactNym_InternalPB::clear_nym_type() { + if (nym_type_ != &::google::protobuf::internal::kEmptyString) { + nym_type_->clear(); + } + clear_has_nym_type(); +} +inline const ::std::string& ContactNym_InternalPB::nym_type() const { + return *nym_type_; +} +inline void ContactNym_InternalPB::set_nym_type(const ::std::string& value) { + set_has_nym_type(); + if (nym_type_ == &::google::protobuf::internal::kEmptyString) { + nym_type_ = new ::std::string; + } + nym_type_->assign(value); +} +inline void ContactNym_InternalPB::set_nym_type(const char* value) { + set_has_nym_type(); + if (nym_type_ == &::google::protobuf::internal::kEmptyString) { + nym_type_ = new ::std::string; + } + nym_type_->assign(value); +} +inline void ContactNym_InternalPB::set_nym_type(const char* value, size_t size) { + set_has_nym_type(); + if (nym_type_ == &::google::protobuf::internal::kEmptyString) { + nym_type_ = new ::std::string; + } + nym_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactNym_InternalPB::mutable_nym_type() { + set_has_nym_type(); + if (nym_type_ == &::google::protobuf::internal::kEmptyString) { + nym_type_ = new ::std::string; + } + return nym_type_; +} +inline ::std::string* ContactNym_InternalPB::release_nym_type() { + clear_has_nym_type(); + if (nym_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = nym_type_; + nym_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string nym_id = 3; +inline bool ContactNym_InternalPB::has_nym_id() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ContactNym_InternalPB::set_has_nym_id() { + _has_bits_[0] |= 0x00000004u; +} +inline void ContactNym_InternalPB::clear_has_nym_id() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ContactNym_InternalPB::clear_nym_id() { + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + nym_id_->clear(); + } + clear_has_nym_id(); +} +inline const ::std::string& ContactNym_InternalPB::nym_id() const { + return *nym_id_; +} +inline void ContactNym_InternalPB::set_nym_id(const ::std::string& value) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(value); +} +inline void ContactNym_InternalPB::set_nym_id(const char* value) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(value); +} +inline void ContactNym_InternalPB::set_nym_id(const char* value, size_t size) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactNym_InternalPB::mutable_nym_id() { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + return nym_id_; +} +inline ::std::string* ContactNym_InternalPB::release_nym_id() { + clear_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = nym_id_; + nym_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string public_key = 4; +inline bool ContactNym_InternalPB::has_public_key() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ContactNym_InternalPB::set_has_public_key() { + _has_bits_[0] |= 0x00000008u; +} +inline void ContactNym_InternalPB::clear_has_public_key() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ContactNym_InternalPB::clear_public_key() { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + clear_has_public_key(); +} +inline const ::std::string& ContactNym_InternalPB::public_key() const { + return *public_key_; +} +inline void ContactNym_InternalPB::set_public_key(const ::std::string& value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void ContactNym_InternalPB::set_public_key(const char* value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void ContactNym_InternalPB::set_public_key(const char* value, size_t size) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactNym_InternalPB::mutable_public_key() { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + return public_key_; +} +inline ::std::string* ContactNym_InternalPB::release_public_key() { + clear_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = public_key_; + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string memo = 5; +inline bool ContactNym_InternalPB::has_memo() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ContactNym_InternalPB::set_has_memo() { + _has_bits_[0] |= 0x00000010u; +} +inline void ContactNym_InternalPB::clear_has_memo() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ContactNym_InternalPB::clear_memo() { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + clear_has_memo(); +} +inline const ::std::string& ContactNym_InternalPB::memo() const { + return *memo_; +} +inline void ContactNym_InternalPB::set_memo(const ::std::string& value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void ContactNym_InternalPB::set_memo(const char* value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void ContactNym_InternalPB::set_memo(const char* value, size_t size) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactNym_InternalPB::mutable_memo() { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + return memo_; +} +inline ::std::string* ContactNym_InternalPB::release_memo() { + clear_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = memo_; + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .OTDB.ServerInfo_InternalPB servers = 6; +inline int ContactNym_InternalPB::servers_size() const { + return servers_.size(); +} +inline void ContactNym_InternalPB::clear_servers() { + servers_.Clear(); +} +inline const ::OTDB::ServerInfo_InternalPB& ContactNym_InternalPB::servers(int index) const { + return servers_.Get(index); +} +inline ::OTDB::ServerInfo_InternalPB* ContactNym_InternalPB::mutable_servers(int index) { + return servers_.Mutable(index); +} +inline ::OTDB::ServerInfo_InternalPB* ContactNym_InternalPB::add_servers() { + return servers_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ServerInfo_InternalPB >& +ContactNym_InternalPB::servers() const { + return servers_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::ServerInfo_InternalPB >* +ContactNym_InternalPB::mutable_servers() { + return &servers_; +} + +// ------------------------------------------------------------------- + +// ContactAcct_InternalPB + +// optional string gui_label = 1; +inline bool ContactAcct_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ContactAcct_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void ContactAcct_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ContactAcct_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& ContactAcct_InternalPB::gui_label() const { + return *gui_label_; +} +inline void ContactAcct_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void ContactAcct_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void ContactAcct_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* ContactAcct_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_type = 2; +inline bool ContactAcct_InternalPB::has_server_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ContactAcct_InternalPB::set_has_server_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void ContactAcct_InternalPB::clear_has_server_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ContactAcct_InternalPB::clear_server_type() { + if (server_type_ != &::google::protobuf::internal::kEmptyString) { + server_type_->clear(); + } + clear_has_server_type(); +} +inline const ::std::string& ContactAcct_InternalPB::server_type() const { + return *server_type_; +} +inline void ContactAcct_InternalPB::set_server_type(const ::std::string& value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void ContactAcct_InternalPB::set_server_type(const char* value) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(value); +} +inline void ContactAcct_InternalPB::set_server_type(const char* value, size_t size) { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + server_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_server_type() { + set_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + server_type_ = new ::std::string; + } + return server_type_; +} +inline ::std::string* ContactAcct_InternalPB::release_server_type() { + clear_has_server_type(); + if (server_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_type_; + server_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string server_id = 3; +inline bool ContactAcct_InternalPB::has_server_id() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ContactAcct_InternalPB::set_has_server_id() { + _has_bits_[0] |= 0x00000004u; +} +inline void ContactAcct_InternalPB::clear_has_server_id() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ContactAcct_InternalPB::clear_server_id() { + if (server_id_ != &::google::protobuf::internal::kEmptyString) { + server_id_->clear(); + } + clear_has_server_id(); +} +inline const ::std::string& ContactAcct_InternalPB::server_id() const { + return *server_id_; +} +inline void ContactAcct_InternalPB::set_server_id(const ::std::string& value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_server_id(const char* value) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_server_id(const char* value, size_t size) { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + server_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_server_id() { + set_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + server_id_ = new ::std::string; + } + return server_id_; +} +inline ::std::string* ContactAcct_InternalPB::release_server_id() { + clear_has_server_id(); + if (server_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = server_id_; + server_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string asset_type_id = 4; +inline bool ContactAcct_InternalPB::has_asset_type_id() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ContactAcct_InternalPB::set_has_asset_type_id() { + _has_bits_[0] |= 0x00000008u; +} +inline void ContactAcct_InternalPB::clear_has_asset_type_id() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ContactAcct_InternalPB::clear_asset_type_id() { + if (asset_type_id_ != &::google::protobuf::internal::kEmptyString) { + asset_type_id_->clear(); + } + clear_has_asset_type_id(); +} +inline const ::std::string& ContactAcct_InternalPB::asset_type_id() const { + return *asset_type_id_; +} +inline void ContactAcct_InternalPB::set_asset_type_id(const ::std::string& value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_asset_type_id(const char* value) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_asset_type_id(const char* value, size_t size) { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + asset_type_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_asset_type_id() { + set_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + asset_type_id_ = new ::std::string; + } + return asset_type_id_; +} +inline ::std::string* ContactAcct_InternalPB::release_asset_type_id() { + clear_has_asset_type_id(); + if (asset_type_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = asset_type_id_; + asset_type_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string acct_id = 5; +inline bool ContactAcct_InternalPB::has_acct_id() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ContactAcct_InternalPB::set_has_acct_id() { + _has_bits_[0] |= 0x00000010u; +} +inline void ContactAcct_InternalPB::clear_has_acct_id() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ContactAcct_InternalPB::clear_acct_id() { + if (acct_id_ != &::google::protobuf::internal::kEmptyString) { + acct_id_->clear(); + } + clear_has_acct_id(); +} +inline const ::std::string& ContactAcct_InternalPB::acct_id() const { + return *acct_id_; +} +inline void ContactAcct_InternalPB::set_acct_id(const ::std::string& value) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_acct_id(const char* value) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_acct_id(const char* value, size_t size) { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + acct_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_acct_id() { + set_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + acct_id_ = new ::std::string; + } + return acct_id_; +} +inline ::std::string* ContactAcct_InternalPB::release_acct_id() { + clear_has_acct_id(); + if (acct_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = acct_id_; + acct_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string nym_id = 6; +inline bool ContactAcct_InternalPB::has_nym_id() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ContactAcct_InternalPB::set_has_nym_id() { + _has_bits_[0] |= 0x00000020u; +} +inline void ContactAcct_InternalPB::clear_has_nym_id() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ContactAcct_InternalPB::clear_nym_id() { + if (nym_id_ != &::google::protobuf::internal::kEmptyString) { + nym_id_->clear(); + } + clear_has_nym_id(); +} +inline const ::std::string& ContactAcct_InternalPB::nym_id() const { + return *nym_id_; +} +inline void ContactAcct_InternalPB::set_nym_id(const ::std::string& value) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_nym_id(const char* value) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(value); +} +inline void ContactAcct_InternalPB::set_nym_id(const char* value, size_t size) { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + nym_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_nym_id() { + set_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + nym_id_ = new ::std::string; + } + return nym_id_; +} +inline ::std::string* ContactAcct_InternalPB::release_nym_id() { + clear_has_nym_id(); + if (nym_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = nym_id_; + nym_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string memo = 7; +inline bool ContactAcct_InternalPB::has_memo() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void ContactAcct_InternalPB::set_has_memo() { + _has_bits_[0] |= 0x00000040u; +} +inline void ContactAcct_InternalPB::clear_has_memo() { + _has_bits_[0] &= ~0x00000040u; +} +inline void ContactAcct_InternalPB::clear_memo() { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + clear_has_memo(); +} +inline const ::std::string& ContactAcct_InternalPB::memo() const { + return *memo_; +} +inline void ContactAcct_InternalPB::set_memo(const ::std::string& value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void ContactAcct_InternalPB::set_memo(const char* value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void ContactAcct_InternalPB::set_memo(const char* value, size_t size) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_memo() { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + return memo_; +} +inline ::std::string* ContactAcct_InternalPB::release_memo() { + clear_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = memo_; + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string public_key = 8; +inline bool ContactAcct_InternalPB::has_public_key() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void ContactAcct_InternalPB::set_has_public_key() { + _has_bits_[0] |= 0x00000080u; +} +inline void ContactAcct_InternalPB::clear_has_public_key() { + _has_bits_[0] &= ~0x00000080u; +} +inline void ContactAcct_InternalPB::clear_public_key() { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + clear_has_public_key(); +} +inline const ::std::string& ContactAcct_InternalPB::public_key() const { + return *public_key_; +} +inline void ContactAcct_InternalPB::set_public_key(const ::std::string& value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void ContactAcct_InternalPB::set_public_key(const char* value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void ContactAcct_InternalPB::set_public_key(const char* value, size_t size) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ContactAcct_InternalPB::mutable_public_key() { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + return public_key_; +} +inline ::std::string* ContactAcct_InternalPB::release_public_key() { + clear_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = public_key_; + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// Contact_InternalPB + +// optional string gui_label = 1; +inline bool Contact_InternalPB::has_gui_label() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Contact_InternalPB::set_has_gui_label() { + _has_bits_[0] |= 0x00000001u; +} +inline void Contact_InternalPB::clear_has_gui_label() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Contact_InternalPB::clear_gui_label() { + if (gui_label_ != &::google::protobuf::internal::kEmptyString) { + gui_label_->clear(); + } + clear_has_gui_label(); +} +inline const ::std::string& Contact_InternalPB::gui_label() const { + return *gui_label_; +} +inline void Contact_InternalPB::set_gui_label(const ::std::string& value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void Contact_InternalPB::set_gui_label(const char* value) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(value); +} +inline void Contact_InternalPB::set_gui_label(const char* value, size_t size) { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + gui_label_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Contact_InternalPB::mutable_gui_label() { + set_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + gui_label_ = new ::std::string; + } + return gui_label_; +} +inline ::std::string* Contact_InternalPB::release_gui_label() { + clear_has_gui_label(); + if (gui_label_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = gui_label_; + gui_label_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string contact_id = 2; +inline bool Contact_InternalPB::has_contact_id() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Contact_InternalPB::set_has_contact_id() { + _has_bits_[0] |= 0x00000002u; +} +inline void Contact_InternalPB::clear_has_contact_id() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Contact_InternalPB::clear_contact_id() { + if (contact_id_ != &::google::protobuf::internal::kEmptyString) { + contact_id_->clear(); + } + clear_has_contact_id(); +} +inline const ::std::string& Contact_InternalPB::contact_id() const { + return *contact_id_; +} +inline void Contact_InternalPB::set_contact_id(const ::std::string& value) { + set_has_contact_id(); + if (contact_id_ == &::google::protobuf::internal::kEmptyString) { + contact_id_ = new ::std::string; + } + contact_id_->assign(value); +} +inline void Contact_InternalPB::set_contact_id(const char* value) { + set_has_contact_id(); + if (contact_id_ == &::google::protobuf::internal::kEmptyString) { + contact_id_ = new ::std::string; + } + contact_id_->assign(value); +} +inline void Contact_InternalPB::set_contact_id(const char* value, size_t size) { + set_has_contact_id(); + if (contact_id_ == &::google::protobuf::internal::kEmptyString) { + contact_id_ = new ::std::string; + } + contact_id_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Contact_InternalPB::mutable_contact_id() { + set_has_contact_id(); + if (contact_id_ == &::google::protobuf::internal::kEmptyString) { + contact_id_ = new ::std::string; + } + return contact_id_; +} +inline ::std::string* Contact_InternalPB::release_contact_id() { + clear_has_contact_id(); + if (contact_id_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = contact_id_; + contact_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string email = 3; +inline bool Contact_InternalPB::has_email() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void Contact_InternalPB::set_has_email() { + _has_bits_[0] |= 0x00000004u; +} +inline void Contact_InternalPB::clear_has_email() { + _has_bits_[0] &= ~0x00000004u; +} +inline void Contact_InternalPB::clear_email() { + if (email_ != &::google::protobuf::internal::kEmptyString) { + email_->clear(); + } + clear_has_email(); +} +inline const ::std::string& Contact_InternalPB::email() const { + return *email_; +} +inline void Contact_InternalPB::set_email(const ::std::string& value) { + set_has_email(); + if (email_ == &::google::protobuf::internal::kEmptyString) { + email_ = new ::std::string; + } + email_->assign(value); +} +inline void Contact_InternalPB::set_email(const char* value) { + set_has_email(); + if (email_ == &::google::protobuf::internal::kEmptyString) { + email_ = new ::std::string; + } + email_->assign(value); +} +inline void Contact_InternalPB::set_email(const char* value, size_t size) { + set_has_email(); + if (email_ == &::google::protobuf::internal::kEmptyString) { + email_ = new ::std::string; + } + email_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Contact_InternalPB::mutable_email() { + set_has_email(); + if (email_ == &::google::protobuf::internal::kEmptyString) { + email_ = new ::std::string; + } + return email_; +} +inline ::std::string* Contact_InternalPB::release_email() { + clear_has_email(); + if (email_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = email_; + email_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string memo = 4; +inline bool Contact_InternalPB::has_memo() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void Contact_InternalPB::set_has_memo() { + _has_bits_[0] |= 0x00000008u; +} +inline void Contact_InternalPB::clear_has_memo() { + _has_bits_[0] &= ~0x00000008u; +} +inline void Contact_InternalPB::clear_memo() { + if (memo_ != &::google::protobuf::internal::kEmptyString) { + memo_->clear(); + } + clear_has_memo(); +} +inline const ::std::string& Contact_InternalPB::memo() const { + return *memo_; +} +inline void Contact_InternalPB::set_memo(const ::std::string& value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void Contact_InternalPB::set_memo(const char* value) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(value); +} +inline void Contact_InternalPB::set_memo(const char* value, size_t size) { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + memo_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Contact_InternalPB::mutable_memo() { + set_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + memo_ = new ::std::string; + } + return memo_; +} +inline ::std::string* Contact_InternalPB::release_memo() { + clear_has_memo(); + if (memo_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = memo_; + memo_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string public_key = 5; +inline bool Contact_InternalPB::has_public_key() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void Contact_InternalPB::set_has_public_key() { + _has_bits_[0] |= 0x00000010u; +} +inline void Contact_InternalPB::clear_has_public_key() { + _has_bits_[0] &= ~0x00000010u; +} +inline void Contact_InternalPB::clear_public_key() { + if (public_key_ != &::google::protobuf::internal::kEmptyString) { + public_key_->clear(); + } + clear_has_public_key(); +} +inline const ::std::string& Contact_InternalPB::public_key() const { + return *public_key_; +} +inline void Contact_InternalPB::set_public_key(const ::std::string& value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void Contact_InternalPB::set_public_key(const char* value) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(value); +} +inline void Contact_InternalPB::set_public_key(const char* value, size_t size) { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + public_key_->assign(reinterpret_cast(value), size); +} +inline ::std::string* Contact_InternalPB::mutable_public_key() { + set_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + public_key_ = new ::std::string; + } + return public_key_; +} +inline ::std::string* Contact_InternalPB::release_public_key() { + clear_has_public_key(); + if (public_key_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = public_key_; + public_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .OTDB.ContactNym_InternalPB nyms = 6; +inline int Contact_InternalPB::nyms_size() const { + return nyms_.size(); +} +inline void Contact_InternalPB::clear_nyms() { + nyms_.Clear(); +} +inline const ::OTDB::ContactNym_InternalPB& Contact_InternalPB::nyms(int index) const { + return nyms_.Get(index); +} +inline ::OTDB::ContactNym_InternalPB* Contact_InternalPB::mutable_nyms(int index) { + return nyms_.Mutable(index); +} +inline ::OTDB::ContactNym_InternalPB* Contact_InternalPB::add_nyms() { + return nyms_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ContactNym_InternalPB >& +Contact_InternalPB::nyms() const { + return nyms_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::ContactNym_InternalPB >* +Contact_InternalPB::mutable_nyms() { + return &nyms_; +} + +// repeated .OTDB.ContactAcct_InternalPB accounts = 7; +inline int Contact_InternalPB::accounts_size() const { + return accounts_.size(); +} +inline void Contact_InternalPB::clear_accounts() { + accounts_.Clear(); +} +inline const ::OTDB::ContactAcct_InternalPB& Contact_InternalPB::accounts(int index) const { + return accounts_.Get(index); +} +inline ::OTDB::ContactAcct_InternalPB* Contact_InternalPB::mutable_accounts(int index) { + return accounts_.Mutable(index); +} +inline ::OTDB::ContactAcct_InternalPB* Contact_InternalPB::add_accounts() { + return accounts_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::ContactAcct_InternalPB >& +Contact_InternalPB::accounts() const { + return accounts_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::ContactAcct_InternalPB >* +Contact_InternalPB::mutable_accounts() { + return &accounts_; +} + +// ------------------------------------------------------------------- + +// AddressBook_InternalPB + +// repeated .OTDB.Contact_InternalPB contacts = 1; +inline int AddressBook_InternalPB::contacts_size() const { + return contacts_.size(); +} +inline void AddressBook_InternalPB::clear_contacts() { + contacts_.Clear(); +} +inline const ::OTDB::Contact_InternalPB& AddressBook_InternalPB::contacts(int index) const { + return contacts_.Get(index); +} +inline ::OTDB::Contact_InternalPB* AddressBook_InternalPB::mutable_contacts(int index) { + return contacts_.Mutable(index); +} +inline ::OTDB::Contact_InternalPB* AddressBook_InternalPB::add_contacts() { + return contacts_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::Contact_InternalPB >& +AddressBook_InternalPB::contacts() const { + return contacts_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::Contact_InternalPB >* +AddressBook_InternalPB::mutable_contacts() { + return &contacts_; +} + +// ------------------------------------------------------------------- + +// WalletData_InternalPB + +// repeated .OTDB.BitcoinServer_InternalPB bitcoin_server = 1; +inline int WalletData_InternalPB::bitcoin_server_size() const { + return bitcoin_server_.size(); +} +inline void WalletData_InternalPB::clear_bitcoin_server() { + bitcoin_server_.Clear(); +} +inline const ::OTDB::BitcoinServer_InternalPB& WalletData_InternalPB::bitcoin_server(int index) const { + return bitcoin_server_.Get(index); +} +inline ::OTDB::BitcoinServer_InternalPB* WalletData_InternalPB::mutable_bitcoin_server(int index) { + return bitcoin_server_.Mutable(index); +} +inline ::OTDB::BitcoinServer_InternalPB* WalletData_InternalPB::add_bitcoin_server() { + return bitcoin_server_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinServer_InternalPB >& +WalletData_InternalPB::bitcoin_server() const { + return bitcoin_server_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinServer_InternalPB >* +WalletData_InternalPB::mutable_bitcoin_server() { + return &bitcoin_server_; +} + +// repeated .OTDB.BitcoinAcct_InternalPB bitcoin_acct = 2; +inline int WalletData_InternalPB::bitcoin_acct_size() const { + return bitcoin_acct_.size(); +} +inline void WalletData_InternalPB::clear_bitcoin_acct() { + bitcoin_acct_.Clear(); +} +inline const ::OTDB::BitcoinAcct_InternalPB& WalletData_InternalPB::bitcoin_acct(int index) const { + return bitcoin_acct_.Get(index); +} +inline ::OTDB::BitcoinAcct_InternalPB* WalletData_InternalPB::mutable_bitcoin_acct(int index) { + return bitcoin_acct_.Mutable(index); +} +inline ::OTDB::BitcoinAcct_InternalPB* WalletData_InternalPB::add_bitcoin_acct() { + return bitcoin_acct_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinAcct_InternalPB >& +WalletData_InternalPB::bitcoin_acct() const { + return bitcoin_acct_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::BitcoinAcct_InternalPB >* +WalletData_InternalPB::mutable_bitcoin_acct() { + return &bitcoin_acct_; +} + +// repeated .OTDB.RippleServer_InternalPB ripple_server = 3; +inline int WalletData_InternalPB::ripple_server_size() const { + return ripple_server_.size(); +} +inline void WalletData_InternalPB::clear_ripple_server() { + ripple_server_.Clear(); +} +inline const ::OTDB::RippleServer_InternalPB& WalletData_InternalPB::ripple_server(int index) const { + return ripple_server_.Get(index); +} +inline ::OTDB::RippleServer_InternalPB* WalletData_InternalPB::mutable_ripple_server(int index) { + return ripple_server_.Mutable(index); +} +inline ::OTDB::RippleServer_InternalPB* WalletData_InternalPB::add_ripple_server() { + return ripple_server_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::RippleServer_InternalPB >& +WalletData_InternalPB::ripple_server() const { + return ripple_server_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::RippleServer_InternalPB >* +WalletData_InternalPB::mutable_ripple_server() { + return &ripple_server_; +} + +// repeated .OTDB.LoomServer_InternalPB loom_server = 4; +inline int WalletData_InternalPB::loom_server_size() const { + return loom_server_.size(); +} +inline void WalletData_InternalPB::clear_loom_server() { + loom_server_.Clear(); +} +inline const ::OTDB::LoomServer_InternalPB& WalletData_InternalPB::loom_server(int index) const { + return loom_server_.Get(index); +} +inline ::OTDB::LoomServer_InternalPB* WalletData_InternalPB::mutable_loom_server(int index) { + return loom_server_.Mutable(index); +} +inline ::OTDB::LoomServer_InternalPB* WalletData_InternalPB::add_loom_server() { + return loom_server_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::OTDB::LoomServer_InternalPB >& +WalletData_InternalPB::loom_server() const { + return loom_server_; +} +inline ::google::protobuf::RepeatedPtrField< ::OTDB::LoomServer_InternalPB >* +WalletData_InternalPB::mutable_loom_server() { + return &loom_server_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace OTDB + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_Moneychanger_2eproto__INCLUDED diff --git a/OTLib/Moneychanger.proto b/OTLib/Moneychanger.proto new file mode 100644 index 000000000..f0b0cc17e --- /dev/null +++ b/OTLib/Moneychanger.proto @@ -0,0 +1,56 @@ +import "Generics.proto"; +import "Bitcoin.proto"; + +package OTDB; + +message ServerInfo_InternalPB { + optional string server_type = 1; + optional string server_id = 2; +} + +message ContactNym_InternalPB { + optional string gui_label = 1; + optional string nym_type = 2; + optional string nym_id = 3; + optional string public_key = 4; + optional string memo = 5; + repeated ServerInfo_InternalPB servers = 6; +} + + +message ContactAcct_InternalPB { + optional string gui_label = 1; + optional string server_type = 2; + optional string server_id = 3; + optional string asset_type_id = 4; + optional string acct_id = 5; + optional string nym_id = 6; + optional string memo = 7; + optional string public_key = 8; +} + + +message Contact_InternalPB { + optional string gui_label = 1; + optional string contact_id = 2; + optional string email = 3; + optional string memo = 4; + optional string public_key = 5; + repeated ContactNym_InternalPB nyms = 6; + repeated ContactAcct_InternalPB accounts = 7; +} + + + +message AddressBook_InternalPB { + repeated Contact_InternalPB contacts = 1; +} + + + +message WalletData_InternalPB { + repeated BitcoinServer_InternalPB bitcoin_server = 1; + repeated BitcoinAcct_InternalPB bitcoin_acct = 2; + repeated RippleServer_InternalPB ripple_server = 3; + repeated LoomServer_InternalPB loom_server = 4; +} diff --git a/OTLib/OTASCIIArmor.cpp b/OTLib/OTASCIIArmor.cpp new file mode 100644 index 000000000..5669a7c76 --- /dev/null +++ b/OTLib/OTASCIIArmor.cpp @@ -0,0 +1,1356 @@ +/************************************************************** + * + * OTASCIIArmor.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include + +extern "C" +{ +#include //uint8_t + +#include +#include +#include +} + +// I use ezcompress once and ezuncompress once. +// Basically I compress the strings before they +// are ascii-armored, to save space. +// If it turns out I can't use this lib, then I'll +// just do the same thing using zlib instead of easyzlib. +// I'm avoiding that since it won't be as easy. Ha. +#include "easyzlib.h" + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTEnvelope.h" + +#include "OTLog.h" + +#include "OTASCIIArmor.h" + + + + +OTCleanup g_thePackerAngel; // Make sure the pointer below gets cleaned up properly at shutdown. + +OTDB::OTPacker * OTASCIIArmor::s_pPacker = NULL; + + +OTDB::OTPacker * OTASCIIArmor::GetPacker() +{ + if (NULL == s_pPacker) + { // WARNING: Do not change OTDB_DEFAULT_PACKER below unless you also change SetAndPackData() since it ASSUMES this. + s_pPacker = OTDB::OTPacker::Create(OTDB_DEFAULT_PACKER); // Protobuf is the only one that works on all platforms right now. + OT_ASSERT(NULL != s_pPacker); + + g_thePackerAngel.SetCleanupTargetPointer(s_pPacker); + } + + return s_pPacker; +} + + +// initializes blank. +OTASCIIArmor::OTASCIIArmor() : OTString() +{ + +} + +// encodes +OTASCIIArmor::OTASCIIArmor(const OTString & strValue) : OTString(/*Don't pass here, since we're encoding.*/) +{ + this->SetString(strValue); +} + +// Copies (already encoded) +OTASCIIArmor::OTASCIIArmor(const OTASCIIArmor & strValue) : OTString(dynamic_cast(strValue)) +{ + +} + + +// assumes envelope contains encrypted data; +// grabs that data in base64-form onto *this. +OTASCIIArmor::OTASCIIArmor(const OTEnvelope & theEnvelope) : OTString() +{ + theEnvelope.GetAsciiArmoredData(*this); +} + + +// copies (already encoded) +OTASCIIArmor::OTASCIIArmor(const char * szValue) : OTString(szValue) +{ + +} + +// ------------------------------------------------------------- + +// copies, assumes already encoded. +OTASCIIArmor & OTASCIIArmor::operator=(const char * szValue) +{ + this->Set(szValue); + return *this; +} + +// encodes +OTASCIIArmor & OTASCIIArmor::operator=(const OTString & strValue) +{ + if ((&strValue) != (&(dynamic_cast(*this)))) + { + this->SetString(strValue); + } + return *this; +} + +// assumes is already encoded and just copies the encoded text +OTASCIIArmor & OTASCIIArmor::operator=(const OTASCIIArmor & strValue) +{ + if ((&strValue) != this) // prevent self-assignment + { + this->OTString::operator=(dynamic_cast(strValue)); + } + return *this; +} + + + +extern "C" { +char *OT_base64_encode(const uint8_t* input, int in_len, int bLineBreaks) +{ + char *buf = NULL; + + BIO * bmem = NULL; + BIO * b64 = NULL; + BUF_MEM *bptr = NULL; + + b64 = BIO_new(BIO_f_base64()); + + if (!b64) + return buf; + + if (!bLineBreaks) + { + BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); + } + + bmem = BIO_new(BIO_s_mem()); + + if (bmem) + { + b64 = BIO_push(b64, bmem); + + if (BIO_write(b64, input, in_len)==in_len) + { + (void)BIO_flush(b64); + BIO_get_mem_ptr(b64, &bptr); + +// OTLog::vOutput(5, "DEBUG base64_encode size: %ld, in_len: %ld\n", bptr->length+1, in_len); + + buf = new char[bptr->length+1]; + + OT_ASSERT(NULL != buf); + + memcpy(buf, bptr->data, bptr->length); // Safe. + buf[bptr->length] = '\0'; + } + } + else + { + OT_ASSERT_MSG(false, "Failed creating new Bio in base64_encode.\n"); + } + + BIO_free_all(b64); + + return buf; +} + +uint8_t* OT_base64_decode(const char *input, size_t* out_len, int bLineBreaks) +{ + BIO *bmem = NULL, *b64 = NULL; + + OT_ASSERT(NULL != input); + + int in_len = strlen(input); + int out_max_len=(in_len*6+7)/8; + unsigned char *buf = new unsigned char [out_max_len]; + + OT_ASSERT(NULL != buf); + + memset(buf, 0, out_max_len); + + b64 = BIO_new(BIO_f_base64()); + + if (b64) + { + if (!bLineBreaks) + { + BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); + } + bmem = BIO_new_mem_buf((char*)input, in_len); + b64 = BIO_push(b64, bmem); + *out_len = BIO_read(b64, buf, out_max_len); + BIO_free_all(b64); + } + else + { + OT_ASSERT_MSG(false, "Failed creating new Bio in base64_decode.\n"); + } + + return buf; +} +} // extern "C" + + + + +/* More code for Base64 Decoding using OpenSSL: + + void base64Decode(unsigned char* pIn, int inLen, unsigned char* pOut, + int& outLen) + { + // create a memory buffer containing base64 encoded data + BIO* bmem = BIO_new_mem_buf((void*)pIn, inLen); + + // push a Base64 filter so that reading from buffer decodes it + BIO *bioCmd = BIO_new(BIO_f_base64()); + // we don't want newlines + BIO_set_flags(bioCmd, BIO_FLAGS_BASE64_NO_NL); + bmem = BIO_push(bioCmd, bmem); + + int finalLen = BIO_read(bmem, (void*)pOut, outLen); + BIO_free_all(bmem); + outLen = finalLen; + } + + Another example of similar code: + + char *unbase64(unsigned char *input, int length) + { + BIO *b64, *bmem; + + char *buffer = (char *)malloc(length); + memset(buffer, 0, length); + + b64 = BIO_new(BIO_f_base64()); + bmem = BIO_new_mem_buf(input, length); + bmem = BIO_push(b64, bmem); + + BIO_read(bmem, buffer, length); + + BIO_free_all(bmem); + + return buffer; + } + + + */ + + +// easyzlib knows, if the result buffer isn't big enough to +// store the results, +#define DEFAULT_BUFFER_SIZE_EASYZLIB 16384 + + + +// This function will base64 DECODE the string contents +// and return them as binary in theData +// Additionally it will decompress and unpack the data! +// +bool OTASCIIArmor::GetAndUnpackData(OTData & theData, bool bLineBreaks) const //linebreaks=true +{ + size_t outSize = 0; + uint8_t * pData = NULL; + + theData.Release(); + + if (GetLength() < 1) + return true; + + // -------------------------------------------------------------- + // + pData = OT_base64_decode(Get(), &outSize, (bLineBreaks ? 1 : 0)); + + if (pData) + { + // -------------------------------------------------------- + + OTDB::OTPacker * pPacker = OTASCIIArmor::GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // make sure buffer is deleted. + + pBuffer->SetData(static_cast(pData), outSize); + delete [] pData; pData=NULL; + // ----------------------------- + + OTDB::Blob * pBlob = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_BLOB)); + OT_ASSERT(NULL != pBlob); + OTCleanup theBlobAngel(*pBlob); // clean up this blob. + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pBlob); + + // ---------------------- + + if (false == bUnpacked) + { + OTLog::Error("Failed unpacking data in OTASCIIArmor::GetAndUnpackData.\n"); + delete [] pData; pData=NULL; + return false; + } + + // -------------------------------------------------------- + + theData.Assign(pBlob->m_memBuffer.data(), pBlob->m_memBuffer.size()); + delete [] pData; pData=NULL; + return true; + } + else + { + OTLog::Error("Error while base64_decoding in OTASCIIArmor::GetAndUnpackData.\n"); + return false; + } +} + + +/// if we pack, compress, encode on the way in, that means, therefore, we +/// need to decode, uncompress, then unpack on our way out. Right? +/// +/// This function will base64-DECODE the string contents, then uncompress them using +/// zlib, and then unpack the result using whatever is the default packer (MsgPack, Protobuf, etc). +/// +/// I originally added compression because message sizes were too big. Now I'm adding packing, +/// to solve any issues of binary compatibility across various platforms. +// +bool OTASCIIArmor::GetAndUnpackString(OTString & theData, bool bLineBreaks) const //bLineBreaks=true +{ + size_t outSize = 0; + uint8_t * pData = NULL; + + theData.Release(); + + if (GetLength() < 1) { + return true; + } + + // -------------------------------------------------------------- + // + pData = OT_base64_decode(Get(), &outSize, (bLineBreaks ? 1 : 0)); + + if (pData) + { + // ------------------------------------------- + // EASY ZLIB + // + long nDestLen = DEFAULT_BUFFER_SIZE_EASYZLIB; // todo stop hardcoding numbers (but this one is OK I think.) + unsigned char* pDest = new unsigned char [nDestLen+10]; // For safety. + + OT_ASSERT(NULL != pDest); + + int nErr = ezuncompress( pDest, &nDestLen, pData, outSize ); + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = new unsigned char [nDestLen]; // enough room now + + OT_ASSERT(NULL != pDest); + + nErr = ezuncompress( pDest, &nDestLen, pData, outSize ); + } + + // Now we're done with this memory, let's free it. + delete [] pData; pData=NULL; + + // ---------------------------------------- + + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Buffer error in OTASCIIArmor::GetAndUnpackString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_STREAM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "pDest is NULL in OTASCIIArmor::GetAndUnpackString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_DATA_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OTLog::vError("corrupted pSrc passed to ezuncompress OTASCIIArmor::GetAndUnpackString, size: %d\n", outSize); + + OT_ASSERT(false); + + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_MEM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Out of memory in OTASCIIArmor::GetAndUnpackString\n"); + return false; // not really necessary but just making sure. + } + + // --------------------------------------- + + // PUT THE PACKED BUFFER HERE, AND UNPACK INTO THEDATA + + // -------------------------------------------------------- + + OTDB::OTPacker * pPacker = OTASCIIArmor::GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // This will make sure buffer is deleted later. + + const size_t theDestLen = nDestLen; + + pBuffer->SetData(pDest, // const unsigned char * + theDestLen); + + delete [] pDest; pDest=NULL; + + // ----------------------------- + + OTDB::OTDBString * pOTDBString = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_STRING)); + OT_ASSERT(NULL != pOTDBString); + OTCleanup theStringAngel(*pOTDBString); // clean up this string. + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pOTDBString); + + // ---------------------- + + if (false == bUnpacked) + { + OTLog::Error("Failed unpacking string in OTASCIIArmor::GetAndUnpackString.\n"); + + return false; + } + + // -------------------------------------------------------- + + // This enforces the null termination. (using the 2nd parameter as nEnforcedMaxLength) + theData.Set(pOTDBString->m_string.c_str(), pOTDBString->m_string.length()); + + return true; + } + else + { + OTLog::Error("OTASCIIArmor::GetAndUnpackString: NULL pData while base64-decoding pData.\n"); + return false; + } +} + +// If adding packing STILL didn't make us binary compatible, then I need to try this next: +// Do the compression, THEN PACK... +// On the other way, UNPACK, THEN Uncompress. +// +// Right now I'm doing packing before compression, and unpacking after uncompression. +// Basically if that doesn't work (even though easyzlib appears to care about endian/platform) +// then switch the, (though that seems to make less logical sense to me.) +// Maybe have to pack before both? Seems crazy. + +bool OTASCIIArmor::GetString(OTString & theData, bool bLineBreaks) const //bLineBreaks=true +{ + return GetAndUnpackString(theData, bLineBreaks); + + + + + + size_t outSize = 0; + uint8_t * pData = NULL; + + theData.Release(); + + if (GetLength() < 1) { + return true; + } + + pData = OT_base64_decode(Get(), &outSize, (bLineBreaks ? 1 : 0)); + + if (pData) + { + long nDestLen = DEFAULT_BUFFER_SIZE_EASYZLIB; // todo stop hardcoding numbers (but this one is OK I think.) + unsigned char* pDest = new unsigned char [nDestLen+10]; // For safety. + + OT_ASSERT(NULL != pDest); + + int nErr = ezuncompress( pDest, &nDestLen, pData, outSize ); + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = new unsigned char [nDestLen]; // enough room now + + OT_ASSERT(NULL != pDest); + + nErr = ezuncompress( pDest, &nDestLen, pData, outSize ); + } + + // Now we're done with this memory, let's free it. + delete [] pData; pData=NULL; + + // ---------------------------------------- + + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Buffer error in OTASCIIArmor::GetString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_STREAM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "pDest is NULL in OTASCIIArmor::GetString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_DATA_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OTLog::vError("corrupted pSrc passed to ezuncompress OTASCIIArmor::GetString, size: %d\n", outSize); + + OT_ASSERT(false); + + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_MEM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Out of memory in OTASCIIArmor::GetString\n"); + return false; // not really necessary but just making sure. + } + + // This enforces the null termination. (using the extra parameter nDestLen as nEnforcedMaxLength) + theData.Set((const char*)pDest, nDestLen); + + delete [] pDest; pDest=NULL; + return true; + } + else + { + OTLog::Error("NULL pData while base64_decodeing pData.\n"); + return false; + } +} + + +/* +// This function will base64 DECODE the string contents +// and return them as a string in theData +// It does NOT handle Uncompression + +bool OTASCIIArmor::GetString(OTString & theData, bool bLineBreaks) const //=true +{ + size_t outSize = 0; + uint8_t * pData = NULL; + + pData = base64_decode(Get(), &outSize, (bLineBreaks ? 1 : 0)); + + if (pData) + { + theData.Set((const char*)pData, outSize); + + delete [] pData; pData=NULL; + return true; + } + else { + return false; + } +} + + +// This function will base64 ENCODE string stored in theData, +// and then Set() that as the string contents for *this. +// It does NOT handle compression. + +bool OTASCIIArmor::SetString(const OTString & theData, bool bLineBreaks) // =true +{ + char * pString = NULL; + + // Now let's base-64 encode it... // +1 for the null terminator. + pString = base64_encode((const uint8_t*)theData.Get(), theData.GetLength(), (bLineBreaks ? 1 : 0)); + // pString = base64_encode((const uint8_t*)theData.Get(), theData.GetLength()+1, (bLineBreaks ? 1 : 0)); // this was before we used compression. + + if (pString) + { + Set(pString); + delete [] pString; pString=NULL; // I'm using free here because I believe base64_encode is using malloc + return true; + } + + return false; +} +*/ + + + + +bool OTASCIIArmor::MemSet(const char * pMem, uint32_t theSize) +{ + Release(); + + if ((NULL == pMem) || (theSize < 1)) + return true; + + // ------------------- + + char * str_new = new char [theSize + 1]; + OT_ASSERT(NULL != str_new); + + memcpy((void*)str_new, pMem, theSize); + + str_new[theSize] = 0; // add null-terminator. (I deliberately made this buffer 1 byte larger so I could put the 0 at the end.) + + m_lLength = theSize; // the length doesn't count the 0. + m_strBuffer = str_new; + + return true; +} + + + +// This function will base64 ENCODE theData, +// and then Set() that as the string contents. +// Additionally it will pack and compress the data! +// +bool OTASCIIArmor::SetAndPackData(const OTData & theData, bool bLineBreaks/*=true*/) +{ + char * pString = NULL; + + Release(); + + if (theData.GetSize() < 1) + return true; + + // -------------------------------------------------------- + + OTDB::OTPacker * pPacker = OTASCIIArmor::GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // Here I use the default storage context to create the object (the blob.) + // I also originally created OTASCIIArmor::GetPacker() using OTDB_DEFAULT_PACKER, + // so I know everything is compatible. + // + OTDB::Blob * pBlob = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_BLOB)); + + OT_ASSERT(NULL != pBlob); // Beyond this point, responsible to delete pBlob. + OTCleanup theBlobAngel(*pBlob); // make sure memory is cleaned up. + + // ----------------------------- + + pBlob->m_memBuffer.assign(static_cast(theData.GetPointer()), + static_cast(theData.GetPointer())+theData.GetSize()); + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*pBlob); // Now we PACK our data before compressing/encoding it. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing data in OTASCIIArmor::SetAndPackData. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + if (NULL != pUint) + pString = OT_base64_encode(pUint, theSize, (bLineBreaks ? 1 : 0)); + else + { + OTLog::Error("Error while base64_encoding in OTASCIIArmor::SetAndPackData.\n"); + return false; + } + + // ------------------------------------- + + if (NULL != pString) + { + Set(pString); + delete [] pString; pString=NULL; + return true; + } + else + { + OTLog::Error("Error while base64_encoding in OTASCIIArmor::SetAndPackData.\n"); + return false; + } +} + + + +/// This function first Packs the incoming string, using whatever is the default packer. (MsgPack or Protobuf). +/// Then it Compresses the packed binary data using zlib. (ezcompress.) +/// Then it Base64-Encodes the compressed binary and sets it as a string on THIS OBJECT. +/// +/// I added these pieces 1-by-1 over time. At first the messages were too long, so I started compressing them. +/// Then they were not binary compatible across various platforms, so I added the packing. +// +bool OTASCIIArmor::SetAndPackString(const OTString & theData, bool bLineBreaks) //=true +{ + // OTLog::vError("DEBUGGING OTASCIIARMOR::SETSTRING, INPUT: --------->%s<---------", theData.Get()); + + Release(); + + if (theData.GetLength() < 1) + return true; + + // -------------------------------------------------------- + + OTDB::OTPacker * pPacker = OTASCIIArmor::GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // Here I use the default storage context to create the object (the blob.) + // I also originally created OTASCIIArmor::GetPacker() using OTDB_DEFAULT_PACKER, + // so I know everything is compatible. + // + OTDB::OTDBString * pOTDBString = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_STRING)); + + OT_ASSERT(NULL != pOTDBString); // Beyond this point, responsible to delete pString. + OTCleanup theStringAngel(*pOTDBString); // make sure memory is cleaned up. + + // ----------------------------- + + const uint32_t theStringSize32 = theData.GetLength(); + const size_t theStringSize = theStringSize32; // might need a cast here. // todo make sure this will handle sizes as big as I need. + + pOTDBString->m_string.assign(theData.Get(), // const char * + theStringSize); + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*pOTDBString); // Now we PACK our string before compressing/encoding it. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing string in OTASCIIArmor::SetAndPackString. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + // -------------------------------------------------------- + + char * pString = NULL; + + // Set up source buffer and destination buffer + long nDestLen = DEFAULT_BUFFER_SIZE_EASYZLIB; // todo stop hardcoding numbers (but this one is OK I think.) + const long lSourcelen = theSize; + + unsigned char* pSource = new unsigned char[lSourcelen+10]; // for safety + unsigned char* pDest = new unsigned char[nDestLen+10]; // for safety + + OT_ASSERT(NULL != pSource); + OT_ASSERT(NULL != pDest); + + memcpy(pSource, static_cast(pUint), theSize ); + + // Now we are compressing first before base64-encoding (for strings, anyway) + int nErr = ezcompress( pDest, &nDestLen, pSource, lSourcelen ); + + // If the destination buffer wasn't the right size the first time around, + // then we re-allocate it to the right size (which we now know) and try again... + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = new unsigned char [nDestLen]; // enough room now + + OT_ASSERT(NULL != pDest); + + nErr = ezcompress( pDest, &nDestLen, pSource, lSourcelen ); + } + + // Clean this up... + delete [] pSource; + pSource = NULL; + + // Still errors? + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Error allocating memory in OTASCIIArmor::SetAndPackString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_STREAM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "pDest is NULL in OTASCIIArmor::SetAndPackString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_DATA_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "corrupted pSrc passed to ezuncompress OTASCIIArmor::SetAndPackString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_MEM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Out of memory in OTASCIIArmor::SetAndPackString\n"); + return false; // not really necessary but just making sure. + } + + + OT_ASSERT_MSG(pDest != NULL, "pDest NULL in OTASCIIArmor::SetAndPackString\n"); + + // Success + if (0 < nDestLen) + { + // Now let's base-64 encode it... + pString = OT_base64_encode((const uint8_t*)pDest, nDestLen, (bLineBreaks ? 1 : 0)); + + delete [] pDest; + pDest = NULL; + + if (pString) + { + Set(pString); + delete [] pString; pString=NULL; + return true; + } + else + { + OTLog::Error("pString NULL in OTASCIIArmor::SetAndPackString\n"); + } + } + else + { + OTLog::Error("nDestLen 0 in OTASCIIArmor::SetAndPackString\n"); + } + + if (pDest) + delete [] pDest; + + pDest = NULL; + + return false; +} + + + + +// -------------------------------------- + + +// This version is fully functional, and performs compression in addition to base64-encoding. +// +bool OTASCIIArmor::SetString(const OTString & theData, bool bLineBreaks) //=true +{ + + return SetAndPackString(theData, bLineBreaks); + + + // --------------------------------------------------------------- + + // OTLog::vError("DEBUGGING OTASCIIARMOR::SETSTRING, INPUT: --------->%s<---------", theData.Get()); + + Release(); + + if (theData.GetLength() < 1) + return true; + + char * pString = NULL; + + // Set up source buffer and destination buffer + long nDestLen = DEFAULT_BUFFER_SIZE_EASYZLIB; // todo stop hardcoding numbers (but this one is OK I think.) + const long lSourcelen = sizeof(unsigned char)*theData.GetLength()+1;// for null terminator + + unsigned char* pSource = new unsigned char[lSourcelen+10]; // for safety + unsigned char* pDest = new unsigned char[nDestLen+10]; // for safety + + OT_ASSERT(NULL != pSource); + OT_ASSERT(NULL != pDest); + + memcpy(pSource, (const unsigned char*)theData.Get(), lSourcelen ); + + // Now we are compressing first before base64-encoding (for strings, anyway) + int nErr = ezcompress( pDest, &nDestLen, pSource, lSourcelen ); + + // If the destination buffer wasn't the right size the first time around, + // then we re-allocate it to the right size (which we now know) and try again... + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = new unsigned char [nDestLen]; // enough room now + + OT_ASSERT(NULL != pDest); + + nErr = ezcompress( pDest, &nDestLen, pSource, lSourcelen ); + } + + // Clean this up... + delete [] pSource; + pSource = NULL; + + // Still errors? + if ( nErr == EZ_BUF_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Error allocating memory in OTASCIIArmor::SetString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_STREAM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "pDest is NULL in OTASCIIArmor::SetString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_DATA_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "corrupted pSrc passed to ezuncompress OTASCIIArmor::SetString\n"); + return false; // not really necessary but just making sure. + } + else if ( nErr == EZ_MEM_ERROR ) + { + delete [] pDest; + pDest = NULL; + + OT_ASSERT_MSG(false, "Out of memory in OTASCIIArmor::SetString\n"); + return false; // not really necessary but just making sure. + } + + + OT_ASSERT_MSG(pDest != NULL, "pDest NULL in OTASCIIArmor::SetString\n"); + + // Success + if (0 < nDestLen) + { + // Now let's base-64 encode it... + pString = OT_base64_encode((const uint8_t*)pDest, nDestLen, (bLineBreaks ? 1 : 0)); + // pString = OT_base64_encode((const uint8_t*)theData.Get(), theData.GetLength()+1, (bLineBreaks ? 1 : 0)); // this was before we used compression. + + delete [] pDest; + pDest = NULL; + + if (pString) + { + Set(pString); + delete [] pString; pString=NULL; + return true; + } + else + { + OTLog::Error("pString NULL in OTASCIIArmor::SetString\n"); + } + } + else + { + OTLog::Error("nDestLen 0 in OTASCIIArmor::SetString\n"); + } + + if (pDest) + delete [] pDest; + + pDest = NULL; + + return false; +} + + +// --------------------------------------------------------------- + + + + + +// This function will base64 DECODE the string contents +// and return them as binary in theData +bool OTASCIIArmor::GetData(OTData & theData, bool bLineBreaks) const //linebreaks=true +{ + return GetAndUnpackData(theData, bLineBreaks); + + + + size_t outSize = 0; + uint8_t * pData = NULL; + + theData.Release(); + + if (GetLength() < 1) + return true; + + pData = OT_base64_decode(Get(), &outSize, (bLineBreaks ? 1 : 0)); + + if (pData) + { + theData.Assign(pData, outSize); + delete [] pData; pData=NULL; + return true; + } + else + { + OTLog::Error("Error while base64_decoding in OTASCIIArmor::GetData.\n"); + return false; + } +} + +// This function will base64 ENCODE theData, +// and then Set() that as the string contents. +bool OTASCIIArmor::SetData(const OTData & theData, bool bLineBreaks/*=true*/) +{ + return SetAndPackData(theData, bLineBreaks); + + + + char * pString = NULL; + + Release(); + + if (theData.GetSize() < 1) + return true; + + pString = OT_base64_encode((const uint8_t*)theData.GetPointer(), theData.GetSize(), (bLineBreaks ? 1 : 0)); + + if (pString) + { + Set(pString); + delete [] pString; pString=NULL; + return true; + } + else + { + OTLog::Error("Error while base64_encoding in OTASCIIArmor::GetData.\n"); + return false; + } +} + + +// This code reads up the file, discards the bookends, and saves only the gibberish itself. +bool OTASCIIArmor::LoadFromFile(const OTString & foldername, const OTString & filename) +{ + /* + std::ifstream fin(filename.Get(), std::ios::binary); + + if (!fin.is_open()) + { + OTLog::vError("Error opening file in OTASCIIArmor::LoadFromFile: %s\n", filename.Get()); + return false; + } + + return LoadFromifstream(fin); + */ + + OT_ASSERT(foldername.Exists()); + OT_ASSERT(filename.Exists()); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(foldername.Get(), filename.Get())) + { + OTLog::vError("OTASCIIArmor::LoadFromFile: File does not exist: %s%s%s\n", + foldername.Get(), OTLog::PathSeparator(), filename.Get()); + return false; + } + + // -------------------------------------------------------------------- + // + OTString strFileContents(OTDB::QueryPlainString(foldername.Get(), filename.Get())); // <=== LOADING FROM DATA STORE. + + if (strFileContents.GetLength() < 2) + { + OTLog::vError("OTASCIIArmor::LoadFromFile: Error reading file: %s%s%s\n", + foldername.Get(), OTLog::PathSeparator(), filename.Get()); + return false; + } + + // -------------------------------------------------------------------- + + return LoadFromString(strFileContents); +} + +// This code reads up the file, discards the bookends, and saves only the gibberish itself. +bool OTASCIIArmor::LoadFromifstream(const std::ifstream & fin) +{ + std::stringstream buffer; + buffer << fin.rdbuf(); + + std::string contents(buffer.str()); + + OTString theString; + theString.Set(contents.c_str()); + + return LoadFromString(theString); +} + + +// This code reads up the file, discards the bookends, and saves only the gibberish itself. +// the bEscaped option allows you to load a normal ASCII-Armored file if off, and allows +// you to load an escaped ASCII-armored file (such as inside the contracts when the public keys +// are escaped with a "- " before the rest of the ------- starts.) +bool OTASCIIArmor::LoadFromString(OTString & theStr, bool bEscaped/*=false*/) +{ + char buffer1[2100]; + + memset(buffer1, 0, 2100); + + bool bContentMode = false; // "currently in content mode" + bool bHaveEnteredContentMode = false; // "have yet to enter content mode" + + // Clear out whatever string might have been in there before. + Release(); + + // Load up the string from theStr, + // (bookended by "-----BEGIN ... -----" and END messages) + bool bIsEOF = false; + theStr.reset(); // So we can call theStr.sgets(). Making sure position is at start of string. + + do + { + bIsEOF = !(theStr.sgets(buffer1, 2048)); + // bIsEOF = fin.getline(buffer1, 2048).eof(); + + std::string line = buffer1; + const char * pConstBuf = line.c_str(); + char * pBuf = (char *)pConstBuf; + + // It's not a blank line. + if (line.length() < 2) + { + continue; + } + + // if we're on a dashed line... + else if (line.at(0) == '-' && line.at(2) == '-' && line.at(3) == '-' + && (bEscaped ? (line.at(1) == ' ') : (line.at(1) == '-') ) ) + { + // If I just hit a dash, that means there are only two options: + + // a. I have not yet entered content mode, and potentially just now entering it for the first time. + if (!bHaveEnteredContentMode) + { + if (line.find("BEGIN")!=std::string::npos && line.at(0) == '-' && line.at(2) == '-' && + line.at(3) == '-' && (bEscaped ? (line.at(1) == ' ') : (line.at(1) == '-'))) + { +// OTLog::Error("Reading ascii-armored contents..."); + bHaveEnteredContentMode = true; + bContentMode = true; + continue; + } + else + { + continue; + } + + } + + // b. I am now LEAVING content mode! + else if (bContentMode && line.find("END")!=std::string::npos) + { +// OTLog::Error("Finished reading ascii-armored contents.\n"); +// OTLog::vError("Finished reading ascii-armored contents:\n%s(END DATA)\n", Get()); + bContentMode = false; + continue; + } + } + + + // Else we're on a normal line, not a dashed line. + else + { + if (bHaveEnteredContentMode && bContentMode) + { + if (line.compare(0,8,"Version:") == 0) + { +// OTLog::Error("Skipping version line...\n"); + continue; + } + } + + } + + // Here we save the line to member variables, if appropriate + if (bContentMode) + { + Concatenate("%s\n", pBuf); + } + } + while(!bIsEOF && (bContentMode || !bHaveEnteredContentMode)); + + + // reset the string position back to 0 + theStr.reset(); + + if (!bHaveEnteredContentMode) + { + OTLog::Error("Error in OTASCIIArmor::LoadFromString: EOF before ascii-armored content found.\n"); + return false; + } + else if (bContentMode) + { + OTLog::Error("Error in OTASCIIArmor::LoadFromString: EOF while still reading content.\n"); + return false; + } + else + return true; +} + + +OTASCIIArmor::~OTASCIIArmor() +{ + // ~OTString called automatically, which calls Release(). +} + diff --git a/OTLib/OTASCIIArmor.h b/OTLib/OTASCIIArmor.h new file mode 100644 index 000000000..1ad83b104 --- /dev/null +++ b/OTLib/OTASCIIArmor.h @@ -0,0 +1,225 @@ +/************************************************************************************ + * + * OTASCIIArmor.h + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_ASCII_ARMOR_H__ +#define __OT_ASCII_ARMOR_H__ + +#include +#include +#include +#include +#include + +#include "OTData.h" +#include "OTString.h" +//#include "OTStorage.h" + + +class OTEnvelope; + +//class OTDB::OTPacker; + +// The natural state of OTASCIIArmor is in compressed and base64-encoded, string form. +// It is derived from OTString. The Get() method returns a base64-encoded string. +// The Set() method assumes that you are PASSING IN a base64-encoded string. +// The constructors assume that you are passing in a base64-encoded string. +class OTASCIIArmor : public OTString +{ +public: + static OTDB::OTPacker * GetPacker(); + static OTDB::OTPacker * s_pPacker; + + OTASCIIArmor(); + OTASCIIArmor(const char * szValue); + OTASCIIArmor(const OTString & strValue); + OTASCIIArmor(const OTASCIIArmor & strValue); + OTASCIIArmor(const OTEnvelope & theEnvelope); + virtual ~OTASCIIArmor(); + + using OTString::swap; + + OTASCIIArmor & operator=(const char * szValue); + OTASCIIArmor & operator=(const OTString & strValue); + OTASCIIArmor & operator=(const OTASCIIArmor & strValue); + + bool LoadFromFile(const OTString & foldername, const OTString & filename); + bool LoadFromifstream(const std::ifstream & fin); + bool LoadFromString(OTString & theStr, bool bEscaped=false); + + // This function will base64 DECODE the string contents (This class is a string) + // and return them as BINARY in theData + // Should be called "Get From Internal String Into Data" + bool GetData(OTData & theData, bool bLineBreaks=true) const; + bool GetAndUnpackData(OTData & theData, bool bLineBreaks=true) const; + + // This function will base64 ENCODE theData, + // and then Set() that as the string contents. + // Should be called "Encode Data And Set As Internal String" + bool SetData(const OTData & theData, bool bLineBreaks=true); + bool SetAndPackData(const OTData & theData, bool bLineBreaks=true); + + // This function will base64 DECODE the string contents + // and return them as a STRING in theData + bool GetString(OTString & theData, bool bLineBreaks=true) const; + bool GetAndUnpackString(OTString & theData, bool bLineBreaks=true) const; + + // This function will base64 ENCODE the STRING stored in theData, + // and then Set() that as this string contents. + bool SetString(const OTString & theData, bool bLineBreaks=true); + bool SetAndPackString(const OTString & theData, bool bLineBreaks=true); + + // For a straight-across, exact-size copy of bytes that you KNOW + // are base64-encoded properly by an OTASCIIArmor. + bool MemSet(const char * pMem, uint32_t theSize); +}; + +typedef std::map mapOfArmor; + + + +#endif // __OT_ASCII_ARMOR_H__ + + + + + + + + + + + + + + + + diff --git a/OTLib/OTAccount.cpp b/OTLib/OTAccount.cpp new file mode 100644 index 000000000..403a6877e --- /dev/null +++ b/OTLib/OTAccount.cpp @@ -0,0 +1,922 @@ +/************************************************************* + * + * OTAccount.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +extern "C" +{ +#include + +#ifdef _WIN32 +#include +#include +#include + /* +void gettimeofday(struct timeval* t,void* timezone) +{ struct _timeb timebuffer; + _ftime64_s( &timebuffer ); + t->tv_sec=timebuffer.time; + t->tv_usec=1000*timebuffer.millitm; +} +*/ + +int gettimeofday + (struct timeval* tp, void* tzp) { + DWORD t; + t = timeGetTime(); + tp->tv_sec = t / 1000; + tp->tv_usec = t % 1000; + /* 0 indicates success. */ + return 0; +} +#else +#include +#include +#endif +} + + +#include +#include +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + + +#include "OTIdentifier.h" +#include "OTAccount.h" +#include "OTLedger.h" +#include "OTPayload.h" +#include "OTMessage.h" +#include "OTStringXML.h" +#include "OTPseudonym.h" +#include "OTLog.h" + + + +const char * OTAccount::_TypeStrings[] = +{ + "simple", + "issuer", + "basket", + "err_acct" +}; + + + +// Caller responsible to delete. +OTLedger * OTAccount::LoadInbox(OTPseudonym & theNym) +{ + OTLedger * pBox = new OTLedger(GetUserID(), GetRealAccountID(), GetRealServerID()); + + OT_ASSERT(NULL != pBox); + + if (pBox->LoadInbox() && pBox->VerifyAccount(theNym)) + { + return pBox; + } + else + { + OTString strUserID(GetUserID()), strAcctID(GetRealAccountID()); + + OTLog::vOutput(2, "Unable to load or verify inbox:\n%s\n For user:\n%s\n", + strAcctID.Get(), strUserID.Get()); + } + + return NULL; +} + + +// Caller responsible to delete. +OTLedger * OTAccount::LoadOutbox(OTPseudonym & theNym) +{ + OTLedger * pBox = new OTLedger(GetUserID(), GetRealAccountID(), GetRealServerID()); + + OT_ASSERT(NULL != pBox); + + if (pBox->LoadOutbox() && pBox->VerifyAccount(theNym)) + { + return pBox; + } + else + { + OTString strUserID(GetUserID()), strAcctID(GetRealAccountID()); + + OTLog::vOutput(2, "Unable to load or verify outbox:\n%s\n For user:\n%s\n", + strAcctID.Get(), strUserID.Get()); + } + + return NULL; +} + + + + +// TODO: add an override so that OTAccount, when it loads up, it performs the check to +// see the ServerID, look at the Server Contract and make sure the server hashes match. +// + +// Todo override "Verify". Have some way to verify a specific Nym to a specific account. + + // overriding this so I can set the filename automatically inside based on ID. +bool OTAccount::LoadContract() +{ + OTString strID; + GetIdentifier(strID); + + return OTContract::LoadContract(OTLog::AccountFolder(), strID.Get()); +} + +bool OTAccount::SaveAccount() +{ + OTString strID; + GetIdentifier(strID); + + return SaveContract(OTLog::AccountFolder(), strID.Get()); +} + +// Debit a certain amount from the account (presumably the same amount is being credited somewhere else) +bool OTAccount::Debit(const long & lAmount) +{ + /* // TODO: Decide whether or not to allow negative Debits and negative Credits. + // (Currrently allowed -- a negative cheque is the same thing as an invoice.) + if (lAmount < 0) + return false; + */ + + long lOldBalance = atol(m_BalanceAmount.Get()); + + long lNewBalance = lOldBalance - lAmount; // The MINUS here is the big difference between Debit and Credit + + // This is where issuer accounts get a pass. They just go negative. + if ((lNewBalance < 0) && // IF the new balance is less than zero... + (OTAccount::simple == m_AcctType) && // AND it's a normal account... (not an issuer) + (lNewBalance < lOldBalance)) // AND the new balance is even less than the old balance... + return false; // THEN FAIL. The "new less than old" requirement is recent, + else // and it means that we now allow <0 debits on normal accounts, + { // AS LONG AS the result is a HIGHER BALANCE :-) + m_BalanceAmount.Format("%ld", lNewBalance); + + const time_t tDate = time(NULL); // Today, now. + m_BalanceDate.Format("%d", tDate); + + return true; + } +} + + +// Credit a certain amount to the account (presumably the same amount is being debited somewhere else) +bool OTAccount::Credit(const long & lAmount) +{ + /* // TODO: Decide whether or not to allow negative Debits and negative Credits. (Currrently allowed.) + if (lAmount < 0) + return false; + */ + + long lOldBalance = atol(m_BalanceAmount.Get()); + + long lNewBalance = lOldBalance + lAmount; // The PLUS here is the big difference between Debit and Credit. + + // If the balance gets too big, it may flip to negative due to us using long int. + // We'll maybe explicitly check that it's not negative in order to prevent that. TODO. +// if (lNewBalance > 0 || (OTAccount::simple != m_AcctType)) +// { +// m_BalanceAmount.Format("%ld", lNewBalance); +// return true; +// } + + // This is where issuer accounts get a pass. They just go negative. + if ((lNewBalance < 0) && // IF the new balance is less than zero... + (OTAccount::simple == m_AcctType) && // AND it's a normal account... (not an issuer) + (lNewBalance < lOldBalance)) // AND the new balance is even less than the old balance... + return false; // THEN FAIL. The "new less than old" requirement is recent, + else // and it means that we now allow <0 debits on normal accounts, + { // AS LONG AS the result is a HIGHER BALANCE :-) + m_BalanceAmount.Format("%ld", lNewBalance); + + const time_t tDate = time(NULL); // Today, now. + m_BalanceDate.Format("%d", tDate); + + return true; + } +} + + +const OTIdentifier & OTAccount::GetAssetTypeID() +{ + return m_AcctAssetTypeID; +} + + +// Used for generating accounts, thus no accountID needed. +OTAccount::OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theServerID) +: OTTransactionType(), m_bMarkForDeletion(false) +{ + InitAccount(); + + SetUserID(theUserID); + SetRealServerID(theServerID); + SetPurportedServerID(theServerID); +} + + +void OTAccount::InitAccount() +{ + m_strContractType = "ACCOUNT"; + + m_AcctType = OTAccount::simple; +} + +// this is private for now. hopefully keep that way. +OTAccount::OTAccount() : OTTransactionType(), m_bMarkForDeletion(false) +{ + InitAccount(); +} + + +OTAccount::OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, + const OTIdentifier & theServerID, const OTString & name) +: OTTransactionType (theUserID, theAccountID, theServerID), m_bMarkForDeletion(false) +{ + InitAccount(); + + m_strName = name; +} + +OTAccount::OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID) +: OTTransactionType (theUserID, theAccountID, theServerID), m_bMarkForDeletion(false) +{ + InitAccount(); +} + + + +OTAccount::~OTAccount() +{ + +} + + +// Verify Contract ID first, THEN Verify Owner. +// Because we use the ID in this function, so make sure that it is verified before calling this. +bool OTAccount::VerifyOwner(OTPseudonym & theCandidate) +{ + OTIdentifier ID_CANDIDATE; + theCandidate.GetIdentifier(ID_CANDIDATE); // ID_CANDIDATE now contains the ID of the Nym we're testing. + + if (m_AcctUserID == ID_CANDIDATE) // There's an op== function, but no != ... So I used == since it exists. + { + return true; + } + return false; +} + + + + +char* myGetTimeOfDay(char* buffer, int bufferLength) +{ + using namespace std; + + // this const was part of a class... + const int getTimeOfDayBufferLength = 27; + + if (bufferLengthSetRealAccountID(theAccountID); + pAccount->SetRealServerID(theServerID); + + OTString strAcctID(theAccountID); + + pAccount->m_strFoldername = OTLog::AccountFolder(); + pAccount->m_strFilename = strAcctID.Get(); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(pAccount->m_strFoldername.Get(), pAccount->m_strFilename.Get())) + { + OTLog::vError("OTAccount::LoadExistingAccount: File does not exist: %s%s%s\n", + pAccount->m_strFoldername.Get(), OTLog::PathSeparator(), pAccount->m_strFilename.Get()); + return NULL; + } + + // -------------------------------------------------------------------- + + if (pAccount->LoadContract() && pAccount->VerifyContractID()) + return pAccount; + else + { + delete pAccount; + pAccount = NULL; + } + + return NULL; +} + + +// static method (call it without an instance, using notation: OTAccount::GenerateNewAccount) +OTAccount * OTAccount::GenerateNewAccount(const OTIdentifier & theUserID, const OTIdentifier & theServerID, + const OTPseudonym & theServerNym, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType/*=OTAccount::simple*/) +{ + OTAccount * pAccount = new OTAccount(theUserID, theServerID); + + if (pAccount) + { + if (pAccount->GenerateNewAccount(theServerNym, theMessage, eAcctType)) + return pAccount; + else { + delete pAccount; + pAccount = NULL; + } + } + return NULL; +} + + + + +/* + + Just make sure theMessage has these members populated: +theMessage.m_strNymID; +theMessage.m_strAssetID; +theMessage.m_strServerID; + */ +// The above method uses this one internally... +bool OTAccount::GenerateNewAccount(const OTPseudonym & theServer, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType/*=OTAccount::simple*/) +{ + // First we generate a secure random number into a binary object. + OTPayload thePayload; + thePayload.SetPayloadSize(100); + if (!RAND_bytes((unsigned char*)thePayload.GetPayloadPointer(), 100)) + { + OTLog::Error("The PRNG is not seeded!\n"); +// abort( ); + return false; + } + + // Next we calculate that binary object into a message digest (an OTIdentifier). + OTIdentifier newID; + if (!newID.CalculateDigest(thePayload)) + { + OTLog::Error("Error generating new account ID.\n"); + return false; + } + + // Next we get that digest (which is a binary hash number) + // and extract a human-readable standard string format of that hash, + // into an OTString. + OTString strID(newID); + + SetRealAccountID(newID); // Set the account number based on what we just generated. + SetPurportedAccountID(newID); // Might as well set them both. (Safe here to do so, for once.) + + m_strName.Set(strID); // So it's not blank. The user can always change it. + + // Next we create the full path filename for the account using the ID. + m_strFoldername = OTLog::AccountFolder(); + m_strFilename = strID.Get(); + + // Then we try to load it, in order to make sure that it doesn't already exist. + // -------------------------------------------------------------------- + + if (OTDB::Exists(m_strFoldername.Get(), m_strFilename.Get())) + { + OTLog::vError("OTAccount::GenerateNewAccount: Account already exists: %s\n", + m_strFilename.Get()); + return false; + } + + // -------------------------------------------------------------------- + + // Set up the various important starting values of the account. + m_AcctType = eAcctType; // account type defaults to OTAccount::simple. But there are also issuer accts... + + // for basket accounts, the server is the user. + if (OTAccount::basket == eAcctType) + { + theServer.GetIdentifier(m_AcctUserID); + } + else + { + m_AcctUserID.SetString(theMessage.m_strNymID); + } + + m_AcctAssetTypeID.SetString(theMessage.m_strAssetID); + + OTLog::vOutput(3, "Creating new account, type:\n%s\n", + theMessage.m_strAssetID.Get()); + + OTIdentifier SERVER_ID(theMessage.m_strServerID); + SetRealServerID(SERVER_ID); // todo this assumes the serverID on the message is correct. It's vetted, but still... + SetPurportedServerID(SERVER_ID); + + const time_t tDate = time(NULL); // Today, now. + m_BalanceDate.Format("%d", tDate); + + m_BalanceAmount.Set("0"); + + + // Sign the Account (so we know that we did)... Otherwise someone could put a fake + // account file on the server if the code wasn't designed to verify the signature on the + // account. + SignContract(theServer); + SaveContract(); + + // Save the Account to storage (based on its ID.) + SaveAccount(); + + // Don't know why I had this here. Putting SaveAccount() instead. +// OTString strFilename(m_strFilename); +// SaveContract(strFilename.Get()); // Saves the account to a specific filename + + // No need to create the inbox and outbox ledgers...they will be created automatically + // if they do not exist when they are needed. + + return true; +} + + +long OTAccount::GetBalance() const +{ + if (m_BalanceAmount.Exists()) + return atol(m_BalanceAmount.Get()); + + return 0; +} + + +void TranslateAccountTypeToString(OTAccount::AccountType theType, OTString & strAcctType) +{ + switch (theType) + { + case OTAccount::simple: + strAcctType.Set("simple"); + break; + case OTAccount::issuer: + strAcctType.Set("issuer"); + break; + case OTAccount::basket: + strAcctType.Set("basket"); + break; + default: + strAcctType.Set("err_acct"); + break; + } +} + +// Most contracts do not override this function... +// But OTAccount does, because IF THE SIGNER has chosen to SIGN the account based on +// the current balances, then we need to update the m_xmlUnsigned member with the +// current balances and other updated information before the signing occurs. (Presumably +// this is the whole reason why the account is being re-signed.) +// +// Normally, in other OTContract and derived classes, m_xmlUnsigned is read +// from the file and then kept read-only, since contracts do not normally change. +// But as accounts change in balance, they must be re-signed to keep the signatures valid. + +void OTAccount::UpdateContents() +{ + OTString strAssetTYPEID(m_AcctAssetTypeID); // asset type + + OTString ACCOUNT_ID(GetPurportedAccountID()), SERVER_ID(GetPurportedServerID()), USER_ID(GetUserID()); + + OTString strAcctType; + TranslateAccountTypeToString(m_AcctType, strAcctType); + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", m_strVersion.Get(), strAcctType.Get(), + ACCOUNT_ID.Get(), USER_ID.Get(), SERVER_ID.Get(), strAssetTYPEID.Get()); + +// m_xmlUnsigned.Concatenate("\n\n", m_BalanceAmount.Get()); + m_xmlUnsigned.Concatenate("\n\n", m_BalanceDate.Get(), + m_BalanceAmount.Get()); + + if (m_bMarkForDeletion) + m_xmlUnsigned.Concatenate("\n" + "%s\n\n", + "THIS ACCOUNT HAS BEEN MARKED FOR DELETION AT ITS OWN REQUEST"); + + m_xmlUnsigned.Concatenate("\n"); +} + + + +bool OTAccount::DisplayStatistics(OTString & strContents) const +{ + const OTString strAccountID(GetPurportedAccountID()), strServerID(GetPurportedServerID()), + strUserID(GetUserID()), strAssetTypeID(m_AcctAssetTypeID); + + OTString strAcctType; + TranslateAccountTypeToString(m_AcctType, strAcctType); + + strContents.Concatenate( + " Asset Account (%s) Name: %s\n" + " Last retrieved Balance: %s on date: %s\n" + " accountID: %s\n" + " userID: %s\n" + " serverID: %s\n" + " assetTypeID: %s\n" + "\n", + strAcctType.Get(), + m_strName.Get(), + m_BalanceAmount.Get(), + m_BalanceDate.Get(), + strAccountID.Get(), + strUserID.Get(), + strServerID.Get(), + strAssetTypeID.Get()); + + return true; +} + + + +bool OTAccount::SaveContractWallet(OTString & strContents) const +{ + const OTString strAccountID(GetPurportedAccountID()), + strServerID(GetPurportedServerID()), + strUserID(GetUserID()), + strAssetTypeID(m_AcctAssetTypeID); + + OTString strAcctType; + TranslateAccountTypeToString(m_AcctType, strAcctType); + + OTASCIIArmor ascName; + + if (m_strName.Exists()) // name is in the clear in memory, and base64 in storage. + { + ascName.SetString(m_strName, false); // linebreaks == false + } + + strContents.Concatenate("\n" + "\n" + "\n\n", + m_BalanceAmount.Get(), + m_BalanceDate.Get(), + strAcctType.Get(), + m_strName.Exists() ? ascName.Get() : "", + strAccountID.Get(), + strUserID.Get(), + strServerID.Get(), + strAssetTypeID.Get()); + return true; +} + + + + +bool OTAccount::SaveContractWallet(std::ofstream & ofs) +{ + OTString strOutput; + + if (SaveContractWallet(strOutput)) + { + ofs << strOutput.Get(); + return true; + } + + return false; +} + + +/* +bool OTAccount::SaveContractWallet(FILE * fl) +{ + OTString strAccountID(GetPurportedAccountID()), strServerID(GetPurportedServerID()), strUserID(GetUserID()); + + fprintf(fl, " " + "\n\n", m_strName.Get(), m_strFilename.Get(), strUserID.Get(), strServerID.Get(), strAccountID.Get()); + + return true; +} +*/ + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTAccount::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTTransactionType::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("assetAccount", xml->getNodeName())) + { + OTString strAcctType; + + m_strVersion = xml->getAttributeValue("version"); + strAcctType = xml->getAttributeValue("type"); + + + if (strAcctType.Compare("simple")) + m_AcctType = OTAccount::simple; + else if (strAcctType.Compare("issuer")) + m_AcctType = OTAccount::issuer; + else if (strAcctType.Compare("basket")) + m_AcctType = OTAccount::basket; + else + m_AcctType = OTAccount::err_acct; + + m_AcctAssetTypeID.SetString(xml->getAttributeValue("assetTypeID")); + + OTString strAccountID(xml->getAttributeValue("accountID")), + strServerID(xml->getAttributeValue("serverID")), + strAcctUserID(xml->getAttributeValue("userID")); + + OTIdentifier ACCOUNT_ID(strAccountID), + SERVER_ID(strServerID), + USER_ID(strAcctUserID); + + SetPurportedAccountID(ACCOUNT_ID); + SetPurportedServerID(SERVER_ID); + SetUserID(USER_ID); + + OTString strAssetTypeID(m_AcctAssetTypeID); + OTLog::vOutput(3, + // "\n===> Loading XML for Account into memory structures..." + "\n\nAccount Type: %s\nAccountID: %s\nUserID: %s\n" + "AssetTypeID: %s\nServerID: %s\n", + strAcctType.Get(), strAccountID.Get(), strAcctUserID.Get(), + strAssetTypeID.Get(), strServerID.Get()); + + nReturnVal = 1; + } + else if (!strcmp("MARKED_FOR_DELETION", xml->getNodeName())) + { + m_bMarkForDeletion = true; + OTLog::vOutput(3, "This asset account has been MARKED_FOR_DELETION (at some point prior.)\n"); + + nReturnVal = 1; + } + + else if (!strcmp("balance", xml->getNodeName())) + { + m_BalanceDate = xml->getAttributeValue("date"); + m_BalanceAmount = xml->getAttributeValue("amount"); + + // I convert to integer / long and back to string. + // (Just an easy way to keep the data clean.) + + int nDate = atoi(m_BalanceDate.Get()); + long lAmount = atol(m_BalanceAmount.Get()); + + m_BalanceDate.Format("%d", nDate); + m_BalanceAmount.Format("%ld", lAmount); + +// OTLog::vOutput(1, "\nBALANCE -- %s\n", +// m_BalanceAmount.Get()); + OTLog::vOutput(3, "\nBALANCE -- %s\nDATE -- %s\n", + m_BalanceAmount.Get(), m_BalanceDate.Get()); + + nReturnVal = 1; + } + + return nReturnVal; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTAccount.h b/OTLib/OTAccount.h new file mode 100644 index 000000000..6c7da2456 --- /dev/null +++ b/OTLib/OTAccount.h @@ -0,0 +1,237 @@ +/************************************************************************************ + * + * OTAccount.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTACCOUNT_H__ +#define __OTACCOUNT_H__ + +#include +#include + +#include "OTTransactionType.h" +#include "OTString.h" + +class OTPseudonym; +class OTAccount; +class OTMessage; +class OTLedger; + + + +class OTAccount : public OTTransactionType +{ + friend OTTransactionType * OTTransactionType::TransactionFactory(const OTString & strInput); + +public: + enum AccountType { + simple, + issuer, + basket, + err_acct + }; // If you add any types to this list, update the list of strings at the top of the .CPP file. + +protected: + + AccountType m_AcctType; + + OTIdentifier m_AcctAssetTypeID; // These are all the variables from the account file itself. + + OTString m_BalanceDate; + OTString m_BalanceAmount; + + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); + OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theServerID); + OTAccount(); + + bool m_bMarkForDeletion; // Default FALSE. When set to true, saves a "DELETED" flag with this Account, + // for easy cleanup later when the server is doing some maintenance. +public: + + inline void MarkForDeletion() { m_bMarkForDeletion = true; } + inline bool IsMarkedForDeletion() const { return m_bMarkForDeletion; } + + // --------------------------------------- + + OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID, const OTString & name); + OTAccount(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + void InitAccount(); + virtual ~OTAccount(); + + static OTAccount * GenerateNewAccount(const OTIdentifier & theUserID, const OTIdentifier & theServerID, + const OTPseudonym & theServerNym, const OTMessage & theMessage, + const AccountType eAcctType=simple); + + bool GenerateNewAccount(const OTPseudonym & theServer, const OTMessage & theMessage, const AccountType eAcctType=simple); + + // Let's say you don't have or know the UserID, and you just want to load the damn thing up. + // Then call this function. It will set userID for you. + static OTAccount * LoadExistingAccount(const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + + + OTLedger * LoadInbox(OTPseudonym & theNym); // Caller responsible to delete. + OTLedger * LoadOutbox(OTPseudonym & theNym); // Caller responsible to delete. + + // gives you the asset type ID of this account. (the asset contract hash.) + const OTIdentifier & GetAssetTypeID(); + + long GetBalance() const; + + bool Debit(const long & lAmount); // Debit a certain amount from the account (presumably the same amount is being added somewhere) + bool Credit(const long & lAmount); // Credit a certain amount from the account (presumably the same amount is being subtracted somewhere) + + // Compares the NymID loaded from the account file with whatever Nym the programmer wants to verify. + bool VerifyOwner(OTPseudonym & theCandidate); + + virtual bool LoadContract(); // overriding this so I can set the filename automatically inside based on ID. + bool SaveAccount(); // generates filename based on accounts path and account ID. Saves to the standard location for an acct. + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); + virtual bool SaveContractWallet(OTString & strContents) const; + + virtual bool DisplayStatistics(OTString & strContents) const; + + // -------------------------------------------------------------- + + static const char * _TypeStrings[]; // for translating transaction type into a string. + + static inline const char * _GetTypeString(AccountType theType) + { int nType = (int)theType; return OTAccount::_TypeStrings[nType]; } + + inline const char * GetTypeString() { return OTAccount::_GetTypeString(m_AcctType); } +}; + +typedef std::list listOfAccounts; + +#endif // __OTACCOUNT_H__ diff --git a/OTLib/OTAgreement.cpp b/OTLib/OTAgreement.cpp new file mode 100644 index 000000000..618aa9512 --- /dev/null +++ b/OTLib/OTAgreement.cpp @@ -0,0 +1,1094 @@ +/************************************************************** + * + * OTAgreement.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// OTAgreement is derived from OTCronItem. It handles re-occuring billing. + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTCron.h" +#include "OTAgreement.h" +#include "OTLog.h" + + + + + +// This is called by OTCronItem::HookRemovalFromCron +// (After calling this method, HookRemovalFromCron then calls onRemovalFromCron.) +// +void OTAgreement::onFinalReceipt(OTCronItem & theOrigCronItem, const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover) +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ------------------------------------------------- + + // The finalReceipt Item's ATTACHMENT contains the UPDATED Cron Item. + // (With the SERVER's signature on it!) + // + OTString strUpdatedCronItem(*this); + OTString * pstrAttachment=&strUpdatedCronItem; + + const OTString strOrigCronItem(theOrigCronItem); + // ----------------------------------------------------------------- + + + OTPseudonym theRecipientNym; // Don't use this... use the pointer just below. + + // The Nym who is actively requesting to remove a cron item will be passed in as pRemover. + // However, sometimes there is no Nym... perhaps it just expired and pRemover is NULL. + // The originating Nym (if different than remover) is loaded up. Otherwise the originator + // pointer just pointers to *pRemover. + // + OTPseudonym * pRecipient = NULL; + + if (pServerNym->CompareID(this->GetRecipientUserID())) + { + pRecipient = pServerNym; // Just in case the recipient Nym is also the server Nym. + } + // ******************************************************* + // + // If pRemover is NOT NULL, and he has the Recipient's ID... + // then set the pointer accordingly. + // + else if ((NULL != pRemover) && (true == pRemover->CompareID(this->GetRecipientUserID()))) + { + pRecipient = pRemover; // <======== now both pointers are set (to same Nym). DONE! + } + // -------------------------------------------------------------------------------------------------- + + if (NULL == pRecipient) + { + // GetSenderUserID() should be the same on THIS (updated version of the same cron item) + // but for whatever reason, I'm checking the userID on the original version. Sue me. + // + const OTIdentifier NYM_ID(this->GetRecipientUserID()); + + theRecipientNym.SetIdentifier(NYM_ID); + + if (false == theRecipientNym.LoadPublicKey()) + { + OTString strNymID(NYM_ID); + OTLog::vError("OTAgreement::onFinalReceipt: Failure loading Recipient's public key:\n%s\n", strNymID.Get()); + } + else if (theRecipientNym.VerifyPseudonym() && + theRecipientNym.LoadSignedNymfile(*pServerNym)) // ServerNym here is merely the signer on this file. + { + pRecipient = &theRecipientNym; // <===== + } + else + { + OTString strNymID(NYM_ID); + OTLog::vError("OTAgreement::onFinalReceipt: Failure verifying Recipient's public key or loading signed nymfile: %s\n", + strNymID.Get()); + } + } + + // ------------------------------- + + // First, we are closing the transaction number ITSELF, of this cron item, + // as an active issued number on the originating nym. (Changing it to CLOSED.) + // + // Second, we're verifying the CLOSING number, and using it as the closing number + // on the FINAL RECEIPT (with that receipt being "InReferenceTo" this->GetTransactionNum()) + // + const long lRecipientOpeningNumber = this->GetRecipientOpeningNum(); + const long lRecipientClosingNumber = this->GetRecipientClosingNum(); + + // ----------------------------------------------------------------------------------- + const long lSenderOpeningNumber = theOrigCronItem.GetTransactionNum(); + + const long lSenderClosingNumber = (theOrigCronItem.GetCountClosingNumbers() > 0) ? + theOrigCronItem.GetClosingTransactionNoAt(0) : 0; // index 0 is closing number for sender, since GetTransactionNum() is his opening #. + + // ---------------------------------- + + const OTString strServerID(GetServerID()); + + // ----------------------------------------------------------------- + // + + if ((lSenderOpeningNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lSenderOpeningNumber)) + { + // The Nym (server side) stores a list of all opening and closing cron #s. + // So when the number is released from the Nym, we also take it off that list. + // + std::set & theIDSet = theOriginator.GetSetOpenCronItems(); + theIDSet.erase(lSenderOpeningNumber); + + // the RemoveIssued call means the original transaction# (to find this cron item on cron) is now CLOSED. + // But the Transaction itself is still OPEN. How? Because the CLOSING number is still signed out. + // The closing number is also USED, since the NotarizePaymentPlan or NotarizeMarketOffer call, but it + // remains ISSUED, until the final receipt itself is accepted during a process inbox. + // + theOriginator.RemoveIssuedNum(*pServerNym, strServerID, lSenderOpeningNumber, false); //bSave=false + theOriginator.SaveSignedNymfile(*pServerNym); + + if (false == this->DropFinalReceiptToNymbox(GetSenderUserID(), + lNewTransactionNumber, + strOrigCronItem, + NULL, + pstrAttachment)) + { + OTLog::Error("OTAgreement::onFinalReceipt: Failure dropping sender final receipt into nymbox.\n"); + } + } + else + { + OTLog::Error("OTAgreement::onFinalReceipt: Failure verifying sender's opening number.\n"); + } + + // ----------------------------------------------------------------- + + if ((lSenderClosingNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lSenderClosingNumber) + ) // --------------------------------------------------------------- + { + // In this case, I'm passing NULL for pstrNote, since there is no note. + // (Additional information would normally be stored in the note.) + + if (false == this->DropFinalReceiptToInbox(GetSenderUserID(), + GetSenderAcctID(), + lNewTransactionNumber, + lSenderClosingNumber, // The closing transaction number to put on the receipt. + strOrigCronItem, + NULL, + pstrAttachment)) + OTLog::Error("OTAgreement::onFinalReceipt: Failure dropping receipt into sender's inbox.\n"); + + // This part below doesn't happen until theOriginator ACCEPTS the final receipt (when processing his inbox.) + // +// theOriginator.RemoveIssuedNum(strServerID, lSenderClosingNumber, true); //bSave=false + } + else + { + OTLog::Error("OTAgreement::onFinalReceipt: Failed verifying lSenderClosingNumber=theOrigCronItem.GetClosingTransactionNoAt(0)>0 && " + "theOriginator.VerifyTransactionNum(lSenderClosingNumber)\n"); + } + // ----------------------------------------------------------------- + // + if ((NULL != pRecipient) && (lRecipientOpeningNumber > 0) && + pRecipient->VerifyIssuedNum(strServerID, lRecipientOpeningNumber) + ) + { + // The Nym (server side) stores a list of all opening and closing cron #s. + // So when the number is released from the Nym, we also take it off that list. + // + std::set & theIDSet = pRecipient->GetSetOpenCronItems(); + theIDSet.erase(lRecipientOpeningNumber); + + // the RemoveIssued call means the original transaction# (to find this cron item on cron) is now CLOSED. + // But the Transaction itself is still OPEN. How? Because the CLOSING number is still signed out. + // The closing number is also USED, since the NotarizePaymentPlan or NotarizeMarketOffer call, but it + // remains ISSUED, until the final receipt itself is accepted during a process inbox. + // + pRecipient->RemoveIssuedNum(*pServerNym, strServerID, lRecipientOpeningNumber, false); //bSave=false + pRecipient->SaveSignedNymfile(*pServerNym); + + if (false == this->DropFinalReceiptToNymbox(GetRecipientUserID(), + lNewTransactionNumber, + strOrigCronItem, + NULL, + pstrAttachment)) + { + OTLog::Error("OTAgreement::onFinalReceipt: Failure dropping recipient final receipt into nymbox.\n"); + } + } + else + { + OTLog::Error("OTAgreement::onFinalReceipt: Failed verifying " + "lRecipientClosingNumber=this->GetRecipientClosingTransactionNoAt(1)>0 && " + "pRecipient->VerifyTransactionNum(lRecipientClosingNumber) && VerifyIssuedNum(lRecipientOpeningNumber)\n"); + } + + // ----------------------------------------------------------------- + + if ((NULL != pRecipient) && (lRecipientClosingNumber > 0) && + pRecipient->VerifyIssuedNum(strServerID, lRecipientClosingNumber) + ) + { + if (false == this->DropFinalReceiptToInbox(GetRecipientUserID(), + GetRecipientAcctID(), + lNewTransactionNumber, + lRecipientClosingNumber, // The closing transaction number to put on the receipt. + strOrigCronItem, + NULL, + pstrAttachment)) + OTLog::Error("OTAgreement::onFinalReceipt: Failure dropping receipt into recipient's inbox.\n"); + + // This part below doesn't happen until pRecipient ACCEPTs the final receipt (when processing his inbox.) + // +// pRecipient->RemoveIssuedNum(strServerID, lRecipientClosingNumber, true); //bSave=false + } + else + { + OTLog::Error("OTAgreement::onFinalReceipt: Failed verifying " + "lRecipientClosingNumber=this->GetRecipientClosingTransactionNoAt(1)>0 && " + "pRecipient->VerifyTransactionNum(lRecipientClosingNumber) && VerifyIssuedNum(lRecipientOpeningNumber)\n"); + } + + // QUESTION: Won't there be Cron Items that have no asset account at all? + // In which case, there'd be no need to drop a final receipt, but I don't think + // that's the case, since you have to use a transaction number to get onto cron + // in the first place. + // ----------------------------------------------------------------- +} + + + + +long OTAgreement::GetRecipientOpeningNum() const +{ + return (GetRecipientCountClosingNumbers() > 0) ? GetRecipientClosingTransactionNoAt(0) : 0; // todo stop hardcoding. +} + +long OTAgreement::GetRecipientClosingNum() const +{ + return (GetRecipientCountClosingNumbers() > 1) ? GetRecipientClosingTransactionNoAt(1) : 0; // todo stop hardcoding. +} + + +void OTAgreement::onRemovalFromCron() +{ + // Not much needed here. + // Actually: Todo: (unless it goes in payment plan code) need to set receipts + // in inboxes, and close out the closing transaction numbers. + // + +} + + +// Used for adding transaction numbers back to a Nym, after deciding not to use this agreement +// or failing in trying to use it. Client side. +// +void OTAgreement::HarvestClosingNumbers(OTPseudonym & theNym) +{ + // since we overrode the parent, we give it a chance to harvest also. + // + OTCronItem::HarvestClosingNumbers(theNym); + + // The Nym is the original sender. (If Compares true). + // GetTransactionNum() is burned, but we can harvest the closing + // numbers from the "Closing" list, which is only for the sender's numbers. + // Subclasses will have to override this function for recipients, etc. + // + if (theNym.CompareID(GetRecipientUserID())) + { + const OTString strServerID(GetServerID()); + + for (int i = 0; i < GetRecipientCountClosingNumbers(); i++) + { + theNym.AddTransactionNum(theNym, strServerID, GetRecipientClosingTransactionNoAt(i), + (i == (GetRecipientCountClosingNumbers()-1) ? true : false)); // bSave=true only on the last iteration. + } + } +} + + + +// OTCron calls this regularly, which is my chance to expire, etc. +// Child classes will override this, AND call it (to verify valid date range.) +bool OTAgreement::ProcessCron() +{ + // END DATE -------------------------------- + // First call the parent's version (which this overrides) so it has + // a chance to check its stuff. Currently it checks IsExpired(). + if (!OTCronItem::ProcessCron()) + return false; // It's expired or flagged--removed it from Cron. + + + // START DATE -------------------------------- + // Okay, so it's not expired. But might not have reached START DATE yet... + if (!VerifyCurrentDate()) + return true; // The Trade is not yet valid, so we return. BUT, we return + // true, so it will stay on Cron until it BECOMES valid. + + + // Process my Agreement-specific stuff below.-------------------------------- + + + return true; +} + + + + + + + +/// See if theNym has rights to remove this item from Cron. +/// +bool OTAgreement::CanRemoveItemFromCron(OTPseudonym & theNym) +{ + // You don't just go willy-nilly and remove a cron item from a market unless you check first + // and make sure the Nym who requested it actually has said number (or a related closing number) + // signed out to him on his last receipt... + // + if (true == OTCronItem::CanRemoveItemFromCron(theNym)) + return true; + + const OTString strServerID(GetServerID()); + + // Usually the Nym is the originator. (Meaning GetTransactionNum() on this agreement + // is still verifiable as an issued number on theNum, and belongs to him.) In that case, + // the above call will discover this, and return true. + // In other cases, theNym has the right to Remove the item even though theNym didn't originate it. + // (Like if he is the recipient -- not the sender -- in a payment plan.) We check such things + // HERE in this function (see below.) + // + if (false == theNym.CompareID(GetRecipientUserID())) + { + OTLog::Output(0, "OTAgreement::CanRemoveItemFromCron Weird: Nym tried to remove agreement (payment plan), even " + "though he apparently wasn't the sender OR recipient.\n"); + return false; + } + + else if (this->GetRecipientCountClosingNumbers() < 2) + { + OTLog::vOutput(0, "OTAgreement::CanRemoveItemFromCron Weird: Recipient tried to remove agreement " + "(or payment plan); expected 2 closing numbers to be available--that weren't. (Found %d).\n", + this->GetRecipientCountClosingNumbers()); + return false; + } + + if (false == theNym.VerifyIssuedNum(strServerID, this->GetRecipientClosingNum())) + { + OTLog::Output(0, "OTAgreement::CanRemoveItemFromCron: Recipient Closing number didn't verify (for removal from cron).\n"); + return false; + } + + // By this point, we KNOW theNym is the sender, and we KNOW there are the proper number of transaction + // numbers available to close. We also know that this cron item really was on the cron object, since + // that is where it was looked up from, when this function got called! So I'm pretty sure, at this point, + // to authorize removal, as long as the transaction num is still issued to theNym (this check here.) + // + return theNym.VerifyIssuedNum(strServerID, this->GetRecipientOpeningNum()); + + // Normally this will be all we need to check. The originator will have the transaction + // number signed-out to him still, if he is trying to close it. BUT--in some cases, someone + // who is NOT the originator can cancel. Like in a payment plan, the sender is also the depositor, + // who would normally be the person cancelling the plan. But technically, the RECIPIENT should + // also have the ability to cancel that payment plan. BUT: the transaction number isn't signed + // out to the RECIPIENT... In THAT case, the below VerifyIssuedNum() won't work! In those cases, + // expect that the special code will be in the subclasses override of this function. (OTPaymentPlan::CanRemoveItem() etc) + + // P.S. If you override this function, MAKE SURE to call the parent (OTCronItem::CanRemoveItem) first, + // for the VerifyIssuedNum call above. Only if that fails, do you need to dig deeper... + +} + + +// ------------------------------------------------------------ +// These are for finalReceipt +// The Cron Item stores a list of these closing transaction numbers, +// used for closing a transaction. +// +int OTAgreement::GetRecipientCountClosingNumbers() const +{ + return m_dequeRecipientClosingNumbers.size(); +} + +long OTAgreement::GetRecipientClosingTransactionNoAt(unsigned int nIndex) const +{ + OT_ASSERT_MSG((nIndex < m_dequeRecipientClosingNumbers.size()) && (nIndex >= 0), + "OTCronItem::GetClosingTransactionNoAt: index out of bounds."); + + return m_dequeRecipientClosingNumbers.at(nIndex); +} + +void OTAgreement::AddRecipientClosingTransactionNo(const long & lClosingTransactionNo) +{ + m_dequeRecipientClosingNumbers.push_back(lClosingTransactionNo); +} + + +// ------------------------------------------------------------ + + +bool OTAgreement::Compare(const OTAgreement & rhs) const +{ + // Compare OTAgreement specific info here. + + if ( + ( m_strConsideration.Compare(rhs.m_strConsideration) ) && + ( GetRecipientAcctID() == rhs.GetRecipientAcctID() ) && + ( GetRecipientUserID() == rhs.GetRecipientUserID() ) && +// ( m_dequeClosingNumbers == rhs.m_dequeClosingNumbers ) && // The merchant wouldn't know the customer's trans#s. + // (Thus wouldn't expect them to be set in BOTH versions...) + ( m_dequeRecipientClosingNumbers == rhs.m_dequeRecipientClosingNumbers ) && +// ( GetTransactionNum() == rhs.GetTransactionNum() ) && // (commented out for same reason as above.) +// ( GetSenderAcctID() == rhs.GetSenderAcctID() ) && // Same here -- we should let the merchant leave these blank, +// ( GetSenderUserID() == rhs.GetSenderUserID() ) && // and then allow the customer to add them in his version, + ( GetAssetID() == rhs.GetAssetID() ) && // (and this Compare function still still verify it.) + ( GetServerID() == rhs.GetServerID() ) && + ( GetValidFrom() == rhs.GetValidFrom() ) && + ( GetValidTo() == rhs.GetValidTo() ) + ) + return true; + + return false; +} + + + + + +// THIS FUNCTION IS CALLED BY THE MERCHANT +// +// (lMerchantTransactionNumber, lMerchantClosingNumber are set internally in this call, from MERCHANT_NYM.) +bool OTAgreement::SetProposal(OTPseudonym & MERCHANT_NYM, const OTString & strConsideration, + const time_t & VALID_FROM/*=0*/, const time_t & VALID_TO/*=0*/) +{ + // ---------------------------------------------------------------------------- + OTIdentifier id_MERCHANT_NYM; + MERCHANT_NYM.GetIdentifier(id_MERCHANT_NYM); + + if (GetRecipientUserID() != id_MERCHANT_NYM) + { + OTLog::Output(0, "OTAgreement::SetProposal: Merchant has wrong NymID (should be same as RecipientUserID.)\n"); + return false; + } + else if (GetRecipientUserID() == GetSenderUserID()) + { + OTLog::Output(0, "OTAgreement::SetProposal: Error: Sender and recipient have the same Nym ID (not allowed.)\n"); + return false; + } + else if (MERCHANT_NYM.GetTransactionNumCount(GetServerID()) < 2) // Need opening and closing numbers (that's 2)... + { + OTLog::Output(0, "OTAgreement::SetProposal: Failure. You need at least 2 transaction numbers available to do this.\n"); + return false; + } + + // ------------------------------------------- + // Set the CREATION DATE + // + const time_t CURRENT_TIME = time(NULL); + + // Set the Creation Date. + SetCreationDate(CURRENT_TIME); + + // ----------------------------------------- + // Putting this above here so I don't have to put the transaction numbers back if this fails: + // ------------------------------------------- + // VALID_FROM + // + // The default "valid from" time is NOW. + if (0 >= VALID_FROM) // if it's 0 or less, set to current time. + SetValidFrom(CURRENT_TIME); + else // Otherwise use whatever was passed in. + SetValidFrom(VALID_FROM); + // ------------------------------------------- + // VALID_TO + // + // The default "valid to" time is 0 (which means no expiration date / cancel anytime.) + if (0 == VALID_TO) // VALID_TO is 0 + { + SetValidTo(VALID_TO); // Keep it at zero then, so it won't expire. + } + else if (0 < VALID_TO) // VALID_TO is ABOVE zero... + { + if (VALID_TO < VALID_FROM) // If Valid-To date is EARLIER than Valid-From date... + { + long lValidTo = VALID_TO, lValidFrom = VALID_FROM; + OTLog::vError("OTAgreement::SetProposal: VALID_TO (%ld) is earlier than VALID_FROM (%ld)\n", + lValidTo, lValidFrom); + return false; + } + + SetValidTo(VALID_TO); // Set it to whatever it is, since it is now validated as higher than Valid-From. + } + else // VALID_TO is a NEGATIVE number... Error. + { + long lValidTo = VALID_TO; + OTLog::vError("Negative value for valid_to in SetAgreement: %ld\n", lValidTo); + + return false; + } + + // ---------------------------------------------------------------------------- + // Since we'll be needing 2 transaction numbers to do this, let's grab 'em... + // + OTString strServerID(GetServerID()); + + long lTransactionNumber=0, lClosingTransactionNo=0; + + if (MERCHANT_NYM.GetTransactionNumCount(GetServerID()) < 2) // Need opening and closing numbers (that's 2)... + { + OTLog::Output(0, "OTAgreement::SetProposal: Failure. You need at least 2 transaction numbers available to do this.\n"); + return false; + } + else if (false == MERCHANT_NYM.GetNextTransactionNum(MERCHANT_NYM, strServerID, lTransactionNumber)) + { + OTLog::Error("OTAgreement::SetProposal: Error: Strangely unable to get a transaction number.\n"); + return false; + } + else if (false == MERCHANT_NYM.GetNextTransactionNum(MERCHANT_NYM, strServerID, lClosingTransactionNo)) + { + OTLog::Error("OTAgreement::SetProposal: Error: Strangely unable to get a closing transaction number.\n"); + MERCHANT_NYM.AddTransactionNum(MERCHANT_NYM, strServerID, lTransactionNumber, true); // bSave=true + // (Since the first one was successful, we just put it back before returning.) + return false; + } + + // At this point we now have 2 transaction numbers... + // We can't return without either USING THEM, or PUTTING THEM BACK. + // + // --------------------------------------------------------- + + // Set the Transaction Number and the Closing transaction number... (for merchant / recipient.) + // + this->AddRecipientClosingTransactionNo(lTransactionNumber); + this->AddRecipientClosingTransactionNo(lClosingTransactionNo); + // (They just both go onto this same list.) + + // ------------------------------------------- + + // Set the Consideration memo... + m_strConsideration.Set(strConsideration); + + // ------------------------------------------- + + OTLog::Output(4, "Successfully performed OTPaymentPlan::SetProposal()\n"); + + return true; +} + + +// THIS FUNCTION IS CALLED BY THE CUSTOMER +// +// (Transaction number and closing number are retrieved from Nym at this time.) +bool OTAgreement::Confirm(OTPseudonym & MERCHANT_NYM, OTPseudonym & PAYER_NYM) +{ + // ---------------------------------------------------------------------------- + OTIdentifier id_MERCHANT_NYM, id_PAYER_NYM; + MERCHANT_NYM.GetIdentifier(id_MERCHANT_NYM); + PAYER_NYM.GetIdentifier(id_PAYER_NYM); + + if (GetRecipientUserID() == GetSenderUserID()) + { + OTLog::Output(0, "OTAgreement::Confirm: Error: Sender and recipient have the same Nym ID (not allowed.)\n"); + return false; + } + else if (GetRecipientUserID() != id_MERCHANT_NYM) + { + OTLog::Output(0, "OTAgreement::Confirm: Merchant has wrong NymID (should be same as RecipientUserID.)\n"); + return false; + } + else if (GetSenderUserID() != id_PAYER_NYM) + { + OTLog::Output(0, "OTAgreement::Confirm: Payer has wrong NymID (should be same as SenderUserID.)\n"); + return false; + } + else if (PAYER_NYM.GetTransactionNumCount(GetServerID()) < 2) // Need opening and closing numbers (that's 2)... + { + OTLog::Output(0, "OTAgreement::Confirm: Failure. You need at least 2 transaction numbers available to do this.\n"); + return false; + } + else if (GetRecipientCountClosingNumbers() < 2) + { + OTLog::Output(0, "OTAgreement::Confirm: Failure. (The merchant was supposed to attach 2 transaction numbers.)\n"); + return false; + } + // ---------------------------------------------------------------------------- + // This is the single reason why MERCHANT_NYM was even passed in here! + // Supposedly merchant has already signed. Let's verify this!! + // + if (false == this->VerifySignature(MERCHANT_NYM)) + { + OTLog::Output(0, "OTAgreement::Confirm: Merchant's signature failed to verify.\n"); + return false; + } + // ---------------------------------------------------------------------------- + + // Now that we KNOW the merchant signed it... SAVE MERCHANT's COPY. + // Let's save a copy of the one the merchant signed, before changing it and re-signing it, + // (to add my own transaction numbers...) + // + OTString strTemp; + this->SaveContract(strTemp); + this->SetMerchantSignedCopy(strTemp); + + // ******************************************************************* + + // The payer has to submit TWO transaction numbers in order to activate this agreement... + // + OTString strServerID(GetServerID()); + long lTransactionNumber=0, lClosingTransactionNo=0; + + if (false == PAYER_NYM.GetNextTransactionNum(PAYER_NYM, strServerID, lTransactionNumber)) + { + OTLog::Error("OTAgreement::Confirm: Error: Strangely unable to get a transaction number.\n"); + return false; + } + else if (false == PAYER_NYM.GetNextTransactionNum(PAYER_NYM, strServerID, lClosingTransactionNo)) + { + OTLog::Error("OTAgreement::Confirm: Error: Strangely unable to get a closing transaction number.\n"); + PAYER_NYM.AddTransactionNum(PAYER_NYM, strServerID, lTransactionNumber, true); // bSave=true + // (Since the first one was successful, we just put it back before returning.) + return false; + } + + // At this point we now HAVE 2 transaction numbers (for payer / sender)... + // We can't return without USING THEM or PUTTING THEM BACK. + // + // --------------------------------------------------------- + + + this->SetTransactionNum(lTransactionNumber); // Set the Transaction Number + this->AddClosingTransactionNo(lClosingTransactionNo); // and the Closing Number (both for sender)... + + // ------------------------------------------- + + // CREATION DATE was set in the Merchant's proposal, and it's RESET here in the Confirm. + // This way, (since we still have the original proposal) we can see BOTH times. + // + time_t CURRENT_TIME = time(NULL); + // Set the Creation Date. + SetCreationDate(CURRENT_TIME); + + // ------------------------------------------- + + OTLog::Output(4, "OTAgreement::Confirm(): Success!\n"); + + return true; +} + + + + + + + +// (Make sure to set Creation date here.) +// THIS FUNCTION IS DEPRECATED +// +/* +bool OTAgreement::SetAgreement(const long & lTransactionNum, const OTString & strConsideration, + const time_t & VALID_FROM=0, const time_t & VALID_TO=0) +{ + // Set the Transaction Number... + SetTransactionNum(lTransactionNum); + + // Set the Consideration memo... + m_strConsideration.Set(strConsideration); + + // ------------------------------------------- + + time_t CURRENT_TIME = time(NULL); + + // Set the Creation Date. + SetCreationDate(CURRENT_TIME); + + // ------------------------------------------- + + // The default "valid from" time is NOW. + if (0 >= VALID_FROM) // if it's 0 or less, set to current time. + SetValidFrom(CURRENT_TIME); + else // Otherwise use whatever was passed in. + SetValidFrom(VALID_FROM); + + // ------------------------------------------- + + // The default "valid to" time is 0 (which means no expiration date / cancel anytime.) + if (0 == VALID_TO) // VALID_TO is 0 + { + SetValidTo(VALID_TO); // Keep it at zero then, so it won't expire. + } + else if (0 < VALID_TO) // VALID_TO is ABOVE zero... + { + if (VALID_TO < VALID_FROM) // If Valid-To date is EARLIER than Valid-From date... + { + long lValidTo = VALID_TO, lValidFrom = VALID_FROM; + OTLog::vError("VALID_TO is earlier than VALID_FROM in SetAgreement: %ld, %ld\n", lValidTo, lValidFrom); + return false; + } + + SetValidTo(VALID_TO); // Set it to whatever it is, since it is now validated as higher than Valid-From. + } + else // VALID_TO is a NEGATIVE number... Error. + { + long lValidTo = VALID_TO; + OTLog::vError("Negative value for valid_to in SetAgreement: %ld\n", lValidTo); + return false; + } + + // ------------------------------------------- + + OTLog::Output(4, "Successfully performed SetAgreement()\n"); + + return true; +} +*/ + + + + + + + + +OTAgreement::OTAgreement() : OTCronItem() +{ + InitAgreement(); +} + +OTAgreement::OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTCronItem(SERVER_ID, ASSET_ID) +{ + InitAgreement(); +} + + +OTAgreement::OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID) : + OTCronItem(SERVER_ID, ASSET_ID, SENDER_ACCT_ID, SENDER_USER_ID) +{ + InitAgreement(); + + SetRecipientAcctID(RECIPIENT_ACCT_ID); + SetRecipientUserID(RECIPIENT_USER_ID); +} + +OTAgreement::~OTAgreement() +{ + // no need to call Release(), the framework will call it. +} + + +void OTAgreement::InitAgreement() +{ + m_strContractType = "AGREEMENT"; + +} + +// the framework will call this at the right time. +void OTAgreement::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + m_RECIPIENT_ACCT_ID.Release(); + m_RECIPIENT_USER_ID.Release(); + + m_strConsideration.Release(); + m_strMerchantSignedCopy.Release(); + + m_dequeRecipientClosingNumbers.clear(); + + + OTCronItem::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything + InitAgreement(); +} + + + + +void OTAgreement::UpdateContents() +{ + // See OTPaymentPlan::UpdateContents. +} + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTAgreement::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + if (0 != (nReturnVal = OTCronItem::ProcessXMLNode(xml))) + return nReturnVal; + + // ------------------------------------------------- + + if (!strcmp("agreement", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + SetTransactionNum( atol(xml->getAttributeValue("transactionNum")) ); + SetCreationDate( atoi(xml->getAttributeValue("creationDate"))); + SetValidFrom( atoi(xml->getAttributeValue("validFrom"))); + SetValidTo( atoi(xml->getAttributeValue("validTo"))); + + // --------------------- + + const OTString strServerID(xml->getAttributeValue("serverID")), + strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strSenderAcctID(xml->getAttributeValue("senderAcctID")), + strSenderUserID(xml->getAttributeValue("senderUserID")), + strRecipientAcctID(xml->getAttributeValue("recipientAcctID")), + strRecipientUserID(xml->getAttributeValue("recipientUserID")); + + const OTIdentifier SERVER_ID(strServerID), ASSET_ID(strAssetTypeID), + SENDER_ACCT_ID(strSenderAcctID), SENDER_USER_ID(strSenderUserID), + RECIPIENT_ACCT_ID(strRecipientAcctID), RECIPIENT_USER_ID(strRecipientUserID); + + SetServerID(SERVER_ID); + SetAssetID(ASSET_ID); + SetSenderAcctID(SENDER_ACCT_ID); + SetSenderUserID(SENDER_USER_ID); + SetRecipientAcctID(RECIPIENT_ACCT_ID); + SetRecipientUserID(RECIPIENT_USER_ID); + + // --------------------- + + OTLog::vOutput(0, "\n\nAgreement. Transaction Number: %ld\n", m_lTransactionNum); + + OTLog::vOutput(1, + " Creation Date: %d Valid From: %d\n Valid To: %d\n" + " AssetTypeID: %s\n ServerID: %s\n" + " senderAcctID: %s\n senderUserID: %s\n " + " recipientAcctID: %s\n recipientUserID: %s\n ", + GetCreationDate(), GetValidFrom(), GetValidTo(), + strAssetTypeID.Get(), strServerID.Get(), + strSenderAcctID.Get(), strSenderUserID.Get(), + strRecipientAcctID.Get(), strRecipientUserID.Get()); + + nReturnVal = 1; + } + + else if (!strcmp("consideration", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strConsideration)) + { + OTLog::Error("Error in OTPaymentPlan::ProcessXMLNode: consideration field without value.\n"); + return (-1); // error condition + } + + nReturnVal = 1; + } + + else if (!strcmp("merchantSignedCopy", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strMerchantSignedCopy)) + { + OTLog::Error("Error in OTPaymentPlan::ProcessXMLNode: merchant_signed_copy field without value.\n"); + return (-1); // error condition + } + + nReturnVal = 1; + } + + // ------------------------------------------- + // std::deque m_dequeRecipientClosingNumbers; // Numbers used for CLOSING a transaction. (finalReceipt.) + + else if (!strcmp("closingRecipientNumber", xml->getNodeName())) + { + OTString strClosingNumber = xml->getAttributeValue("value"); + + if (strClosingNumber.Exists()) + { + const long lClosingNumber = atol(strClosingNumber.Get()); + + this->AddRecipientClosingTransactionNo(lClosingNumber); + } + else + { + OTLog::Error("Error in OTAgreement::ProcessXMLNode: closingRecipientNumber field without value.\n"); + return (-1); // error condition + } + + nReturnVal = 1; + } + + return nReturnVal; +} + + + +bool OTAgreement::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTAgreement.h b/OTLib/OTAgreement.h new file mode 100644 index 000000000..2c76fd9d5 --- /dev/null +++ b/OTLib/OTAgreement.h @@ -0,0 +1,401 @@ +/************************************************************************************ + * + * OTAgreement.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// OTAgreement is derived from OTCronItem. It handles re-occuring billing. + +#ifndef __OTAGREEMENT_H__ +#define __OTAGREEMENT_H__ + +#include "OTIdentifier.h" +#include "OTString.h" +//#include "OTPseudonym.h" +#include "OTCronItem.h" + +// An Agreement occurs between TWO PEOPLE, and is for a CONSIDERATION. +// Thus, we add the RECIPIENT (already have SENDER from OTTrackable.) + +// While other instruments are derived from OTTrackable (like OTCheque) in order +// to gain a transaction number and sender user/acct, Agreements are derived from +// a further subclass of trackable: OTCronItem. +// +// OTCronItems are allowed to be posted on the OTCron object, which performs regular +// processing on a timely basis to the items that are posted there. In this way, +// payment authorizations can be posted (and expire properly), and trades can be +// posted with valid date ranges, and payment plans can be instituted, and so on. +// +// OTAgreement is derived from OTCronItem because it allows people to post Agreements +// on OTCron until a certain expiration period, so that third parties can query the +// server and verify the agreements, and so that copies of the agreement, stamped +// with the server's signature, can be made available to the parties and to 3rd parties. +// + +class OTPseudonym; + +class OTAgreement : public OTCronItem +{ +private: + OTIdentifier m_RECIPIENT_ACCT_ID; + OTIdentifier m_RECIPIENT_USER_ID; + +protected: + OTString m_strConsideration; // Presumably an agreement is in return for some consideration. Memo here. + + OTString m_strMerchantSignedCopy; // The merchant sends it over, then the payer confirms it, which adds + // his own transaction numbers and signs it. This, unfortunately, invalidates the merchant's version, so we store + // a copy of the merchant's signed agreement INSIDE our own. The server can do the hard work of comparing them, though + // such will probably occur through a comparison function I'll have to add right here in this class. Todo. + + virtual void onFinalReceipt(OTCronItem & theOrigCronItem, const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover); + virtual void onRemovalFromCron(); + + std::deque m_dequeRecipientClosingNumbers; // Numbers used for CLOSING a transaction. (finalReceipt.) + +public: + // -------------------------------------------------------------------------- + + void SetMerchantSignedCopy(const OTString & strMerchantCopy) { m_strMerchantSignedCopy = strMerchantCopy; } + const OTString & GetMerchantSignedCopy() { return m_strMerchantSignedCopy; } + + // SetAgreement replaced with the 2 functions below. See notes even lower. + // +// bool SetAgreement(const long & lTransactionNum, const OTString & strConsideration, +// const time_t & VALID_FROM=0, const time_t & VALID_TO=0); + + bool SetProposal(OTPseudonym & MERCHANT_NYM, const OTString & strConsideration, + const time_t & VALID_FROM=0, const time_t & VALID_TO=0); + + bool Confirm(OTPseudonym & MERCHANT_NYM, OTPseudonym & PAYER_NYM); // Merchant Nym is passed here so we can verify the signature before confirming. + + + // What should be the process here? + + /* + FIRST: (Construction) + OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OR: + OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID); + OR: + OTPaymentPlan * pPlan = new OTPaymentPlan(pAccount->GetRealServerID(), + pAccount->GetAssetTypeID(), + pAccount->GetRealAccountID(), + pAccount->GetUserID(), + RECIPIENT_ACCT_ID, RECIPIENT_USER_ID); + // -------------------------------------------------------------------------------------------------------- + THEN: (Agreement) + + bool bSuccessSetAgreement = pPlan->SetAgreement(lTransactionNumber, PLAN_CONSIDERATION, VALID_FROM, VALID_TO); + // -------------------------------------------------------------------------------------------------------- + THEN, (OTPaymentPlan) adds TWO OPTIONS (additional and independent of each other): + + bool SetInitialPayment(const long & lAmount, time_t tTimeUntilInitialPayment=0); // default: now. + // -------------------------------------------------------------------------------------------------------- + bool SetPaymentPlan(const long & lPaymentAmount, time_t tTimeUntilPlanStart=LENGTH_OF_MONTH_IN_SECONDS, + time_t tBetweenPayments=LENGTH_OF_MONTH_IN_SECONDS, // Default: 30 days. + time_t tPlanLength=0, int nMaxPayments=0); + + + // ******************************************************************************** + + The new process is the same, but it adds some additional transaction numbers... + + HERE IS THE WAY I ENVISION IT BEING CALLED: + + ---- The MERCHANT does these steps: ----- + + Step one, though it says PaymentPlan, is basically the OTAgreement constructor. + Its primary concern is with determining the server, payer, payee, accounts, etc. + + 1) OTPaymentPlan * pPlan = + new OTPaymentPlan(pAccount->GetRealServerID(), + pAccount->GetAssetTypeID(), + pAccount->GetRealAccountID(), + pAccount->GetUserID(), + RECIPIENT_ACCT_ID, RECIPIENT_USER_ID); + + STILL, this is the MERCHANT. Step two is concerned with the specific terms of the offer. + + 2) bool bOffer = + pPlan->SetProposal(MERCHANT_NYM, + PLAN_CONSIDERATION, VALID_FROM, VALID_TO); + (lMerchantTransactionNumber, lMerchantClosingNumber are set internally using the MERCHANT_NYM.) + + ==> Optionally, the merchant also calls SetInitialPayment and/or SetPaymentPlan at this time. + ==> Next, the merchant signs it, and sends to the recipient. + + THE RECIPIENT: + + 3) bool bConfirmation = pPlan->Confirm(MERCHANT_NYM, PAYER_NYM); + + (Transaction number and closing number are retrieved from Nym at this time.) + + NO NEED TO SIGN ANYTHING AFTER THIS POINT, and the Payment Plan should store a copy of itself at this time. + (That is, STORE A COPY of the Merchant's signed version, since the above call to Confirm will change the plan + and sign it again. The server is left with the chore of comparing the two against each other, which I will + probably have to code right here in this class! TOdo.) + + */ + + // This function verifies both Nyms and both signatures. + // Due to the peculiar nature of how OTAgreement/OTPaymentPlan works, there are two signed + // copies stored. The merchant signs first, adding his transaction numbers (2), and then he + // sends it to the customer, who also adds two numbers and signs. (Also resetting the creation date.) + // The problem is, adding the additional transaction numbers invalidates the first (merchant's) + // signature. + // The solution is, when the customer confirms the agreement, he stores an internal copy of the + // merchant's signed version. This way later, in VERIFY AGREEMENT, the internal copy can be loaded, + // and BOTH Nyms can be checked to verify that BOTH transaction numbers are valid for each. + // The two versions of the contract can also be compared to each other, to make sure that none of + // the vital terms, values, clauses, etc are different between the two. + // + virtual bool VerifyAgreement(OTPseudonym & RECIPIENT_NYM, OTPseudonym & SENDER_NYM)=0; + + virtual bool Compare(const OTAgreement & rhs) const; + + // -------------------------------------------------------------------------- + + inline const OTIdentifier & GetRecipientAcctID() const { return m_RECIPIENT_ACCT_ID; } + inline const OTIdentifier & GetRecipientUserID() const { return m_RECIPIENT_USER_ID; } + inline void SetRecipientAcctID(const OTIdentifier & ACCT_ID) { m_RECIPIENT_ACCT_ID = ACCT_ID; } + inline void SetRecipientUserID(const OTIdentifier & USER_ID) { m_RECIPIENT_USER_ID = USER_ID; } + + // -------------------------------------------------------------------------- + + // The recipient must also provide an opening and closing transaction number(s). + // + long GetRecipientClosingTransactionNoAt(unsigned int nIndex) const; + int GetRecipientCountClosingNumbers() const; + + void AddRecipientClosingTransactionNo(const long & lClosingTransactionNo); + // ---------------------------------------------------------------------------- + + // This is a higher-level than the above functions. It calls them. + // Below is the abstraction, above is the implementation. + + long GetRecipientOpeningNum() const; + long GetRecipientClosingNum() const; + + // ---------------------------------------------------------------------------- + // From OTCronItem (parent class of this) + /* + inline void SetCronPointer(OTCron & theCron) { m_pCron = &theCron; } + + inline void SetCreationDate(const time_t & CREATION_DATE) { m_CREATION_DATE = CREATION_DATE; } + inline const time_t & GetCreationDate() const { return m_CREATION_DATE; } + + // ------------------------------------------------------ + // These are for: + // std::deque m_dequeClosingNumbers; + // + // They are numbers used for CLOSING a transaction. (finalReceipt, someday more.) + + long GetClosingTransactionNoAt(int nIndex) const; + int GetCountClosingNumbers() const; + + void AddClosingTransactionNo(const long & lClosingTransactionNo); + */ + virtual bool CanRemoveItemFromCron(OTPseudonym & theNym); + + virtual void HarvestClosingNumbers(OTPseudonym & theNym); + + // Return True if should stay on OTCron's list for more processing. + // Return False if expired or otherwise should be removed. + virtual bool ProcessCron(); // OTCron calls this regularly, which is my chance to expire, etc. + + // -------------------------------------------------------------------------- + + // From OTTrackable (parent class of OTCronItem, parent class of this) + /* + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline void SetTransactionNum(long lTransactionNum) { m_lTransactionNum = lTransactionNum; } + + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + inline void SetSenderAcctID(const OTIdentifier & ACCT_ID) { m_SENDER_ACCT_ID = ACCT_ID; } + inline void SetSenderUserID(const OTIdentifier & USER_ID) { m_SENDER_USER_ID = USER_ID; } + */ + + // -------------------------------------------------------------------------- + + // From OTInstrument (parent class of OTTrackable, parent class of OTCronItem, parent class of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + */ + + /* + From OTContract, I have: + + virtual bool SignContract (const OTPseudonym & theNym); + + */ + + // ------------------------------------- + + OTAgreement(); + OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTAgreement(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID); + virtual ~OTAgreement(); + + void InitAgreement(); + + virtual void Release(); + + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); + +}; + + +#endif // __OTAGREEMENT_H__ diff --git a/OTLib/OTAssetContract.cpp b/OTLib/OTAssetContract.cpp new file mode 100644 index 000000000..7e151cd3d --- /dev/null +++ b/OTLib/OTAssetContract.cpp @@ -0,0 +1,442 @@ +/************************************************************* + * + * OTAssetContract.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTAssetContract.h" +#include "OTStringXML.h" +#include "OTPseudonym.h" +#include "OTBasket.h" +#include "OTLog.h" + +OTAssetContract::OTAssetContract() : OTContract() +{ + +} + +OTAssetContract::OTAssetContract(OTString & name, OTString & foldername, OTString & filename, OTString & strID) +: OTContract(name, foldername, filename, strID) +{ + +} + + +OTAssetContract::~OTAssetContract() +{ + // OTContract::~OTContract is called here automatically, and it calls Release. + // So I don't need to call it here again when it's already called by the parent. +} + +// Make sure you escape any lines that begin with dashes using "- " +// So "---BEGIN " at the beginning of a line would change to: "- ---BEGIN" +// This function expects that's already been done. +// This function assumes there is only unsigned contents, and not a signed contract. +// This function is intended to PRODUCE said signed contract. +bool OTAssetContract::CreateContract(OTString & strContract, OTPseudonym & theSigner) +{ + Release(); + + m_xmlUnsigned = strContract; + + // This function assumes that m_xmlUnsigned is ready to be processed. + // This function only processes that portion of the contract. + bool bLoaded = LoadContractXML(); + + if (bLoaded) + { + SignContract(theSigner); + SaveContract(); + + OTIdentifier NEW_ID; + CalculateContractID(NEW_ID); + m_ID = NEW_ID; + + return true; + } + + return false; +} + + +// Normally, Asset Contracts do NOT update / rewrite their contents, since their +// primary goal is for the signature to continue to verify. But when first creating +// a basket contract, we have to rewrite the contents, which is done here. +bool OTAssetContract::CreateBasket(OTBasket & theBasket, OTPseudonym & theSigner) +{ + Release(); + + // Grab a string copy of the basket information. + theBasket.SaveContract(m_strBasketInfo); + + // ------------------------------- + + // Insert the server's public key as the "contract" key for this basket currency. + OTString strPubKey, strKeyName("contract"); // todo stop hardcoding + theSigner.GetPublicKey().GetPublicKey(strPubKey); + + InsertNym(strKeyName, strPubKey); + + // todo check the above two return values. + + OTASCIIArmor theBasketArmor(m_strBasketInfo); + + // ------------------------------- + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", m_strVersion.Get()); + m_xmlUnsigned.Concatenate("\n%s\n\n", theBasketArmor.Get()); + m_xmlUnsigned.Concatenate("\n%s\n\n", strKeyName.Get(), strPubKey.Get()); + + m_xmlUnsigned.Concatenate("\n"); + + + // This function assumes that m_xmlUnsigned is ready to be processed. + // This function only processes that portion of the contract. + bool bLoaded = LoadContractXML(); + + if (bLoaded) + { + SignContract(theSigner); + SaveContract(); + + OTIdentifier NEW_ID; + CalculateContractID(NEW_ID); + m_ID = NEW_ID; + + return true; + } + + return false; + +} + + +bool OTAssetContract::DisplayStatistics(OTString & strContents) const +{ + const OTString strID(m_ID); + + strContents.Concatenate( + " Asset Type: %s\n" + " AssetTypeID: %s\n" + "\n", + m_strName.Get(), + strID.Get()); + return true; +} + + +bool OTAssetContract::SaveContractWallet(OTString & strContents) const +{ + const OTString strID(m_ID); + + OTASCIIArmor ascName; + + if (m_strName.Exists()) // name is in the clear in memory, and base64 in storage. + { + ascName.SetString(m_strName, false); // linebreaks == false + } + + strContents.Concatenate("\n\n", + m_strName.Exists() ? ascName.Get() : "", + strID.Get()); + + return true; +} + + +bool OTAssetContract::SaveContractWallet(std::ofstream & ofs) +{ + OTString strOutput; + + if (SaveContractWallet(strOutput)) + { + ofs << strOutput.Get(); + return true; + } + + return false; +} + + + +/* +bool OTAssetContract::SaveContractWallet(FILE * fl) +{ + OTString strID(m_ID); + + fprintf(fl, " " + "\n\n", m_strName.Get(), strID.Get(), m_strFilename.Get()); + + return true; +} +*/ + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTAssetContract::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = OTContract::ProcessXMLNode(xml); + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + + if (nReturnVal == 1 || nReturnVal == (-1)) + return nReturnVal; + + if (!strcmp("digitalAssetContract", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + OTLog::vOutput(1, "\n" + "===> Loading XML portion of asset contract into memory structures...\n\n" + "Digital Asset Contract: %s\nContract version: %s\n----------\n", m_strName.Get(), m_strVersion.Get()); + nReturnVal = 1; + } + else if (!strcmp("basketContract", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + OTLog::vOutput(1, "\n" + "===> Loading XML portion of basket contract into memory structures...\n\n" + "Digital Basket Contract: %s\nContract version: %s\n----------\n", m_strName.Get(), m_strVersion.Get()); + nReturnVal = 1; + } + + else if (!strcmp("basketInfo", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strBasketInfo)) + { + OTLog::Error("Error in OTAssetContract::ProcessXMLNode: basketInfo field without value.\n"); + return (-1); // error condition + } + + return 1; + } + + else if (!strcmp("issue", xml->getNodeName())) + { + m_strIssueCompany = xml->getAttributeValue("company"); + m_strIssueEmail = xml->getAttributeValue("email"); + m_strIssueContractURL = xml->getAttributeValue("contractUrl"); + m_strIssueType = xml->getAttributeValue("type"); + + OTLog::vOutput(2, "Loaded Issue company: %s\nEmail: %s\nContractURL: %s\nType: %s\n----------\n", + m_strIssueCompany.Get(), m_strIssueEmail.Get(), m_strIssueContractURL.Get(), + m_strIssueType.Get()); + nReturnVal = 1; + } + else if (!strcmp("currency", xml->getNodeName())) + { + m_strName = xml->getAttributeValue("name"); + m_strCurrencyName = xml->getAttributeValue("name"); + + m_strCurrencyTLA = xml->getAttributeValue("tla"); + m_strCurrencySymbol = xml->getAttributeValue("symbol"); + m_strCurrencyType = xml->getAttributeValue("type"); + m_strCurrencyFactor = xml->getAttributeValue("factor"); + m_strCurrencyDecimalPower = xml->getAttributeValue("decimal_power"); + m_strCurrencyFraction = xml->getAttributeValue("fraction"); + + OTLog::vOutput(2, "Loaded Currency, Name: %s, TLA: %s, Symbol: %s\n" + "Type: %s, Factor: %s, Decimal Power: %s, Fraction: %s\n----------\n", + m_strCurrencyName.Get(), m_strCurrencyTLA.Get(), m_strCurrencySymbol.Get(), + m_strCurrencyType.Get(), m_strCurrencyFactor.Get(), m_strCurrencyDecimalPower.Get(), + m_strCurrencyFraction.Get()); + nReturnVal = 1; + } + + return nReturnVal; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTAssetContract.h b/OTLib/OTAssetContract.h new file mode 100644 index 000000000..f60267013 --- /dev/null +++ b/OTLib/OTAssetContract.h @@ -0,0 +1,190 @@ +/************************************************************************************ + * + * OTAssetContract.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTASSETCONTRACT_H__ +#define __OTASSETCONTRACT_H__ + + +#include +#include +#include + + +#include "OTContract.h" + +class OTBasket; +class OTPseudonym; +class OTString; + +class OTAssetContract : public OTContract +{ +protected: + OTString m_strBasketInfo; // If this contract is for a basket currency, the OTBasket object is stored here. + + OTString m_strIssueCompany; + OTString m_strIssueEmail; + OTString m_strIssueContractURL; + OTString m_strIssueType; + + OTString m_strCurrencyName; + OTString m_strCurrencyTLA; + OTString m_strCurrencySymbol; + OTString m_strCurrencyType; + OTString m_strCurrencyFactor; + OTString m_strCurrencyDecimalPower; + OTString m_strCurrencyFraction; + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); +public: + bool CreateBasket(OTBasket & theBasket, OTPseudonym & theSigner); + + inline const OTString & GetBasketInfo() const { return m_strBasketInfo; } + + OTAssetContract(); + OTAssetContract(OTString & name, OTString & foldername, OTString & filename, OTString & strID); + virtual ~OTAssetContract(); + + virtual bool CreateContract(OTString & strContract, OTPseudonym & theSigner); + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(OTString & strContents) const; + virtual bool SaveContractWallet(std::ofstream & ofs); + + virtual bool DisplayStatistics(OTString & strContents) const; +}; + + +typedef std::map mapOfContracts; + + + +#endif // __OTASSETCONTRACT_H__ diff --git a/OTLib/OTAsymmetricKey.cpp b/OTLib/OTAsymmetricKey.cpp new file mode 100644 index 000000000..56066185a --- /dev/null +++ b/OTLib/OTAsymmetricKey.cpp @@ -0,0 +1,1532 @@ +/************************************************************** + * + * OTAsymmetricKey.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +extern "C" +{ +#include + +#include +#include +#include +#include +#include +} + +#include +#include +#include + +#include "OTStorage.h" + +#include "OTData.h" +#include "OTString.h" +#include "OTAsymmetricKey.h" +#include "OTPayload.h" +#include "OTASCIIArmor.h" +#include "OTLog.h" + + + + +typedef struct +{ + BIGNUM* p; + BIGNUM* g; + BIGNUM* pub_key; + BIGNUM* priv_key; +} ELGAMAL; + +typedef struct +{ + RSA* pRsa; + DSA* pDsa; + ELGAMAL* pElgamal; +} PgpKeys; + + + +// -------------------------------------------------------- + +// static +OT_OPENSSL_CALLBACK * OTAsymmetricKey::s_pwCallback = NULL; + +//static void SetPasswordCallback(p_OT_OPENSSL_CALLBACK pCallback); +//static p_OT_OPENSSL_CALLBACK GetPasswordCallback(); +//static bool IsPasswordCallbackSet() { (NULL == s_pwCallback) ? false : true; } + + +void OTAsymmetricKey::SetPasswordCallback(OT_OPENSSL_CALLBACK * pCallback) +{ + s_pwCallback = pCallback; // no need to delete function pointer that came before this function pointer. +} + +OT_OPENSSL_CALLBACK * OTAsymmetricKey::GetPasswordCallback() +{ + if (IsPasswordCallbackSet()) + return s_pwCallback; + else + return &default_pass_cb; + +} + + + +// -------------------------------------------------------- + +OTCaller * OTAsymmetricKey::s_pCaller = NULL; + + +// Takes ownership. UPDATE: doesn't, since he assumes the Java side +// created it and will therefore delete it when the time comes. +// I keep a pointer, but I don't delete the thing. Let Java do it. +// +bool OTAsymmetricKey::SetPasswordCaller(OTCaller & theCaller) +{ + if (!theCaller.isCallbackSet()) + { + OTLog::Error("Error in OTAsymmetricKey::SetPasswordCaller:\nOTCaller::setCallback() " + "MUST be called first, with an OTCallback-extended object passed to it,\n" + "before calling this function with that OTCaller.\n"); + return false; + } + + if (NULL != s_pCaller) + { +// delete s_pCaller; // Let Java delete it. + } + + s_pCaller = &theCaller; + + // --------------------------- + + SetPasswordCallback(&souped_up_pass_cb); + + return true; +} + +OTCaller * OTAsymmetricKey::GetPasswordCaller() +{ + return s_pCaller; +} + +// -------------------------------------------------------- + +// OTCallback CLASS + +OTCallback::~OTCallback() +{ +// std::cout << "OTCallback::~OTCallback()" << std:: endl; +} + +std::string OTCallback::runOne() // child class will override. +{ + // std::cout << "OTCallback::run()" << std::endl; + + std::string blah("test"); + + return blah; +} + +std::string OTCallback::runTwo() // child class will override. +{ + // std::cout << "OTCallback::run()" << std::endl; + + std::string blah("test"); + + return blah; +} + + +// ------------------------------------------------ + +// OTCaller CLASS + +OTCaller::~OTCaller() +{ + delCallback(); +} + +const char * OTCaller::GetPassword() +{ + if (m_strPW.size() > 0) + return m_strPW.c_str(); + + return NULL; +} + +void OTCaller::delCallback() +{ +// if (NULL != _callback) // TODO this may be a memory leak. +// delete _callback; // But I know we're currently crashing from deleting same object twice. + // And since the object comes from Java, who am I to delete it? Let Java clean it up. + _callback = NULL; +} + +void OTCaller::setCallback(OTCallback *cb) +{ + delCallback(); + _callback = cb; +} + +void OTCaller::callOne() +{ + if (NULL != _callback) + { + m_strPW = _callback->runOne(); + // std::cout << "RESULT!!!: " << m_strPW << std::endl; + } +} + +void OTCaller::callTwo() +{ + if (NULL != _callback) + { + m_strPW = _callback->runTwo(); + // std::cout << "RESULT!!!: " << m_strPW << std::endl; + } +} + +bool OTCaller::isCallbackSet() +{ + return (NULL == _callback) ? false : true; +} + +bool OT_API_Set_PasswordCallback(OTCaller & theCaller) // Caller must have Callback attached already. +{ + if (!theCaller.isCallbackSet()) + { + OTLog::Error("Error in OT_API_Set_PasswordCallback:\nOTCaller::setCallback() " + "MUST be called first, with an OTCallback-extended class passed to it,\n" + "before calling this function with that OTCaller.\n"); + return false; + } + + return OTAsymmetricKey::SetPasswordCaller(theCaller); +} + +// -------------------------------------------------------- + +/* + extern "C" + { + typedef int OT_OPENSSL_CALLBACK(char *buf, int size, int rwflag, void *u); // <== Callback type, used for declaring. + } + + // Used for the actual function definition (in the .cpp file). + #define OPENSSL_CALLBACK_FUNC(name) extern \"C\" int (name)(char *buf, int size, int rwflag, void *u) + */ + + +// If the password callback isn't set, then it uses the default ("test") password. +// +OPENSSL_CALLBACK_FUNC(default_pass_cb) +{ + int len=0; + const char *tmp="test"; + + // We'd probably do something else if 'rwflag' is 1 + + OTLog::vOutput(0, "Using 'test' pass phrase for \"%s\"\n", (char *)u); + + // get pass phrase, length 'len' into 'tmp' + + len = strlen(tmp); + + if (len <= 0) + return 0; + + // if too long, truncate + if (len > size) + len = size; + + memcpy(buf, tmp, len); + return len; +} + + +// -------------------------------------------------------- + + +//typedef int OT_OPENSSL_CALLBACK(char *buf, int size, int rwflag, void *u); // <== Callback type, used for declaring. + +OPENSSL_CALLBACK_FUNC(souped_up_pass_cb) +{ + int len=0; + char *tmp=NULL; + + // We'd probably do something else if 'rwflag' is 1 + + OTLog::vOutput(0, "Using OT Password Callback for \"%s\"\n", (char *)u); + + OTCaller * pCaller = OTAsymmetricKey::GetPasswordCaller(); + + if (NULL == pCaller) + { + OTLog::Error("OTCaller is NULL. Try calling OT_API_Set_PasswordCallback() first.\n"); + + OT_ASSERT(0); // This will never actually happen, since SetPasswordCaller() and souped_up_pass_cb are activated in same place. + + // get pass phrase, length 'len' into 'tmp' + /* + tmp = "test"; + len = strlen(tmp); + + if (len <= 0) + return 0; + + // if too long, truncate + if (len > size) + len = size; + + memcpy(buf, tmp, len); + return len; + */ + } + + if (1 == rwflag) + pCaller->callTwo(); // This is where Java pops up a modal dialog and asks for password twice... + else + pCaller->callOne(); // This is where Java pops up a modal dialog and asks for password... + + // get pass phrase, length 'len' into 'tmp' + const char * pPassword = pCaller->GetPassword(); + + if (NULL == pPassword) + return 0; + + OTString strPassword(pPassword); + tmp = (char*)strPassword.Get(); + len = strlen(tmp); + + if (len <= 0) + return 0; + + // if too long, truncate + if (len > size) + len = size; + + memcpy(buf, tmp, len); + return len; +} + + +// -------------------------------------------------------- + +void OTAsymmetricKey::SetKey(EVP_PKEY * pKey) +{ + OT_ASSERT(NULL != pKey); + + Release(); + + m_pKey = pKey; +} + + + +// Get the public key in ASCII-armored format with bookends - ------- BEGIN PUBLIC KEY -------- +// This version, so far, is escaped-only. Notice the "- " before the rest of the bookend starts. +bool OTAsymmetricKey::GetPublicKey(OTString & strKey, bool bEscaped/*=true*/) const +{ + OTASCIIArmor theArmor; + + if (GetPublicKey(theArmor)) + { + if (bEscaped) + { + strKey.Concatenate("- -----BEGIN PUBLIC KEY-----\n" + "%s" + "- -----END PUBLIC KEY-----\n", + theArmor.Get() + ); + + } + else { + strKey.Concatenate("-----BEGIN PUBLIC KEY-----\n" + "%s" + "-----END PUBLIC KEY-----\n", + theArmor.Get() + ); + + } + return true; + } + else { + return false; + } +} + + +/* +void OTbase64Decode(unsigned char* pIn, int inLen, unsigned char* pOut, int& outLen) +{ + // create a memory buffer containing base64 encoded data (or binary data if I remove the filter below) + BIO* bmem = BIO_new_mem_buf((void*)pIn, inLen); + + // create a Base64 filter so that reading from buffer decodes it + BIO *bio64Filter = BIO_new(BIO_f_base64()); + BIO_set_flags(bio64Filter, BIO_FLAGS_BASE64_NO_NL); // with no newlines, please. + + // push the base64 filter onto the memory buffer + bmem = BIO_push(bio64Filter, bmem); + + // Get the length of the output while also reading it from the BIO + int finalLen = BIO_read(bmem, (void*)pOut, outLen); + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(bmem); + + outLen = finalLen; +} +*/ +/* +EVP_PKEY * pKey OTGetPublicKey(unsigned char* pIn, int inLen, unsigned char* pOut, int& outLen) +{ + // create a memory buffer containing base64 encoded data (or binary data if I remove the filter below) + BIO* bmem = BIO_new_mem_buf((void*)pIn, inLen); + + // create a Base64 filter so that reading from buffer decodes it + BIO *bio64Filter = BIO_new(BIO_f_base64()); + BIO_set_flags(bio64Filter, BIO_FLAGS_BASE64_NO_NL); // with no newlines, please. + + // push the base64 filter onto the memory buffer + bmem = BIO_push(bio64Filter, bmem); + + // Get the length of the output while also reading it from the BIO + int finalLen = BIO_read(bmem, (void*)pOut, outLen); + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(bmem); + + outLen = finalLen; +} + */ + +/* + BIO* keyBio = BIO_new_mem_buf(TESTING_PUBLIC_KEY, + sizeof(TESTING_PUBLIC_KEY)); + public_key = d2i_PUBKEY_bio(keyBio, NULL); +*/ + + +// Decodes a public key from ASCII armor into an actual key pointer +// and sets that as the keypointer on this object. +// This is the version that will handle the bookends ( --------- BEGIN PUBLIC KEY -------) +bool OTAsymmetricKey::SetPublicKey(const OTString & strKey, bool bEscaped/*=false*/) +{ + // This reads the string into the Armor and removes the bookends. (----- BEGIN ...) + OTASCIIArmor theArmor; + + if (theArmor.LoadFromString((OTString &)strKey, bEscaped)) + { + return SetPublicKey(theArmor); + } + else + return false; +} + + + +/* + * An implementation of convertion from PGP public key format to OpenSSL equivalent + * Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI . All rights reserved. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +PgpKeys ExportRsaKey(unsigned char *pbData, int dataLength) +{ + PgpKeys pgpKeys; + int i; + + memset(&pgpKeys, 0, sizeof(pgpKeys)); + for (i = 0; i < dataLength; ) + { + int packetLength; + unsigned char packetTag = pbData[i++]; + if ((packetTag & 0x80) == 0) + break; + if ((packetTag & 0x40)) + { + packetTag &= 0x3F; + packetLength = pbData[i++]; + if( (packetLength >191) && (packetLength <224)) + packetLength = ((packetLength-192) << 8) + pbData[i++]; + else if( (packetLength > 223) && (packetLength < 255)) + packetLength = (1 << (packetLength & 0x1f)); + else if(packetLength == 255) + { + packetLength = (pbData[i]<<24) + (pbData[i+1]<<16) + (pbData[i+2]<<8) + pbData[i+3]; + i+=4; + } + } + else + { + packetLength = packetTag & 3; + packetTag = (packetTag >> 2) & 15; + if(packetLength == 0) + packetLength = pbData[i++]; + else if(packetLength == 1) + { + packetLength = (pbData[i]<<8) + pbData[i+1]; + i+=2; + } + else if(packetLength == 2) + { + packetLength = (pbData[i]<<24) + (pbData[i+1]<<16) + (pbData[i+2]<<8) + pbData[i+3]; + i+=4; + } + else + packetLength = dataLength - 1; + } + + if( (packetTag==6) || (packetTag==14) ) // a public key + { + int algorithm; + int version = pbData[i++]; + + // skip time over 4 bytes + i += 4; + + if( (version==2) || (version==3) ) + { + // skip validity over 2 bytes + i += 2; + } + + algorithm = pbData[i++]; + + if( (algorithm == 1) || (algorithm == 2) || (algorithm == 3) ) // an RSA key + { + int modulusLength, exponentLength; + RSA* pKey = RSA_new(); + + // Get the modulus + modulusLength = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->n = BN_bin2bn (pbData + i + 2, modulusLength, NULL); + i += modulusLength + 2; + + // Get the exponent + exponentLength = (pbData[i]*256 + pbData[i+1]+7)/8; + pKey->e = BN_bin2bn(pbData + i + 2, exponentLength, NULL); + i += exponentLength + 2; + + pgpKeys.pRsa = pKey; + + continue; + } + else if (algorithm == 17) // a DSA key + { + int pLen, qLen, gLen, yLen; + DSA* pKey = DSA_new(); + + // Get Prime P + pLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->p = BN_bin2bn(pbData + i + 2, pLen, NULL); + i += pLen + 2; + + // Get Prime Q + qLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->q = BN_bin2bn(pbData + i + 2, qLen, NULL); + i += qLen + 2; + + // Get Prime G + gLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->g = BN_bin2bn(pbData + i + 2, gLen, NULL); + i += gLen + 2; + + // Get Prime Y + yLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->pub_key = BN_bin2bn(pbData + i + 2, yLen, NULL); + i += yLen + 2; + + pgpKeys.pDsa = pKey; + + continue; + } + else if ((algorithm == 16) || (algorithm == 20)) // Elgamal key (not supported by OpenSSL + { + int pLen, gLen, yLen; + ELGAMAL* pKey = (ELGAMAL*) malloc(sizeof(ELGAMAL)); + + // Get Prime P + pLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->p = BN_bin2bn(pbData + i + 2, pLen, NULL); + i += pLen + 2; + + // Get Prime G + gLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->g = BN_bin2bn(pbData + i + 2, gLen, NULL); + i += gLen + 2; + + // Get Prime Y + yLen = ((pbData[i]*256 + pbData[i+1]+7)/8); + pKey->pub_key = BN_bin2bn(pbData + i + 2, yLen, NULL); + i += yLen + 2; + + pgpKeys.pElgamal = pKey; + + continue; + } + else + { + i -= 6; + if (version == 2 || version == 3) + i -= 2; + } + } + + i += packetLength; + } + + return pgpKeys; +} + + + + + + +// Decodes a PGP public key from ASCII armor into an actual key pointer +// and sets that as the keypointer on this object. +// This function expects the bookends to be GONE already +// It just wants the base64 encoded data which is why we have ascii-armor +// object coming in instead of a string. +bool OTAsymmetricKey::LoadPublicKeyFromPGPKey(const OTASCIIArmor & strKey) +{ + /* + EVP_PKEY * pReturnKey = NULL; + OTPayload theData; + + // This base64 decodes the string into binary object theData + strKey.GetData(theData); + + BIO* keyBio = BIO_new_mem_buf((void*)theData.GetPayloadPointer(), theData.GetSize()); + + //TODO Figure out which one of these is right, if any + // pReturnKey = d2i_PUBKEY_bio(keyBio, NULL); + pReturnKey = PEM_read_bio_PUBKEY(keyBio, NULL, NULL, NULL); // we'll try this one next + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(keyBio); + + Release(); + + if (NULL != pReturnKey) + { + m_pKey = pReturnKey; + // OTLog::vOutput(4, "Success reading public key from ASCII-armored data:\n%s",strKey.Get()); + return true; + } + else { + // OTLog::vOutput(4, "Failed reading public key from ASCII-armored data:\n%s",strKey.Get()); + return false; + } + + */ + + + /* + * An implementation of convertion from PGP public key format to OpenSSL equivalent + * Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI . All rights reserved. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + int iRet =-1, len; + BIO *bio, *b64, *bio_out; + unsigned char buffer[520]; // Making it a bit bigger than 512 for safety reasons. + BUF_MEM *bptr; + PgpKeys pgpKeys; + + b64 = BIO_new(BIO_f_base64()); + bio = BIO_new_mem_buf((void*)strKey.Get(), strKey.GetLength()); + bio_out = BIO_new(BIO_s_mem()); + bio = BIO_push(b64, bio); + + while((len = BIO_read(bio, buffer, 512)) > 0) + BIO_write(bio_out, buffer, len); + BIO_free_all(bio); + bio = NULL; + + BIO_get_mem_ptr(bio_out, &bptr); + + pgpKeys = ExportRsaKey((unsigned char*)bptr->data, bptr->length); + + if(!pgpKeys.pRsa) + { + OTLog::Output(5, "\nNo RSA public key found.\n\n"); + } + else + { + char* szModulusHex = BN_bn2hex(pgpKeys.pRsa->n); + char* szExponentHex = BN_bn2hex(pgpKeys.pRsa->e); + OTLog::vOutput(5, "RSA public key found : \n Modulus (%d bits)\n", BN_num_bits(pgpKeys.pRsa->n)); + OTLog::vOutput(5, " Exponent : 0x%s\n\n", szExponentHex); + OTLog::vOutput(5, "RSA public key found : \nModulus (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pRsa->n), szModulusHex); + OTLog::vOutput(5, "Exponent : 0x%s\n\n", szExponentHex); + + CRYPTO_free(szModulusHex); + CRYPTO_free(szExponentHex); + } + + if(!pgpKeys.pDsa) + { + OTLog::Output(5, "No DSA public key found.\n\n"); + } + else + { + char* szPHex = BN_bn2hex(pgpKeys.pDsa->p); + char* szQHex = BN_bn2hex(pgpKeys.pDsa->q); + char* szGHex = BN_bn2hex(pgpKeys.pDsa->g); + char* szYHex = BN_bn2hex(pgpKeys.pDsa->pub_key); + OTLog::vOutput(5, "DSA public key found : \n p (%d bits)\n", BN_num_bits(pgpKeys.pDsa->p)); + OTLog::vOutput(5, " q (%d bits)\n", BN_num_bits(pgpKeys.pDsa->q)); + OTLog::vOutput(5, " g (%d bits)\n", BN_num_bits(pgpKeys.pDsa->g)); + OTLog::vOutput(5, "public key (%d bits)\n\n", BN_num_bits(pgpKeys.pDsa->pub_key)); + OTLog::vOutput(5, "DSA public key found : \np (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pDsa->p), szPHex); + OTLog::vOutput(5, "q (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pDsa->q),szQHex); + OTLog::vOutput(5, "g (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pDsa->g),szGHex); + OTLog::vOutput(5, "public key (%d bits) : 0x%s\n\n", BN_num_bits(pgpKeys.pDsa->pub_key),szYHex); + + CRYPTO_free(szPHex); + CRYPTO_free(szQHex); + CRYPTO_free(szGHex); + CRYPTO_free(szYHex); + } + + if(!pgpKeys.pElgamal) + { + OTLog::Output(5, "No Elgamal public key found.\n\n"); + } + else + { + char* szPHex = BN_bn2hex(pgpKeys.pElgamal->p); + char* szGHex = BN_bn2hex(pgpKeys.pElgamal->g); + char* szYHex = BN_bn2hex(pgpKeys.pElgamal->pub_key); + OTLog::vOutput(5, "Elgamal public key found : \n p (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pElgamal->p), szPHex); + OTLog::vOutput(5, " g (%d bits) : 0x%s\n", BN_num_bits(pgpKeys.pElgamal->g),szGHex); + OTLog::vOutput(5, " public key (%d bits) : 0x%s\n\n", BN_num_bits(pgpKeys.pElgamal->pub_key),szYHex); + + CRYPTO_free(szPHex); + CRYPTO_free(szGHex); + CRYPTO_free(szYHex); + } + + iRet = 0; + + BIO_free(bio_out); + bio_out = NULL; + + /* + if (pgpKeys.pRsa) + RSA_free(pgpKeys.pRsa); + if (pgpKeys.pDsa) + DSA_free(pgpKeys.pDsa); + if (pgpKeys.pElgamal) + free(pgpKeys.pElgamal); + */ + + + Release(); + + bool bReturnValue = false; + EVP_PKEY * pkey = EVP_PKEY_new(); + + OT_ASSERT(NULL != pkey); + + if (pgpKeys.pRsa) + { + if (EVP_PKEY_assign_RSA(pkey, pgpKeys.pRsa)) + { + m_pKey = pkey; + bReturnValue = true; + OTLog::Output(4, "Successfully extracted RSA public key from PGP public key block.\n"); + } + else + { + RSA_free(pgpKeys.pRsa); + OTLog::Output(0, "Extracted RSA public key from PGP public key block, but unable to convert to EVP_PKEY.\n"); + } + + pgpKeys.pRsa = NULL; + } + else if (pgpKeys.pDsa) + { + if (EVP_PKEY_assign_DSA(pkey, pgpKeys.pDsa)) + { + m_pKey = pkey; + bReturnValue = true; + OTLog::Output(4, "Successfully extracted DSA public key from PGP public key block.\n"); + } + else + { + DSA_free(pgpKeys.pDsa); + OTLog::Output(0, "Extracted DSA public key from PGP public key block, but unable to convert to EVP_PKEY.\n"); + } + + pgpKeys.pDsa = NULL; + } + else if (pgpKeys.pElgamal) + { + OTLog::Output(0, "Extracted ElGamal Key from PGP public key block, but currently do not support it (sorry))\n"); + //int EVP_PKEY_assign_EC_KEY(EVP_PKEY *pkey,EC_KEY *key); // Here is the assign function for El Gamal + // (assuming that "EC" stands for eliptical curve... kind of hard to tell with the OpenSSL docs...) + free(pgpKeys.pElgamal); + pgpKeys.pElgamal = NULL; + + EVP_PKEY_free(pkey); + pkey = NULL; + } + + pkey = NULL; // This is either stored on m_pKey, or deleted. I'm setting pointer to NULL here just for completeness. + + return bReturnValue; + // EVP_cleanup(); // removes digests from the table + // ERR_free_strings(); // removes error strings. +} + + +// Decodes a public key from ASCII armor into an actual key pointer +// and sets that as the keypointer on this object. +bool OTAsymmetricKey::SetPublicKey(const OTASCIIArmor & strKey) +{ + EVP_PKEY * pReturnKey = NULL; + OTPayload theData; + + // This base64 decodes the string into binary object theData + strKey.GetData(theData); + + BIO* keyBio = BIO_new_mem_buf((void*)theData.GetPayloadPointer(), theData.GetSize()); + + OT_ASSERT(NULL != keyBio); + + //TODO Figure out which one of these is right, if any + // pReturnKey = d2i_PUBKEY_bio(keyBio, NULL); + pReturnKey = PEM_read_bio_PUBKEY(keyBio, NULL, NULL, NULL); // we'll try this one next + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(keyBio); + keyBio = NULL; + + Release(); + + if (NULL != pReturnKey) + { + m_pKey = pReturnKey; + OTLog::vOutput(4, "Success reading public key from ASCII-armored data:\n%s", strKey.Get()); + return true; + } + else { + OTLog::vError("Failed reading public key from ASCII-armored data:\n%s", strKey.Get()); + return false; + } +} + + +/* +bool OTAsymmetricKey::SetPublicKey(OTASCIIArmor & strKey) +{ + EVP_PKEY * pReturnKey = NULL; + + // create a memory buffer containing the ascii-armored Key data + BIO* bmem = BIO_new_mem_buf((void *)strKey.Get(), strKey.GetLength()); + + // create a Base64 filter so that reading from buffer decodes it + BIO *bio64Filter = BIO_new(BIO_f_base64()); + //BIO_set_flags(bio64Filter, BIO_FLAGS_BASE64_NO_NL); // with no newlines, please. + + // push the base64 filter onto the memory buffer + bmem = BIO_push(bio64Filter, bmem); + + // Reads from a BIO into a public key + pReturnKey = PEM_read_bio_PUBKEY(bmem, NULL, NULL, NULL); + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(bmem); + + Release(); + + if (NULL != pReturnKey) + { + m_pKey = pReturnKey; + OTLog::vOutput(4, "Success reading public key from ASCII-armored data:\n%s", strKey.Get()); + return true; + } + else { + OTLog::vError("Failed reading public key from ASCII-armored data:\n%s", strKey.Get()); + return false; + } +} +*/ +/* + + bool OTAsymmetricKey::SetPublicKey(OTASCIIArmor & strKey) + { + OTPayload theData; + + // This base64 decodes the string into binary object theData + strKey.GetData(theData); + + // Next I ask OpenSSL to allocate a public key handle for me, + // based on the binary key data that I show in memory. + // const unsigned char * pChar = (const unsigned char*)theData.GetPayloadPointer(); + + EVP_PKEY * pKey = NULL; + EVP_PKEY * pReturnKey = NULL; + + // create a memory buffer containing the (already decoded) binary Key data + BIO* bmem = BIO_new_mem_buf(theData.GetPayloadPointer(), theData.GetSize()); + + // Reads from a BIO into a public key + pReturnKey = PEM_read_bio_PUBKEY(bmem, &pKey, NULL, NULL); + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(bmem); + + Release(); + + if (NULL != pReturnKey) + { + m_pKey = pReturnKey; + OTLog::vOutput(4, "Success reading public key from ASCII-armored data.\n"); + return true; + } + else { + OTLog::Error("Failed reading public key from ASCII-armored data.\n"); + return false; + } + } + + */ + +// Get the public key in ASCII-armored format +// i2d == EVP_PKEY* converted to normal binary in RAM +bool OTAsymmetricKey::GetPublicKey(OTASCIIArmor & strKey) const +{ + if (NULL == m_pKey) + return false; + + bool bReturnVal = false; + + // Create a new memory buffer on the OpenSSL side + BIO *bmem = BIO_new(BIO_s_mem()); + //BIO_puts(bmem, Get()); + + OT_ASSERT(NULL != bmem); + + // write a public key to that buffer from our member variable m_pKey + int nWriteBio = PEM_write_bio_PUBKEY(bmem, m_pKey); + + if (0 == nWriteBio) + { + OTLog::Error("Failed writing EVP_PKEY* to memory buffer in OTAsymmetricKey::GetPublicKey\n"); + } + else + { + OTLog::Output(5, "Success writing EVP_PKEY* to memory buffer in OTAsymmetricKey::GetPublicKey\n"); + + OTPayload theData; + char * pChar = NULL; + + // After the below call, pChar will point to the memory buffer where the public key supposedly is, + // and lSize will contain the size of that memory. + long lSize = BIO_get_mem_data(bmem, &pChar); + int nSize = lSize; + + if (nSize > 0) + { + // Set the buffer size in our own memory. + theData.SetPayloadSize(nSize); + + // copy it over from OpenSSL to our own memory + memcpy((char*)theData.GetPayloadPointer(), pChar, nSize); + + // This base64 encodes the public key data + strKey.SetData(theData); + + OTLog::Output(5, "Success copying public key into memory in OTAsymmetricKey::GetPublicKey\n"); + bReturnVal = true; + } + else + { + OTLog::Error("Failed copying public key into memory in OTAsymmetricKey::GetPublicKey\n"); + } + } + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(bmem); + bmem = NULL; + + return bReturnVal; +} + +/* + bool OTAsymmetricKey::GetPublicKey(OTASCIIArmor & strKey) + { + if (NULL == m_pKey) + return false; + + // I assume the 0 passed in here is what tells it to give us the length + OTPayload theData; + unsigned char *next; + + int nLength = i2d_PublicKey(m_pKey, 0); + + theData.SetPayloadSize(nLength); + + next = (unsigned char *) theData.GetPayloadPointer(); + + i2d_PublicKey(m_pKey, &next); // If we use buf here, return buf; becomes wrong. So we use next. + + // This base64 encodes the public key data + strKey.SetData(theData); + + return true; + + } + */ + + + +/* + BIO *infile; + infile = BIO_new_file(strFilename.Get(), "r"); + + if (!infile) + //Error + ; + + BIO_printf(infile, "Hello World\n"); + BIO_free(infile); + */ + +// Does public key only. +OTAsymmetricKey & OTAsymmetricKey::operator=(const OTAsymmetricKey & rhs) +{ + if (&rhs != this) + { + OTASCIIArmor ascTransfer; + + // Get the Issuer's public key in ASCII-armored format + rhs.GetPublicKey(ascTransfer); + + // Decodes a public key from ASCII armor into m_keyPublic, which stores it as a EVP_PKEY pointer. + this->SetPublicKey(ascTransfer); + } + + return *this; +} + + + +OTAsymmetricKey::OTAsymmetricKey(const OTAsymmetricKey & rhs) : m_pKey(NULL) +{ + if (&rhs != this) + { + OTASCIIArmor ascTransfer; + + // Get the Issuer's public key in ASCII-armored format + rhs.GetPublicKey(ascTransfer); + + // Decodes a public key from ASCII armor into m_keyPublic, which stores it as a EVP_PKEY pointer. + this->SetPublicKey(ascTransfer); + } +} + + +OTAsymmetricKey::OTAsymmetricKey() : m_pKey(NULL) +{ + +} + +OTAsymmetricKey::~OTAsymmetricKey() +{ + Release(); +} + +void OTAsymmetricKey::Release() +{ + if (NULL != m_pKey) + { + EVP_PKEY_free (m_pKey); + } + + m_pKey = NULL; +} + + + +// Load the public key from a x509 stored in a bookended string +// If the string is escaped (- ----BEGIN is prefixed with dash space: "- ") then make +// sure to pass true. (Keys that appear inside contracts are escaped after signing.) +// This function will remove the escapes. +bool OTAsymmetricKey::LoadPublicKeyFromCertString(const OTString & strCert, bool bEscaped/*=true*/) +{ + bool bReturnValue = false; + + Release(); + + // Read public key + OTLog::Output(3, "\nReading public key from x509 stored in bookended string...\n"); + + OTString strWithBookends; + + if (bEscaped) + { + OTASCIIArmor theArmor; + + // I only have a CERTIFICATE 'if' here, not a PUBLIC KEY 'if'. + // That's because this function is called "LoadPublicKeyFrom*CERT*String" + // If you want to load a public key from a public key string, then call the + // other function that does that. + if (theArmor.LoadFromString((OTString &)strCert, true)) // passing bEscaped in as true explicitly here. + strWithBookends.Format("-----BEGIN CERTIFICATE-----\n%s-----END CERTIFICATE-----\n", + theArmor.Get()); + else + { + OTLog::Error("Error extracting ASCII-Armored text from Cert String in " + "OTAsymmetricKey::LoadPublicKeyFromCertString\n"); + return false; + } + } + else { + strWithBookends = strCert; + } + + + // toook out the +1 on the length since null terminater only + // needed in string form, not binary form as OpenSSL treats it. + BIO * keyBio = BIO_new_mem_buf((void*)strWithBookends.Get(), strWithBookends.GetLength() /*+1*/); +// BIO * keyBio = BIO_new_mem_buf((void*)strCert.Get(), strCert.GetLength() /*+1*/); + + OT_ASSERT(NULL != keyBio); + + X509 * x509 = PEM_read_bio_X509(keyBio, NULL, NULL, NULL); + + + // Free the BIO and related buffers, filters, etc. + BIO_free_all(keyBio); + keyBio = NULL; + + + // TODO: At some point need to switch to using X509_AUX functions. + // The current x509 functions will read a trust certificate but discard the trust structure. + // The X509_AUX functions will process the trust structure. + if (NULL != x509) + { + m_pKey = X509_get_pubkey(x509); + + X509_free(x509); + x509 = NULL; + + if (m_pKey == NULL) + { + OTLog::Error("Error reading public key from x509 in LoadPublicKeyFromCertArmor.\n"); + } + else + { + OTLog::Output(3, "\nSuccessfully extracted a public key from an x509 certificate.\n"); + bReturnValue = true; + } + } + else + { + OTLog::Error("Error reading x509 out of certificate in LoadPublicKeyFromCertArmor.\n"); + } + + return bReturnValue; +} + + + + + + +// Load the public key from a .pem file +bool OTAsymmetricKey::LoadPublicKey(const OTString & strFoldername, const OTString & strFilename) +{ + Release(); + + // This doesn't use assert on the arguments, but theArmor.LoadFromFile DOES. + + // ----------------------- + + OTASCIIArmor theArmor; + + if (theArmor.LoadFromFile(strFoldername, strFilename)) + { + if (SetPublicKey(theArmor)) + { + OTLog::Output(4, "Success setting public key from OTASCIIArmor in OTAsymmetricKey::LoadPublicKey.\n"); + return true; + } + else + { + OTLog::vError("Unable to convert from OTASCIIArmor to public key in " + "OTAsymmetricKey::LoadPublicKey: %s\n", + strFilename.Get()); + return false; + } + } + else + { + OTLog::vError("Unable to read pubkey file in OTAsymmetricKey::LoadPublicKey: %s\n", strFilename.Get()); + return false; + } + + return false; +} + +/* +// Load the public key from a .pem file +bool OTAsymmetricKey::LoadPublicKey(OTString & strFilename) +{ + Release(); + + FILE * fp; + + // Read public key + fp = fopen (strFilename.Get(), "r"); + + if (NULL == fp) + { + fprintf (stderr, "Error opening public key file in OTAsymmetricKey::LoadPublicKey: %s\n", strFilename.Get()); + return false; + } + + m_pKey = PEM_read_PUBKEY(fp, &m_pKey, NULL, NULL); + + fclose (fp); + + if (NULL == m_pKey) + { + fprintf (stderr, "Error reading public key from file in OTAsymmetricKey::LoadPublicKey: %s\n", strFilename.Get()); + return false; + } + + return true; +} +*/ + + + + +// Load the public key from a x509 stored in a .pem file +bool OTAsymmetricKey::LoadPublicKeyFromCertFile(const OTString & strFoldername, const OTString & strFilename) +{ + Release(); + + // --------------- + + X509 * x509 = NULL; + + const char * szFoldername = strFoldername.Get(); + const char * szFilename = strFilename.Get(); + + OT_ASSERT(strFoldername.Exists()); + OT_ASSERT(strFilename.Exists()); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTAsymmetricKey::LoadPublicKeyFromCertFile: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTAsymmetricKey::LoadPublicKeyFromCertFile: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + // Create a new memory buffer on the OpenSSL side + BIO * bio = BIO_new_mem_buf((void*)strFileContents.c_str(), strFileContents.length()); + +// BIO *bio = BIO_new(BIO_s_mem()); + OT_ASSERT(NULL != bio); + +// int nPutsResult = BIO_puts(bio, strFileContents.c_str()); + + // -------------------------------------------------------------------- + +// if (nPutsResult > 0) + { + x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); + + BIO_free_all(bio); + bio = NULL; + // ------------------------------------------------- + + if (x509 == NULL) + { + OTLog::vError("Error reading x509 out of cert file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + m_pKey = X509_get_pubkey(x509); + X509_free(x509); + x509 = NULL; + + if (m_pKey == NULL) + { + OTLog::vError("Error reading public key from x509 from certfile: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + else + { + OTLog::vOutput(3, "Successfully loaded public key from x509 from certfile: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return true; + } + } + + if (NULL != bio) + BIO_free_all(bio); + + return false; +} + + + + +// Load the private key from a .pem file +bool OTAsymmetricKey::LoadPrivateKey(const OTString & strFoldername, const OTString & strFilename) +{ + Release(); + + const char * szFoldername = strFoldername.Get(); + const char * szFilename = strFilename.Get(); + + OT_ASSERT(strFoldername.Exists()); + OT_ASSERT(strFilename.Exists()); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vOutput(2, "Unable to find private key file in OTAsymmetricKey::LoadPrivateKey: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTAsymmetricKey::LoadPrivateKey: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + + // Create a new memory buffer on the OpenSSL side + BIO * bio = BIO_new_mem_buf((void*)strFileContents.c_str(), strFileContents.length()); +// BIO * bio = BIO_new(BIO_s_mem()); + OT_ASSERT(NULL != bio); + +// int nPutsResult = BIO_puts(bio, strFileContents.c_str()); + + // -------------------------------------------------------------------- + +// if (nPutsResult > 0) + { + m_pKey = PEM_read_bio_PrivateKey( bio, NULL, GetPasswordCallback(), NULL ); + + BIO_free_all(bio); + bio = NULL; + // ------------------------------------------------------ + + if (NULL == m_pKey) + { + OTLog::vError("Error reading private key from file in OTAsymmetricKey::LoadPrivateKey: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + else + { + OTLog::vOutput(3, "Successfully loaded private key:\n%s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return true; + } + } + + if (NULL != bio) + BIO_free_all(bio); + + OTLog::vError("STRANGE error while loading private key:\n%s\n", strFilename.Get()); + return false; +} + + +const EVP_PKEY * OTAsymmetricKey::GetKey() const +{ + return m_pKey; +} + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTAsymmetricKey.h b/OTLib/OTAsymmetricKey.h new file mode 100644 index 000000000..81f49121c --- /dev/null +++ b/OTLib/OTAsymmetricKey.h @@ -0,0 +1,260 @@ +/************************************************************* + * + * OTAsymmetricKey.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_ASYMMETRIC_KEY_H__ +#define __OT_ASYMMETRIC_KEY_H__ + +#include + +extern "C" +{ +#include +} + +// ------------------------------------------------ + + +class OTCallback +{ +public: + OTCallback() {} + virtual ~OTCallback(); + virtual std::string runOne(); // Asks for password once. + virtual std::string runTwo(); // Asks for password twice. (For verification.) +}; + + +class OTCaller +{ +protected: + std::string m_strPW; + OTCallback *_callback; + +public: + OTCaller() : _callback(NULL) { } + ~OTCaller(); + + const char * GetPassword(); + + void delCallback(); + void setCallback(OTCallback *cb); + bool isCallbackSet(); + + void callOne(); // Asks for password once. + void callTwo(); // Asks for password twice. (For verification.) +}; + + +// This is the only part of the API that actually accepts objects as parameters, +// since the above objects have SWIG C++ wrappers. +// +bool OT_API_Set_PasswordCallback(OTCaller & theCaller); // Caller must have Callback attached already. + + +// ------------------------------------------------ + +// For getting the password from the user, for using his private key. +// +extern "C" +{ +typedef int OT_OPENSSL_CALLBACK(char *buf, int size, int rwflag, void *u); // <== Callback type, used for declaring. + + OT_OPENSSL_CALLBACK default_pass_cb; + OT_OPENSSL_CALLBACK souped_up_pass_cb; +} + +// Used for the actual function definition (in the .cpp file). +#define OPENSSL_CALLBACK_FUNC(name) extern "C" int (name)(char *buf, int size, int rwflag, void *u) + +// ------------------------------------------------ + +class OTString; +class OTASCIIArmor; + + +class OTAsymmetricKey +{ +private: + EVP_PKEY * m_pKey; + + static OT_OPENSSL_CALLBACK * s_pwCallback; + + static OTCaller * s_pCaller; + +public: + + static void SetPasswordCallback(OT_OPENSSL_CALLBACK * pCallback); + static OT_OPENSSL_CALLBACK * GetPasswordCallback(); + static bool IsPasswordCallbackSet() { return (NULL == s_pwCallback) ? false : true; } + + static bool SetPasswordCaller(OTCaller & theCaller); + static OTCaller * GetPasswordCaller(); + + OTAsymmetricKey(); + OTAsymmetricKey(const OTAsymmetricKey & rhs); + virtual ~OTAsymmetricKey(); + + OTAsymmetricKey & operator=(const OTAsymmetricKey & rhs); + + void Release(); + + const EVP_PKEY * GetKey() const; + + void SetKey(EVP_PKEY * pKey); + + bool LoadPrivateKey(const OTString & strFoldername, const OTString & strFilename); + bool LoadPublicKey(const OTString & strFoldername, const OTString & strFilename); + + bool LoadPublicKeyFromPGPKey(const OTASCIIArmor & strKey); // does NOT handle bookends. + + bool LoadPublicKeyFromCertFile(const OTString & strFoldername, const OTString & strFilename); // DOES handle bookends. + bool LoadPublicKeyFromCertString(const OTString & strCert, bool bEscaped=true); // DOES handle bookends, AND escapes. + + // Get the public key in ASCII-armored format with bookends + // - ------- BEGIN PUBLIC KEY -------- + // Notice the "- " before the rest of the bookend starts. + bool GetPublicKey(OTString & strKey, bool bEscaped=true) const; + + // Get the public key in ASCII-armored format + // i2d == EVP_PKEY* converted to normal binary in RAM + bool GetPublicKey(OTASCIIArmor & strKey) const; + + // Decodes a public key from ASCII armor into an actual key pointer + // and sets that as the m_pKey on this object. + // This is the version that will handle the bookends ( --------- BEGIN PUBLIC KEY -------) + bool SetPublicKey(const OTString & strKey, bool bEscaped=false); + + // Decodes a public key from ASCII armor into an actual key pointer + // and sets that as the m_pKey on this object. + bool SetPublicKey(const OTASCIIArmor & strKey); +}; + +#endif // __OT_ASYMMETRIC_KEY_H__ diff --git a/OTLib/OTBasket.cpp b/OTLib/OTBasket.cpp new file mode 100644 index 000000000..6a45c88ea --- /dev/null +++ b/OTLib/OTBasket.cpp @@ -0,0 +1,446 @@ +/**************************************************************** + * + * OTBasket.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + +#include "OTStorage.h" + + +#include "OTBasket.h" +#include "OTLog.h" + + +BasketItem::BasketItem() : + lMinimumTransferAmount(0), + lClosingTransactionNo(0) +{ + +} + +// ------------------------------------------------------------ + + + +// For generating a user request to EXCHANGE in/out of a basket. +// Assumes that SetTransferMultiple has already been called. +void OTBasket::AddRequestSubContract(const OTIdentifier & SUB_CONTRACT_ID, + const OTIdentifier & SUB_ACCOUNT_ID, + const long & lClosingTransactionNo) +{ + BasketItem * pItem = new BasketItem; + + OT_ASSERT_MSG(NULL != pItem, + "Error allocating memory in OTBasket::AddRequestSubContract\n"); + + // Minimum transfer amount is not set on a request. The server already knows its value. + // Also there is no multiple on the item, only on the basket as a whole. + // ALL items are multiplied by the same multiple. Even the basket amount itself is also. + + m_dequeItems.push_back(pItem); + + pItem->SUB_CONTRACT_ID = SUB_CONTRACT_ID; + pItem->SUB_ACCOUNT_ID = SUB_ACCOUNT_ID; + + // When the basketReceipts are accepted in all the asset accounts, + // each one will have a transaction number, lClosingTransactionNo, + // which the user will finally clear from his record by accepting + // from his inbox. + pItem->lClosingTransactionNo = lClosingTransactionNo; +} + + +// For generating a real basket +void OTBasket::AddSubContract(const OTIdentifier & SUB_CONTRACT_ID, + long lMinimumTransferAmount) +{ + BasketItem * pItem = new BasketItem; + + OT_ASSERT_MSG(NULL != pItem, "Error allocating memory in OTBasket::AddSubContract\n"); + + pItem->SUB_CONTRACT_ID = SUB_CONTRACT_ID; + // server adds this later. Client can't know it in advance. +// pItem->SUB_ACCOUNT_ID = SUB_ACCOUNT_ID; + pItem->lMinimumTransferAmount = lMinimumTransferAmount; + + m_dequeItems.push_back(pItem); +} + +// The closing transaction number is the one that gets closed when the basketReceipt +// is accepted for the exchange that occured, specific to the basket item at nIndex. +// (Each asset account gets its own basketReceipt when an exchange happens.) +// +long OTBasket::GetClosingTransactionNoAt(unsigned int nIndex) +{ + OT_ASSERT_MSG((nIndex < m_dequeItems.size()) && (nIndex >= 0), + "OTBasket::GetClosingTransactionNoAt: index out of bounds."); + + BasketItem * pItem = m_dequeItems.at(nIndex); + + OT_ASSERT_MSG(NULL != pItem, + "OTBasket::GetClosingTransactionNoAt: basket item was NULL at that index."); + + return pItem->lClosingTransactionNo; +} + + + +BasketItem * OTBasket::At(unsigned int nIndex) +{ + if (nIndex < m_dequeItems.size() && nIndex >= 0) + return m_dequeItems.at(nIndex); + + return NULL; +} + +int OTBasket::Count() const +{ + return m_dequeItems.size(); +} + + +/* + struct BasketItem + { + OTIdentifier SUB_CONTRACT_ID; + OTIdentifier SUB_ACCOUNT_ID; + long lMinimumTransferAmount; + + BasketItem() { lMinimumTransferAmount = 0; } + ~BasketItem(); + }; + + */ + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTBasket::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + if (!strcmp("currencyBasket", xml->getNodeName())) + { + OTString strSubCount, strMinTrans; + strSubCount = xml->getAttributeValue("contractCount"); + strMinTrans = xml->getAttributeValue("minimumTransfer"); + + m_nSubCount = atoi(strSubCount.Get()); + m_lMinimumTransfer = atol(strMinTrans.Get()); + + OTLog::Output(1, "Loading currency basket...\n"); + + return 1; + } + else if (!strcmp("requestExchange", xml->getNodeName())) + { + OTString strTransferMultiple, strRequestAccountID, strDirection, strTemp; + + strTransferMultiple = xml->getAttributeValue("transferMultiple"); + strRequestAccountID = xml->getAttributeValue("transferAccountID"); + strDirection = xml->getAttributeValue("direction"); + strTemp = xml->getAttributeValue("closingTransactionNo"); + + if (strTransferMultiple.Exists()) + m_nTransferMultiple = atoi(strTransferMultiple.Get()); + if (strRequestAccountID.Exists()) + m_RequestAccountID.SetString(strRequestAccountID); + if (strDirection.Exists()) + m_bExchangingIn = strDirection.Compare("in"); + if (strTemp.Exists()) + SetClosingNum(atol( strTemp.Get() )); + + OTLog::vOutput(2, "Basket Transfer multiple is %d. Direction is %s. Closing number is %ld. " + "Target account is:\n%s\n", m_nTransferMultiple, strDirection.Get(), + m_lClosingTransactionNo, strRequestAccountID.Get()); + + return 1; + } + else if (!strcmp("basketItem", xml->getNodeName())) + { + BasketItem * pItem = new BasketItem; + + OT_ASSERT_MSG(NULL != pItem, "Error allocating memory in OTBasket::ProcessXMLNode\n"); + + OTString strTemp; + + strTemp = xml->getAttributeValue("minimumTransfer"); + if (strTemp.Exists()) + pItem->lMinimumTransferAmount = atol( strTemp.Get() ); + + strTemp = xml->getAttributeValue("closingTransactionNo"); + if (strTemp.Exists()) + pItem->lClosingTransactionNo = atol( strTemp.Get() ); + + OTString strSubAccountID(xml->getAttributeValue("accountID")), + strContractID(xml->getAttributeValue("assetID")); + pItem->SUB_ACCOUNT_ID.SetString(strSubAccountID); + pItem->SUB_CONTRACT_ID.SetString(strContractID); + + m_dequeItems.push_back(pItem); + + OTLog::Output(2, "Loaded basket item.\n"); + + return 1; + } + + return 0; +} + + +void OTBasket::UpdateContents() // Before transmission or serialization, this is where the basket updates its contents +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", + m_nSubCount, m_lMinimumTransfer); + + // Only uesd in Request Basket (requesting an exchange in/out.) + // (Versus a basket object used for ISSUING a basket currency, this is EXCHANGING instead.) + // + if (m_nTransferMultiple) + { + OTString strRequestAcctID(m_RequestAccountID); + m_xmlUnsigned.Concatenate("\n\n", + m_nTransferMultiple, + strRequestAcctID.Get(), + m_lClosingTransactionNo, + m_bExchangingIn ? "in" : "out"); + } + + for (int i = 0; i < Count(); i++) + { + BasketItem * pItem = m_dequeItems[i]; + + OT_ASSERT_MSG(NULL != pItem, "Error allocating memory in OTBasket::UpdateContents\n"); + + OTString strAcctID(pItem->SUB_ACCOUNT_ID), strContractID(pItem->SUB_CONTRACT_ID); + + if (m_nTransferMultiple) + m_xmlUnsigned.Concatenate("\n\n", + pItem->lMinimumTransferAmount, + pItem->lClosingTransactionNo, + m_bHideAccountID ? "" : strAcctID.Get(), + strContractID.Get()); + else + m_xmlUnsigned.Concatenate("\n\n", + pItem->lMinimumTransferAmount, + m_bHideAccountID ? "" : strAcctID.Get(), + strContractID.Get()); + } + + m_xmlUnsigned.Concatenate("\n"); +} + +// Most contracts calculate their ID by hashing the Raw File (signatures and all). +// The Basket only hashes the unsigned contents, and only with the account IDs removed. +// This way, the basket will produce a consistent ID across multiple different servers. +void OTBasket::CalculateContractID(OTIdentifier & newID) +{ + m_bHideAccountID = true; + + // Produce a version of the file without account IDs (which are different from server to server.) + UpdateContents(); + + newID.CalculateDigest(m_xmlUnsigned); + + // Put it back the way it was. + m_bHideAccountID = false; + UpdateContents(); +} + + + + + +OTBasket::OTBasket(int nCount, long lMinimumTransferAmount) : OTContract(), + m_nSubCount(nCount), + m_lMinimumTransfer(lMinimumTransferAmount), + m_nTransferMultiple(0), + m_bHideAccountID(false), + m_bExchangingIn(false), + m_lClosingTransactionNo(0) +{ + +} + +OTBasket::OTBasket() : OTContract(), + m_nSubCount(0), + m_lMinimumTransfer(0), + m_nTransferMultiple(0), + m_bHideAccountID(false), + m_bExchangingIn(false), + m_lClosingTransactionNo(0) +{ + +} + +OTBasket::~OTBasket() +{ + ReleaseBasket(); +} + +void OTBasket::ReleaseBasket() +{ + BasketItem * pItem = NULL; + + m_RequestAccountID.Release(); + + while (!m_dequeItems.empty()) + { + pItem = m_dequeItems.front(); + m_dequeItems.pop_front(); + delete pItem; + } + + m_nSubCount = 0; + m_lMinimumTransfer = 0; + m_nTransferMultiple = 0; + m_bHideAccountID = false; + m_bExchangingIn = false; + m_lClosingTransactionNo = 0; +} + + + +bool OTBasket::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + diff --git a/OTLib/OTBasket.h b/OTLib/OTBasket.h new file mode 100644 index 000000000..914053914 --- /dev/null +++ b/OTLib/OTBasket.h @@ -0,0 +1,276 @@ +/************************************************************************************ + * + * OTBasket.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTBASKET_H__ +#define __OTBASKET_H__ + +#include +#include + +#include "OTIdentifier.h" +#include "OTContract.h" + + + +class BasketItem +{ +public: + OTIdentifier SUB_CONTRACT_ID; + OTIdentifier SUB_ACCOUNT_ID; + + long lMinimumTransferAmount; + + // lClosingTransactionNo: + // Used when EXCHANGING a basket (NOT USED when first creating one.) + // A basketReceipt must be dropped into each asset account during + // an exchange, to account for the change in balance. Until that + // receipt is accepted, lClosingTransactionNo will remain open as + // an issued transaction number (an open transaction) on that Nym. + // (One must be supplied for EACH asset account during an exchange.) + // + long lClosingTransactionNo; + + BasketItem(); + ~BasketItem() {} +}; + + + +typedef std::deque dequeOfBasketItems; + + +class OTBasket : public OTContract +{ +public: + +protected: + + int m_nSubCount; + long m_lMinimumTransfer; // used in the actual basket + + int m_nTransferMultiple; // used in a request basket. If non-zero, that means this is a request basket. + + OTIdentifier m_RequestAccountID; // used in a request basket so the server knows your acct ID. + + dequeOfBasketItems m_dequeItems; + + bool m_bHideAccountID; // When saving, we might wish to produce a version without Account IDs + // So that the resulting hash will be a consistent ID across different servers. + + bool m_bExchangingIn; // True if exchanging INTO the basket, False if exchanging OUT of the basket. + + long m_lClosingTransactionNo; // For the main (basket) account, in a request basket (for exchanges.) + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); +public: + OTBasket(); + OTBasket(int nCount, long lMinimumTransferAmount); + virtual ~OTBasket(); + + virtual void UpdateContents(); +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); + + virtual void CalculateContractID(OTIdentifier & newID); + + inline long GetMinimumTransfer() const { return m_lMinimumTransfer; } + + inline int GetTransferMultiple() const { return m_nTransferMultiple; } + inline void SetTransferMultiple(const int nTransferMultiple) { m_nTransferMultiple = nTransferMultiple; } + + inline bool GetExchangingIn() const { return m_bExchangingIn; } + inline void SetExchangingIn(const bool bDirection) { m_bExchangingIn = bDirection; } + + int Count() const; + BasketItem * At(unsigned int nIndex); + + long GetClosingTransactionNoAt(unsigned int nIndex); + + inline long GetClosingNum() const { return m_lClosingTransactionNo; } + inline void SetClosingNum(const long & lClosingNum) { m_lClosingTransactionNo = lClosingNum; } + + // For generating a real basket. The user does this part, and the server creates Account ID later + // (That's why you don't see the account ID being passed in to the method.) + void AddSubContract(const OTIdentifier & SUB_CONTRACT_ID, long lMinimumTransferAmount); + inline void IncrementSubCount() { m_nSubCount++; } // Used to abstract away this detail in the API. + + // For generating a user request to exchange in/out of a basket. + // Assumes that SetTransferMultiple has already been called. + void AddRequestSubContract(const OTIdentifier & SUB_CONTRACT_ID, + const OTIdentifier & SUB_ACCOUNT_ID, + const long & lClosingTransactionNo); + + inline void SetRequestAccountID(const OTIdentifier & theAccountID) { m_RequestAccountID = theAccountID; } + inline const OTIdentifier & GetRequestAccountID() { return m_RequestAccountID; } + + void ReleaseBasket(); +}; + + + + + +#endif // __OTBASKET_H__ + +/* + + I figured this one out, it's easy. + + Someone creates a contract that contains 10 sub-contracts. It just delegates the issuence to the sub-issuers. + + When he connects to the server he can upload the contract, but he has no control over it at that point, + since he is not one of the real issuers. + + The contract will only work if the sub-issuers actually have issued currencies on that transaction server. + + Then, the transaction server itself becomes the "issuer" of the basket currency. It simply creates an issuer + account, and stores a list of sub-accounts to store the delegated cuts of "real" currencies. + + For example, if I issue a currency that is 1 part dollar, 1 part gold, and 1 part silver, then the server + creates an issuer account in "goldbucks" and then ANY other user can create a "goldbucks" asset account and + trade it like any other asset. It doesn't even have to be a special account that the trader uses. It's just + a normal account, but the asset type ID links to the special basket issuer account maintained by the server. + + Meanwhile, behind the scenes, the server's "goldbucks" issuer account is not OTAccount, but derived from it. + suppose derived from OTAccount, that contains a list of 3 sub-accounts, 1 denominated in the dollar asset + specified in the contract, 1 denominiated in the gold asset, and so on. + + The OTAssetBasket contract (with sub-issuers) and the OTBasketAccount (issuer account) objects handle all the + details of converting between the sub-accounts and the main account. + + If I am trading in goldbucks, and I have 9 goldbucks in my goldbucks account, then the goldbucks issuer account + (controlled by the transaction server) must have at least -9 on its balance due to me. And its hidden 3 sub-accounts + have at least +3 dollars, +3 gold, and +3 silver stored along with the rest that make up their total balances from + all the users of that basket currency. + + */ + diff --git a/OTLib/OTCheque.cpp b/OTLib/OTCheque.cpp new file mode 100644 index 000000000..1789553be --- /dev/null +++ b/OTLib/OTCheque.cpp @@ -0,0 +1,371 @@ +/*************************************************************** + * + * OTCheque.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTCheque.h" +#include "OTLog.h" + + +void OTCheque::UpdateContents() +{ + OTString ASSET_TYPE_ID(GetAssetID()), SERVER_ID(GetServerID()), + SENDER_ACCT_ID(GetSenderAcctID()), SENDER_USER_ID(GetSenderUserID()), + RECIPIENT_USER_ID(m_RECIPIENT_USER_ID); + + long lFrom = GetValidFrom(), + lTo = GetValidTo(); + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + m_lAmount, + ASSET_TYPE_ID.Get(), + GetTransactionNum(), + SERVER_ID.Get(), + SENDER_ACCT_ID.Get(), + SENDER_USER_ID.Get(), + (m_bHasRecipient ? "true" : "false"), + (m_bHasRecipient ? RECIPIENT_USER_ID.Get() : ""), + lFrom, lTo ); + + if (m_strMemo.Exists() && m_strMemo.GetLength() > 2) + { + OTASCIIArmor ascMemo(m_strMemo); + m_xmlUnsigned.Concatenate("\n%s\n\n", ascMemo.Get()); + } + + m_xmlUnsigned.Concatenate("\n"); +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTCheque::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("cheque", xml->getNodeName())) + { + OTString strHasRecipient; + strHasRecipient = xml->getAttributeValue("hasRecipient"); + if (strHasRecipient.Compare("true")) + m_bHasRecipient = true; + else + m_bHasRecipient = false; + + m_strVersion = xml->getAttributeValue("version"); + m_lAmount = atol(xml->getAttributeValue("amount")); + + SetTransactionNum( atol(xml->getAttributeValue("transactionNum")) ); + + SetValidFrom(atol(xml->getAttributeValue("validFrom"))); + SetValidTo(atol(xml->getAttributeValue("validTo"))); + + OTString strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strServerID(xml->getAttributeValue("serverID")), + strSenderAcctID(xml->getAttributeValue("senderAcctID")), + strSenderUserID(xml->getAttributeValue("senderUserID")), + strRecipientUserID(xml->getAttributeValue("recipientUserID")); + OTIdentifier ASSET_ID(strAssetTypeID), SERVER_ID(strServerID), + SENDER_ACCT_ID(strSenderAcctID),SENDER_USER_ID(strSenderUserID); + SetAssetID(ASSET_ID); + SetServerID(SERVER_ID); + SetSenderAcctID(SENDER_ACCT_ID); + SetSenderUserID(SENDER_USER_ID); + + // Recipient ID -------- + if (m_bHasRecipient) + { + m_RECIPIENT_USER_ID.SetString(strRecipientUserID); + } + else + { + m_RECIPIENT_USER_ID.Release(); + } + + // --------------------- + + OTLog::vOutput(0, + "\n\nCheque Amount: %ld. Transaction Number: %ld\n Valid From: %d\n Valid To: %d\n" + " AssetTypeID: %s\n ServerID: %s\n" + " senderAcctID: %s\n senderUserID: %s\n " + " Has Recipient? %s. If yes, UserID of Recipient:\n%s\n", + m_lAmount, m_lTransactionNum, m_VALID_FROM, m_VALID_TO, + strAssetTypeID.Get(), strServerID.Get(), + strSenderAcctID.Get(), strSenderUserID.Get(), + (m_bHasRecipient ? "Yes" : "No"), + strRecipientUserID.Get()); + + nReturnVal = 1; + } + + else if (!strcmp("memo", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strMemo)) + { + OTLog::Error("Error in OTCheque::ProcessXMLNode: memo field without value.\n"); + return (-1); // error condition + } + + return 1; + } + + return nReturnVal; +} + + + +// Imagine that you are actually writing a cheque. +// That's basically what this function does. +// Make sure to sign it afterwards. +bool OTCheque::IssueCheque(const long & lAmount, const long & lTransactionNum, + const time_t & VALID_FROM, const time_t & VALID_TO, // The expiration date (valid from/to dates) of the cheque + const OTIdentifier & SENDER_ACCT_ID, // The asset account the cheque is drawn on. + const OTIdentifier & SENDER_USER_ID, // This ID must match the user ID on the asset account, + // AND must verify the cheque signature with that user's key. + const OTString & strMemo, // Optional memo field. + const OTIdentifier * pRECIPIENT_USER_ID/*=NULL*/) // Recipient optional. (Might be a blank cheque.) +{ + m_lAmount = lAmount; + m_strMemo = strMemo; + + SetValidFrom(VALID_FROM); + SetValidTo(VALID_TO); + + SetTransactionNum(lTransactionNum); + + SetSenderAcctID(SENDER_ACCT_ID); + SetSenderUserID(SENDER_USER_ID); + + if (NULL == pRECIPIENT_USER_ID) + { + m_bHasRecipient = false; + m_RECIPIENT_USER_ID.Release(); + } + else + { + m_bHasRecipient = true; + m_RECIPIENT_USER_ID = *pRECIPIENT_USER_ID; + } + + if (m_lAmount < 0) + m_strContractType.Set("INVOICE"); + + return true; +} + + +void OTCheque::InitCheque() +{ + m_strContractType.Set("CHEQUE"); + + m_lAmount = 0; + + m_bHasRecipient = false; +} + +OTCheque::OTCheque() : OTTrackable() +{ + InitCheque(); +} + +OTCheque::OTCheque(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTTrackable(SERVER_ID, ASSET_ID) +{ + InitCheque(); + + // m_ServerID and m_AssetTypeID are now in a grandparent class (OTInstrument) + // So they are initialized there now. +} + + +void OTCheque::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + m_strMemo.Release(); +// m_SENDER_ACCT_ID.Release(); // in parent class now. +// m_SENDER_USER_ID.Release(); // in parent class now. + m_RECIPIENT_USER_ID.Release(); + + OTTrackable::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything + InitCheque(); +} + +OTCheque::~OTCheque() +{ + // OTTrackable::~OTTrackable is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. +} + + +bool OTCheque::SaveContractWallet(std::ofstream & ofs) +{ + + return true; +} + diff --git a/OTLib/OTCheque.h b/OTLib/OTCheque.h new file mode 100644 index 000000000..384921c09 --- /dev/null +++ b/OTLib/OTCheque.h @@ -0,0 +1,228 @@ +/************************************************************************************ + * + * OTCheque.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_CHEQUE_H__ +#define __OT_CHEQUE_H__ + + +#include + + +#include "OTTrackable.h" +#include "OTIdentifier.h" +#include "OTString.h" + + + +class OTCheque : public OTTrackable +{ +protected: + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + long m_lAmount; + OTString m_strMemo; + OTIdentifier m_RECIPIENT_USER_ID;// Optional. If present, must match depositor's user ID. + bool m_bHasRecipient; + +public: + inline void SetAsVoucher() { m_strContractType = "VOUCHER"; } + inline OTString & GetMemo() { return m_strMemo; } + inline const long & GetAmount() const { return m_lAmount; } + inline OTIdentifier & GetRecipientUserID() { return m_RECIPIENT_USER_ID; } + inline bool HasRecipient() const { return m_bHasRecipient; } + + + // Calling this function is like writing a check... + bool IssueCheque(const long & lAmount, const long & lTransactionNum, + const time_t & VALID_FROM, const time_t & VALID_TO,// The expiration date (valid from/to dates) of the cheque + const OTIdentifier & SENDER_ACCT_ID, // The asset account the cheque is drawn on. + const OTIdentifier & SENDER_USER_ID, // This ID must match the user ID on the asset account, + // AND must verify the cheque signature with that user's key. + const OTString & strMemo, // Optional memo field. + const OTIdentifier * pRECIPIENT_USER_ID=NULL); // Recipient optional. (Might be a blank cheque.) + + // From OTTrackable (parent class of this) + /* + // A cheque can be written offline, provided you have a transaction + // number handy to write it with. (Necessary to prevent double-spending.) + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + */ + + // From OTInstrument (parent class of OTTrackable, parent class of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + */ + OTCheque(); + OTCheque(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + virtual ~OTCheque(); + + void InitCheque(); + virtual void Release(); + virtual void UpdateContents(); // Before transmission or serialization, this is where the token saves its contents + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + + +#endif // __OT_CHEQUE_H__ + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTContract.cpp b/OTLib/OTContract.cpp new file mode 100644 index 000000000..beb366311 --- /dev/null +++ b/OTLib/OTContract.cpp @@ -0,0 +1,2366 @@ +/************************************************************* + * + * OTContract.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +extern "C" +{ + + +#include +#include +#include +#include +#include +} + +#include +#include + +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTData.h" +#include "OTString.h" +#include "OTIdentifier.h" + +#include "OTStringXML.h" + + +#include "OTStorage.h" + +#include "OTPseudonym.h" +#include "OTContract.h" +#include "OTLog.h" + +#include "OTAgreement.h" +#include "OTPaymentPlan.h" +#include "OTTrade.h" +#include "OTOffer.h" +#include "OTAccount.h" +#include "OTCheque.h" +#include "OTMessage.h" +#include "OTLedger.h" +#include "OTTransaction.h" +#include "OTItem.h" +#include "OTMint.h" +#include "OTPurse.h" +#include "OTSignedFile.h" +#include "OTToken.h" +#include "OTServerContract.h" +#include "OTAssetContract.h" + + +// Factory (though rarely used; was just added recently for the API.) +// +// If you want to instantiate a contract that you already have in string form, +// this function will figure out what kind of contract it is, and instantiate the +// right subclass, then load it up and return it. +// +// CALLER IS RESPONSIBLE to cleanup! +// +OTContract * OTContract::InstantiateContract(OTString & strInputContract) +{ + static char buf[45] = ""; + + if (!strInputContract.Exists()) + return NULL; + + buf[0] = 0; // probably unnecessary. + strInputContract.reset(); // for sgets + bool bGotLine = strInputContract.sgets(buf, 40); + + if (!bGotLine) + return NULL; + + OTString strFirstLine(buf); + strInputContract.reset(); // set the "file" pointer within this string back to index 0. + + // Now I feel pretty safe -- the string I'm examining is within + // the first 45 characters of the beginning of the contract, and + // it will NOT contain the escape "- " sequence. From there, if + // it contains the proper sequence, I will instantiate that type. + if (!strFirstLine.Exists() || strFirstLine.Contains("- -")) + return NULL; + + // ----------------------------------------------------------- + + OTContract * pContract = NULL; + +// if (strFirstLine.Contains("-----BEGIN SIGNED AGREEMENT-----")) // this string is 32 chars long. +// { pContract = new OTAgreement(); OT_ASSERT(NULL != pContract); } + + if (strFirstLine.Contains("-----BEGIN SIGNED PAYMENT PLAN-----")) // this string is 35 chars long. + { pContract = new OTPaymentPlan(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED TRADE-----")) // this string is 28 chars long. + { pContract = new OTTrade(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED OFFER-----")) + { pContract = new OTOffer(); OT_ASSERT(NULL != pContract); } + + + else if (strFirstLine.Contains("-----BEGIN SIGNED INVOICE-----")) + { pContract = new OTCheque(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED VOUCHER-----")) + { pContract = new OTCheque(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED CHEQUE-----")) + { pContract = new OTCheque(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED MESSAGE-----")) + { pContract = new OTMessage(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED MINT-----")) + { pContract = new OTMint(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED FILE-----")) + { pContract = new OTSignedFile(); OT_ASSERT(NULL != pContract); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED CASH-----")) + { pContract = new OTToken(); OT_ASSERT(NULL != pContract); } + + + // The Purse object requires the asset type ID in order to be instantiated. + // I may remove this requirement (if possible) or not. +// +// else if (strFirstLine.Contains("-----BEGIN SIGNED PURSE-----")) +// { pContract = new OTPurse(); OT_ASSERT(NULL != pContract); } + + + // THESE OBJECTS REQUIRE YOU TO KNOW THE SERVER ID, USER ID, AND ACCT ID, + // IN ORDER TO GENERATE A NEW INSTANCE, OR TO LOAD AN EXISTING ONE. + // THUS, I AM REMOVING THEM FROM HERE FOR NOW. + // DONE: ADD A OTTransactionType class factory (like I did for CronItem) + // and then create these in there instead. + // +// else if (strFirstLine.Contains("-----BEGIN SIGNED ACCOUNT-----")) +// { pContract = new OTAccount(); OT_ASSERT(NULL != pContract); } +// else if (strFirstLine.Contains("-----BEGIN SIGNED LEDGER-----")) +// { pContract = new OTLedger(); OT_ASSERT(NULL != pContract); } +// +// else if (strFirstLine.Contains("-----BEGIN SIGNED TRANSACTION-----")) +// { pContract = new OTTransaction(); OT_ASSERT(NULL != pContract); } +// +// else if (strFirstLine.Contains("-----BEGIN SIGNED TRANSACTION ITEM-----")) +// { pContract = new OTItem(); OT_ASSERT(NULL != pContract); } +// + + + // TODO: Might want to clarify in Asset and Server Contracts, + // so I don't have to do this crap... The ones above are cleaner. + // + else if (strFirstLine.Contains("-----BEGIN SIGNED CONTRACT-----")) + { + if (strInputContract.Contains("")) + { pContract = new OTServerContract(); OT_ASSERT(NULL != pContract); } + else if (strInputContract.Contains("")) + { pContract = new OTAssetContract(); OT_ASSERT(NULL != pContract); } + } + + + // The string didn't match any of the options in the factory. + if (NULL == pContract) + OTLog::vOutput(0, "Object type not yet supported by class factory: %s\n", strFirstLine.Get()); + // Does the contract successfully load from the string passed in? + else if (false == pContract->LoadContractFromString(strInputContract)) + { + OTLog::vOutput(0, "Failed loading contract from string (first line): %s\n", strFirstLine.Get()); + delete pContract; + pContract = NULL; + } + else + return pContract; + + return NULL; +} + + +OTContract::OTContract() +{ + Initialize(); +} + +OTContract::OTContract(const OTString & name, const OTString & foldername, const OTString & filename, const OTString & strID) +{ + Initialize(); + + m_strName = name; + m_strFoldername = foldername; + m_strFilename = filename; + + m_ID.SetString(strID); +} + + + +OTContract::OTContract(const OTString & strID) +{ + Initialize(); + + m_ID.SetString(strID); +} + +OTContract::OTContract(const OTIdentifier & theID) +{ + Initialize(); + + m_ID = theID; +} + +void OTContract::Initialize() +{ + m_strContractType = "CONTRACT"; // CONTRACT, MESSAGE, TRANSACTION, LEDGER, TRANSACTION ITEM + // make sure subclasses set this in their own initialization routine. + + m_strSigHashType = OTIdentifier::DefaultHashAlgorithm; + m_strVersion = "1.0"; +} + + +// The name, filename, version, and ID loaded by the wallet +// are NOT released here, since they are used immediately after +// the Release() call in LoadContract(). Really I just want to +// "Release" the stuff that is about to be loaded, not the stuff +// that I need to load it! +void OTContract::Release() +{ + // !! Notice I don't release the m_strFilename here!! + // Because in LoadContract, we want to release all the members, and then load up from the file. + // So if I release the filename, now I can't load up from the file cause I just blanked it. DUh. + // + // m_strFilename.Release(); + + m_strSigHashType = OTIdentifier::DefaultHashAlgorithm; + m_xmlUnsigned.Release(); + m_strRawFile.Release(); + + ReleaseSignatures(); + + // Go through the existing list of nyms at this point, and delete them all. + while (!m_mapNyms.empty()) + { + OTPseudonym * pNym = m_mapNyms.begin()->second; + + OT_ASSERT(NULL != pNym); + + delete pNym; + pNym = NULL; + + m_mapNyms.erase(m_mapNyms.begin()); + } +} + + +OTContract::~OTContract() +{ + + Release(); +} + + + + +bool OTContract::SaveToContractFolder() +{ + OTString strFoldername(OTLog::ContractFolder()), strFilename; + + GetIdentifier(strFilename); + + // ------------------------------------- + // These are already set in SaveContract(), called below. +// m_strFoldername = strFoldername; +// m_strFilename = strFilename; + + OTLog::Output(2, "OTContract::SaveToContractFolder: Saving asset contract to disk...\n"); + + return SaveContract(strFoldername.Get(), strFilename.Get()); +} + + + + + +void OTContract::GetFilename(OTString & strFilename) +{ + strFilename = m_strFilename; +} + +void OTContract::GetIdentifier(OTIdentifier & theIdentifier) +{ + theIdentifier = m_ID; +} + +void OTContract::GetIdentifier(OTString & theIdentifier) +{ + m_ID.GetString(theIdentifier); +} + +// Make sure this contract checks out. Very high level. +// Verifies ID, existence of public key, and signature. +bool OTContract::VerifyContract() +{ + // Make sure that the supposed Contract ID that was set is actually + // a hash of the contract file, signatures and all. + if (false == VerifyContractID()) + { + OTLog::Output(1, "Failed verifying contract ID in OTContract::VerifyContract\n"); + return false; + } + + // Make sure we are able to read the official "contract" public key out of this contract. + const OTPseudonym * pNym = GetContractPublicNym(); + + if (NULL == pNym) + { + OTLog::Output(1, "Failed retrieving contract public nym from within contract, in OTContract::VerifyContract\n"); + return false; + } + + + if (false == VerifySignature(*pNym)) + { + OTLog::Output(1, "Failed verifying public key from contract with signature on contract.\n"); + return false; + } + + + OTLog::Output(1, "\nVerified -- The Contract ID from the wallet matches the newly-calculated hash of the contract file.\n" + "Verified -- A standard \"contract\" Public Key or x509 Cert WAS found inside the contract.\n" + "Verified -- And the **SIGNATURE VERIFIED** with THAT key.\n\n"); + return true; +} + + +void OTContract::CalculateContractID(OTIdentifier & newID) const +{ +// OTLog::vError("DEBUG CalculateContractID:\n--->%s<---\n", +// m_strRawFile.Get()); + + newID.CalculateDigest(m_strRawFile); +} + +bool OTContract::VerifyContractID() +{ + OTIdentifier newID; + + if (!newID.CalculateDigest(m_strRawFile)) + { + OTLog::Output(1, "Error calculating Contract digest.\n"); + return false; + } + + // newID now contains the Hash aka Message Digest aka Fingerprint + // aka thumbprint aka "IDENTIFIER" of the Contract. + // + // Now let's compare that identifier to the one already loaded by the wallet + // for this contract and make sure they MATCH. + + // I use the == operator here because there is no != operator at this time. + // That's why you see the ! outside the parenthesis. + if (!(m_ID == newID)) + { + OTString str1(m_ID), str2(newID); + + OTLog::vOutput(0, "\nHashes do NOT match in OTContract::VerifyContractID.\n%s\n%s\n" +// "\nRAW FILE:\n--->%s<---" + "\n", + str1.Get(), str2.Get() +// m_strRawFile.Get() + ); + return false; + } + else { + OTString str1; + newID.GetString(str1); + OTLog::vOutput(1, "\nContract ID *SUCCESSFUL* match to %s hash of contract file:\n%s\n\n", + OTIdentifier::DefaultHashAlgorithm.Get(), str1.Get()); + return true; + } +} + + +const OTPseudonym * OTContract::GetContractPublicNym() +{ + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG(NULL != pNym, "NULL pseudonym pointer in OTContract::GetContractPublicNym.\n"); + + if ((*ii).first == "contract") // TODO have a place for hardcoded values like this. + { // We're saying here that every contract has to have a key tag called "contract" + // where the official public key can be found for it and for any contract. + return pNym; + } + } + + return pNym; +} + + +// If there is a public key I can find for this contract, then +// I will return it here -- or NULL. +const OTAsymmetricKey * OTContract::GetContractPublicKey() +{ + OTPseudonym * pNym = NULL; + OTAsymmetricKey * pKey = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG(NULL != pNym, "NULL pseudonym pointer in OTContract::GetContractPublicKey.\n"); + + if ((*ii).first == "contract") // TODO have a place for hardcoded values like this. + { // We're saying here that every contract has a key tag called "contract" + // where the official public key can be found for it and for any contract. + pKey = (OTAsymmetricKey *) &(pNym->GetPublicKey()); + return (const OTAsymmetricKey *)pKey; + } + } + + return pKey; +} + + + + +/* +int main() +{ + verify("gserver.cer", "gserver.pem"); +} +int verify (char *certfile, char * keyfile) +{ + struct stat tStat; + int err; + int sig_len; + unsigned char sig_buf [4096]; + static char data[] = "I owe you..."; + + EVP_MD_CTX md_ctx; + EVP_PKEY * pkey = NULL; + FILE * fp; + X509 * x509 = NULL; + + printf ("verifyCert_N_Key: Certificate File %s\n", certfile); + printf ("verifyCert_N_Key: Key File %s\n", keyfile); + + // Just load the crypto library error strings, + /SSL_load_error_strings() loads the crypto AND the SSL ones + // SSL_load_error_strings(); + ERR_load_crypto_strings(); + + // Read private key + fp = fopen (keyfile, "r"); if (fp == NULL) exit (1); + pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL); + + fclose (fp); + + if (pkey == NULL) + { + return (-1); + } + + // Do the signature + EVP_SignInit (&md_ctx, EVP_md5()); + EVP_SignUpdate (&md_ctx, data, strlen(data)); + + sig_len = sizeof(sig_buf); + err = EVP_SignFinal (&md_ctx, sig_buf, (unsigned int *)&sig_len, + pkey); + + if (err != 1) { + return (-1); + } + + EVP_PKEY_free (pkey); + + // Read public key + printf ("Reading public key\n"); + fp = fopen (certfile, "r"); + + if (fp == NULL) + { + exit (1); + } + + x509 = PEM_read_X509(fp, NULL, NULL, NULL); + fclose (fp); + + if (x509 == NULL) + { + return (-1); + } + + fclose (fp); + + // Get public key - eay + printf ("Get public key\n"); + pkey=X509_get_pubkey(x509); + + if (pkey == NULL) + { + return (-1); + } + + printf ("After public key\n"); + + // Verify the signature + + EVP_VerifyInit (&md_ctx, EVP_md5()); + + EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data)); + + err = EVP_VerifyFinal (&md_ctx, sig_buf, sig_len, pkey); + EVP_PKEY_free (pkey); + + if (err != 1) + { + return (-1); + } + return 1; +} +*/ + +void OTContract::UpdateContents() +{ + // Deliberately left blank. + // + // Some child classes may need to perform work here + // (OTAccount and OTMessage, for example.) + // + // This function is called just prior to the signing of a contract. +} + + +// This is the one that you will most likely want to call. +// It actually attaches the resulting signature to this contract. +// If you want the signature to remain on the contract and be handled +// internally, then this is what you should call. +bool OTContract::SignContract(const OTPseudonym & theNym) +{ + bool bSigned = false; + OTSignature * pSig = NULL; + + OT_ASSERT_MSG(pSig = new OTSignature(), "Error allocating memory for Signature in OTContract::SignContract\n"); + + bSigned = SignContract(theNym, *pSig); + + if (bSigned) + m_listSignatures.push_back(pSig); + else + { + delete pSig; + pSig = NULL; + } + + return bSigned; +} + +// The output signature will be in theSignature. +// It is NOT attached to the contract. This is just a utility function. +bool OTContract::SignContract(const OTPseudonym & theNym, OTSignature & theSignature) +{ + return SignContract(theNym.GetPrivateKey(), theSignature, m_strSigHashType); +} + +// The output signature will be in theSignature. +// It is NOT attached to the contract. This is just a utility function. +bool OTContract::SignContract(const OTAsymmetricKey & theKey, OTSignature & theSignature, const OTString & strHashType) +{ + return SignContract(theKey.GetKey(), theSignature, strHashType); +} + + + + +// The default hashing algorithm in this software should be one that XOR combines two other, +// established and respected algorithms. In this case, we use the "SAMY" hash which is actually +// SHA512 XOR'd with WHIRLPOOL (also 512 in output). Credit to SAMY for the idea. +// +// This way if one is ever cracked, our system is still strong, and we can swap it out. +// Thus, I had to write this special function so that if the Default hash algorithm is the one +// chosen, ("SAMY") then we have to hash it twice using Hash1 (SHA512) and Hash2 (Whirlpool) +// before we encrypt it with the private key. +// +// Since the envelope (EVP) interface did not allow this, I had to Google everywhere to find +// lower-level code I could model. + +bool OTContract::SignContractDefaultHash(const EVP_PKEY * pkey, OTSignature & theSignature) +{ + bool bReturnValue = false; + + RSA* pRsaKey = NULL; + + unsigned char pDigest[256]; + unsigned char pOutputHash1[256]; + unsigned char pOutputHash2[256]; + unsigned int uDigest1Len = 64; + unsigned int uDigest2Len = 64; + + EVP_MD_CTX mdHash1_ctx, mdHash2_ctx; + + unsigned char EM [256]; // This stores the message digest, pre-encrypted, but with the padding added. + unsigned char pSignature[256]; + + int status = 0; + + memset(pDigest, 0, 256); + memset(pOutputHash1, 0, 256); + memset(pOutputHash2, 0, 256); + memset(EM, 0, 256); + memset(pSignature, 0, 256); + + + // Here, we convert the EVP_PKEY that was passed in, to an RSA key for signing. + pRsaKey = EVP_PKEY_get1_RSA(const_cast< EVP_PKEY* > (pkey)); + + if (!pRsaKey) + { + OTLog::vError("EVP_PKEY_get1_RSA failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + return false; + } + + // Since the idea of this special code is that we're using 2 hash algorithms, + // let's look them up and see what they are. + // addendum: unless we're on Android... then there's only 1 hash algorithm. + + + const EVP_MD * digest1 = OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm1); // SHA-512 + if (NULL == digest1) + { + OTLog::Error("Failure to load message digest algorithm in OTContract::SignContractDefaultHash\n"); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // hash the contents of the contract with HashAlgorithm1 (SHA-512) + EVP_MD_CTX_init (&mdHash1_ctx); + EVP_DigestInit (&mdHash1_ctx, digest1); + EVP_DigestUpdate (&mdHash1_ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); // input + EVP_DigestFinal (&mdHash1_ctx, pOutputHash1, &uDigest1Len); // output + EVP_MD_CTX_cleanup(&mdHash1_ctx); // cleanup + +#ifndef ANDROID + const EVP_MD * digest2 = OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm2); // WHIRLPOOL + if (NULL == digest2) + { + OTLog::Error("Failure to load message digest algorithm in OTContract::SignContractDefaultHash\n"); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // hash the same contents with HashAlgorithm2 (WHIRLPOOL) + EVP_MD_CTX_init (&mdHash2_ctx); + EVP_DigestInit (&mdHash2_ctx, digest2); + EVP_DigestUpdate (&mdHash2_ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); // Input + EVP_DigestFinal (&mdHash2_ctx, pOutputHash2, &uDigest2Len); // output + EVP_MD_CTX_cleanup(&mdHash2_ctx); // cleanup + + + // XOR the two together + for (unsigned int i = 0; i < (uDigest1Len > uDigest2Len ? uDigest2Len : uDigest1Len); i++) + { + pDigest[i] = ((pOutputHash1[i]) ^ (pOutputHash2[i])); + } +#else // ANDROID + for (int i = 0; i < uDigest1Len; i++) + { + pDigest[i] = (pOutputHash1[i]); + } +#endif // ANDROID + + // --------------------------------------------------------- + + // compute the PSS padded data + // the result goes into EM. + status = RSA_padding_add_PKCS1_PSS(pRsaKey, EM, pDigest, digest1, -2); //maximum salt length + if (!status) + { + OTLog::vError("RSA_padding_add_PKCS1_PSS failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // perform digital signature on EM, with result going into pSignature + status = RSA_private_encrypt(128, EM, pSignature, pRsaKey, RSA_NO_PADDING); + if (status == -1) + { + OTLog::vError("RSA_private_encrypt failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + OTData binSignature(pSignature, 128); // Todo stop hardcoding this block size. + + // theSignature that was passed in, now contains the final signature. + // The contents were hashed twice, and the resulting hashes were + // XOR'd together, and then padding was added, and then it was signed + // with the private key. + theSignature.SetData(binSignature, true); // true means, "yes, with newlines in the b64-encoded output, please." + bReturnValue = true; + + // --------------------------------------------------------- + + if (pRsaKey) + RSA_free(pRsaKey); + + pRsaKey = NULL; + + return bReturnValue; +} + + +// Verify a contract that has been signed with our own default algorithm (aka SAMY hash) +// Basically we had to customize for that algorithm since, by default, it XORs two different +// algorithms together (SHA512 and WHIRLPOOL) in anticipation of the day that one of them is +// broken. + +bool OTContract::VerifyContractDefaultHash(const EVP_PKEY * pkey, const OTSignature & theSignature) const +{ + bool bReturnValue = false; + + RSA* pRsaKey = NULL; + + unsigned char pDigest[256]; + unsigned char pOutputHash1[256]; + unsigned char pOutputHash2[256]; + unsigned int uDigest1Len = 64; + unsigned int uDigest2Len = 64; + + EVP_MD_CTX mdHash1_ctx, mdHash2_ctx; + + unsigned char pDecrypted[256]; + + int status = 0; + + memset(pDigest, 0, 256); + memset(pOutputHash1, 0, 256); + memset(pOutputHash2, 0, 256); + memset(pDecrypted, 0, 256); + + + // Here, we convert the EVP_PKEY that was passed in, to an RSA key for signing. + pRsaKey = EVP_PKEY_get1_RSA((EVP_PKEY*)pkey); + + if (!pRsaKey) + { + OTLog::vError("EVP_PKEY_get1_RSA failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + return false; + } + + // Since the idea of this special code is that we're using 2 hash algorithms, + // let's look them up and see what they are. + const EVP_MD * digest1 = OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm1); // SHA-512 + if (NULL == digest1) + { + OTLog::Error("Failure to load message digest algorithm in OTContract::VerifyContractDefaultHash\n"); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // hash the contents of the contract with HashAlgorithm1 (SHA-512) + EVP_MD_CTX_init (&mdHash1_ctx); + EVP_DigestInit (&mdHash1_ctx, digest1); + EVP_DigestUpdate (&mdHash1_ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); // input + EVP_DigestFinal (&mdHash1_ctx, pOutputHash1, &uDigest1Len); // output + EVP_MD_CTX_cleanup(&mdHash1_ctx); // cleanup + +#ifndef ANDROID + const EVP_MD * digest2 = OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm2); // WHIRLPOOL + if (NULL == digest2) + { + OTLog::Error("Failure to load message digest algorithm in OTContract::VerifyContractDefaultHash\n"); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // hash the same contents with HashAlgorithm2 (WHIRLPOOL) + EVP_MD_CTX_init (&mdHash2_ctx); + EVP_DigestInit (&mdHash2_ctx, digest2); + EVP_DigestUpdate (&mdHash2_ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); // Input + EVP_DigestFinal (&mdHash2_ctx, pOutputHash2, &uDigest2Len); // output + EVP_MD_CTX_cleanup(&mdHash2_ctx); // cleanup + + // XOR the two together + for (unsigned int i = 0; i < (uDigest1Len > uDigest2Len ? uDigest2Len : uDigest1Len); i++) + { + pDigest[i] = ((pOutputHash1[i]) ^ (pOutputHash2[i])); + } +#else // ANDROID + for (int i = 0; i < uDigest1Len; i++) + { + pDigest[i] = (pOutputHash1[i]); + } +#endif // ANDROID + + // Now we have the exact content in pDigest that we should also see if we decrypt + // the signature that was passed in. + // + // --------------------------------------------------------- + + OTData binSignature; + + // now binSignature will contain the base64 decoded binary of the signature that we're verifying. + // Unless the call fails of course... + if ((theSignature.GetLength() < 10) || !theSignature.GetData(binSignature)) + { + OTLog::Error("Error decoding base64 data for Signature in OTContract::VerifyContractDefaultHash.\n"); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // now we will verify the signature + // Start by a RAW decrypt of the signature + // output goes to pDecrypted + // todo stop hardcoding here. + status = RSA_public_decrypt(128, (const unsigned char*)binSignature.GetPointer(), pDecrypted, pRsaKey, RSA_NO_PADDING); + if (status == -1) + { + OTLog::vError("RSA_public_decrypt failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // verify the data + // Now it compares pDecrypted with pDigest which we calculated above. (They SHOULD be the same.) + status = RSA_verify_PKCS1_PSS(pRsaKey, pDigest, digest1, pDecrypted, -2); // salt length recovered from signature + if (status == 1) + { + OTLog::Output(5, " *Signature verified*\n"); + bReturnValue = true; + } + else + { + OTLog::vOutput(5, "RSA_verify_PKCS1_PSS failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + RSA_free(pRsaKey); pRsaKey = NULL; + return false; + } + + // --------------------------------------------------------- + + if (pRsaKey) + RSA_free(pRsaKey); + pRsaKey = NULL; + + return bReturnValue; +} + + +/* + const OTString OTIdentifier::DefaultHashAlgorithm("SAMY"); + + const OTString OTIdentifier::HashAlgorithm1("SHA512"); + const OTString OTIdentifier::HashAlgorithm2("WHIRLPOOL"); +*/ + + +// All the other various versions eventually call this one, where the actual work is done. +bool OTContract::SignContract(const EVP_PKEY * pkey, OTSignature & theSignature, const OTString & strHashType) +{ + int err, sig_len; + unsigned char sig_buf [4096]; // Safe since we pass the size when we use it. + EVP_MD_CTX md_ctx; + + OTString strDoubleHash; + + OT_ASSERT_MSG(NULL != pkey, "Null private key sent to OTContract::SignContract.\n"); + + + // Update the contents, (not always necessary, many contracts are read-only) + // This is where we provide an overridable function for the child classes that + // need to update their contents at this point. + // But the OTContract version of this function is actually empty, since the + // default behavior is that contract contents don't change. + // (Accounts and Messages being two big exceptions.) + UpdateContents(); + + // Are we using the special SAMY hash? In which case, we have to actually combine two signatures. + const bool bUsesDefaultHashAlgorithm = strHashType.Compare(OTIdentifier::DefaultHashAlgorithm); + EVP_MD * md = NULL; + + // SAMY hash. (The "default" hash.) + if (bUsesDefaultHashAlgorithm) + { +// OTIdentifier hash1, hash2; +// +// hash1.CalculateDigest(m_xmlUnsigned, OTIdentifier::HashAlgorithm1); +// hash2.CalculateDigest(m_xmlUnsigned, OTIdentifier::HashAlgorithm2); +// +// hash1.XOR(hash2); +// hash1.GetString(strDoubleHash); +// +// md = (EVP_MD *)OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm1); + return SignContractDefaultHash(pkey, theSignature); + } +// else + { + md = (EVP_MD *)OTIdentifier::GetOpenSSLDigestByName(strHashType); + } + + + // If it's not the default hash, then it's just a normal hash. + // Either way then we process it, first by getting the message digest pointer for signing. + + if (NULL == md) + { + OTLog::vError("Unable to decipher Hash algorithm in OTContract::SignContract: %s\n", + strHashType.Get()); + return false; + } + + // Do the signature + EVP_SignInit (&md_ctx, md); + +// if (bUsesDefaultHashAlgorithm) +// { +// EVP_SignUpdate (&md_ctx, strDoubleHash.Get(), strDoubleHash.GetLength()); +// } +// else + { + EVP_SignUpdate (&md_ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); + } + + + sig_len = sizeof(sig_buf); + err = EVP_SignFinal (&md_ctx, sig_buf, (unsigned int *)&sig_len, (EVP_PKEY *)pkey); + + if (err != 1) + { + OTLog::Error("Error signing xml contents in OTContract::SignContract.\n"); + return false; + } + else { + OTLog::Output(3, "Successfully signed xml contents.\n"); + + // We put the signature data into the signature object that + // was passed in for that purpose. + OTData tempData; + tempData.Assign(sig_buf, sig_len); + theSignature.SetData(tempData); + + return true; + } +} + + +// All the other various versions eventually call this one, where the actual work is done. +bool OTContract::VerifySignature(const EVP_PKEY * pkey, const OTSignature & theSignature, const OTString & strHashType) const +{ + OTString strDoubleHash; + + OT_ASSERT_MSG(NULL != pkey, "Null key in OTContract::VerifySignature.\n"); + + // Are we using the special SAMY hash? In which case, we have to actually combine two hashes. + const bool bUsesDefaultHashAlgorithm = strHashType.Compare(OTIdentifier::DefaultHashAlgorithm); + EVP_MD * md = NULL; + + if (bUsesDefaultHashAlgorithm) + { +// OTIdentifier hash1, hash2; +// +// hash1.CalculateDigest(m_xmlUnsigned, OTIdentifier::HashAlgorithm1); +// hash2.CalculateDigest(m_xmlUnsigned, OTIdentifier::HashAlgorithm2); +// +// hash1.XOR(hash2); +// hash1.GetString(strDoubleHash); +// +// md = (EVP_MD *)OTIdentifier::GetOpenSSLDigestByName(OTIdentifier::HashAlgorithm1); + return VerifyContractDefaultHash(pkey, theSignature); + } +// else + { + md = (EVP_MD *)OTIdentifier::GetOpenSSLDigestByName(strHashType); + } + + if (!md) + { + OTLog::vOutput(1, "Unknown message digest algorithm in OTContract::VerifySignature: %s\n", + strHashType.Get()); + return false; + } + + OTData binSignature; + + // now binSignature contains the base64 decoded binary of the signature. + // Unless the call failed of course... + if (!theSignature.GetData(binSignature)) + { + OTLog::Error("Error decoding base64 data for Signature in OTContract::VerifySignature.\n"); + return false; + } + + + EVP_MD_CTX ctx; + EVP_MD_CTX_init(&ctx); + + EVP_VerifyInit(&ctx, md); + + // Here I'm adding the actual XML portion of the contract (the portion that gets signed.) + // Basically we are repeating similarly to the signing process in order to verify. + +// if (bUsesDefaultHashAlgorithm) +// { +// EVP_VerifyUpdate(&ctx, strDoubleHash.Get(), strDoubleHash.GetLength()); +// } +// else + { + EVP_VerifyUpdate(&ctx, m_xmlUnsigned.Get(), m_xmlUnsigned.GetLength()); + } + + + // Now we pass in the Signature + // EVP_VerifyFinal() returns 1 for a correct signature, 0 for failure and -1 if some other error occurred. + int nErr = EVP_VerifyFinal(&ctx, (const unsigned char *)binSignature.GetPointer(), + (unsigned int)binSignature.GetSize(), (EVP_PKEY *)pkey); + + EVP_MD_CTX_cleanup(&ctx); + + // the moment of true. 1 means the signature verified. + if (1 == nErr) + return true; + else + return false; +} + + + +// Sign the Contract using a private key from a file. +// theSignature will contain the output. +bool OTContract::SignContract(const char * szFoldername, const char * szFilename, OTSignature & theSignature) +{ + OT_ASSERT(NULL != szFoldername); + OT_ASSERT(NULL != szFilename); + + EVP_PKEY * pkey = NULL; + + /* + BIO *bio = BIO_new( BIO_s_file() ); + + OT_ASSERT(NULL != bio); + + BIO_read_filename( bio, szFilename ); + */ + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTContract::SignContract: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTContract::SignContract: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + // Create a new memory buffer on the OpenSSL side + BIO * bio = BIO_new_mem_buf((void*)strFileContents.c_str(), strFileContents.length()); +// BIO *bio = BIO_new(BIO_s_mem()); + OT_ASSERT(NULL != bio); + //BIO_puts(bmem, Get()); + +// int nPutsResult = BIO_puts(bio, strFileContents.c_str()); + + // -------------------------------------------------------------------- + +// if (nPutsResult > 0) + { + pkey = PEM_read_bio_PrivateKey( bio, NULL, NULL, NULL ); + + if (NULL == pkey) + { + OTLog::Error("Error reading private key from BIO in OTContract::SignContract.\n"); + BIO_free_all(bio); + return false; + } + + bool bSigned = SignContract(pkey, theSignature, m_strSigHashType); + + EVP_PKEY_free (pkey); pkey = NULL; + BIO_free_all(bio); + + return bSigned; + } + + BIO_free_all(bio); + return false; +} + + +void OTContract::ReleaseSignatures() +{ + OTSignature * pSig = NULL; + + while (!m_listSignatures.empty()) + { + pSig = m_listSignatures.front(); + m_listSignatures.pop_front(); + delete pSig; pSig=NULL; + } +} + + +bool OTContract::VerifySignature(const OTPseudonym & theNym) +{ + OTSignature * pSig = NULL; + + for (listOfSignatures::iterator ii = m_listSignatures.begin(); + ii != m_listSignatures.end(); ++ii) + { + pSig = *ii; + + OT_ASSERT(NULL != pSig); + + if (VerifySignature(theNym, *pSig)) + return true; + } + + return false; +} + + +// The only different between calling this with a Nym and calling it with an Asymmetric Key is that +// the key gives you the choice of hash algorithm, whereas the nym version uses m_strHashType to decide +// for you. Choose the function you prefer, you can do it either way. +bool OTContract::VerifySignature(const OTPseudonym & theNym, const OTSignature & theSignature) const +{ + return VerifySignature(theNym.GetPublicKey(), theSignature, m_strSigHashType); +} + +/* + openssl dgst -sha1 \ + -sign clientkey.pem \ + -out cheesy2.sig \ + cheesy2.xml + + openssl dgst -sha1 \ + -verify clientcert.pem \ + -signature cheesy2.sig \ + cheesy2.xml + + + +openssl x509 -in clientcert.pem -pubkey -noout > clientpub.pem + + Then verification using the public key works as expected: + +openssl dgst -sha1 -verify clientpub.pem -signature cheesy2.sig cheesy2.xml + + Verified OK + + + openssl enc -base64 -out cheesy2.b64 cheesy2.sig + + */ + +bool OTContract::VerifySignature(const OTAsymmetricKey & theKey, const OTSignature & theSignature, const OTString & strHashType) const +{ + return VerifySignature(theKey.GetKey(), theSignature, strHashType); +} + + + +// Presumably the Signature passed in here was just loaded as part of this contract and is +// somewhere in m_listSignatures. Now it is being verified. +bool OTContract::VerifySignature(const char * szFoldername, const char * szFilename, const OTSignature & theSignature) const +{ + OT_ASSERT_MSG(NULL != szFoldername, "Null foldername pointer passed to OTContract::VerifySignature"); + OT_ASSERT_MSG(NULL != szFilename, "Null filename pointer passed to OTContract::VerifySignature"); + +// FILE * fp = NULL; + X509 * x509 = NULL; + EVP_PKEY * pkey = NULL; + + // Read public key + OTLog::Output(2, "Reading public key from certfile in order to verify signature...\n"); + + /* + BIO * bio = BIO_new( BIO_s_file() ); + OT_ASSERT(NULL != bio); + BIO_read_filename( bio, szFilename ); + */ + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTContract::VerifySignature: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTContract::VerifySignature: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + // Create a new memory buffer on the OpenSSL side + BIO * bio = BIO_new_mem_buf((void*)strFileContents.c_str(), strFileContents.length()); +// BIO *bio = BIO_new(BIO_s_mem()); + OT_ASSERT(NULL != bio); + //BIO_puts(bmem, Get()); + +// int nPutsResult = BIO_puts(bio, strFileContents.c_str()); + + // -------------------------------------------------------------------- +// if (nPutsResult <= 0) +// { +// BIO_free_all(bio); +// return false; +// } + + x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); + BIO_free_all(bio); + + // -------------------------- + + if (x509 == NULL) + { + OTLog::vError("OTContract::VerifySignature: Failed reading x509 out of cert file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + bool bVerifySig = false; + + pkey = X509_get_pubkey(x509); + + if (pkey == NULL) + { + OTLog::vError("OTContract::VerifySignature: Failed reading public key from x509 from certfile: %s\n", szFilename); + } + else + { + bVerifySig = VerifySignature(pkey, theSignature, m_strSigHashType); + EVP_PKEY_free(pkey); pkey = NULL; + } + + // At some point have to call this + X509_free(x509); x509 = NULL; + + return bVerifySig; +} + + +bool OTContract::DisplayStatistics(OTString & strContents) const +{ + // Subclasses may override this. + strContents.Concatenate((char*)"ERROR: OTContract::DisplayStatistics was called instead of a subclass...\n"); + + return false; +} + + +bool OTContract::SaveContractWallet(OTString & strContents) const +{ + // Subclasses may use this. + + return false; +} + + +bool OTContract::SaveContents(std::ofstream & ofs) const +{ + ofs << m_xmlUnsigned.Get(); + + return true; +} + +// Saves the unsigned XML contents to a string +bool OTContract::SaveContents(OTString & strContents) const +{ + strContents.Concatenate(m_xmlUnsigned.Get()); + + return true; +} + + +/* + bool OTContract::SaveContents(FILE * fl) const + { + if (fl) + fprintf(fl, "%s", m_xmlUnsigned.Get()); + + return true; + } + */ + + + +// Save the contract member variables into the m_strRawFile variable + +bool OTContract::SaveContract() +{ + m_strRawFile.Release(); + + return SaveContract(m_strRawFile); +} + + +// Make sure you escape any lines that begin with dashes using "- " +// So "---BEGIN " at the beginning of a line would change to: "- ---BEGIN" +// This function expects that's already been done. +// This function assumes there is only unsigned contents, and not a signed contract. +// This function is intended to PRODUCE said signed contract. +bool OTContract::CreateContract(OTString & strContract, OTPseudonym & theSigner) +{ + Release(); + + m_xmlUnsigned = strContract; + + // This function assumes that m_xmlUnsigned is ready to be processed. + // This function only processes that portion of the contract. + bool bLoaded = LoadContractXML(); + + if (bLoaded) + { + SignContract(theSigner); + SaveContract(); + + OTIdentifier NEW_ID; + CalculateContractID(NEW_ID); + m_ID = NEW_ID; + + return true; + } + + return false; +} + + +bool OTContract::SaveContract(OTString & strContract) +{ + // --------------------------------------------------------------- + + strContract.Concatenate("-----BEGIN SIGNED %s-----\nHash: %s\n\n", + m_strContractType.Get(), m_strSigHashType.Get()); + + // --------------------------------------------------------------- + + SaveContents(strContract); + + // --------------------------------------------------------------- + + OTSignature * pSig = NULL; + + for (listOfSignatures::iterator ii = m_listSignatures.begin(); + ii != m_listSignatures.end(); ++ii) + { + pSig = *ii; + + OT_ASSERT(NULL != pSig); + + strContract.Concatenate("-----BEGIN %s SIGNATURE-----\n" + "Version: Open Transactions %s\n" + "Comment: http://github.com/FellowTraveler/Open-Transactions/wiki\n\n", + m_strContractType.Get(), OTLog::Version()); + strContract.Concatenate("%s", pSig->Get()); + strContract.Concatenate("-----END %s SIGNATURE-----\n\n", m_strContractType.Get()); + } + + // --------------------------------------------------------------- + + return true; +} + + + + +bool OTContract::SaveContract(const char * szFoldername, const char * szFilename) +{ + OT_ASSERT_MSG(NULL != szFilename, "Null filename sent to OTContract::SaveContract\n"); + OT_ASSERT_MSG(NULL != szFoldername, "Null foldername sent to OTContract::SaveContract\n"); + + m_strFoldername.Set(szFoldername); + m_strFilename.Set(szFilename); + + OT_ASSERT(m_strFoldername.GetLength() > 2); + OT_ASSERT(m_strFilename.GetLength() > 2); + + // -------------------------------------------------------------------- + OTString strFinal; + SaveContract(strFinal); + + bool bSaved = OTDB::StorePlainString(strFinal.Get(), szFoldername, szFilename); + + if (!bSaved) + { + OTLog::vError("OTContract::SaveContract: Error saving file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- +/* + std::ofstream ofs(szFilename, std::ios::binary); + + if (ofs.fail()) + { + OTLog::vError("Error opening file in OTContract::SaveContract: %s\n", szFilename); + return false; + } + + ofs.clear(); + + OTString strFinal; + SaveContract(strFinal); + + ofs << strFinal.Get(); + ofs.close(); + */ + // -------- + + /* + fprintf(fl, "%s", strFinal.Get()); + fclose(fl); + */ + + return true; +} + + + +// Just like it says. If you have a contract in string form, pass it in +// here to import it. +bool OTContract::LoadContractFromString(const OTString & theStr) +{ + Release(); + + // This populates the internal "raw file" member as if we had actually read it from a file. + m_strRawFile = theStr; + + // This populates m_xmlUnsigned with the contents of m_strRawFile (minus bookends, signatures, etc. JUST the XML.) + bool bSuccess = ParseRawFile(); // It also parses into the various member variables. + + // If it was a success, save back to m_strRawFile again so + // the format is consistent and hashes will calculate properly. + if (bSuccess) + { + // Basically we take the m_xmlUnsigned that we parsed out of the raw file before, + // then we use that to generate the raw file again, re-attaching the signatures. + // This function does that. + SaveContract(); + } + + return bSuccess; +} + + + + + + + +// The entire Raw File, signatures and all, is used to calculate the hash +// value that becomes the ID of the contract. If you change even one letter, +// then you get a different ID. +// This applies to all contracts except accounts, since their contents must +// change periodically, their ID is not calculated from a hash of the file, +// but instead is chosen at random when the account is created. +bool OTContract::LoadContractRawFile() +{ + const char * szFoldername = m_strFoldername.Get(); + const char * szFilename = m_strFilename.Get(); + + if (!m_strFoldername.Exists() || !m_strFilename.Exists()) + return false; + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTContract::LoadContractRawFile: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTContract::LoadContractRawFile: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- +/* + std::ifstream in(m_strFilename.Get(), std::ios::binary); + + if (in.fail()) + { + OTLog::vError("Error opening file in OTContract::LoadContractRawFile: %s\n", + m_strFilename.Get()); + return false; + } + + std::stringstream buffer; + buffer << in.rdbuf(); + + std::string contents(buffer.str()); +*/ + m_strRawFile = strFileContents.c_str(); + + if (m_strRawFile.GetLength()) + return true; + else + return false; +} + + +bool OTContract::LoadContract(const char * szFoldername, const char * szFilename) +{ + Release(); + + m_strFoldername.Set(szFoldername); + m_strFilename.Set(szFilename); + + // -------------------------------------------- + /* + if (false == OTLog::ConfirmExactPath(m_strFilename.Get())) + { + OTLog::vOutput(3, "LoadContract: File does not exist: %s\n", m_strFilename.Get()); + return false; + } + */ + // -------------------------------------------- + + // opens m_strFilename and reads into m_strRawFile + if (LoadContractRawFile()) + return ParseRawFile(); // Parses m_strRawFile into the various member variables. + else + { + OTLog::vError("Failed loading raw contract file: %s%s%s\n", + m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + } + + return false; +} + + +// assumes m_strFilename is already set. +// Then it reads that file into a string. +// Then it parses that string into the object. +bool OTContract::LoadContract() +{ + Release(); + LoadContractRawFile(); // opens m_strFilename and reads into m_strRawFile + + return ParseRawFile(); // Parses m_strRawFile into the various member variables. +} + + +bool OTContract::ParseRawFile() +{ + char buffer1[2100]; // a bit bigger than 2048, just for safety reasons. + OTSignature * pSig = NULL; + + std::string line; + + bool bSignatureMode = false; // "currently in signature mode" + bool bContentMode = false; // "currently in content mode" + bool bHaveEnteredContentMode = false; // "have yet to enter content mode" + + if (!m_strRawFile.GetLength()) + { + OTLog::vError("Empty m_strRawFile in OTContract::ParseRawFile. Filename: %s%s%s.\n", + m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + return false; + } + + bool bIsEOF = false; + m_strRawFile.reset(); + + do + { + // Just a fresh start at the top of the loop block... probably unnecessary. + memset(buffer1, 0, 2100); + + // the call returns true if there's more to read, and false if there isn't. + bIsEOF = !(m_strRawFile.sgets(buffer1, 2048)); +// bIsEOF = fin.getline(buffer1, 2048).eof(); + + line = buffer1; + const char * pConstBuf = line.c_str(); + char * pBuf = (char *)pConstBuf; + + + if (line.length() < 2) + { + if (bSignatureMode) + continue; + } + + // if we're on a dashed line... + else if (line.at(0) == '-') + { + if (bSignatureMode) + { + // we just reached the end of a signature + // OTLog::vError("%s\n", pSig->Get()); + pSig = NULL; + bSignatureMode = false; + continue; + } + + // if I'm NOT in signature mode, and I just hit a dash, that means there + // are only four options: + + // a. I have not yet even entered content mode, and just now entering it for the first time. + if (!bHaveEnteredContentMode) + { + if ((line.length() > 3) && + (line.find("BEGIN")!=std::string::npos) && + line.at(1) == '-' && + line.at(2) == '-' && + line.at(3) == '-') + { +// OTLog::Error("\nProcessing contract... \n"); + bHaveEnteredContentMode = true; + bContentMode = true; + continue; + } + else + { + continue; + } + + } + + // b. I am now entering signature mode! + else if (line.length() > 3 && line.find("SIGNATURE")!=std::string::npos && line.at(1) == '-' && line.at(2) == '-' && line.at(3) == '-') + { + //if (bContentMode) + // OTLog::Output(3, "Finished reading contract.\n\nReading a signature at the bottom of the contract...\n"); + //else + // OTLog::Output(3, "Reading another signature...\n"); + + bSignatureMode = true; + bContentMode = false; + + pSig = new OTSignature(); + + OT_ASSERT_MSG(NULL != pSig, "Error allocating memory for Signature in OTContract::ParseRawFile\n"); + + m_listSignatures.push_back(pSig); + + continue; + } + // c. There is an error in the file! + else if (line.length() < 3 || line.at(1) != ' ' || line.at(2) != '-') + { + OTLog::vOutput(0, "Error in contract %s: a dash at the beginning of the " + "line should be followed by a space and another dash:\n%s\n", + m_strFilename.Get(), m_strRawFile.Get()); + return false; + } + // d. It is an escaped dash, and therefore kosher, so I merely remove the escape and add it. + else + ; // I've decided not to remove the dashes but to keep them as part of the signed content. + // It's just much easier to deal with that way. The input code will insert the extra dashes. + //pBuf += 2; + } + + // Else we're on a normal line, not a dashed line. + else + { + if (bHaveEnteredContentMode) + { + if (bSignatureMode) + { + if (line.length()<2 || + line.compare(0,8,"Version:") == 0 || + line.compare(0,8,"Comment:") == 0 + ) + { + OTLog::Output(2, "Skipping version section...\n"); + + if (!m_strRawFile.sgets(buffer1, 2048)) + { + OTLog::vOutput(0, "Error in signature for contract %s: Unexpected EOF after \"Version:\"\n", m_strFilename.Get()); + return false; + } + + continue; + } + } + if (bContentMode) + { + if (line.compare(0,6,"Hash: ") == 0) + { + OTLog::Output(2, "Collecting message digest algorithm from contract header...\n"); + + std::string strTemp = line.substr(6); + m_strSigHashType = strTemp.c_str(); + m_strSigHashType.ConvertToUpperCase(); + + if (!m_strRawFile.sgets(buffer1, 2048)) + { + OTLog::vOutput(0, "Error in contract %s: Unexpected EOF after \"Hash:\"\n", m_strFilename.Get()); + return false; + } + continue; + } + } + } + } + + if (bSignatureMode) + { + OT_ASSERT_MSG(NULL != pSig, "Error: Null Signature pointer WHILE processing signature, in OTContract::ParseRawFile"); + + pSig->Concatenate("%s\n", pBuf); + } + else if (bContentMode) + m_xmlUnsigned.Concatenate("%s\n", pBuf); + } + while(!bIsEOF); + // while(!bIsEOF && (!bHaveEnteredContentMode || bContentMode || bSignatureMode)); + + + /* + OTSignature theSignature; + SignContract("clientkey.pem", theSignature); + + FILE * tf = fopen("output.txt", "w"); + + fprintf(tf, "-----BEGIN CONTRACT SIGNATURE-----\n%s-----END CONTRACT SIGNATURE-----\n", + theSignature.Get()); + fclose(tf); + */ + + if (!bHaveEnteredContentMode) + { + OTLog::Error("Error in OTContract::ParseRawFile: Found no BEGIN for signed content.\n"); + return false; + } + else if (bContentMode) + { + OTLog::Error("Error in OTContract::ParseRawFile: EOF while reading xml content.\n"); + return false; + } + else if (bSignatureMode) + { + OTLog::Error("Error in OTContract::ParseRawFile: EOF while reading signature.\n"); + return false; + } + else if (!LoadContractXML()) + { + OTLog::Error("Error in OTContract::ParseRawFile: unable to load XML portion of contract into memory.\n"); + return false; + } + // Verification code and loading code are now called separately. +// else if (!VerifyContractID()) +// { +// OTLog::Error("Error in OTContract::ParseRawFile: Contract ID does not match hashed contract file.\n"); +// return false; +// } + else + { + return true; + } +} + + + +// This function assumes that m_xmlUnsigned is ready to be processed. +// This function only processes that portion of the contract. +bool OTContract::LoadContractXML() +{ + int retProcess = 0; + + if (!m_xmlUnsigned.Exists()) + { + return false; + } + + IrrXMLReader* xml = createIrrXMLReader(&m_xmlUnsigned); + + OT_ASSERT_MSG(NULL != xml, "Memory allocation issue with xml reader in OTContract::LoadContractXML()\n"); + + // parse the file until end reached + while(xml && xml->read()) + { + switch(xml->getNodeType()) + { + case EXN_NONE: + case EXN_COMMENT: + case EXN_ELEMENT_END: + case EXN_CDATA: + break; + + case EXN_TEXT: + { + // unknown element type + OTLog::vError( "unknown text element type in OTContract::LoadContractXML: %s, value: %s\n", + xml->getNodeName(), xml->getNodeData()); + } + break; + case EXN_ELEMENT: + { + retProcess = ProcessXMLNode(xml); + + // an error was returned. file format or whatever. + if ((-1) == retProcess) + { + return false; + } + // No error, but also the node wasn't found... + else if (0 == retProcess) + { + // unknown element type + OTLog::vError("UNKNOWN element type in OTContract::LoadContractXML: %s, value: %s\n", + xml->getNodeName(), xml->getNodeData()); + } + // else if 1 was returned, that means the node was processed. + } + break; + default: + { + } + continue; + + } + } + + if (NULL != xml) + { + delete xml; + xml = NULL; + } + + return true; +} + + +// ------------------------------------------------------------- + +// Loads it up and also decodes it to a string. +bool OTContract::LoadEncodedTextField(IrrXMLReader*& xml, OTString & strOutput) +{ + OTASCIIArmor ascOutput; + + if (LoadEncodedTextField(xml, ascOutput) && ascOutput.GetLength() > 2) + { + return ascOutput.GetString(strOutput, true); // linebreaks = true + } + + return false; +} + +// Loads it up and keeps it encoded in an ascii-armored object. +bool OTContract::LoadEncodedTextField(IrrXMLReader*& xml, OTASCIIArmor & ascOutput) +{ + // go to the next node and read the text. + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + OTString strNodeData = xml->getNodeData(); + + // Sometimes the XML reads up the data with a prepended newline. + // This screws up my own objects which expect a consistent in/out + // So I'm checking here for that prepended newline, and removing it. + char cNewline; + if (strNodeData.Exists() && strNodeData.GetLength() > 2 && strNodeData.At(0, cNewline)) + { + if ('\n' == cNewline) + { + ascOutput.Set(strNodeData.Get() + 1); + } + else + { + ascOutput.Set(strNodeData.Get()); + } + + xml->read(); // THIS PUTS us on the CLOSING TAG. + + return true; + } + } + + return false; +} + +// --------------- + + +// Loads it up and also decodes it to a string. +bool OTContract::LoadEncodedTextFieldByName(IrrXMLReader*& xml, OTString & strOutput, const char *& szName) +{ + OT_ASSERT(NULL != szName); + + OTASCIIArmor ascOutput; + + if (LoadEncodedTextFieldByName(xml, ascOutput, szName) && ascOutput.GetLength() > 2) + { + return ascOutput.GetString(strOutput, true); // linebreaks = true + } + + return false; +} + +// Loads it up and keeps it encoded in an ascii-armored object. +bool OTContract::LoadEncodedTextFieldByName(IrrXMLReader*& xml, OTASCIIArmor & ascOutput, const char *& szName) +{ + OT_ASSERT(NULL != szName); + + // move to the next node which SHOULD be the expected name. + xml->read(); + + const char * pElementExpected = szName; + + if (EXN_ELEMENT == xml->getNodeType()) + { + if (!strcmp(pElementExpected, xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, ascOutput)) + { + OTLog::vError("OTContract::LoadEncodedTextFieldByName: Error loading %s field.\n", + pElementExpected); + return false; // error condition + } + else + { + return true; // <============ SUCCESS!!!! + } + } + else + { + OTLog::vError("Error in OTContract::LoadEncodedTextFieldByName:" + " missing %s element.\n", pElementExpected); + return false; // error condition + } + } + else + { + OTLog::vError("Error in OTContract::LoadEncodedTextFieldByName:" + " Expected %s element with text field.\n", + pElementExpected); + return false; // error condition + } + + return false; +} + + + +// --------------------------------------------------------------------- + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTContract::ProcessXMLNode(IrrXMLReader*& xml) +{ + OTString strEntityShortName; + OTString strEntityLongName; + OTString strEntityEmail; + + OTString strConditionName; + OTString strConditionValue; + + OTString strKeyName; + OTString strKeyValue; + + if (!strcmp("entity", xml->getNodeName())) + { +// strEntityShortName = xml->getAttributeValue("shortname"); + if (!m_strName.Exists()) // only set it if it's not already set, since the wallet may have already had a user label set. + m_strName = xml->getAttributeValue("shortname"); // m_strName may later be changed again in OTAssetContract::ProcessXMLNode + strEntityLongName = xml->getAttributeValue("longname"); + strEntityEmail = xml->getAttributeValue("email"); + + OTLog::vOutput(1, "Loaded Entity, shortname: %s\nLongname: %s, email: %s\n----------\n", + strEntityShortName.Get(), strEntityLongName.Get(), strEntityEmail.Get()); + + return 1; + } + else if (!strcmp("condition", xml->getNodeName())) + { + strConditionName = xml->getAttributeValue("name"); + + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + strConditionValue = xml->getNodeData(); + } + else { + OTLog::vError("Error in OTContract::ProcessXMLNode: Condition without value: %s\n", + strConditionName.Get()); + return (-1); // error condition + } + + //Todo: add the conditions to a list in memory (on this object) + + OTLog::vOutput(1, "---- Loaded condition \"%s\"\n", strConditionName.Get()); +// OTLog::vOutput(1, "Loading condition \"%s\": %s----------(END DATA)----------\n", strConditionName.Get(), +// strConditionValue.Get()); + + return 1; + } + else if (!strcmp("key", xml->getNodeName())) + { + strKeyName = xml->getAttributeValue("name"); + + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + strKeyValue = xml->getNodeData(); + } + else { + OTLog::vError("Error in OTContract::ProcessXMLNode: Key without value: %s\n", + strKeyName.Get()); + return (-1); // error condition + } + + // Create a new nym for this public key (or x509 cert, it works either way) + // and add it to the contract's internal list of nyms. + // + // Later on, if someone needs to get the Public Key for this contract and + // use it to verify the signature on the contract, or to verify a message + // from the server, the contract can iterate the list of Nyms and get + // the public contract key based on a standard name such as the "contract" key. + // (Versus the "server" key or the "certification" key, etc. + + if (!InsertNym(strKeyName, strKeyValue)) + OTLog::Error("Error performing OTContract::InsertNym.\n"); + + return 1; + } + + return 0; +} + + +// If you have a Public Key or Cert that you would like to add as one of the keys on this contract, +// just call this function. Usually you'd never want to do that because you would never want to actually +// change the text of the contract (or the signatures will stop verifying.) +// But in unique situations, for example when first creating a contract, you might want to insert some +// keys into it. You might also call this function when LOADING the contract, to populate it. +bool OTContract::InsertNym(const OTString & strKeyName, const OTString & strKeyValue) +{ + bool bResult = false; + OTPseudonym * pNym = new OTPseudonym; + + OT_ASSERT_MSG(NULL != pNym, "Error allocating memory for new Nym in OTContract::InsertNym\n"); + + // This is the version of SetCertificate that handles escaped bookends. ( - -----BEGIN CERTIFICATE-----) + if (strKeyValue.Contains("CERTIFICATE") && pNym->SetCertificate(strKeyValue, true)) // it also defaults to true, FYI. + { + m_mapNyms[strKeyName.Get()] = pNym; + pNym->SetIdentifierByPubkey(); + OTLog::vOutput(1, "---- Loaded certificate \"%s\"\n", strKeyName.Get()); + bResult = true; + } + else if (strKeyValue.Contains("PUBLIC KEY") && pNym->SetPublicKey(strKeyValue, true)) // it also defaults to true, FYI. + { + m_mapNyms[strKeyName.Get()] = pNym; + pNym->SetIdentifierByPubkey(); + OTLog::vOutput(1, "---- Loaded public key \"%s\"\n", strKeyName.Get()); + bResult = true; + } + else + { + delete pNym; + pNym = NULL; + OTLog::vOutput(0, "\nLoaded key \"%s\" but FAILED adding the Nym to the Contract:\n--->%s<---\n", + strKeyName.Get(), strKeyValue.Get()); + } + + return bResult; +} + + + +/* + * An implementation of RSA PSS digital signature using OpenSSL + * + * Copyright (c) 2009 Mounir IDRASSI . All rights reserved. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. + * + */ +/* +// inside a comment here #include +// inside a comment here #include +#include +#include +#include +#include + + +int main(int argc, char** argv) +{ + RSA* pRsaKey = NULL; + unsigned char pDigest[32]; + size_t uDigestLen = 32; + const char* szMessage = "This is the string to be signed"; + EVP_MD_CTX md_ctx; + unsigned char EM[128]; + unsigned char pSignature[128]; + unsigned char pDecrypted[128]; + int status = 0; + + // openssl initialization + ERR_load_crypto_strings(); + OpenSSL_add_all_algorithms(); + +#ifdef _WIN32 + RAND_screen(); +#else + RAND_poll(); +#endif + + // Generate an RSA key pair + pRsaKey = RSA_generate_key(1024, 0x010001, NULL, NULL); + if (!pRsaKey) + { + printf("RSA_generate_key failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + goto prog_end; + } + + // hash the message + EVP_MD_CTX_init(&md_ctx); + EVP_DigestInit(&md_ctx, EVP_sha256()); + EVP_DigestUpdate(&md_ctx, (const void*) szMessage, strlen(szMessage)); + EVP_DigestFinal(&md_ctx, pDigest, &uDigestLen); + EVP_MD_CTX_cleanup(&md_ctx); + + // compute the PSS padded data + status = RSA_padding_add_PKCS1_PSS(pRsaKey, EM, pDigest, EVP_sha256(), -2); //maximum salt length + if (!status) + { + printf("RSA_padding_add_PKCS1_PSS failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + goto prog_end; + } + + // perform digital signature + status = RSA_private_encrypt(128, EM, pSignature, pRsaKey, RSA_NO_PADDING); + if (status == -1) + { + printf("RSA_private_encrypt failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + goto prog_end; + } + + // now we will verify the signature + // Start by a RAW decrypt of the signature + status = RSA_public_decrypt(128, pSignature, pDecrypted, pRsaKey, RSA_NO_PADDING); + if (status == -1) + { + printf("RSA_public_decrypt failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + goto prog_end; + } + + // verify the data + status = RSA_verify_PKCS1_PSS(pRsaKey, pDigest, EVP_sha256(), pDecrypted, -2); // salt length recovered from signature + if (status == 1) + { + printf("Signature verification successfull!\n"); + } + else + { + printf("RSA_verify_PKCS1_PSS failed with error %s\n", ERR_error_string(ERR_get_error(), NULL)); + goto prog_end; + } + +prog_end: + if (pRsaKey) + RSA_free(pRsaKey); + + // openssl cleanup + CRYPTO_cleanup_all_ex_data(); + RAND_cleanup(); + EVP_cleanup(); + ERR_free_strings(); + ERR_remove_state(0); + + return 0; +} +*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTContract.h b/OTLib/OTContract.h new file mode 100644 index 000000000..3132268c1 --- /dev/null +++ b/OTLib/OTContract.h @@ -0,0 +1,378 @@ +/************************************************************************************ + * + * OTContract.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTCONTRACT_H__ +#define __OTCONTRACT_H__ + +#include + +extern "C" +{ +#include +} + +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +#include "OTIdentifier.h" + +#include "OTData.h" +#include "OTString.h" +#include "OTAsymmetricKey.h" + +#include "OTSignature.h" +#include "OTStringXML.h" +//#include "OTStorage.h" + +class OTPseudonym; +class OTIdentifier; + + +typedef std::list listOfSignatures; +typedef std::map mapOfNyms; + +class OTContract +{ + friend class OTPayload; + +protected: + OTString m_strName; // Contract name as shown in the wallet. + OTString m_strFoldername; // Foldername for this contract (nyms, contracts, accounts, etc) + OTString m_strFilename; // Filename for this contract (usually an ID.) + OTIdentifier m_ID; // Hash of the contract, including signatures. (the "raw file") + OTStringXML m_xmlUnsigned; // The Unsigned Clear Text (XML contents without signatures.) + OTString m_strRawFile; // The complete raw file including signatures. + OTString m_strSigHashType; // The Hash algorithm used for the signature + OTString m_strContractType; // CONTRACT, MESSAGE, TRANSACTION, LEDGER, TRANSACTION ITEM + + mapOfNyms m_mapNyms; // The default behavior for a contract, though occasionally overridden, + // is to contain its own public keys internally, located on standard XML tags. + // + // So when we load a contract, we find its public key, and we verify its + // signature with it. (It self-verifies!) I could be talking about an x509 + // as well, since people will need these to be revokable. + // + // The Issuer/Server/etc URL will also be located within the contract, on a + // standard tag, so by merely loading a contract, a wallet will know how to + // connect to the relevant server, and the wallet will be able to encrypt + // messages meant for that server to its public key without the normally requisite + // key exchange. ==> THE TRADER HAS ASSURANCE THAT, IF HIS OUT-MESSAGE IS ENCRYPTED, + // HE KNOWS THE MESSAGE CAN ONLY BE DECRYPTED BY THE SAME PERSON WHO SIGNED THAT CONTRACT. + + listOfSignatures m_listSignatures; // The PGP signatures at the bottom of the XML file. + + OTString m_strVersion; // The version of this Contract file, in case the format changes in the future. + + bool LoadContractXML(); // The XML file is in m_xmlUnsigned. Load it from there into members here. + + bool LoadEncodedTextField(irr::io::IrrXMLReader*& xml, OTString &strOutput); + bool LoadEncodedTextField(irr::io::IrrXMLReader*& xml, OTASCIIArmor &ascOutput); + + bool LoadEncodedTextFieldByName(irr::io::IrrXMLReader*& xml, OTString &strOutput, const char *& szName); + bool LoadEncodedTextFieldByName(irr::io::IrrXMLReader*& xml, OTASCIIArmor &ascOutput, const char *& szName); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual bool SignContract(const EVP_PKEY * pkey, OTSignature & theSignature, + const OTString & strHashType); + bool VerifySignature(const EVP_PKEY * pkey, const OTSignature & theSignature, + const OTString & strHashType) const; + + // The default hash scheme involves combining 2 other hashes + // If a hash with one of the special names comes through, it will + // be processed here instead of the normal code. The above two functions + // will call these two when appropriate. + bool SignContractDefaultHash(const EVP_PKEY * pkey, OTSignature & theSignature); + bool VerifyContractDefaultHash(const EVP_PKEY * pkey, const OTSignature & theSignature) const; + +public: + inline const char * GetHashType() const { return m_strSigHashType.Get(); } + + inline void SetIdentifier(const OTIdentifier & theID) { m_ID = theID; } + + OTContract(); + OTContract(const OTString & name, const OTString & foldername, const OTString & filename, const OTString & strID); + OTContract(const OTString & strID); + OTContract(const OTIdentifier & theID); + + void Initialize(); + + // TODO: a contract needs to have certain required fields in order to be accepted for notarization. + // One of those should be a URL where anyone can see a list of the approved e-notary servers, signed + // by the issuer. + // + // Why is this important? + // + // Because when the issuer connects to the e-notary to issue the currency, he must upload the + // asset contract as part of that process. During the same process, the e-notary connects to that + // standard URL and downloads a RECORD, signed by the ISSUER, showing the e-notary on the accepted + // list of transaction providers. + // + // Now the e-notary can make THAT record available to its clients (most likely demanded by their + // wallet software) as proof that the issuer has, in fact, issued digital assets on the e-notary + // server in question. This provides proof that the issuer is, in fact, legally on the line for + // whatever assets they have actually issued through that e-notary. The issuer can make the total + // outstanding units available publicly, which wallets can cross-reference with the public records + // on the transaction servers. (The figures concerning total issued currency should match.) + // + // Of course, the transaction server could still lie, and publish a falsified number instead of + // the actual total issued currency for a given digital asset. Only systems can prevent that, + // based around separation of powers. People will be more likely to trust the transaction provider + // who has good accounting and code audit processes, with code fingerprints, multiple passwords + // across neutral and bonded 3rd parties, insured, etc. Ultimately these practices will be + // governed by the cost of insurance. + // + // But there WILL be winners who arise because they implement systems that provide trust. + // And trust is a currency. + // + // (Currently the code loads the key FROM the contract itself, which won't be possible when + // the issuer and transaction provider are two separate entities. So this sort of protocol + // becomes necessary.) + + virtual ~OTContract(); + virtual void Release(); + void ReleaseSignatures(); + + // This function is for those times when you already have the unsigned version + // of the contract, and you have the signer, and you just want to sign it and + // calculate its new ID from the finished result. + virtual bool CreateContract(OTString & strContract, OTPseudonym & theSigner); + + bool InsertNym(const OTString & strKeyName, const OTString & strKeyValue); + + inline void GetName(OTString & strName) const { strName = m_strName; } + inline void SetName(const OTString & strName) { m_strName = strName; } + + // This function calls VerifyContractID, and if that checks out, then it looks up the official + // "contract" key inside the contract by calling GetContractPublicKey, and uses it to verify the + // signature on the contract. So the contract is self-verifying. Right now only public keys are + // supported, but soon contracts will also support x509 certs. + virtual bool VerifyContract(); + + // Only overriden in OTOffer so far. + virtual void GetIdentifier(OTIdentifier & theIdentifier);// You can get it in string or binary form. + virtual void GetIdentifier(OTString & theIdentifier); // The Contract ID is a hash of the contract raw file. + + void GetFilename(OTString & strFilename); + void GetFoldername(OTString & strFoldername); + + + // If you have a contract in string form, and you don't know what subclass it is, + // but you still want to instantiate it, and load it up properly, then call this + // class method. + // + static OTContract * InstantiateContract(OTString & strInputContract); + + + // assumes m_strFilename is already set. Then it reads that file into a string. + // Then it parses that string into the object. + virtual bool LoadContract(); +// bool LoadContract(const char * szFilename); + bool LoadContract(const char * szFoldername, const char * szFilename); + + bool LoadContractFromString(const OTString & theStr); // Just like it says. If you have a contract in + // string form, pass it in here to import it. + bool LoadContractRawFile(); // fopens m_strFilename and reads it off the disk into m_strRawFile + bool ParseRawFile(); // parses m_strRawFile into the various member variables. + // Separating these into two steps allows us to load contracts + // from other sources besides files. + + bool SaveToContractFolder(); // data_folder/contracts/Contract-ID + + bool SaveContract(); // This saves the Contract to its own internal member string, m_strRawFile (and does + // NOT actually save it to a file.) + bool SaveContract(OTString & strContract); // Saves the contract to any string you want to pass in. + bool SaveContract(const char * szFoldername, const char * szFilename); // Saves the contract to its internal member, then saves + // that to a specific filename + + // Update the internal unsigned contents based on the member variables + virtual void UpdateContents(); // default behavior does nothing. + + // Save the internal contents (m_xmlUnsigned) to an already-open file +// virtual bool SaveContents(FILE * fl) const; + virtual bool SaveContents(std::ofstream & ofs) const; + + // Saves the entire contract to a file that's already open (like a wallet). +// virtual bool SaveContractWallet(FILE * fl) = 0; + virtual bool SaveContractWallet(std::ofstream & ofs) = 0; + virtual bool SaveContractWallet(OTString & strContents) const; + + virtual bool DisplayStatistics(OTString & strContents) const; + + // Save m_xmlUnsigned to a string that's passed in + virtual bool SaveContents(OTString & strContents) const; + + virtual bool SignContract(const OTPseudonym & theNym); + + bool SignContract(const OTPseudonym & theNym, OTSignature & theSignature); + bool SignContract(const OTAsymmetricKey & theKey, OTSignature & theSignature, + const OTString & strHashType); + bool SignContract(const char * szFoldername, const char * szFilename, OTSignature & theSignature); + + // Calculates a hash of m_strRawFile (the xml portion of the contract plus the signatures) + // and compares to m_ID (supposedly the same. The ID is calculated by hashing the file.) + // + // Be careful here--asset contracts and server contracts can have this ID. + // But a class such as OTAccount will change in its datafile as the balance + // changes. Thus, the account must have a Unique ID that is NOT a hash of its file. + // + // This means it's important to have the ID function overridable for OTAccount... + // This also means that my wallet MUST be signed, and these files should have + // and encryption option also. Because if someone changes my account ID in the file, + // I have no way of re-calculating it from the account file, which changes! So my + // copies of the account file and wallet file are the only records of that account ID + // which is a giant long number. + virtual bool VerifyContractID(); + virtual void CalculateContractID(OTIdentifier & newID) const; + + // So far not overridden anywhere (used to be OTTrade.) + virtual bool VerifySignature(const OTPseudonym & theNym); + bool VerifySignature(const OTPseudonym & theNym, const OTSignature & theSignature) const; + bool VerifySignature(const OTAsymmetricKey & theKey, const OTSignature & theSignature, + const OTString & strHashType) const; + bool VerifySignature(const char * szFoldername, const char * szFilename, const OTSignature & theSignature) const; + + + + //bool VerifySignatures(); // This function verifies the signatures on the contract. + // If true, it proves that certain entities really did sign + // it, and that the contract hasn't been tampered with since + // it was signed. + const OTAsymmetricKey * GetContractPublicKey(); + const OTPseudonym * GetContractPublicNym(); +}; + +#endif // __OTCONTRACT_H__ diff --git a/OTLib/OTCron.cpp b/OTLib/OTCron.cpp new file mode 100644 index 000000000..b13af1220 --- /dev/null +++ b/OTLib/OTCron.cpp @@ -0,0 +1,1145 @@ +/*************************************************************** + * + * OTCron.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// OTCron has a list of OTCronItems. (Really subclasses of that such as OTTrade and OTAgreement.) + +#include +#include + +#include +#include +#include + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +using namespace std; + +#include "OTStorage.h" + +#include "OTString.h" + +#include "OTLog.h" + +#include "OTCron.h" +#include "OTCronItem.h" + +#include "OTOffer.h" +#include "OTTrade.h" +#include "OTMarket.h" +#include "OTPaymentPlan.h" + + + + +// Make sure Server Nym is set on this cron object before loading or saving, since it's +// used for signing and verifying.. +bool OTCron::LoadCron() +{ + const char * szFoldername = OTLog::CronFolder(); + const char * szFilename = "OT-CRON.crn"; // todo stop hardcoding filenames. + + OT_ASSERT(NULL != GetServerNym()); + + // -------------------------------------------------------------------- + + bool bSuccess = false; + + bSuccess = LoadContract(szFoldername, szFilename); + + if (bSuccess) + bSuccess = VerifySignature(*GetServerNym()); + + return bSuccess; +} + + +bool OTCron::SaveCron() +{ + const char * szFoldername = OTLog::CronFolder(); + const char * szFilename = "OT-CRON.crn"; // todo stop hardcoding filenames. + + OT_ASSERT(NULL != GetServerNym()); + + // ------------------------------------------------------------------------ + + ReleaseSignatures(); + + // Sign it, save it internally to string, and then save that out to the file. + if (!SignContract(*m_pServerNym) || !SaveContract() || !SaveContract(szFoldername, szFilename)) + { + OTLog::vError("Error saving main Cronfile:\n%s%s%s\n", szFoldername, + OTLog::PathSeparator(), szFilename); + return false; + } + else + return true; +} + +// ------------------------------------------------------ + +// Loops through ALL markets, and calls pMarket->GetNym_OfferList(NYM_ID, *pOfferList) for each. +// Returns a list of all the offers that a specific Nym has on all the markets. +// +bool OTCron::GetNym_OfferList(OTASCIIArmor & ascOutput, const OTIdentifier & NYM_ID, int & nOfferCount) +{ + nOfferCount = 0; // Outputs the number of offers on this nym. + + // --------------------------- + + OTDB::OfferListNym * pOfferList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_OFFER_LIST_NYM)); + OTCleanup theListAngel(*pOfferList); + + // ----------------------------------------------------------- + + for (mapOfMarkets::iterator ii = m_mapMarkets.begin(); ii != m_mapMarkets.end(); ++ii) + { + OTMarket * pMarket = (*ii).second; + + OT_ASSERT(NULL != pMarket); + + int nNymOfferCount = 0; + + if (false == pMarket->GetNym_OfferList(NYM_ID, *pOfferList, nNymOfferCount)) // appends to *pOfferList, each iteration. + { + // may wish to add a log later. Anyway, keep iterationg and appending, then send back whatever we have. + } + else // Success! + nOfferCount += nNymOfferCount; + } + + // ------------------------------------------------------------- + + // Now pack the list into strOutput... + if (nOfferCount == 0) + return true; // Success, but 0 offers being returned. (List is empty.) + + else if (nOfferCount > 0) + { + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*pOfferList); // Now we PACK our nym's offer list. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing pOfferList in OTCron::GetNym_OfferList. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + // Now we need to translate pBuffer into strOutput. + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + if ((NULL != pUint) || (theSize < 2)) + { + OTData theData(pUint, theSize); + + // This function will base64 ENCODE theData, + // and then Set() that as the string contents. + ascOutput.SetData(theData); + + return true; + } + else + OTLog::Error("Null returned, or bad size, while getting buffer data in OTCron::GetNym_OfferList.\n"); + } + + else + OTLog::vError("Error: Less-than-zero nOfferCount in OTCron::GetNym_OfferList: %d.\n", nOfferCount); + + return false; +} + + + +bool OTCron::GetMarketList (OTASCIIArmor & ascOutput, int & nMarketCount) +{ + nMarketCount = 0; // This parameter is set to zero here, and incremented in the loop below. + + // ------------------------ + OTMarket * pMarket = NULL; + + OTDB::MarketList * pMarketList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_MARKET_LIST)); + OTCleanup theListAngel(*pMarketList); + + // ----------------------------------------------------------- + + for (mapOfMarkets::iterator ii = m_mapMarkets.begin(); ii != m_mapMarkets.end(); ++ii) + { + pMarket = (*ii).second; + + OT_ASSERT(NULL != pMarket); + + OTDB::MarketData * pMarketData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_MARKET_DATA)); + OTCleanup theDataAngel(*pMarketData); + + // -------------------------------------------- + const OTIdentifier MARKET_ID(*pMarket); + const OTString str_MARKET_ID(MARKET_ID); + const OTString str_ServerID(pMarket->GetServerID()); + const OTString str_ASSET_ID(pMarket->GetAssetID()); + const OTString str_CURRENCY_ID(pMarket->GetCurrencyID()); + + pMarketData->server_id = str_ServerID.Get(); + pMarketData->market_id = str_MARKET_ID.Get(); + pMarketData->asset_type_id = str_ASSET_ID.Get(); + pMarketData->currency_type_id = str_CURRENCY_ID.Get(); + // -------------------------------------------- + const long & lScale = pMarket->GetScale(); + + pMarketData->scale = to_string(lScale); + + // -------------------------------------------- + + const uint64_t theCurrentBid = pMarket->GetHighestBidPrice(); + const uint64_t theCurrentAsk = pMarket->GetLowestAskPrice(); + + pMarketData->current_bid = to_string(theCurrentBid); + pMarketData->current_ask = to_string(theCurrentAsk); + + // --------------------------------------------- + + const long & lLastSalePrice = pMarket->GetLastSalePrice(); + const long & lTotalAvailableAssets = pMarket->GetTotalAvailableAssets(); + + pMarketData->total_assets = to_string(lTotalAvailableAssets); + pMarketData->last_sale_price = to_string(lLastSalePrice); + + // --------------------------------------------- + + const mapOfOffers::size_type theBidCount = pMarket->GetBidCount(); + const mapOfOffers::size_type theAskCount = pMarket->GetAskCount(); + + pMarketData->number_bids = to_string(theBidCount); + pMarketData->number_asks = to_string(theAskCount); + + // --------------------------------------------- + // In the past 24 hours. + // (I'm not collecting this data yet, (maybe never), so these values aren't set at all.) + // +// pMarketData->volume_trades = ???; +// pMarketData->volume_assets = ???; +// pMarketData->volume_currency = ???; +// +// pMarketData->recent_highest_bid = ???; +// pMarketData->recent_lowest_ask = ???; + // --------------------------------------------- + + // *pMarketData is CLONED at this time (I'm still responsible to delete.) + // That's also why I add it here, below: So the data is set right before the cloning occurs. + // + pMarketList->AddMarketData(*pMarketData); + nMarketCount++; + } + + // ------------------------------------------------------------- + + // Now pack the list into strOutput... + if (nMarketCount == 0) + return true; // Success, but the list contains 0 markets. + + else if (nMarketCount > 0) + { + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*pMarketList); // Now we PACK our market list. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing pMarketList in OTCron::GetMarketList. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + // Now we need to translate pBuffer into strOutput. + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + if ((theSize > 0) && (NULL != pUint)) + { + OTData theData(pUint, theSize); + + // This function will base64 ENCODE theData, + // and then Set() that as the string contents. + ascOutput.SetData(theData); +// bool bSuccessSetData = false; +// bSuccessSetData = ascOutput.SetData(theData); + + return true; + } + else + OTLog::Error("OTCron::GetMarketList: 0 size, or null return value, while getting raw data from packed buffer.\n"); + } + + else + OTLog::vError("OTCron::GetMarketList: nMarketCount is less than zero: %d.\n", nMarketCount); + + return false; +} + + + + + +// -------------------------------------------------- + + + +int OTCron::GetTransactionCount() const +{ + if (m_listTransactionNumbers.empty()) + return 0; + + return m_listTransactionNumbers.size(); +} + +void OTCron::AddTransactionNumber(const long & lTransactionNum) +{ + m_listTransactionNumbers.push_back(lTransactionNum); +} + + + +// Once this starts returning 0, OTCron can no longer process trades and +// payment plans until the server object replenishes this list. +long OTCron::GetNextTransactionNumber() +{ + if (m_listTransactionNumbers.empty()) + return 0; + + long lTransactionNum = m_listTransactionNumbers.front(); + + m_listTransactionNumbers.pop_front(); + + return lTransactionNum; +} + + + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTCron::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + OT_ASSERT(NULL != GetServerNym()); + + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + + if (!strcmp("cron", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + // --------------------- + + const OTString strServerID(xml->getAttributeValue("serverID")); + + m_SERVER_ID.SetString(strServerID); + + // --------------------- + + OTLog::vOutput(0, "\n\nLoading an OTCron object. ServerID:\n%s\n", + strServerID.Get()); + + nReturnVal = 1; + } + else if (!strcmp("transactionNum", xml->getNodeName())) + { + long lTransactionNum = 0; + + lTransactionNum = atol(xml->getAttributeValue("value")); + + OTLog::vOutput(1, "Transaction Number %ld available for Cron.\n", + lTransactionNum); + + AddTransactionNumber(lTransactionNum); // This doesn't save to disk. Make sure to save Cron when it changes. + + nReturnVal = 1; + } + + else if (!strcmp("cronItem", xml->getNodeName())) + { + OTString strData; + + if (!LoadEncodedTextField(xml, strData) || !strData.Exists()) + { + OTLog::Error("Error in OTCron::ProcessXMLNode: cronItem field without value.\n"); + return (-1); // error condition + } + else + { + OTCronItem * pItem = OTCronItem::NewCronItem(strData); + + if (NULL == pItem) + { + OTLog::Error("Unable to create cron item from data in cron file.\n"); + return (-1); + } + + if (AddCronItem(*pItem, false)) // bSaveReceipt=false. The receipt is only saved once: When item FIRST added to cron. + { // But here, the item was ALREADY in cron, and is merely being loaded from disk. Thus, + // it would be wrong to try to create the "original record" as if it were brand new + // and still had the user's signature on it. (Once added to Cron, the signatures are + // released and the SERVER signs it from there. That's why the user's version is saved + // as a receipt in the first place -- so we have a record of the user's authorization.) + OTLog::Output(2, "Successfully loaded cron item and added to list.\n"); + } + else + { + OTLog::Error("Though loaded successfully, unable to add cron item (from cron file) to cron list.\n"); + delete pItem; + pItem = NULL; + return (-1); + } + } + + nReturnVal = 1; + } + + else if (!strcmp("market", xml->getNodeName())) + { + const OTString strMarketID(xml->getAttributeValue("marketID")); + const OTString strAssetID(xml->getAttributeValue("assetID")); + const OTString strCurrencyID(xml->getAttributeValue("currencyID")); + + const long lScale = atol(xml->getAttributeValue("marketScale")); + + const OTIdentifier ASSET_ID(strAssetID), CURRENCY_ID(strCurrencyID); + + OTLog::vOutput(1, "Loaded cron entry for Market:\n%s.\n", strMarketID.Get()); + + // LoadMarket() needs this info to do its thing. + OTMarket * pMarket = new OTMarket(m_SERVER_ID, ASSET_ID, CURRENCY_ID, lScale); + + OT_ASSERT(NULL != pMarket); + + pMarket->SetCronPointer(*this); // This way every Market has a pointer to Cron. + + // AddMarket normally saves to file, but we don't want that when we're LOADING from file, now do we? + if (!pMarket->LoadMarket() || !pMarket->VerifySignature(*GetServerNym()) || + !AddMarket(*pMarket, false)) // bSaveFile=false: don't save this file WHILE loading it!!! + { + OTLog::Error("Somehow error while loading, verifying, or adding market while loading Cron file.\n"); + delete pMarket; pMarket = NULL; + return (-1); + } + else + { + OTLog::Output(1, "Loaded market entry from cronfile, and also loaded the market file itself.\n"); + } + nReturnVal = 1; + } + + return nReturnVal; +} + + +void OTCron::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + // ------------------------------------------------------------- + + const OTString SERVER_ID(m_SERVER_ID); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + SERVER_ID.Get()); + + // ------------------------------------------------------------- + + // Save the Market entries (the markets themselves are saved in a markets folder.) + OTMarket * pMarket = NULL; + for (mapOfMarkets::iterator ii = m_mapMarkets.begin(); ii != m_mapMarkets.end(); ++ii) + { + pMarket = (*ii).second; + + OT_ASSERT(NULL != pMarket); + + OTIdentifier MARKET_ID(*pMarket); + OTString str_MARKET_ID(MARKET_ID); + + OTString str_ASSET_ID(pMarket->GetAssetID()); + OTString str_CURRENCY_ID(pMarket->GetCurrencyID()); + + m_xmlUnsigned.Concatenate("\n\n", + str_MARKET_ID.Get(), + str_ASSET_ID.Get(), + str_CURRENCY_ID.Get(), + pMarket->GetScale()); + } + + // ------------------------------------------------------------- + + + // Save the Cron Items + OTCronItem * pItem = NULL; + for (mapOfCronItems::iterator ii = m_mapCronItems.begin(); ii != m_mapCronItems.end(); ++ii) + { + pItem = (*ii).second; + + OT_ASSERT(NULL != pItem); + + OTString strItem(*pItem); // Extract the cron item contract into string form. + OTASCIIArmor ascItem(strItem); // Base64-encode that for storage. + + m_xmlUnsigned.Concatenate("\n%s\n\n", ascItem.Get()); + } + + // ------------------------------------------------------------- + + // Save the transaction numbers. + + long lTransactionNumber = 0; + + for (listOfTransactionNumbers::iterator iii = m_listTransactionNumbers.begin(); + iii != m_listTransactionNumbers.end(); ++iii) + { + lTransactionNumber = *iii; + + m_xmlUnsigned.Concatenate("\n\n", + lTransactionNumber); + } // for + + // ------------------------------------------------------------- + + m_xmlUnsigned.Concatenate("\n"); +} + + + + + +// Make sure to call this regularly so the CronItems get a chance to process and expire. +void OTCron::ProcessCronItems() +{ + if (!m_bIsActivated) + return; // No Cron processing until Cron is activated. + + if (GetTransactionCount() < 10) // todo stop hardcoding. + { + OTLog::Error("Cron is out of transaction numbers!"); + return; + } + + bool bNeedToSave = false; + + // loop through the cron items and tell each one to ProcessCron(). + // If the item returns true, that means leave it on the list. Otherwise, + // if it returns false, that means "it's done: remove it." + OTCronItem * pItem = NULL; + + for (mapOfCronItems::iterator ii = m_mapCronItems.begin(); ii != m_mapCronItems.end(); ) + { + pItem = (*ii).second; + + OT_ASSERT(NULL != pItem); + + bool bVerifySig = pItem->VerifySignature(*m_pServerNym); + bool bProcessCron = false; + + if (bVerifySig) + { + bProcessCron = pItem->ProcessCron(); + + // false means "remove it". + // ProcessCron returns true if should stay on the list. + // + if (false == bProcessCron) + pItem->HookRemovalFromCron(NULL); // We give the hook a chance to do its thing. + } + else + OTLog::Error("OTCron::ProcessCronItems: Signature failed to verify on cron item!\n"); + + // ----------------------------------------------------- + + // Remove it from the list. + // + if (false == bProcessCron) + { + OTLog::vOutput(0, "OTCron::ProcessCronItems: Removing expired or unverified cron item.\n"); + m_mapCronItems.erase(ii++); + delete pItem; + pItem = NULL; + + bNeedToSave = true; // We'll save to file at the bottom if anything was removed. + } + else // the special i++ and ++i arrangement here allows me to erase an item + { // from the list WHILE iterating through it :-) (Supposedly.) + ++ii; + } + } // for + + // Items were removed from Cron -- Save to storage! + if (bNeedToSave) + SaveCron(); +} + + + + +// OTCron IS responsible for cleaning up theItem, and takes ownership. +// So make SURE it is allocated on the HEAP before you pass it in here, and +// also make sure to delete it again if this call fails! +bool OTCron::AddCronItem(OTCronItem & theItem, bool bSaveReceipt/*=true*/) +{ + OT_ASSERT(NULL != GetServerNym()); + + // See if there's something else already there with the same transaction number. + mapOfCronItems::iterator ii = m_mapCronItems.find(theItem.GetTransactionNum()); + + // If it's not already on the list, then add it... + if ( ii == m_mapCronItems.end() ) + { + // If I've been instructed to save the receipt, and theItem did NOT successfully save the receipt, + // then return false. + // This will happen if filesystem problems, but it will also happen if the cron item WAS ALREADY THERE. + // I don't want to save over it. If I'm trying to save over one that is already there, then THAT is the + // real problem. + if (bSaveReceipt && + // --------------------------- + (!theItem.SignContract(*GetServerNym()) || // Notice the server adds its signature before saving the cron receipt to local storage. This way, the server can verify its own signature later, as evidence the file hasn't been tampered with. (BOTH signatures are there now--user's and server's.) + !theItem.SaveContract() || + !theItem.SaveCronReceipt())) + { + OTLog::Error("OTCron::AddCronItem: Error saving receipt while adding new Cronitem to Cron.\n"); + return false; + } + + m_mapCronItems[theItem.GetTransactionNum()] = &theItem; + theItem.SetCronPointer(*this); // This way every CronItem has a pointer to momma. + + bool bSuccess = true; + + // When an item is added to Cron for the first time, a copy of it is saved to the + // cron folder, and it has the user's original signature on it. (If it's a Trade, + // it also contains an Offer with the user's original signature.) This occurs + // wherever this function is called with bSaveReceipt=true. + // + if (bSaveReceipt) // This executes only the first time that an item is added to Cron. + // (versus when it's just being reloaded from file and added back to the internal list.) + { + // Now that a copy of the cronitem is safely stored, I can release the signature on it + // and sign it with the Server's Nym instead. That way I can use the server to verify + // all cron and market-related activity from here on out. +// theItem.ReleaseSignatures(); +// theItem.SignContract(*GetServerNym()); // THIS IS NOW DONE ABOVE. See if (bSaveReceipt) ... +// theItem.SaveContract(); + + // Since we added an item to the Cron, we SAVE it. + bSuccess = SaveCron(); + + if (bSuccess) + OTLog::Output(3, "OTCron::AddCronItem: New Cronitem has been added to Cron.\n"); + else + OTLog::Error("OTCron::AddCronItem: Error saving while adding new Cronitem to Cron.\n"); + } + + return bSuccess; + } + // Otherwise, if it was already there, log an error. + else + { + OTLog::vError("OTCron::AddCronItem: Attempt to add CronItem with pre-existing transaction number: %ld\n", + theItem.GetTransactionNum()); + } + + return false; +} + + + + +bool OTCron::RemoveCronItem(long lTransactionNum, OTPseudonym & theRemover) // if returns false, item wasn't found. +{ + // See if there's something there with that transaction number. + mapOfCronItems::iterator ii = m_mapCronItems.find(lTransactionNum); + + // If it's not already on the list, then there's nothing to remove. + if ( ii == m_mapCronItems.end() ) + { + OTLog::vError("Attempt to remove non-existent CronItem from OTCron. Transaction #: %ld\n", + lTransactionNum); + return false; + } + // Otherwise, if it WAS already there, remove it properly. + else + { + OTCronItem * pItem = (*ii).second; + + OT_ASSERT(NULL != pItem); + + // --------------------------------------- + + pItem->HookRemovalFromCron(&theRemover); // We give the hook a chance to do its thing. + + // --------------------------------------- + + m_mapCronItems.erase(ii); + delete pItem; + + // An item has been removed from Cron. SAVE. + return SaveCron(); + } + + return false; +} + + + +// Look up a transaction by transaction number and see if it is in the ledger. +// If it is, return a pointer to it, otherwise return NULL. +OTCronItem * OTCron::GetCronItem(long lTransactionNum) +{ + // See if there's something there with that transaction number. + mapOfCronItems::iterator ii = m_mapCronItems.find(lTransactionNum); + + if ( ii == m_mapCronItems.end() ) + { + // nothing found. + return NULL; + } + // Found it! + else + { + OTCronItem * pItem = (*ii).second; + + OT_ASSERT((NULL != pItem)); + + if (pItem->GetTransactionNum() == lTransactionNum) + return pItem; + else + OTLog::vError("Expected CronItem with transaction number %ld, but found %ld inside. Bad data?\n", + lTransactionNum, pItem->GetTransactionNum()); + } + + return NULL; +} + + + +// ---------------------------------------------------------- + + +// OTCron IS responsible for cleaning up theMarket, and takes ownership. +// So make SURE it is allocated on the HEAP before you pass it in here, and +// also make sure to delete it again if this call fails! +bool OTCron::AddMarket(OTMarket & theMarket, bool bSaveMarketFile/*=true*/) +{ + OT_ASSERT(NULL != GetServerNym()); + + theMarket.SetCronPointer(*this); // This way every Market has a pointer to Cron. + + OTIdentifier MARKET_ID(theMarket); + OTString str_MARKET_ID(MARKET_ID); + std::string std_MARKET_ID = str_MARKET_ID.Get(); + + // See if there's something else already there with the same market ID. + mapOfMarkets::iterator ii = m_mapMarkets.find(std_MARKET_ID); + + // If it's not already on the list, then add it... + if ( ii == m_mapMarkets.end() ) + { + // If I've been instructed to save the market, and Cron did NOT successfully save the market + // (to its own file), then return false. This will happen if filesystem problems. + if (bSaveMarketFile && !theMarket.SaveMarket()) + { + OTLog::vError("Error saving market file while adding new Market to Cron:\n%s\n", + std_MARKET_ID.c_str()); + return false; + } + + m_mapMarkets[std_MARKET_ID] = &theMarket; + + bool bSuccess = true; + + // When Cron serializes, it stores a list of all its markets in the main cron file. + // The actual markets themselves serialize separately to the market folder. + // + if (bSaveMarketFile) // This executes only the first time that a market is added to Cron. + // (versus when it's just being reloaded from file and added back to the internal list.) + { + // Since we added a market to the Cron, we SAVE it. + bSuccess = SaveCron(); // If we're loading from file, and bSaveMarketFile is false, I don't want to save here. that's why it's in this block. + + if (bSuccess) + OTLog::Output(3, "New Market has been added to Cron.\n"); + else + OTLog::Error("Error saving while adding new Market to Cron.\n"); + } + + return bSuccess; + } + // Otherwise, if it was already there, log an error. + else + { + OTLog::vError("Attempt to add Market that was already there: %s\n", std_MARKET_ID.c_str()); + } + + return false; +} + + +bool OTCron::RemoveMarket(const OTIdentifier & MARKET_ID) // if false, market wasn't found. +{ + OTString str_MARKET_ID(MARKET_ID); + std::string std_MARKET_ID = str_MARKET_ID.Get(); + + // See if there's something there with that transaction number. + mapOfMarkets::iterator ii = m_mapMarkets.find(std_MARKET_ID); + + // If it's not already on the list, then there's nothing to remove. + if ( ii == m_mapMarkets.end() ) + { + OTLog::vError("Attempt to remove non-existent Market from OTCron:\n%s\n", + std_MARKET_ID.c_str()); + return false; + } + // Otherwise, if it WAS already there, remove it properly. + else + { + OTMarket * pMarket = (*ii).second; + + OT_ASSERT(NULL != pMarket); + + m_mapMarkets.erase(ii); + delete pMarket; + + // A market has been removed from Cron. SAVE. + return SaveCron(); + } + + return false; +} + + +// Create it if it's not there. +OTMarket * OTCron::GetOrCreateMarket(const OTIdentifier & ASSET_ID, + const OTIdentifier & CURRENCY_ID, const long & lScale) +{ + OTMarket * pMarket = new OTMarket(GetServerID(), ASSET_ID, CURRENCY_ID, lScale); + + OT_ASSERT(NULL != pMarket); + + OTIdentifier MARKET_ID(*pMarket); + + OTMarket * pExistingMarket = GetMarket(MARKET_ID); + + // If it was already there, there's no need to create it. + if (NULL != pExistingMarket) + { + delete pMarket; pMarket = NULL; + return pExistingMarket; + } + + // If we got this far, it means the Market does NOT already exist in this Cron. + // So let's add it... + bool bAdded = AddMarket(*pMarket, true); // bool bSaveMarketFile=true, since it was created new. + + if (bAdded) + { + OTLog::Output(0, "New market created and added to Cron.\n"); + } + else + { + OTLog::Error("Error trying to add new market to Cron.\n"); + delete pMarket; + pMarket = NULL; + } + + return pMarket; +} + + +// Look up a transaction by transaction number and see if it is in the ledger. +// If it is, return a pointer to it, otherwise return NULL. +OTMarket * OTCron::GetMarket(const OTIdentifier & MARKET_ID) +{ + OTString str_MARKET_ID(MARKET_ID); + std::string std_MARKET_ID = str_MARKET_ID.Get(); + + // See if there's something there with that transaction number. + mapOfMarkets::iterator ii = m_mapMarkets.find(std_MARKET_ID); + + if ( ii == m_mapMarkets.end() ) + { + // nothing found. + return NULL; + } + // Found it! + else + { + OTMarket * pMarket = (*ii).second; + + OT_ASSERT((NULL != pMarket)); + + const OTIdentifier LOOP_MARKET_ID(*pMarket); + const OTString str_LOOP_MARKET_ID(LOOP_MARKET_ID); + + if (MARKET_ID == LOOP_MARKET_ID) + return pMarket; + else + OTLog::vError("Expected Market with ID:\n%s\n but found %s\n", + std_MARKET_ID.c_str(), str_LOOP_MARKET_ID.Get()); + } + + return NULL; +} + + +// ------------------------------------------------------------ + + +OTCron::OTCron() : OTContract() +{ + m_bIsActivated = false; + m_pServerNym = NULL; // just here for convenience, not responsible to cleanup this pointer. + InitCron(); + OTLog::Output(3, "Finished calling InitCron.\n"); +} + +OTCron::OTCron(const OTIdentifier & SERVER_ID) : OTContract() +{ + m_bIsActivated = false; + m_pServerNym = NULL; // just here for convenience, not responsible to cleanup this pointer. + InitCron(); + + SetServerID(SERVER_ID); + OTLog::Output(3, "Finished calling InitCron.\n"); +} + +OTCron::OTCron(const char * szFilename) : OTContract() +{ + OT_ASSERT(NULL != szFilename); + + m_bIsActivated = false; + m_pServerNym = NULL; // just here for convenience, not responsible to cleanup this pointer. + InitCron(); + + m_strFoldername.Set(OTLog::CronFolder()); + m_strFilename.Set(szFilename); + OTLog::Output(3, "Finished calling InitCron.\n"); +} + + + +OTCron::~OTCron() +{ +// no need to call Release() here, the framework will take care of it. +} + + +void OTCron::InitCron() +{ + m_strContractType = "CRON"; +} + + +void OTCron::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + while (!m_mapCronItems.empty()) + { + OTCronItem * pItem = m_mapCronItems.begin()->second; + mapOfCronItems::iterator ii = m_mapCronItems.begin(); + m_mapCronItems.erase(ii); + delete pItem; + pItem = NULL; + } + + while (!m_mapMarkets.empty()) + { + OTMarket * pMarket = m_mapMarkets.begin()->second; + mapOfMarkets::iterator ii = m_mapMarkets.begin(); + m_mapMarkets.erase(ii); + delete pMarket; + pMarket = NULL; + } + + + OTContract::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything for myself. + InitCron(); +} + + + + +bool OTCron::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTCron.h b/OTLib/OTCron.h new file mode 100644 index 000000000..8a0375e72 --- /dev/null +++ b/OTLib/OTCron.h @@ -0,0 +1,249 @@ +/************************************************************************************ + * + * OTCron.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// OTCron has a list of OTCronItems. (Really subclasses of that such as OTTrade and OTAgreement.) + +#ifndef __OTCRON_H__ +#define __OTCRON_H__ + +#include +#include + +#include "OTIdentifier.h" +#include "OTContract.h" +#include "OTCronItem.h" +#include "OTLog.h" + +class OTCronItem; +class OTPseudonym; +class OTMarket; + + + +// Mapped (uniquely) to transaction number. +typedef std::map mapOfCronItems; + +// Mapped (uniquely) to market ID. +typedef std::map mapOfMarkets; + + +// Cron stores a bunch of these on this list, +// which the server refreshes from time to time. +typedef std::list listOfTransactionNumbers; + + + +class OTCron : public OTContract +{ +private: + mapOfMarkets m_mapMarkets; // A list of all valid markets. + mapOfCronItems m_mapCronItems; + OTIdentifier m_SERVER_ID; // Always store this in any object that's associated with a specific server. + + OTPseudonym * m_pServerNym; // I'll need this for later. + + listOfTransactionNumbers m_listTransactionNumbers; // I can't put receipts in people's inboxes without a supply of these. + + bool m_bIsActivated; // I don't want to start Cron processing until everything else is all loaded up and ready to go. + +public: + inline bool IsActivated() const { return m_bIsActivated; } + inline bool ActivateCron() { if (!m_bIsActivated) return m_bIsActivated = true; else return false; } + bool AddCronItem(OTCronItem & theItem, bool bSaveReceipt=true); + bool RemoveCronItem(long lTransactionNum, OTPseudonym & theRemover); // if returns false, CronItem wasn't found. + OTCronItem * GetCronItem(long lTransactionNum); + + bool AddMarket(OTMarket & theMarket, bool bSaveMarketFile=true); + bool RemoveMarket(const OTIdentifier & MARKET_ID); // if returns false, market wasn't found. + OTMarket * GetMarket(const OTIdentifier & MARKET_ID); + OTMarket * GetOrCreateMarket(const OTIdentifier & ASSET_ID, + const OTIdentifier & CURRENCY_ID, const long & lScale); + + + // This is informational only. It returns OTStorage-type data objects, packed in a string. + // + bool GetMarketList(OTASCIIArmor & ascOutput, int & nMarketCount); + bool GetNym_OfferList(OTASCIIArmor & ascOutput, const OTIdentifier & NYM_ID, int & nOfferCount); + + // The server starts out putting a bunch of numbers in here so Cron can use them. + // Then the internal trades and payment plans get numbers from here as needed. + // Server MUST replenish from time-to-time, or Cron will stop working. + // Part of using Cron properly is to call ProcessCron() regularly, as well + // as to call AddTransactionNumber() regularly, in order to keep GetTransactionCount() + // at some minimum threshold. + void AddTransactionNumber(const long & lTransactionNum); + long GetNextTransactionNumber(); + int GetTransactionCount() const; // How many numbers do I currently have on the list? + + // Make sure every time you call this, you check the GetTransactionCount() first and replenish it + // to whatever your minimum supply is. (The transaction numbers in there must be enough to last for + // the entire ProcessCronItems() call, and all the trades and payment plans within, since it will not + // be replenished again at least until the call has finished.) + void ProcessCronItems(); + + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_SERVER_ID = SERVER_ID; } + inline const OTIdentifier & GetServerID() const { return m_SERVER_ID; } + + inline void SetServerNym(OTPseudonym * pServerNym) { OT_ASSERT(NULL != pServerNym); m_pServerNym = pServerNym; } + inline OTPseudonym * GetServerNym() const { return m_pServerNym; } + + // ----------------------------------------------------- + + bool LoadCron(); + bool SaveCron(); + + // ----------------------------------------------------- + + OTCron(); + OTCron(const OTIdentifier & SERVER_ID); + OTCron(const char * szFilename); + virtual ~OTCron(); + + + void InitCron(); + + virtual void Release(); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); + +}; + + + + + +#endif // __OTCRON_H__ + diff --git a/OTLib/OTCronItem.cpp b/OTLib/OTCronItem.cpp new file mode 100644 index 000000000..8e172d1a9 --- /dev/null +++ b/OTLib/OTCronItem.cpp @@ -0,0 +1,1092 @@ +/************************************************************ + * + * OTCronItem.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + + +#include "OTPseudonym.h" +#include "OTLedger.h" +#include "OTCronItem.h" +#include "OTAgreement.h" +#include "OTPaymentPlan.h" +#include "OTTrade.h" +#include "OTCron.h" +#include "OTLog.h" + + +// Base class for OTTrade and OTAgreement and OTPaymentPlan. +// OTCron contains lists of these for regular processing. + + +// static -- class factory. +// +// I just realized, I don't have to use this only for CronItems. +// If I wanted to, I could put ANY Open-Transactions class in here, +// if there was some need for it, and it would work just fine right here. +// Like if I wanted to have different Token types for different cash +// algorithms. All I have to do is change the return type. +OTCronItem * OTCronItem::NewCronItem(const OTString & strCronItem) +{ + static char buf[45] = ""; + OTCronItem * pItem = NULL; + + if (!strCronItem.Exists()) + return NULL; + + OTString strContract(strCronItem); + + strContract.reset(); // for sgets + buf[0] = 0; // probably unnecessary. + bool bGotLine = strContract.sgets(buf, 40); + + if (!bGotLine) + return NULL; + + OTString strFirstLine(buf); + strContract.reset(); // set the "file" pointer within this string back to index 0. + + // Now I feel pretty safe -- the string I'm examining is within + // the first 45 characters of the beginning of the contract, and + // it will NOT contain the escape "- " sequence. From there, if + // it contains the proper sequence, I will instantiate that type. + if (!strFirstLine.Exists() || strFirstLine.Contains("- -")) + return NULL; + +// if (strFirstLine.Contains("-----BEGIN SIGNED AGREEMENT-----")) // this string is 32 chars long. +// { pItem = new OTAgreement(); OT_ASSERT(NULL != pItem); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED PAYMENT PLAN-----")) // this string is 35 chars long. + { pItem = new OTPaymentPlan(); OT_ASSERT(NULL != pItem); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED TRADE-----")) // this string is 28 chars long. + { pItem = new OTTrade(); OT_ASSERT(NULL != pItem); } + + + // The string didn't match any of the options in the factory. + if (NULL == pItem) + return NULL; + + // Does the contract successfully load from the string passed in? + if (pItem->LoadContractFromString(strContract)) + return pItem; + else + delete pItem; + + + return NULL; +} + + + + +// ------------------------------------------------------------ +// These are for finalReceipt +// The Cron Item stores a list of these closing transaction numbers, +// used for closing a transaction. +// +int OTCronItem::GetCountClosingNumbers() const +{ + return m_dequeClosingNumbers.size(); +} + +long OTCronItem::GetClosingTransactionNoAt(unsigned int nIndex) const +{ + OT_ASSERT_MSG((nIndex < m_dequeClosingNumbers.size()) && (nIndex >= 0), + "OTCronItem::GetClosingTransactionNoAt: index out of bounds."); + + return m_dequeClosingNumbers.at(nIndex); +} + +void OTCronItem::AddClosingTransactionNo(const long & lClosingTransactionNo) +{ + m_dequeClosingNumbers.push_back(lClosingTransactionNo); +} +// ------------------------------------------------------------ + +/// See if theNym has rights to remove this item from Cron. +/// +bool OTCronItem::CanRemoveItemFromCron(OTPseudonym & theNym) +{ + // You don't just go willy-nilly and remove a cron item from a market unless you check first + // and make sure the Nym who requested it actually has said number (or a related closing number) + // signed out to him on his last receipt... + // + if (false == theNym.CompareID(GetSenderUserID())) + { + OTLog::Output(5, "OTCronItem::CanRemoveItem: theNym is not the originator of this CronItem. " + "(He could be a recipient though, so this is normal.)\n"); + return false; + } + + // By this point, that means theNym is DEFINITELY the originator (sender)... + else if (this->GetCountClosingNumbers() < 1) + { + OTLog::vOutput(0, "Weird: Sender tried to remove a cron item; expected at least 1 closing number to be available" + "--that wasn't. (Found %d).\n", this->GetCountClosingNumbers()); + return false; + } + // ------------------------------------------ + // + const OTString strServerID(GetServerID()); + + if (false == theNym.VerifyIssuedNum(strServerID, this->GetClosingNum())) + { + OTLog::Output(0, "OTCronItem::CanRemoveItemFromCron: Closing number didn't verify (for removal from cron).\n"); + return false; + } + + // By this point, we KNOW theNym is the sender, and we KNOW there are the proper number of transaction + // numbers available to close. We also know that this cron item really was on the cron object, since + // that is where it was looked up from, when this function got called! So I'm pretty sure, at this point, + // to authorize removal, as long as the transaction num is still issued to theNym (this check here.) + // + return theNym.VerifyIssuedNum(strServerID, this->GetOpeningNum()); + + // Normally this will be all we need to check. The originator will have the transaction + // number signed-out to him still, if he is trying to close it. BUT--in some cases, someone + // who is NOT the originator can cancel. Like in a payment plan, the sender is also the depositor, + // who would normally be the person cancelling the plan. But technically, the RECIPIENT should + // also have the ability to cancel that payment plan. BUT: the transaction number isn't signed + // out to the RECIPIENT... In THAT case, the below VerifyIssuedNum() won't work! In those cases, + // expect that the special code will be in the subclasses override of this function. (OTPaymentPlan::CanRemoveItem() etc) + + // P.S. If you override this function, MAKE SURE to call the parent (OTCronItem::CanRemoveItem) first, + // for the VerifyIssuedNum call above. Only if that fails, do you need to dig deeper... +} + + + + +// OTCron calls this regularly, which is my chance to expire, etc. +// Child classes will override this, AND call it (to verify valid date range.) +// +// Return False: REMOVE this Cron Item from Cron. +// Return True: KEEP this Cron Item on Cron (for now.) +// +bool OTCronItem::ProcessCron() +{ + OT_ASSERT(m_pCron); + + if (IsFlaggedForRemoval()) + { + OTLog::vOutput(3, "Cron: Flagged for removal: %s.\n", m_strContractType.Get()); + return false; + } + + // I call IsExpired() here instead of VerifyCurrentDate(). The Cron Item will stay on + // Cron even if it is NOT YET valid. But once it actually expires, this will remove it. + if (IsExpired()) + { + OTLog::vOutput(3, "Cron: Expired %s.\n", m_strContractType.Get()); + return false; + } + + // As far as this code is concerned, the item can stay on cron for now. Return true. + return true; +} + + + +OTCronItem * OTCronItem::LoadCronReceipt(const long & lTransactionNum) +{ + OTString strFilename; + strFilename.Format("%ld.crn", lTransactionNum); + + const char * szFoldername = OTLog::CronFolder(); + const char * szFilename = strFilename.Get(); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTCronItem::LoadCronReceipt: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return NULL; + } + + // -------------------------------------------------------------------- + // + OTString strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.GetLength() < 2) + { + OTLog::vError("OTCronItem::LoadCronReceipt: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return NULL; + } + else + return OTCronItem::NewCronItem(strFileContents); +} + + +// When first adding anything to Cron, a copy needs to be saved in a folder somewhere. +// (Just for our records.) For example, before I start updating the status on any Trade, +// I have already saved the user's original Trade object (from his request) to a folder. +// Now I have the freedom to ReleaseSignatures on the Trade and re-sign it with the +// server's Nym as it updates over time. The user cannot challenge the Trade because +// the server has the original copy on file and sends it with all receipts. + +bool OTCronItem::SaveCronReceipt() +{ + OTString strFilename; + strFilename.Format("%ld.crn", GetTransactionNum()); + + const char * szFoldername = OTLog::CronFolder(); // cron + const char * szFilename = strFilename.Get(); // cron/TRANSACTION_NUM.crn + + // -------------------------------------------------------------------- + + if (OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("Cron Record exists for transaction %ld %s%s%s,\nyet attempted to record it again.\n", + GetTransactionNum(), szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + + OTString strFinal; + SaveContract(strFinal); + + bool bSaved = OTDB::StorePlainString(strFinal.Get(), szFoldername, szFilename); + + if (!bSaved) + { + OTLog::vError("OTCronItem::SaveCronReceipt: Error saving file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + return bSaved; +} + + + + + + + +// OTCron calls this when a cron item is removed +// This gives each item a chance to drop a final receipt, +// and clean up any memory, before being destroyed. +// +void OTCronItem::HookRemovalFromCron(OTPseudonym * pRemover) +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ----------------------------------------------------- + + // Generate new transaction number for these new inbox receipts. + // + const long lNewTransactionNumber = pCron->GetNextTransactionNumber(); + + // OT_ASSERT(lNewTransactionNumber > 0); // this can be my reminder. + if (0 == lNewTransactionNumber) + { + OTLog::Error("OTCronItem::HookRemovalFromCron: ** ERROR Final receipt not added to inbox, since no " + "transaction numbers were available!\n"); + } + else + { + // Everytime a payment processes, or a trade, then a receipt is put in the user's inbox. + // This contains a copy of the current payment or trade (which took money from the user's acct.) + // + // ==> So I increment the payment count each time before dropping the receipt. (I also use a fresh + // transaction number when I put it into the inbox.) That way, the user will never get the same + // receipt for the same plan twice. It cannot take funds from his account, without a new payment + // count and a new transaction number on a new receipt. Until the user accepts the receipt out + // of his inbox with a new balance agreement, the existing receipts can be added up and compared + // to the last balance agreement, to verify the current balance. Every receipt from a processing + // payment will have the user's authorization, signature, and terms, as well as the update in balances + // due to the payment, signed by the server. + + // In the case of the FINAL RECEIPT, I do NOT increment the count, so you can see it will have the same + // payment count as the last paymentReceipt. (if there were 5 paymentReceipts, from 1 to 5, then the + // finalReceipt will also be 5. This is evidence of what the last paymentReceipt WAS.) + + // ------------------------------------------------------------- + + // The TRANSACTION will be dropped into the INBOX with "In Reference To" information, + // containing the ORIGINAL SIGNED REQUEST. + // + OTCronItem * pOrigCronItem = OTCronItem::LoadCronReceipt(GetTransactionNum()); + // OTCronItem::LoadCronReceipt loads the original version with the user's signature. + // (Updated versions, as processing occurs, are signed by the server.) + OT_ASSERT(NULL != pOrigCronItem); + OTCleanup theCronItemAngel(*pOrigCronItem); + + // Note: elsewhere, we verify the Nym's signature. But in this place, we verify the SERVER's + // signature. (The server signed the cron receipt just before it was first saved, so it has two signatures on it.) + // + OT_ASSERT_MSG(pOrigCronItem->VerifySignature(*pServerNym), + "Failure verifying signature of server on Cron Item in OTCronItem::HookRemovalFromCron.\n"); + + // I now have a String copy of the original CronItem... + const OTString strOrigCronItem(*pOrigCronItem); + // ------------------------------------------------------- + + OTPseudonym theOriginatorNym; // Don't use this... use the pointer just below. + + // The Nym who is actively requesting to remove a cron item will be passed in as pRemover. + // However, sometimes there is no Nym... perhaps it just expired and pRemover is NULL. + // The originating Nym (if different than remover) is loaded up. Otherwise the originator + // pointer just pointers to *pRemover. + // + OTPseudonym * pOriginator = NULL; + + if (pServerNym->CompareID(pOrigCronItem->GetSenderUserID())) + { + pOriginator = pServerNym; // Just in case the originator Nym is also the server Nym. + } // This MIGHT be unnecessary, since pRemover is(I think) already transmogrified + // ******************************************************* to pServer earlier, if they share the same ID. + // + // If pRemover is NOT NULL, and he has the Originator's ID... + // then set the pointer accordingly. + // + else if ((NULL != pRemover) && (true == pRemover->CompareID(pOrigCronItem->GetSenderUserID()))) + { + pOriginator = pRemover; // <======== now both pointers are set (to same Nym). DONE! + } + // -------------------------------------------------------------------------------------------------- + // At this point, pRemover MIGHT be set, or NULL. (And that's that -- pRemover may always be NULL.) + // + // if pRemover IS set, then pOriginator MIGHT point to it as well. (If the IDs match. Done above.) + // pOriginator might also still be NULL. (If pRemover is NULL, then pOriginator DEFINITELY is.) + // pRemover is loaded (or not). Next let's make SURE pOriginator is loaded, if it wasn't already... + // + if (NULL == pOriginator) + { + // GetSenderUserID() should be the same on THIS (updated version of the same cron item) + // but for whatever reason, I'm checking the userID on the original version. Sue me. + // + const OTIdentifier NYM_ID(pOrigCronItem->GetSenderUserID()); + + theOriginatorNym.SetIdentifier(NYM_ID); + + if (false == theOriginatorNym.LoadPublicKey()) + { + OTString strNymID(NYM_ID); + OTLog::vError("OTCronItem::HookRemovalFromCron: Failure loading Sender's public key:\n%s\n", strNymID.Get()); + } + else if (theOriginatorNym.VerifyPseudonym() && + theOriginatorNym.LoadSignedNymfile(*pServerNym)) // ServerNym here is merely the signer on this file. + { + pOriginator = &theOriginatorNym; // <===== + } + else + { + OTString strNymID(NYM_ID); + OTLog::vError("OTCronItem::HookRemovalFromCron: Failure verifying Sender's public key or loading signed nymfile: %s\n", + strNymID.Get()); + } + } + + // ------------------------------- + + // pOriginator should NEVER be NULL by this point, unless there was an ERROR in the above block. + // We even loaded the guy from storage, if we had to. + // + if (NULL != pOriginator) + { + // Drop the FINAL RECEIPT(s) into the user's inbox(es)!! + // Pass in strOrigCronItem and lNewTransactionNumber which were obtained above. + // + onFinalReceipt(*pOrigCronItem, lNewTransactionNumber, *pOriginator, pRemover); + } + else + { + OTLog::Error("MAJOR ERROR in OTCronItem::HookRemovalFromCron!! Failed loading Originator Nym for Cron Item.\n"); + } + } + + // ------------------------------------------------------- + // Remove corresponding offer from market, if applicable. + // + onRemovalFromCron(); +} + + +long OTCronItem::GetOpeningNum() const +{ + return GetTransactionNum(); +} + +long OTCronItem::GetClosingNum() const +{ + return (GetCountClosingNumbers() > 0) ? GetClosingTransactionNoAt(0) : 0; // todo stop hardcoding. +} + + + +// This function is overridden in both OTTrade and OTAgreement. +// I'm put a default implementation here "Just Because". +// +// This is called by HookRemovalFromCron(). +// +void OTCronItem::onFinalReceipt(OTCronItem & theOrigCronItem, const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover) // may already point to theOriginator... or someone else... +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ------------------------------------------------- + + // The finalReceipt Item's ATTACHMENT contains the UPDATED Cron Item. + // (With the SERVER's signature on it!) + // + OTString strUpdatedCronItem(*this); + OTString * pstrAttachment=&strUpdatedCronItem; + + const OTString strOrigCronItem(theOrigCronItem); + // ----------------------------------------------------------------- + + // First, we are closing the transaction number ITSELF, of this cron item, + // as an active issued number on the originating nym. (Changing it to CLOSED.) + // + // Second, we're verifying the CLOSING number, and using it as the closing number + // on the FINAL RECEIPT (with that receipt being "InReferenceTo" this->GetTransactionNum()) + // + const long lOpeningNumber = theOrigCronItem.GetTransactionNum(); + const long lClosingNumber = (theOrigCronItem.GetCountClosingNumbers() > 0) ? theOrigCronItem.GetClosingTransactionNoAt(0) : 0; + + const OTString strServerID(GetServerID()); + + // ----------------------------------------------------------------- + // I'm ASSUMING here that pRemover is also theOriginator. + // + // REMEMBER: Most subclasses will override this method, and THEY + // are the cases where pRemover is someone other than theOriginator. + // That's why they have a different version of onFinalReceipt. + // + if ((lOpeningNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lOpeningNumber)) + { + // The Nym (server side) stores a list of all opening and closing cron #s. + // So when the number is released from the Nym, we also take it off that list. + // + std::set & theIDSet = theOriginator.GetSetOpenCronItems(); + theIDSet.erase(lOpeningNumber); + + theOriginator.RemoveIssuedNum(*pServerNym, strServerID, lOpeningNumber, false); //bSave=false + theOriginator.SaveSignedNymfile(*pServerNym); + + // the RemoveIssued call means the original transaction# (to find this cron item on cron) is now CLOSED. + // But the Transaction itself is still OPEN. How? Because the CLOSING number is still signed out. + // The closing number is also USED, since the NotarizePaymentPlan or NotarizeMarketOffer call, but it + // remains ISSUED, until the final receipt itself is accepted during a process inbox. + // + + if (false == this->DropFinalReceiptToNymbox(GetSenderUserID(), + lNewTransactionNumber, + strOrigCronItem, + NULL, // note + pstrAttachment)) + { + OTLog::Error("OTCronItem::onFinalReceipt:Failure dropping finalReceipt to Nymbox.\n"); + } + } + else + { + OTLog::Error("OTCronItem::onFinalReceipt: Failed doing VerifyIssuedNum(theOrigCronItem.GetTransactionNum())\n"); + } + + // ------------------------------------------------------------------------ + + if ((lClosingNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lClosingNumber) + ) + { + // SENDER only. (CronItem has no recipient. That's in the subclass.) + if (false == this->DropFinalReceiptToInbox(GetSenderUserID(), GetSenderAcctID(), + lNewTransactionNumber, + lClosingNumber, // The closing transaction number to put on the receipt. + strOrigCronItem, + NULL, // note + pstrAttachment)) + OTLog::Error("OTCronItem::onFinalReceipt: Failure dropping receipt into inbox.\n"); + + // In this case, I'm passing NULL for pstrNote, since there is no note. + // (Additional information would normally be stored in the note.) + + // This part below doesn't happen until you ACCEPT the final receipt (when processing your inbox.) + // +// theOriginator.RemoveIssuedNum(strServerID, lClosingNumber, true); //bSave=false + } + else + { + OTLog::Error("OTCronItem::onFinalReceipt: Failed verifying lClosingNumber=theOrigCronItem.GetClosingTransactionNoAt(0)>0 && " + "theOriginator.VerifyTransactionNum(lClosingNumber)\n"); + } + // ------------------------------- + + // QUESTION: Won't there be Cron Items that have no asset account at all? + // In which case, there'd be no need to drop a final receipt, but I don't think + // that's the case, since you have to use a transaction number to get onto cron + // in the first place. + // ----------------------------------------------------------------- +} + + +// DONE: ABOVE, do the other subclasses. + + + + +// DONE: Below, use lClosingNumber +// + + +// This is the "DROPS FINAL RECEIPT" function. +// "Final Receipts" are used by Cron Items, as the last receipt for a given transaction number. +// +/* + bool DropFinalReceiptToInbox(const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID, + const long & lNewTransactionNumber, + const long & lClosingNumber, + OTString & strOrigCronItem, + OTString * pstrNote=NULL, + OTString * pstrAttachment=NULL); + */ +bool OTCronItem::DropFinalReceiptToInbox(const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID, + const long & lNewTransactionNumber, + const long & lClosingNumber, + const OTString & strOrigCronItem, + OTString * pstrNote/*=NULL*/, + OTString * pstrAttachment/*=NULL*/) +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ----------------------------------------------------- + // Load the inbox in case it already exists. + OTLedger theInbox (USER_ID, ACCOUNT_ID, GetServerID()); + + // Inbox will receive notification of something ALREADY DONE. + bool bSuccessLoading = theInbox.LoadInbox(); + + // ------------------------------------------------------------------- + // ...or generate it otherwise... + + if (true == bSuccessLoading) + bSuccessLoading = theInbox.VerifyAccount(*pServerNym); + else + bSuccessLoading = theInbox.GenerateLedger(ACCOUNT_ID, GetServerID(), OTLedger::inbox, true); // bGenerateFile=true + + // -------------------------------------------------------------------- + + if (false == bSuccessLoading) + { + OTLog::Error("ERROR loading or generating an inbox in OTCronItem::DropFinalReceiptToInbox. (FAILED WRITING RECEIPT!!) \n"); + return false; + } + else + { + // Start generating the receipts + + OTTransaction * pTrans1 = OTTransaction::GenerateTransaction(theInbox, OTTransaction::finalReceipt, lNewTransactionNumber); + // (No need to OT_ASSERT on the above transaction since it occurs in GenerateTransaction().) + + // The inbox will get a receipt with the new transaction ID. + // That receipt has an "in reference to" field containing the original cron item. + + // set up the transaction items (each transaction may have multiple items... but not in this case.) + OTItem * pItem1 = OTItem::CreateItemFromTransaction(*pTrans1, OTItem::finalReceipt); + + // This may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave it for now. + OT_ASSERT(NULL != pItem1); + + pItem1->SetStatus(OTItem::acknowledgement); + + // ------------------------------------------------------------- + // + // Here I make sure that the receipt (the inbox notice) references the + // transaction number that the trader originally used to issue the cron item... + // This number is used to match up offers to trades, and used to track all cron items. + // (All Cron items require a transaction from the user to add them to Cron in the + // first place.) + // + pTrans1->SetReferenceToNum(GetTransactionNum()); + // ------------------------------------------------- + // The reference on the transaction contains an OTCronItem, in this case. + // The original cron item, versus the updated cron item (which is stored + // on the finalReceipt item just below here.) + // + pTrans1->SetReferenceString(strOrigCronItem); + // -------------------------------------------- + pTrans1->SetClosingNum(lClosingNumber); // This transaction is the finalReceipt for GetTransactionNum(), as lClosingNumber. + // ----------------------------------------------------------------- + // The finalReceipt ITEM's NOTE contains the UPDATED CRON ITEM. + // + if (NULL != pstrNote) + { + pItem1->SetNote(*pstrNote); // in markets, this is updated trade. + } + + // Also set the ** UPDATED OFFER ** as the ATTACHMENT on the ** item.** + // (With the SERVER's signature on it!) // in markets, this is updated offer. + // + if (NULL != pstrAttachment) + { + pItem1->SetAttachment(*pstrAttachment); + } + + // ----------------------------------------------------------------- + // sign the item + + pItem1->SignContract(*pServerNym); + pItem1->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTrans1->AddItem(*pItem1); + + pTrans1->SignContract(*pServerNym); + pTrans1->SaveContract(); + + // Here the transaction we just created is actually added to the ledger. + theInbox.AddTransaction(*pTrans1); + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theInbox.ReleaseSignatures(); + + // Sign and save. + theInbox. SignContract(*pServerNym); + theInbox. SaveContract(); + + // TODO: Better rollback capabilities in case of failures here: + + // Save both inboxes to storage. (File, DB, wherever it goes.) + theInbox. SaveInbox(); + + return true; // Really this true should be predicated on ALL the above functions returning true. Right? + } // ...Right? + + return false; // unreachable. +} + + + + +// The final receipt doesn't have a closing number in the Nymbox, only in the Inbox. +// That's because in the Nymbox, it's just a notice, and it's not there to enforce anything. +// If you get one in your Nymbox, it's just so that you know to removed its "in ref to" number +// from your issued list (so your balance agreements will work :P) +// +bool OTCronItem::DropFinalReceiptToNymbox(const OTIdentifier & USER_ID, + const long & lNewTransactionNumber, + const OTString & strOrigCronItem, + OTString * pstrNote/*=NULL*/, + OTString * pstrAttachment/*=NULL*/) +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ----------------------------------------------------- + + OTLedger theLedger(USER_ID, USER_ID, GetServerID()); + + // Inbox will receive notification of something ALREADY DONE. + bool bSuccessLoading = theLedger.LoadNymbox(); + + // ------------------------------------------------------------------- + // ...or generate it otherwise... + + if (true == bSuccessLoading) + bSuccessLoading = theLedger.VerifyAccount(*pServerNym); + else + bSuccessLoading = theLedger.GenerateLedger(USER_ID, GetServerID(), OTLedger::nymbox, true); // bGenerateFile=true + + // -------------------------------------------------------------------- + + if (false == bSuccessLoading) + { + OTLog::Error("ERROR loading or generating a nymbox in OTCronItem::DropFinalReceiptToNymbox. (FAILED WRITING RECEIPT!!) \n"); + return false; + } + + // -------------------------------------------------------------------- + + OTTransaction * pTransaction = OTTransaction::GenerateTransaction(theLedger, + OTTransaction::finalReceipt, + lNewTransactionNumber); + + if (NULL != pTransaction) // The above has an OT_ASSERT within, but I just like to check my pointers. + { + // The nymbox will get a receipt with the new transaction ID. + // That receipt has an "in reference to" field containing the original cron item. + + + // set up the transaction items (each transaction may have multiple items... but not in this case.) + OTItem * pItem1 = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::finalReceipt); + + // This may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave it for now. + OT_ASSERT(NULL != pItem1); + + pItem1->SetStatus(OTItem::acknowledgement); + + // ------------------------------------------------------------- + // + // Here I make sure that the receipt (the nymbox notice) references the + // transaction number that the trader originally used to issue the cron item... + // This number is used to match up offers to trades, and used to track all cron items. + // (All Cron items require a transaction from the user to add them to Cron in the + // first place.) + // + pTransaction->SetReferenceToNum(GetTransactionNum()); + // ------------------------------------------------- + // The reference on the transaction contains an OTCronItem, in this case. + // The original cron item, versus the updated cron item (which is stored + // on the finalReceipt item just below here.) + // + pTransaction->SetReferenceString(strOrigCronItem); + // -------------------------------------------- + pTransaction->SetClosingNum(GetTransactionNum()); // This transaction is the finalReceipt for GetTransactionNum(). (Which is also the original transaction number.) + + // ----------------------------------------------------------------- + // The finalReceipt ITEM's NOTE contains the UPDATED CRON ITEM. + // + if (NULL != pstrNote) + { + pItem1->SetNote(*pstrNote); // in markets, this is updated trade. + } + + // Also set the ** UPDATED OFFER ** as the ATTACHMENT on the ** item.** + // (With the SERVER's signature on it!) // in markets, this is updated offer. + // + if (NULL != pstrAttachment) + { + pItem1->SetAttachment(*pstrAttachment); + } + + // ----------------------------------------------------------------- + // sign the item + + pItem1->SignContract(*pServerNym); + pItem1->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem1); + + pTransaction->SignContract(*pServerNym); + pTransaction->SaveContract(); + + // Here the transaction we just created is actually added to the ledger. + theLedger.AddTransaction(*pTransaction); + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theLedger.ReleaseSignatures(); + + // Sign and save. + theLedger.SignContract(*pServerNym); + theLedger.SaveContract(); + + // TODO: Better rollback capabilities in case of failures here: + + // Save both inboxes to storage. (File, DB, wherever it goes.) + theLedger. SaveNymbox(); + + return true; // Really this true should be predicated on ALL the above functions returning true. Right? + } + else + OTLog::Error("Failed trying to create Nymbox in OTCronItem::DropFinalReceiptToNymbox()\n"); + + return false; // unreachable. +} + + + + + + + + +void OTCronItem::HarvestClosingNumbers(OTPseudonym & theNym) +{ + // The Nym is the original sender. (If Compares true). + // GetTransactionNum() is burned, but we can harvest the closing + // numbers from the "Closing" list, which is only for the sender's numbers. + // Subclasses will have to override this function for recipients, etc. + // + if (theNym.CompareID(GetSenderUserID())) + { + const OTString strServerID(GetServerID()); + + for (int i = 0; i < GetCountClosingNumbers(); i++) + { + theNym.AddTransactionNum(theNym, strServerID, GetClosingTransactionNoAt(i), + (i == (GetCountClosingNumbers()-1) ? true : false)); // bSave=true only on the last iteration. + } + } +} + + + +OTCronItem::OTCronItem() : OTTrackable(), m_pCron(NULL), m_CREATION_DATE(0), m_LAST_PROCESS_DATE(0), + m_PROCESS_INTERVAL(1), // Default for any cron item is to execute once per second. + m_bRemovalFlag(false) +{ + InitCronItem(); +} + + +OTCronItem::OTCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTTrackable(SERVER_ID, ASSET_ID), + m_pCron(NULL), m_CREATION_DATE(0), + m_LAST_PROCESS_DATE(0), m_PROCESS_INTERVAL(1), // Default for any cron item is to execute once per second. + m_bRemovalFlag(false) +{ + InitCronItem(); +} + +OTCronItem::OTCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & ACCT_ID, const OTIdentifier & USER_ID) : + OTTrackable(SERVER_ID, ASSET_ID, ACCT_ID, USER_ID), + m_pCron(NULL), m_CREATION_DATE(0), + m_LAST_PROCESS_DATE(0), m_PROCESS_INTERVAL(1), // Default for any cron item is to execute once per second. + m_bRemovalFlag(false) + +{ + InitCronItem(); +} + + + + +OTCronItem::~OTCronItem() +{ + // No need to call Release() here, it's handled by the framework. +} + +void OTCronItem::InitCronItem() +{ + m_strContractType.Set("CRONITEM"); // in practice should never appear. Child classes will overwrite. +} + + +void OTCronItem::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + + m_CREATION_DATE = 0; + m_LAST_PROCESS_DATE = 0; + m_PROCESS_INTERVAL = 1; + + m_dequeClosingNumbers.clear(); + + m_bRemovalFlag = false; + + // ---------------------------------- + + OTTrackable::Release(); // since I've overridden the base class, I call it now... +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTCronItem::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("closingTransactionNumber", xml->getNodeName())) + { + OTString strClosingNumber = xml->getAttributeValue("value"); + + if (strClosingNumber.Exists()) + { + const long lClosingNumber = atol(strClosingNumber.Get()); + + this->AddClosingTransactionNo(lClosingNumber); + } + else + { + OTLog::Error("Error in OTCronItem::ProcessXMLNode: closingTransactionNumber field without value.\n"); + return (-1); // error condition + } + + nReturnVal = 1; + } + + return nReturnVal; +} + + + +/* + +void OTCronItem::UpdateContents() +{ + +} + + +bool OTCronItem::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} +*/ diff --git a/OTLib/OTCronItem.h b/OTLib/OTCronItem.h new file mode 100644 index 000000000..2660eddf2 --- /dev/null +++ b/OTLib/OTCronItem.h @@ -0,0 +1,297 @@ +/************************************************************* + * + * OTCronItem.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// Base class for OTTrade and OTAgreement. +// OTCron contains lists of these for regular processing. + +#ifndef __OTCRON_ITEM_H__ +#define __OTCRON_ITEM_H__ + +#include + + +#include "OTTrackable.h" + + +class OTIdentifier; +class OTCron; +class OTString; + + +class OTCronItem : public OTTrackable +{ + OTCron * m_pCron; + + time_t m_CREATION_DATE; // The date, in seconds, when the CronItem was authorized. + time_t m_LAST_PROCESS_DATE; // The last time this item was processed. + + time_t m_PROCESS_INTERVAL; // How often to Process Cron on this item. + + std::deque m_dequeClosingNumbers; // Numbers used for CLOSING a transaction. (finalReceipt.) + +protected: + + OTCronItem(); + OTCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & ACCT_ID, const OTIdentifier & USER_ID); + + bool m_bRemovalFlag; // Set this to true and the cronitem will be removed from Cron on next process. + // (And its offer will be removed from the Market as well, if appropriate.) + + virtual void onFinalReceipt(OTCronItem & theOrigCronItem, + const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover); // called by HookRemovalFromCron(). + virtual void onRemovalFromCron() {} // called by HookRemovalFromCron(). + + // To force the Nym to close out the closing number on the receipt. + bool DropFinalReceiptToInbox(const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID, + const long & lNewTransactionNumber, + const long & lClosingNumber, + const OTString & strOrigCronItem, + OTString * pstrNote=NULL, + OTString * pstrAttachment=NULL); + + // Notify the Nym that the OPENING number is now closed, so he can remove it from his issued list. + bool DropFinalReceiptToNymbox(const OTIdentifier & USER_ID, + const long & lNewTransactionNumber, + const OTString & strOrigCronItem, + OTString * pstrNote=NULL, + OTString * pstrAttachment=NULL); + + +public: + virtual bool CanRemoveItemFromCron(OTPseudonym & theNym); + + virtual void HarvestClosingNumbers(OTPseudonym & theNym); + + // Called in OTCron::RemoveCronItem as well as OTCron::ProcessCron. + void HookRemovalFromCron(OTPseudonym * pRemover); // This calls onFinalReceipt, then onRemovalFromCron. Both are polymorphic. + + // ----------------------------------------------------------------- + + inline bool IsFlaggedForRemoval() const { return m_bRemovalFlag; } + inline void FlagForRemoval() { m_bRemovalFlag = true; } + + // ----------------------------------------------------------------- + + inline void SetCronPointer(OTCron & theCron) { m_pCron = &theCron; } + + static OTCronItem * NewCronItem(const OTString & strCronItem); + static OTCronItem * LoadCronReceipt(const long & lTransactionNum); + + inline void SetCreationDate(const time_t & CREATION_DATE) { m_CREATION_DATE = CREATION_DATE; } + inline const time_t & GetCreationDate() const { return m_CREATION_DATE; } + + inline void SetLastProcessDate(const time_t & THE_DATE) { m_LAST_PROCESS_DATE = THE_DATE; } + inline const time_t & GetLastProcessDate() const { return m_LAST_PROCESS_DATE; } + + inline void SetProcessInterval(const time_t & THE_DATE) { m_PROCESS_INTERVAL = THE_DATE; } + inline const time_t & GetProcessInterval() const { return m_PROCESS_INTERVAL; } + + + inline OTCron * GetCron() { return m_pCron; } + + + // When first adding anything to Cron, a copy needs to be saved in a folder somewhere. + bool SaveCronReceipt(); + + + // -------------------------------------------------------------------------- + // Return True if should stay on OTCron's list for more processing. + // Return False if expired or otherwise should be removed. + virtual bool ProcessCron(); // OTCron calls this regularly, which is my chance to expire, etc. + + // -------------------------------------------------------------------------- + + // From OTTrackable (parent class of this) + /* + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + */ + + // -------------------------------------------------------------------------- + + // From OTInstrument (parent class of OTTrackable, parent class of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + bool IsExpired(); // Only tells if if it's past the "valid to" date. + */ + + virtual ~OTCronItem(); + + + void InitCronItem(); + + virtual void Release(); + + // ------------------------------------------------------ + // These are for std::deque m_dequeClosingNumbers; + // They are numbers used for CLOSING a transaction. (finalReceipt.) + + long GetClosingTransactionNoAt(unsigned int nIndex) const; + int GetCountClosingNumbers() const; + + void AddClosingTransactionNo(const long & lClosingTransactionNo); + + // HIGHER LEVEL ABSTRACTION: + long GetOpeningNum() const; + long GetClosingNum() const; + // ------------------------------------------------------ + + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + +// virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + +// virtual bool SaveContractWallet(std::ofstream & ofs); +}; + + + + +#endif // __OTCRON_ITEM_H__ diff --git a/OTLib/OTData.cpp b/OTLib/OTData.cpp new file mode 100644 index 000000000..65f9c6167 --- /dev/null +++ b/OTLib/OTData.cpp @@ -0,0 +1,397 @@ + +/************************************************************* + * + * OTData.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include + +extern "C" +{ +#include +} + +#include +#include + +#include "OTData.h" + +#include "OTLog.h" + +// First use reset() to set the internal position to 0. +// Then you pass in the buffer where the results go. +// You pass in the length of that buffer. +// It returns how much was actually read. +// If you start at position 0, and read 100 bytes, then +// you are now on position 100, and the next OTfread will +// proceed from that position. (Unless you reset().) +// +int OTData::OTfread(char * buf, int buflen) +{ + int nSizeToRead = 0; + + if (buf && (buflen > 0) && m_pData && (m_lPosition < GetSize())) + { + // If the size is 20, and position is 5 (I've already read the first 5 bytes) + // then the size remaining to read is 15. That is, GetSize() minus m_lPosition. + nSizeToRead = GetSize() - m_lPosition; + + if (buflen < nSizeToRead) + nSizeToRead = buflen; + + memcpy(buf, ((char*)m_pData)+m_lPosition, nSizeToRead); + m_lPosition += nSizeToRead; + } + + return nSizeToRead; +} + + +bool OTData::operator==(const OTData &s2) const +{ + if (m_lSize != s2.m_lSize) + { + return false; + } + + if (m_lSize == 0 && s2.m_lSize == 0) + { + return true; + } + + if (0 == memcmp(m_pData, s2.m_pData, m_lSize)) // TODO security: replace memcmp with a more secure version. Still, though, I am managing it internal to the class. + { + return true; + } + + return false; +} + +bool OTData::operator!=(const OTData &s2) const +{ + if (m_lSize == s2.m_lSize) + { + return false; + } + + if (m_lSize == 0 && s2.m_lSize == 0) + { + return true; + } + + if (0 == memcmp(m_pData, s2.m_pData, m_lSize) ) + { + return false; + } + + return true; +} + +/* The initialization vector needs to be known to Alice AND Bob. + And it needs to be transmitted at the time the session key is negotiated. + + So there should probably be a "OTEnvelope" class which stores the IV + as well as the session key, and which can be encrypted with a public key + and decrypted with a private key. The keys can just be passed in or whatever. + +void OTData::AESEncrypt(OTData & theKey) +{ + const unsigned char *iv="blahfuckheadfixthis"; + + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + + const EVP_CIPHER * cipher = EVP_aes_128_cbc(); + + EVP_EncryptInit(&ctx, cipher, theKey.GetPointer(), iv); + + EVP_EncryptUpdate(&ctx, out, &outlen, in, inlen); + + // unsigned char * out + EVP_EncryptFinal(&ctx, out, &outlen); + + EVP_CIPHER_CTX_cleanup(&ctx); +} + + +void OTData::AESDecrypt(OTData & theKey) +{ + const unsigned char *iv="blahfuckheadfixthis"; + + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + + const EVP_CIPHER * cipher = EVP_aes_128_cbc(); + + EVP_DecryptInit(&ctx, cipher, theKey.GetPointer(), iv); + + EVP_DecryptUpdate(&ctx, out, &outlen, in, inlen); + + // unsigned char * out + EVP_DecryptFinal(&ctx, out, &outlen); + + EVP_CIPHER_CTX_cleanup(&ctx); +} + +*/ + +OTData::OTData() : m_pData(NULL), m_lPosition(0), m_lSize(0) +{ + +} + +OTData::OTData(const OTData &theSource) : m_pData(NULL), m_lPosition(0), m_lSize(0) +{ + Assign(theSource); +} + +OTData::OTData(const void * pNewData, uint32_t lNewSize) : m_pData(NULL), m_lPosition(0), m_lSize(0) +{ + Assign(pNewData, lNewSize); +} + +OTData & OTData::operator=(OTData rhs) +{ + this->swap(rhs); + return *this; +} + +void OTData::swap(OTData & rhs) +{ + std::swap(m_pData, rhs.m_pData); + std::swap(m_lPosition, rhs.m_lPosition); + std::swap(m_lSize, rhs.m_lSize); +} + +void OTData::Assign(const OTData &theSource) +{ + if ((&theSource) == this) + return; // can't assign to self. + + if (false == theSource.IsEmpty()) // If something is there... + { + Assign(theSource.m_pData, theSource.m_lSize); // Copy it. + } + else + Release(); // Otherwise if it's empty, then empty this also. +} + +void OTData::Assign(const void * pNewData, uint32_t lNewSize) +{ + Release(); // This releases all memory and zeros out all members. + + if ((pNewData != NULL) && (lNewSize > 0)) + { + m_pData = static_cast(new char[lNewSize]); + + OT_ASSERT(NULL != m_pData); + + memcpy(m_pData, pNewData, lNewSize); // todo security: replace memcpy with more secure version. Still though, I'm allocating it, and size is passed in. + m_lSize = lNewSize; + } + // else error condition. Could just ASSERT() this. +} + + +void OTData::Release() +{ + if (m_pData != NULL) + { + // For security reasons, we clear the memory to 0 when deleting the object. (Seems smart.) + memset(m_pData, 0, m_lSize); + + delete [] (static_cast(m_pData)); + + Initialize(); // If m_pData was already NULL, no need to re-Initialize(). + } +} + + +void OTData::SetSize(uint32_t lNewSize) +{ + Release(); + + if (lNewSize > 0) + { + m_pData = (void*)new char[lNewSize]; + + OT_ASSERT(NULL != m_pData); + + memset(m_pData, 0, lNewSize); + m_lSize = lNewSize; + } +} + + +OTData & OTData::operator+=(const OTData & rhs) +{ + void * pNewData = NULL; + uint32_t lTotalSize = GetSize() + rhs.GetSize(); + + if (lTotalSize) + { + pNewData = (void*)new char[lTotalSize]; + + OT_ASSERT(NULL != pNewData); + + memset(pNewData, 0, lTotalSize); + } + + if (NULL != pNewData) // If there's a new memory buffer (for the combined..) + { + if (!IsEmpty()) // if THIS object has data inside of it... + { + memcpy(pNewData, m_pData, GetSize()); // Copy THIS object into the new buffer, starting at the beginning. + } + + if (!rhs.IsEmpty()) // If the rhs object has data inside of it... + { + memcpy((static_cast(pNewData))+GetSize(), rhs.m_pData, rhs.GetSize()); + } + } + + if (m_pData) // If I wasn't already empty, then erase whatever I had in there before... + delete [] (char *)m_pData; + + m_pData = pNewData; // Set my internal memory to the new buffer. + m_lSize = lTotalSize; // Set my internal size to the new size. + + return *this; +} + + + + + + + + + + + + diff --git a/OTLib/OTData.h b/OTLib/OTData.h new file mode 100644 index 000000000..001223940 --- /dev/null +++ b/OTLib/OTData.h @@ -0,0 +1,222 @@ + +/************************************************************* + * + * OTData.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#ifndef __OTDATA_H__ +#define __OTDATA_H__ + +extern "C" { +#include +} + + +class OTData +{ + friend class OTASCIIArmor; + friend class OTIdentifier; + friend class OTContract; + friend class OTEnvelope; + +private: + void * m_pData; + uint32_t m_lPosition; + uint32_t m_lSize; + +protected: + inline const void * GetPointer() const { return m_pData; } + void SetSize(uint32_t lNewSize); + + inline void Initialize() { m_pData = NULL; m_lSize = 0; m_lPosition = 0; } + +public: + OTData(); + OTData(const void * pNewData, uint32_t nNewSize); + OTData(const OTData &theSource); + + virtual void Release(); + virtual ~OTData() { Release(); } + + OTData & operator=(OTData rhs); + + void swap (OTData & rhs); + + bool operator==(const OTData &s2) const; + bool operator!=(const OTData &s2) const; + OTData & operator+=(const OTData & rhs); + + + inline uint32_t GetSize() const { return m_lSize; } + inline bool IsEmpty() const { return (m_lSize > 0) ? false : true; } + + void Assign(const OTData &theSource); + void Assign(const void * pNewData, uint32_t lNewSize); + + int OTfread(char * buf, int buflen); + inline void reset() { m_lPosition = 0; }; +}; + + + +// A simple class used for making sure that dynamically allocated objects +// are deleted once the pointer goes out of scope. +// +// WARNING: This is ONE-USE ONLY! Don't try to re-use instances of this all over the place. +// If you are dynamically allocating some new object you want cleaned up, then make a NEW +// instance of OTCleanup for each one. +// +// For example, if you call SetCleanupTarget() on multiple objects, then only the LAST +// one will get cleaned up, and the others will leak! +// +template +class OTCleanup +{ +protected: + T * m_pCharge; + + +public: + + inline bool SetCleanupTarget(const T & theTarget) // Use this as much as you can. + { m_pCharge = &((T&)theTarget); return true; } + + inline bool SetCleanupTargetPointer(const T * pTarget) // Use this when you want it to work even if pTarget is NULL. + { m_pCharge = (T*)pTarget; return true; } // (Like, it will accept the NULL pointer, and just be smart + // enough NOT to delete it, since it's already NULL.) + OTCleanup() { m_pCharge = NULL; } + OTCleanup(const T & theTarget) { SetCleanupTarget(theTarget); } + OTCleanup(const T * pTarget) { SetCleanupTargetPointer(pTarget); } + + ~OTCleanup() { if (m_pCharge) delete m_pCharge; m_pCharge = NULL; } +}; + + +#endif // __OTDATA_H diff --git a/OTLib/OTDataCheck.cpp b/OTLib/OTDataCheck.cpp new file mode 100644 index 000000000..e4391714c --- /dev/null +++ b/OTLib/OTDataCheck.cpp @@ -0,0 +1,224 @@ + +/************************************************************* + * + * OTDataCheck.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 +=VjLJ +-----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "OTDataCheck.h" + +void AppendChecksum( OT_BYTE* buffer, uint32_t & size ) +{ + uint32_t i; + OT_BYTE total = 0; + +// OTLog::vError("Appending checksum. Size: %d ", size); + + for( i = 0; i < size; i++ ) + { + total += buffer[i]; +// OTLog::vError("%d ", buffer[i]); + } + +// OTLog::vError(" VALUE: %d\n", (255 - total)); + + buffer[size++] = 255 - total; +} + + +OT_BYTE CalcChecksum( OT_BYTE* buffer, uint32_t size ) +{ + uint32_t i; + OT_BYTE total = 0; + +// OTLog::vError("Calculating checksum. Size: %d ", size); + + for( i = 0; i < size; i++ ) + { + total += buffer[i]; +// OTLog::vError("%d ", buffer[i]); + } +// OTLog::vError( " VALUE: %d\n", (255 - total)); + + return (255 - total); +} + +OT_BYTE CalcChecksum( const OT_BYTE * const buffer, const uint32_t size ) +{ + uint32_t i; + OT_BYTE total = 0; + +// OTLog::vError("Calculating checksum. Size: %d\n", size); + + for( i = 0; i < size; i++ ) + { + total += buffer[i]; +// OTLog::vError("%d ", buffer[i]); + } +// OTLog::vError(" TOTAL: %d\n", (255 - total)); + + return (255 - total); +} + +OT_BOOL IsChecksumValid( OT_BYTE* buffer, uint32_t size ) +{ + uint32_t i; + OT_BYTE total = 0; + +// OTLog::vError(Validating checksum. Size: %d\n", size); + + for( i = 0; i < size; i++ ) + { + total += buffer[i]; + +// OTLog::vError("%d ", buffer[i]); + } + if( total == 255 ) + { +// OTLog::Error("VALID\n"); + return true; + } + else + { +// OTLog::vError("INVALID: %d\n", total); + return false; + } +} + + + + + + + + + + diff --git a/OTLib/OTDataCheck.h b/OTLib/OTDataCheck.h new file mode 100644 index 000000000..88e043ea2 --- /dev/null +++ b/OTLib/OTDataCheck.h @@ -0,0 +1,151 @@ +/************************************************************* + * + * OTDataCheck.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef _DATA_CHECK_H_ +#define _DATA_CHECK_H_ + +typedef unsigned char OT_BYTE; +typedef bool OT_BOOL; + + +extern "C" { +#include +} + +void AppendChecksum( OT_BYTE* buffer, uint32_t & size ); + +OT_BYTE CalcChecksum( OT_BYTE* buffer, uint32_t size ); + +OT_BYTE CalcChecksum( const OT_BYTE * const buffer, const uint32_t size ); + +OT_BOOL IsChecksumValid( OT_BYTE* buffer, uint32_t size ); + +#endif diff --git a/OTLib/OTEnvelope.cpp b/OTLib/OTEnvelope.cpp new file mode 100644 index 000000000..d9a5b21d7 --- /dev/null +++ b/OTLib/OTEnvelope.cpp @@ -0,0 +1,628 @@ +/***************************************************************** + * + * OTEnvelope.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include + +#include +#include +#include + +extern "C" +{ +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include /* For htonl() */ +#endif +} + +#include "OTStorage.h" + +#include "OTAsymmetricKey.h" +#include "OTASCIIArmor.h" +#include "OTPseudonym.h" +#include "OTEnvelope.h" +#include "OTLog.h" + + +// Presumably this Envelope contains encrypted data (in binary form.) +// If you would like an ASCII-armored version of that data, just call this +// function. +// Should be called "Get Binary Envelope Encrypted Contents Into Ascii-Armored Form" +bool OTEnvelope::GetAsciiArmoredData(OTASCIIArmor & theArmoredText) const +{ + return theArmoredText.SetData(m_dataContents); +} + +// Let's say you just retrieved the ASCII-armored contents of an encrypted envelope. +// Perhaps someone sent it to you, and you just read it out of his message. +// And let's say you want to get those contents back into binary form in an +// Envelope object again, so that they can be decrypted and extracted back as +// plaintext. Fear not, just call this function. +// should be called "Set Via Ascii Armored Data" +bool OTEnvelope::SetAsciiArmoredData(const OTASCIIArmor & theArmoredText) +{ + return theArmoredText.GetData(m_dataContents); +} + + +/* +#include +int EVP_OpenInit(EVP_CIPHER_CTX *ctx,EVP_CIPHER *type,unsigned char *ek, + int ekl,unsigned char *iv,EVP_PKEY *priv); +int EVP_OpenUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl, unsigned char *in, int inl); +int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, + int *outl); +DESCRIPTION + +The EVP envelope routines are a high level interface to envelope decryption. They decrypt a public key + encrypted symmetric key and then decrypt data using it. + + int EVP_OpenInit(EVP_CIPHER_CTX *ctx,EVP_CIPHER *type,unsigned char *ek, int ekl,unsigned char *iv,EVP_PKEY *priv); +EVP_OpenInit() initializes a cipher context ctx for decryption with cipher type. It decrypts the encrypted + symmetric key of length ekl bytes passed in the ek parameter using the private key priv. The IV is supplied + in the iv parameter. + +EVP_OpenUpdate() and EVP_OpenFinal() have exactly the same properties as the EVP_DecryptUpdate() and + EVP_DecryptFinal() routines, as documented on the EVP_EncryptInit(3) manual page. + +NOTES + +It is possible to call EVP_OpenInit() twice in the same way as EVP_DecryptInit(). The first call should have + priv set to NULL and (after setting any cipher parameters) it should be called again with type set to NULL. + +If the cipher passed in the type parameter is a variable length cipher then the key length will be set to the +value of the recovered key length. If the cipher is a fixed length cipher then the recovered key length must +match the fixed cipher length. + +RETURN VALUES + +EVP_OpenInit() returns 0 on error or a non zero integer (actually the recovered secret key size) if successful. + +EVP_OpenUpdate() returns 1 for success or 0 for failure. + +EVP_OpenFinal() returns 0 if the decrypt failed or 1 for success. +*/ + +// RSA / AES + + +bool OTEnvelope::Open(const OTPseudonym & theRecipient, OTString & theContents) +{ + bool retval = false; + + EVP_CIPHER_CTX ctx; + + unsigned char buffer[4096]; + unsigned char buffer_out[4096 + EVP_MAX_IV_LENGTH]; + unsigned char iv[EVP_MAX_IV_LENGTH]; + + size_t len = 0; + int len_out = 0; + + unsigned char * ek = NULL; + int eklen = 0; + uint32_t eklen_n = 0; + + memset(buffer, 0, 4096); + memset(buffer_out, 0, 4096 + EVP_MAX_IV_LENGTH); + memset(iv, 0, EVP_MAX_IV_LENGTH); + + OTAsymmetricKey & privateKey = (OTAsymmetricKey &)theRecipient.GetPrivateKey(); + EVP_PKEY * pkey = (EVP_PKEY *)privateKey.GetKey(); + + if (NULL == pkey) + { + OTLog::Error("Null private key in OTEnvelope::Open\n"); + return false; + } + + EVP_CIPHER_CTX_init(&ctx); + ek = (unsigned char*)malloc(EVP_PKEY_size(pkey)); // I assume this is for the AES key + + OT_ASSERT(NULL != ek); + + memset(ek, 0, EVP_PKEY_size(pkey)); + + eklen = EVP_PKEY_size(pkey); + + + //int EVP_OpenInit(EVP_CIPHER_CTX *ctx, + //EVP_CIPHER *type, + //unsigned char *ek, + //int ekl, + //unsigned char *iv, + //EVP_PKEY *priv); + + //EVP_OpenInit() initializes a cipher context ctx for decryption with cipher type. It decrypts the encrypted + // symmetric key of length ekl bytes passed in the ek parameter using the private key priv. The IV is supplied + // in the iv parameter. + + + theContents.Release(); // This is where we'll put the decrypted data. + m_dataContents.reset(); // reset the fread position on this object. + + int nReadLength = 0; + int nReadKey = 0; + int nReadIV = 0; + + // First we read the encrypted key size. + if (0 == (nReadLength = m_dataContents.OTfread((char*)&eklen_n, sizeof(eklen_n)))) + { + OTLog::Error("Error reading encrypted key size in OTEnvelope::Open\n"); + free(ek); ek = NULL; + return false; + } + + // convert it from network to host endian. + eklen = ntohl(eklen_n); + + // Next we read the encrypted key itself. + if (0 == (nReadKey = m_dataContents.OTfread((char*)ek, eklen))) + { + OTLog::Error("Error reading encrypted key size in OTEnvelope::Open\n"); + free(ek); ek = NULL; + return false; + } + + // Next we read the initialization vector. + if (0 == (nReadIV = m_dataContents.OTfread((char*)iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc())))) + { + OTLog::Error("Error reading initialization vector in OTEnvelope::Open\n"); + free(ek); ek = NULL; + return false; + } + + OTData ciphertext((const void*)((unsigned char *)m_dataContents.GetPointer() + nReadLength + nReadKey + nReadIV), + m_dataContents.GetSize() - nReadLength - nReadKey - nReadIV); + + + + // Now we process ciphertext and write the decrypted data to plaintext. + OTData plaintext; + + if (!EVP_OpenInit(&ctx, EVP_aes_128_cbc(), ek, eklen, iv, pkey)) + { + OTLog::Error("EVP_OpenInit: failed.\n"); + free(ek); ek = NULL; + return false; + } + + while ((len = ciphertext.OTfread((char*)buffer, sizeof(buffer))) > 0) + { + if (!EVP_OpenUpdate(&ctx, buffer_out, &len_out, buffer, len)) + { + OTLog::Error("EVP_OpenUpdate: failed.\n"); + free(ek); ek = NULL; + return false; + } + + OTData dataOpenUpdate(buffer_out, len_out); + plaintext += dataOpenUpdate; + } + + if (!EVP_OpenFinal(&ctx, buffer_out, &len_out)) + { + OTLog::Error("EVP_OpenFinal: failed.\n"); + free(ek); ek = NULL; + return false; + } + + OTData dataOpenFinal(buffer_out, len_out); + plaintext += dataOpenFinal; + + // Make sure it's null terminated + int nIndex = plaintext.GetSize()-1; + ((unsigned char*)plaintext.GetPointer())[nIndex] = 0; + + // Set it into theContents (to return the plaintext to the caller) + theContents.Set((const char *)plaintext.GetPointer()); + + retval = true; + + free(ek); ek = NULL; + + return retval; + +} + +// RSA / AES +bool OTEnvelope::Seal(const OTPseudonym & theRecipient, const OTString & theContents) +{ + return Seal(theRecipient.GetPublicKey(), theContents); +} + +bool OTEnvelope::Seal(const OTAsymmetricKey & RecipPubKey, const OTString & theContents) +{ + bool retval = false; + + EVP_CIPHER_CTX ctx; + + unsigned char buffer[4096]; + unsigned char buffer_out[4096 + EVP_MAX_IV_LENGTH]; + unsigned char iv[EVP_MAX_IV_LENGTH]; + + size_t len = 0; + int len_out = 0; + + unsigned char * ek = NULL; + int eklen = 0; + uint32_t eklen_n = 0; + + + memset(buffer, 0, 4096); + memset(buffer_out, 0, 4096 + EVP_MAX_IV_LENGTH); + memset(iv, 0, EVP_MAX_IV_LENGTH); + + + OTAsymmetricKey & publicKey = (OTAsymmetricKey &)RecipPubKey; + EVP_PKEY * pkey = (EVP_PKEY *)publicKey.GetKey(); + + if (NULL == pkey) + { + OTLog::Error("Null public key in OTEnvelope::Seal\n"); + return false; + } + + // This is where the envelope final contents will be placed. + m_dataContents.Release(); + + + EVP_CIPHER_CTX_init(&ctx); + ek = (unsigned char*)malloc(EVP_PKEY_size(pkey)); + + OT_ASSERT(NULL != ek); + + memset(ek, 0, EVP_PKEY_size(pkey)); + + if (!EVP_SealInit(&ctx, EVP_aes_128_cbc(), &ek, &eklen, iv, &pkey, 1)) + { + OTLog::Error("EVP_SealInit: failed.\n"); + free(ek); ek = NULL; + return false; + } + + // First we write out the encrypted key length, then the encrypted key, + // then the iv (the IV length is fixed by the cipher we have chosen). + + eklen_n = htonl(eklen); + + OTData dataEKSize(&eklen_n, sizeof(eklen_n)); // Encrypted Key size. (EK). Bytes are in network order. + OTData dataEK(ek, eklen); // Encrypted Key + OTData dataIV(iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc())); // Initialization Vector + + // Concatenate (to the envelope result buffer) the three pieces of final data we have so far. + m_dataContents += dataEKSize; + m_dataContents += dataEK; + m_dataContents += dataIV; + + // Next we put the plaintext into a data object so we can process it. + OTData plaintext((const void*)theContents.Get(), theContents.GetLength()+1); // +1 for null terminator + + // Now we process the input and write the encrypted data to the + // output. + + while (0 < (len = plaintext.OTfread((char*)buffer, sizeof(buffer)))) + { + if (!EVP_SealUpdate(&ctx, buffer_out, &len_out, buffer, len)) + { + OTLog::Error("EVP_SealUpdate: failed.\n"); + free(ek); ek = NULL; + return false; + } + + OTData dataSealUpdate(buffer_out, len_out); + m_dataContents += dataSealUpdate; + } + + if (!EVP_SealFinal(&ctx, buffer_out, &len_out)) + { + OTLog::Error("EVP_SealFinal: failed.\n"); + free(ek); ek = NULL; + return false; + } + + OTData dataSealFinal(buffer_out, len_out); + m_dataContents += dataSealFinal; + + retval = true; + + free(ek); ek = NULL; + + return retval; +} + +/* +int do_evp_seal(FILE *rsa_pkey_file, FILE *in_file, FILE *out_file) +{ + int retval = 0; + RSA *rsa_pkey = NULL; + EVP_PKEY *pkey = EVP_PKEY_new(); + EVP_CIPHER_CTX ctx; + unsigned char buffer[4096]; + unsigned char buffer_out[4096 + EVP_MAX_IV_LENGTH]; + size_t len; + int len_out; + unsigned char *ek; + int eklen; + uint32_t eklen_n; + unsigned char iv[EVP_MAX_IV_LENGTH]; + + if (!PEM_read_RSA_PUBKEY(rsa_pkey_file, &rsa_pkey, NULL, NULL)) + { + OTLog::Error("Error loading RSA Public Key File.\n"); + ERR_print_errors_fp(stderr); + retval = 2; + goto out; + } + + if (!EVP_PKEY_assign_RSA(pkey, rsa_pkey)) + { + OTLog::Error("EVP_PKEY_assign_RSA: failed.\n"); + retval = 3; + goto out; + } + + EVP_CIPHER_CTX_init(&ctx); + ek = malloc(EVP_PKEY_size(pkey)); + + if (!EVP_SealInit(&ctx, EVP_aes_128_cbc(), &ek, &eklen, iv, &pkey, 1)) + { + OTLog::Error("EVP_SealInit: failed.\n"); + retval = 3; + goto out_free; + } + + // First we write out the encrypted key length, then the encrypted key, + / then the iv (the IV length is fixed by the cipher we have chosen). + + + eklen_n = htonl(eklen); + if (fwrite(&eklen_n, sizeof eklen_n, 1, out_file) != 1) + { + perror("output file"); + retval = 5; + goto out_free; + } + if (fwrite(ek, eklen, 1, out_file) != 1) + { + perror("output file"); + retval = 5; + goto out_free; + } + if (fwrite(iv, EVP_CIPHER_iv_length(EVP_aes_128_cbc()), 1, out_file) != 1) + { + perror("output file"); + retval = 5; + goto out_free; + } + + // Now we process the input file and write the encrypted data to the + //output file. + + while ((len = fread(buffer, 1, sizeof buffer, in_file)) > 0) + { + if (!EVP_SealUpdate(&ctx, buffer_out, &len_out, buffer, len)) + { + OTLog::Error("EVP_SealUpdate: failed.\n"); + retval = 3; + goto out_free; + } + + if (fwrite(buffer_out, len_out, 1, out_file) != 1) + { + perror("output file"); + retval = 5; + goto out_free; + } + } + + if (ferror(in_file)) + { + perror("input file"); + retval = 4; + goto out_free; + } + + if (!EVP_SealFinal(&ctx, buffer_out, &len_out)) + { + OTLog::Error("EVP_SealFinal: failed.\n"); + retval = 3; + goto out_free; + } + + if (fwrite(buffer_out, len_out, 1, out_file) != 1) + { + perror("output file"); + retval = 5; + goto out_free; + } + +out_free: + EVP_PKEY_free(pkey); + free(ek); + +out: + return retval; +} + +int main(int argc, char *argv[]) +{ + FILE *rsa_pkey_file; + int rv; + + if (argc < 2) + { + OTLog::vOutput(0, "Usage: %s \n", argv[0]); + exit(1); + } + + rsa_pkey_file = fopen(argv[1], "rb"); + if (!rsa_pkey_file) + { + perror(argv[1]); + OTLog::Error("Error loading PEM RSA Public Key File.\n"); + exit(2); + } + + rv = do_evp_seal(rsa_pkey_file, stdin, stdout); + + fclose(rsa_pkey_file); + return rv; +} +*/ + + +// We just read some encrypted data and we want to put it in an envelope +// so that it can be opened. +OTEnvelope::OTEnvelope(const OTASCIIArmor & theArmoredText) +{ + SetAsciiArmoredData(theArmoredText); +} + +OTEnvelope::OTEnvelope() +{ + +} + +OTEnvelope::~OTEnvelope() +{ + +} + + + + diff --git a/OTLib/OTEnvelope.h b/OTLib/OTEnvelope.h new file mode 100644 index 000000000..48f9399c5 --- /dev/null +++ b/OTLib/OTEnvelope.h @@ -0,0 +1,180 @@ +/************************************************************* + * + * OTEnvelope.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTENVELOPE_H__ +#define __OTENVELOPE_H__ + +#include "OTData.h" + +class OTPseudonym; +class OTString; +class OTASCIIArmor; +class OTAsymmetricKey; +class OTPayload; + +class OTEnvelope +{ + friend class OTPayload; + + OTData m_dataContents; // Stores only encrypted contents. + + +public: + OTEnvelope(); + OTEnvelope(const OTASCIIArmor & theArmoredText); + virtual ~OTEnvelope(); + + bool Seal(const OTPseudonym & theRecipient, const OTString & theContents); // Put data into this object with Seal(). + bool Seal(const OTAsymmetricKey & RecipPubKey, const OTString & theContents); // Currently supports strings only. + + bool Open(const OTPseudonym & theRecipient, OTString & theContents); // Read it back out with Open(). + + // Presumably this Envelope contains encrypted data (in binary form.) + // If you would like an ASCII-armored version of that data, just call this + // function. + // Should be called "Get Binary Envelope Encrypted Contents Into Ascii-Armored Form" + // (Bookends not included.) + bool GetAsciiArmoredData(OTASCIIArmor & theArmoredText) const; + + // Let's say you just retrieved the ASCII-armored contents of an encrypted envelope. + // Perhaps someone sent it to you, and you just read it out of his message. + // And let's say you want to get those contents back into binary form in an + // Envelope object again, so that they can be decrypted and extracted back as + // plaintext. Fear not, just call this function. + // + // Should be called "Set This Envelope Via Ascii Armored Data" + bool SetAsciiArmoredData(const OTASCIIArmor & theArmoredText); + +}; + + +#endif // __OTENVELOPE_H__ + diff --git a/OTLib/OTIdentifier.cpp b/OTLib/OTIdentifier.cpp new file mode 100644 index 000000000..407fa24da --- /dev/null +++ b/OTLib/OTIdentifier.cpp @@ -0,0 +1,1053 @@ + +/************************************************************************************ + * + * OTIdentifier.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +extern "C" +{ +#include + +#include + +#include +#include +#include + +#ifndef ANDROID // Android thus far only supports OpenSSL 0.9.8k +#include + + // Just trying to get Whirlpool working since they added it to OpenSSL + // + static int init(EVP_MD_CTX *ctx) + { return WHIRLPOOL_Init((WHIRLPOOL_CTX*)ctx->md_data); } + + static int update(EVP_MD_CTX *ctx,const void *data,size_t count) + { return WHIRLPOOL_Update((WHIRLPOOL_CTX*)ctx->md_data,data,count); } + + static int final(EVP_MD_CTX *ctx,unsigned char *md) + { return WHIRLPOOL_Final(md,(WHIRLPOOL_CTX*)ctx->md_data); } + + + static const EVP_MD whirlpool_md= + { + NID_whirlpool, + 0, + WHIRLPOOL_DIGEST_LENGTH, + 0, + init, + update, + final, + NULL, + NULL, + EVP_PKEY_NULL_method, + WHIRLPOOL_BBLOCK/8, + sizeof(EVP_MD *)+sizeof(WHIRLPOOL_CTX), + }; +#endif // ANDROID + +} + +#include +#include + +#include +#include +//#include "cryptopp/hex.h" +//#include "cryptopp/files.h" +//#include "cryptopp/channels.h" + +#include "OTStorage.h" + +#include "OTData.h" +#include "OTString.h" + +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTContract.h" +#include "OTOffer.h" +#include "OTTrade.h" +#include "OTMarket.h" + +#include "OTLog.h" + +//using namespace CryptoPP; + + +// `BigIntegerLibrary.hh' includes all of the library headers for bigint +#include "BigIntegerLibrary.hh" + + + + +OTIdentifier::OTIdentifier() : OTData() +{ + +} + +OTIdentifier::OTIdentifier(const OTIdentifier & theID) : OTData(theID) +{ + +} + + +OTIdentifier::OTIdentifier(const char * szStr) : OTData() +{ + OT_ASSERT(NULL != szStr); + + SetString(szStr); +} + +OTIdentifier::OTIdentifier(const OTString & theStr) : OTData() +{ + SetString(theStr); +} + +OTIdentifier::OTIdentifier(const OTContract &theContract) : OTData() // Get the contract's ID into this identifier. +{ + (const_cast(theContract)).GetIdentifier(*this); +} + +OTIdentifier::OTIdentifier(const OTPseudonym &theNym) : OTData() // Get the Nym's ID into this identifier. +{ + (const_cast(theNym)).GetIdentifier(*this); +} + +OTIdentifier::OTIdentifier(const OTOffer &theOffer) : OTData() // Get the Offer's Market ID into this identifier. +{ + (const_cast(theOffer)).GetIdentifier(*this); +} + +OTIdentifier::OTIdentifier(const OTMarket &theMarket) : OTData() // Get the Market ID into this identifier. +{ + (const_cast(theMarket)).GetIdentifier(*this); +} + + + + +bool OTIdentifier::operator==(const OTIdentifier &s2) const +{ + OTString ots1(*this), ots2(s2); + + return ots1.Compare(ots2); +} + +bool OTIdentifier::operator!=(const OTIdentifier &s2) const +{ + OTString ots1(*this), ots2(s2); + + return !(ots1.Compare(ots2)); +} + + + +void OTIdentifier::SetString(const char * szString) +{ + OT_ASSERT(NULL != szString); + + const OTString theStr(szString); + + SetString(theStr); +} + + +OTIdentifier::~OTIdentifier() +{ + +} + +void OTIdentifier::CopyTo(unsigned char * szNewLocation) const +{ + if (GetSize()) + { + memcpy((void*)GetPointer(), szNewLocation, GetSize()); + } +} + + + + +// -------------------- +/* + SHA256_CTX context; + unsigned char md[SHA256_DIGEST_LENGTH]; + + SHA256_Init(&context); + SHA256_Update(&context, (unsigned char*)input, length); + SHA256_Final(md, &context); + */ +// ---------------------- + + + +// On the advice of SAMY, our default hash algorithm will be an XOR +// of two reputable algorithms. This way, if one of them gets broken, +// our signatures are still safe. +// Smart, eh? So I named it in his honor. +// (I have chosen SHA-256 and RIPEMD-256.) +// UPDATE: SHA-512 and WHIRLPOOL +// UPDATE: SHA-256 and WHIRLPOOL +// We now have 256-bit keysize, though half of WHIRLPOOL output is still XORed onto it. +// We also now input/output the string values with Base62 instead of Hex. (More compact.) +// + +#ifndef ANDROID +const OTString OTIdentifier::DefaultHashAlgorithm("SAMY"); +#else +const OTString OTIdentifier::DefaultHashAlgorithm("SHA256"); +#endif // ANDROID + +const OTString OTIdentifier::HashAlgorithm1("SHA256"); +const OTString OTIdentifier::HashAlgorithm2("WHIRLPOOL"); + +// I would like to use Tiger and/or Whirlpool in the mix here. +// Unfortunately, OpenSSL does not appear to support them. I may +// try Crypto++ in order to add this functionality. + +const EVP_MD * OTIdentifier::GetOpenSSLDigestByName(const OTString & theName) +{ + if (theName.Compare("SHA1")) + return EVP_sha1(); + else if (theName.Compare("SHA224")) + return EVP_sha224(); + else if (theName.Compare("SHA256")) + return EVP_sha256(); + else if (theName.Compare("SHA384")) + return EVP_sha384(); + else if (theName.Compare("SHA512")) + return EVP_sha512(); +#ifndef ANDROID + else if (theName.Compare("WHIRLPOOL")) + return &whirlpool_md; +#endif + return NULL; +} +/* + const EVP_MD * GetDigestByName(const OTString & theName) + { + if (theName.Compare("SHA1")) + return EVP_sha1(); + else if (theName.Compare("SHA224")) + return EVP_sha224(); + else if (theName.Compare("SHA256")) + return EVP_sha256(); + else if (theName.Compare("SHA384")) + return EVP_sha384(); + else if (theName.Compare("SHA512")) + return EVP_sha512(); + // else if (theName.Compare("RMD256")) + // return EVP_ripemd256(); + else + return NULL; + } + */ + + +/* + bool getSHA1Hash(const std::string& p_file, std::string& result, bool p_upperCase) + { + try + { + SHA1 hash; + FileSource(p_file.c_str(),true, new HashFilter(hash, new HexEncoder(new StringSink(result),p_upperCase))); + } + catch (const std::exception& e) { + return false; + } + return true; + } + */ + +/* + // OpenSSL installed Whirlpool, so I'm going to try their version. + // The below functions are implemented via Crypto++ by Wei Dai. + + // Read a file, digest it with Whirlpool, and store the result inside this object. + bool OTIdentifier::DigestFileWhirlpool(const OTString& strFilename) + { + bool bUpperCase = true; + std::string result; + + try + { + Whirlpool hash; + FileSource(strFilename.Get(), true, new HashFilter(hash, + new HexEncoder(new StringSink(result), bUpperCase))); + } + catch (const std::exception& e) { + return false; + } + OTString strResult(result.c_str()); + SetString(strResult); + return true; + } + + // Digest a string using Whirlpool and store it in this (as binary hash object) + bool OTIdentifier::DigestStringWhirlpool(const OTString& theSource) + { + bool bUpperCase = true; + std::string result, source=theSource.Get(); + + try + { + Whirlpool hash; + StringSource(source, true, new HashFilter(hash, + new HexEncoder(new StringSink(result),bUpperCase))); + } + catch (const std::exception& e) { + return false; + } + + OTString strResult(result.c_str()); + SetString(strResult); + return true; + } + + + // Digest a chunk of binary data and store the result inside this object. + bool OTIdentifier::DigestBinaryWhirlpool(const OTData& theSource) + { + bool bUpperCase = true; + std::string result; + + try + { + Whirlpool hash; + ArraySource((const byte*)theSource.GetPointer(), theSource.GetSize(), true, new HashFilter(hash, + new HexEncoder(new StringSink(result),bUpperCase))); + } + catch (const std::exception& e) { + return false; + } + + OTString strResult(result.c_str()); + SetString(strResult); + return true; + } + + + void OTIdentifier::DigestStringWhirlpool(const std::string & theSource, std::string & theOutput) + { + Whirlpool whirlpool; + HashFilter theFilter(whirlpool); + + ChannelSwitch channelSwitch; + channelSwitch.AddDefaultRoute(theFilter); + + StringSource(theSource, true, &channelSwitch); + + HexEncoder encoder(new StringSink(theOutput), false); + + OTLog::vError("%s: ", theFilter.AlgorithmName().c_str()); + theFilter.TransferTo(encoder); + } + */ + + +/* + unsigned char *RIPEMD160(const unsigned char *d, unsigned long n, + unsigned char *md); + int RIPEMD160_Init(RIPEMD160_CTX *c); + int RIPEMD160_Update(RIPEMD_CTX *c, const void *data, + unsigned long len); + int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c); + */ + +/* + const OTString OTIdentifier::DefaultHashAlgorithm("SAMY"); + + const OTString OTIdentifier::HashAlgorithm1("SHA256"); + const OTString OTIdentifier::HashAlgorithm2("WHIRLPOOL"); + */ + + +// This method implements the SAMY hash +bool OTIdentifier::CalculateDigest(const OTString & strInput) +{ +#ifndef ANDROID // If NOT Android... + OTIdentifier idSecondHash; + + if (idSecondHash.CalculateDigest(strInput, HashAlgorithm2) && + CalculateDigest(strInput, HashAlgorithm1)) + { + // At this point, we have successfully generated the WHRLPOOL hash in + // idSecondHash, and we've successfully generated the SHA-256 hash in + // this object. + // Next we XOR them together for the final product. + return XOR(idSecondHash); + } +#else // SHA256 on Android; no whirlpool until OpenSSL 1.0.0 is added. + if (CalculateDigest(strInput, HashAlgorithm1)) + { + return true; + } +#endif // ANDROID + + return false; +} + + +// This method implements the SAMY hash +bool OTIdentifier::CalculateDigest(const OTData & dataInput) +{ +#ifndef ANDROID // SHA256 on Android; no whirlpool until OpenSSL 1.0.0 is added. + OTIdentifier idSecondHash; + + if (idSecondHash.CalculateDigest(dataInput, HashAlgorithm2) && + CalculateDigest(dataInput, HashAlgorithm1)) + { + // At this point, we have successfully generated the WHRLPOOL hash in + // idSecondHash, and we've successfully generated the SHA-256 hash in + // this object. + // Next we XOR them together for the final product. + return XOR(idSecondHash); + } +#else // ANDROID + if (CalculateDigest(dataInput, HashAlgorithm1)) // SHA256 only until I add the new OpenSSL 1.0 for Android + { + return true; + } +#endif // ANDROID + + return false; +} + + + +// Some of the digest calculations are done by crypto++, instead of OpenSSL. +// (UPDATE that is no longer true.) +// Also, at least one of the algorithms (SAMY) is an internal name, and again not +// handled by OpenSSL. So I call this function first to see if the hash type requres +// internal handling. If not, then I return false and the caller knows to use OpenSSL +// instead. +bool OTIdentifier::CalculateDigestInternal(const OTString & strInput, const OTString & strHashAlgorithm) +{ + // See if they wanted to use the SAMY hash + if (strHashAlgorithm.Compare(DefaultHashAlgorithm)) + { + return CalculateDigest(strInput); + } + // else if (strHashAlgorithm.Compare("WHIRLPOOL")) + // { + // return DigestStringWhirlpool(strInput); + // } + + return false; +} + + +// Some of the digest calculations are done by crypto++, instead of OpenSSL. +// (UPDATE: above is no longer true...) +// Also, at least one of the algorithms (SAMY) is an internal name, and again not +// handled by OpenSSL. So I call this function first to see if the hash type requres +// internal handling. If not, then I return false and the caller knows to use OpenSSL +// instead. + +bool OTIdentifier::CalculateDigestInternal(const OTData & dataInput, const OTString & strHashAlgorithm) +{ + // See if they wanted to use the SAMY hash + if (strHashAlgorithm.Compare(DefaultHashAlgorithm)) + { + return CalculateDigest(dataInput); + } + // else if (strHashAlgorithm.Compare("WHIRLPOOL")) + // { + // return DigestBinaryWhirlpool(dataInput); + // } + + return false; +} + + +// This function lets you choose the hash algorithm by string. +// (For example, if you read "SHA-256" out of a signed file and you +// needed to get the hash function based on that string, you could use this.) +// +bool OTIdentifier::CalculateDigest(const OTString & strInput, const OTString & strHashAlgorithm) +{ + Release(); + + EVP_MD_CTX mdctx; + const EVP_MD *md = NULL; + + unsigned int md_len = 0; + unsigned char md_value[EVP_MAX_MD_SIZE]; // I believe this is safe, having just analyzed this function. + + // Some hash algorithms are handled by other methods. + // If those don't handle it, then we'll come back here and use OpenSSL. + if (CalculateDigestInternal(strInput, strHashAlgorithm)) + { + return true; + } + + // Okay, it wasn't any internal hash algorithm, so then which one was it? + md = GetOpenSSLDigestByName(strHashAlgorithm); + + if (!md) + { + OTLog::vError("Unknown message digest algorithm in OTIdentifier::CalculateDigest: %s\n", + strHashAlgorithm.Get()); + return false; + } + + EVP_MD_CTX_init(&mdctx); + EVP_DigestInit_ex(&mdctx, md, NULL); + EVP_DigestUpdate(&mdctx, strInput.Get(), strInput.GetLength()); + EVP_DigestFinal_ex(&mdctx, md_value, &md_len); + EVP_MD_CTX_cleanup(&mdctx); + + // OTLog::vError("Calculated %s digest.\n", strHashAlgorithm.Get()); + + // for (int i = 0; i < md_len; i++) OTLog::vError("%02x", md_value[i]); + // OTLog::Error("\n"); + + Assign(md_value, md_len); + + return true; +} + +bool OTIdentifier::CalculateDigest(const OTData & dataInput, const OTString & strHashAlgorithm) +{ + Release(); + + EVP_MD_CTX mdctx; + const EVP_MD *md = NULL; + + unsigned int md_len = 0; + unsigned char md_value[EVP_MAX_MD_SIZE]; // I believe this is safe, shouldn't ever be larger than MAX SIZE. + + // Some hash algorithms are handled by other methods. + // If those don't handle it, then we'll come back here and use OpenSSL. + if (CalculateDigestInternal(dataInput, strHashAlgorithm)) + { + return true; + } + + // Okay, it wasn't any internal hash algorithm, so then which one was it? + md = GetOpenSSLDigestByName(strHashAlgorithm); + + if (!md) + { + OTLog::vError("Unknown message digest algorithm in OTIdentifier::CalculateDigest: %s\n", + strHashAlgorithm.Get()); + return false; + } + + EVP_MD_CTX_init(&mdctx); + EVP_DigestInit_ex(&mdctx, md, NULL); + EVP_DigestUpdate(&mdctx, dataInput.GetPointer(), dataInput.GetSize()); + EVP_DigestFinal_ex(&mdctx, md_value, &md_len); + EVP_MD_CTX_cleanup(&mdctx); + + // OTLog::vOutput(5, "Calculated %s digest.\n", strHashAlgorithm.Get()); + + // for (int i = 0; i < md_len; i++) OTLog::vOutput(5, "%02x", md_value[i]); + // OTLog::Output(5, "\n"); + + Assign(md_value, md_len); + + return true; +} + +// So we can implement the SAMY hash, which is currently an XOR of SHA-256 with WHRLPOOL +// +// Originally, it was SHA512 and WHRLPOOL, which both have a 512-bit output-size. +// I was then going to cut the result in half and XOR together again. But then I +// though, for now, instead of doing all that extra work, I'll just change the +// two "HashAlgorithms" from SHA512 and WHRLPOOL to SHA256 and WHIRLPOOL. +// +// This was very much easier, as I only had to change the little "512" to say +// "256" instead, and basically the job was done. Of course, this means that OT +// is generating a 256-bit hash in THIS object, and a 512-bit WHIRLPOOL hash in +// the other object. i.e. There is still one 512-bit hash that you are forced to +// calculate, even if you throw away half of it after the calculation is done. +// +// Since the main object has a 256-bit hash, the XOR() function below was already +// coded to XOR the minimum length based on the smallest of the two objects. +// Therefore, it will XOR 256 bits of the WHRLPOOL output into the 256 bits of +// the main output (SHA256) and stop there: we now have a 256 bit ID. +// +// The purpose here is to reduce the ID size so that it will work on Windows with +// the filenames. The current 512bit output is 64 bytes, or 128 characters when +// exported to a hex string (in all the OT contracts for example, over and over +// again.) +// +// The new size will be 256bit, which is 32 bytes of binary. In hex string that +// would be 64 characters. But we're also converting from Hex to Base62, which +// means we'll get it down to around 43 characters. +// +// This means our IDs are going to go from this: +// +// +// To this: +// +// +// You might ask: is 256 bits big enough of a hash size to be safe from collisions? +// Practically speaking, I believe so. The IDs are used for accounts, servers, asset types, +// and users. How many different asset types do you expect there will be, where changing the +// contract to anything still intelligible would result in a still-valid signature? To find +// a collision in a contract, where the signature would still work, would you expect the necessary +// changed plaintext to be something that would still make sense in the contract? Would such +// a random piece of data turn out to form proper XML? +// +// 256bits is enough to store the number of atoms in the Universe. If we ever need a bigger +// hashsize, just go change the HashAlgorithm1 back to "SHA512" instead of "SHA256", and you'll +// instantly have a doubled hash output size :-) +// +bool OTIdentifier::XOR(const OTIdentifier & theInput) +{ + // Go with the smallest of the two + const long lSize = (GetSize() > theInput.GetSize() ? theInput.GetSize() : GetSize()); + + for (int i = 0; i < lSize; i++) + { + // When converting to BigInteger internally, this will be a bit more efficient. + ((char*)GetPointer())[i] ^= ((char*)theInput.GetPointer())[i]; + } + + return true; +} + + + +union CharToShort +{ + unsigned char c[2]; + unsigned int sh; +}; + + +//TODO speed this up. +// could be named "set from string" or "set by string" +// Basically so you could take one of the hashes out of the +// xml files, as a string, and plug it in here to get the +// binary hash back into memory inside this object. +/* +void OTIdentifier::SetString(const OTString & theStr) +{ + + Release(); + + if (!theStr.GetLength()) + return; + + if (128 != theStr.GetLength()) + { + OTLog::Error("String wrong length to convert to ID.\n"); + return; + } + + OTString & refString = (OTString&)theStr; + + char c = 0; + char d = 0; + + char ca[3] = ""; + + static unsigned char * tempArray = NULL; + + if (NULL == tempArray) + { + tempArray = new unsigned char[MAX_STRING_LENGTH]; + + OT_ASSERT(NULL != tempArray); + } + + tempArray[0] = '\0'; + + unsigned int shTemp = 0; + int i = 0; + + CharToShort conv; + + // for refString.sgetc() + refString.reset(); + + while ((c = refString.sgetc()) != EOF) + { + // notice I'm not checking for failure here + // I'm assuming the hex digits come in groups of 2 + // If they don't, we will crash here. + d = refString.sgetc(); + + ca[0] = c; + ca[1] = d; + ca[2] = 0; + +#ifdef _WIN32 + sscanf_s(ca, "%2x", &shTemp); +#else + sscanf(ca, "%2x", &shTemp); // todo security replace this with something more secure. NOTE: pretty safe though since I'm setting up up myself. +#endif + + // at this point, the string has been converted into the unsigned int. + + // Even though the number is stored in an unsigned int right now, + // we know that it was originally in byte form and converted from a single + // byte to a 2-digit hex whenever GetString was called. + // Therefore, we KNOW that it will fit into a byte now, and since it + // is small enough to fit into a byte, we will take that one byte out of + // the unsigned int and then add that byte to the tempArray. + // This way we have reconstructed the binary array. + conv.sh = shTemp; + tempArray[i] = conv.c[0]; + + shTemp=0; + conv.sh = 0; + + i++; + } + + Assign((void *)tempArray, i); + + OT_ASSERT_MSG(64 == i, "ID wrong length after calculation."); +} + + + // + //for (i = 0; i < md_len; i++) OTLog::vError("%02x", md_value[i]); + //OTLog::Error("\n"); + + + +// This Identifier is stored in binary form. +// But what if you want a pretty hex string version of it? +// Just call this function. +void OTIdentifier::GetString(OTString & theStr) const +{ + theStr.Release(); + + if (IsEmpty()) { + return; + } + + OT_ASSERT_MSG(64 == GetSize(), "ID wrong length before calculation."); + + unsigned char cByte = 0; + + for(long i = 0; i < GetSize(); i++) + { + cByte = ((unsigned char *)GetPointer())[i]; + + int n = cByte; + + theStr.Concatenate("%02x", n); + } + + if (128 != theStr.GetLength()) + OTLog::vError("STRING LENGTH: %d\n", theStr.GetLength()); + + OT_ASSERT_MSG(128 == theStr.GetLength(), "String wrong length after ID calculation."); +} + +*/ + + + + + +//base62... +// +// Using a BigInteger lib I just added. +// +// Hopefully use something like this to replace some of the internals for OTIdentifier. +// I need to get the author to add a "back into data again" function though. +// +void OTIdentifier::SetString(const OTString & theStr) +{ + Release(); + + if (theStr.GetLength() < 3) // todo stop hardcoding. + return; + + const std::string strINPUT = theStr.Get(); + + +// std::cerr << "OTIdentifier::SetString DEBUG: " << strINPUT << std::endl; + + + // Todo there are try/catches in here, so need to handle those at some point. + BigInteger bigIntFromBase62 = stringToBigIntegerBase62(strINPUT); + + + // Now theBaseConverter contains a BigInteger that it read in as base62. + + // Next step is to output it from that to Hex so I can convert to Binary. + + // Why not convert it DIRECTLY to binary, you might ask? TODO. + // In fact this is what we SHOULD be doing. But the BigInteger lib + // I'm using doesn't have a damned output to binary! I'm emailing the + // author now. + // + // In the meantime, I had old code from before, that converted hex string to + // binary, which still needs to be removed. But for now, I'll just convert the + // BigInteger to hex, and then call my old code (below) just to get things running. + + // You can convert the other way too. + std::string strHEX_VERSION = bigIntegerToStringBase16(bigIntFromBase62); + + // I would rather use stringToBigUnsigned and then convert that to data. + // But apparently this class has no conversion back to data, I will contact the author. + //--------------------------------------------------------------- + + BIGNUM * pBigNum = BN_new(); + OT_ASSERT(NULL != pBigNum); + + // ----------------------------------------- + + // Convert from Hex String to BIGNUM. + + OT_ASSERT (0 < BN_hex2bn(&pBigNum, strHEX_VERSION.c_str())); + + // ----------------------------------------- + + // Convert from Hex String to BigInteger (unwieldy, I know. Future versions will improve.) + + //BN_bin2bn((unsigned char *)GetPointer(), GetSize(), pBigNum); + + uint32_t nBigNumBytes = BN_num_bytes(pBigNum); + + this->SetSize(nBigNumBytes); + + OT_ASSERT(BN_bn2bin(pBigNum, (unsigned char *)GetPointer())); + // BN_bn2bin() converts the absolute value of param 1 into big-endian form and stores it at param2. + // param2 must point to BN_num_bytes(pBigNum) bytes of memory. + + BN_free(pBigNum); +} + +/* + + for (i = 0; i < md_len; i++) OTLog::vError("%02x", md_value[i]); + OTLog::Error("\n"); + + + bigIntegerToStringBase16 + bigIntegerToStringBase62 + + stringToBigIntegerBase16 + stringToBigIntegerBase62 + + */ + + + + +// This Identifier is stored in binary form. +// But what if you want a pretty hex string version of it? +// Just call this function. +// UPDATE: Now Base62 instead of Hex. (More compact.) +// +void OTIdentifier::GetString(OTString & theStr) const +{ + theStr.Release(); + + if (IsEmpty()) + { + return; + } + +// OT_ASSERT_MSG(32 == GetSize(), "ID wrong length before calculation."); // 32 bytes in binary + + // Creates a BigInteger from data such as `char's; read below for details. +// BigInteger theBigInt = dataToBigInteger(((unsigned char *)GetPointer()), GetSize(), BigInteger::positive); + + // ----------------------------------------- + + // Convert from internal binary format to BIGNUM format. + + BIGNUM * pBigNum = BN_new(); + OT_ASSERT(NULL != pBigNum); + + BN_bin2bn((unsigned char *)GetPointer(), GetSize(), pBigNum); + + // ----------------------------------------- + + // Convert from BIGNUM to Hex String. + + char * szBigNumInHex = BN_bn2hex(pBigNum); + OT_ASSERT(szBigNumInHex != NULL); + + // ----------------------------------------- + + // Convert from Hex String to BigInteger (unwieldy, I know. Future versions will improve.) + + BigInteger theBigInt = stringToBigIntegerBase16(szBigNumInHex); + + OPENSSL_free(szBigNumInHex); + BN_free(pBigNum); + + // ----------------------------------------- + + // Convert from BigInteger to std::string in Base62 format. + + std::string strBigInt = bigIntegerToStringBase62(theBigInt); + + theStr.Set(strBigInt.c_str()); + + // Now that we're using Base62 instead of Hex, there's no guarantee + // the output size will be the same here every time. + // +// if (64 != theStr.GetLength()) +// OTLog::vError("STRING LENGTH: %d\n", theStr.GetLength()); // from the hex days + +// OT_ASSERT_MSG(128 == theStr.GetLength(), "String wrong length after ID calculation."); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTIdentifier.h b/OTLib/OTIdentifier.h new file mode 100644 index 000000000..e49d184ad --- /dev/null +++ b/OTLib/OTIdentifier.h @@ -0,0 +1,224 @@ +/************************************************************** + * + * OTIdentifier.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTIDENTIFIER_H__ +#define __OTIDENTIFIER_H__ + +extern "C" +{ +#include +} + +#include "OTData.h" +#include "OTString.h" + + +// An Identifier is basically a 256 bit hash value. +// This class makes it easy to convert IDs back and forth to strings. +// + +class OTPseudonym; +class OTOffer; +class OTMarket; + +class OTIdentifier : public OTData +{ +protected: + // Some digests are handled in special ways before they can call OpenSSL. They are internal, + // like SAMY hash. + bool CalculateDigestInternal(const OTString & strInput, const OTString & strHashAlgorithm); + bool CalculateDigestInternal(const OTData & dataInput, const OTString & strHashAlgorithm); + +public: + static const OTString DefaultHashAlgorithm; + static const OTString HashAlgorithm1; + static const OTString HashAlgorithm2; + + static const EVP_MD * GetOpenSSLDigestByName(const OTString & theName); + + OTIdentifier(); + OTIdentifier(const OTIdentifier &theID); + OTIdentifier(const char * szStr); + OTIdentifier(const OTString &theStr); + OTIdentifier(const OTPseudonym &theNym); + OTIdentifier(const OTContract &theContract); // Get the contract's ID into this identifier. + OTIdentifier(const OTOffer &theOffer); + OTIdentifier(const OTMarket &theMarket); + virtual ~OTIdentifier(); + + using OTData::swap; + using OTData::operator=; + + bool operator==(const OTIdentifier &s2) const; + bool operator!=(const OTIdentifier &s2) const; + + bool CalculateDigest(const OTData & dataInput); + bool CalculateDigest(const OTString & strInput); + + bool CalculateDigest(const OTString & strInput, const OTString & strHashAlgorithm); + bool CalculateDigest(const OTData & dataInput, const OTString & strHashAlgorithm); + +// bool DigestFileWhirlpool(const OTString& strFilename); +// bool DigestStringWhirlpool(const OTString& theSource); +// bool DigestBinaryWhirlpool(const OTData& theSource); + + bool XOR(const OTIdentifier & theInput); + + void CopyTo(unsigned char * szNewLocation) const; + + // If someone passes in the pretty string of hex digits, + // convert it to the actual binary hash and set it internally. + void SetString(const char * szString); + void SetString(const OTString & theStr); + + // theStr will contain pretty hex string after call. + void GetString(OTString & theStr) const; +}; + + +#endif // __OTIDENTIFIER_H__ + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTInstrument.cpp b/OTLib/OTInstrument.cpp new file mode 100644 index 000000000..201b4b6be --- /dev/null +++ b/OTLib/OTInstrument.cpp @@ -0,0 +1,226 @@ +/***************************************************************** + * + * OTInstrument.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTInstrument.h" + +using namespace std; + + + +// Verify whether the CURRENT date is AFTER the the VALID TO date. +// Notice, this will return false, even if the instrument is NOT YET VALID. +// You have to use VerifyCurrentDate() to make sure you're within the +// valid date range to use this instrument. But sometimes you only want +// to know if it's expired, regardless of whether it's valid yet. So this +// function answers that for you. +bool OTInstrument::IsExpired() +{ + const time_t CURRENT_TIME = time(NULL); + + if (CURRENT_TIME >= m_VALID_TO) + return true; + else + return false; +} + + +// Verify whether the CURRENT date is WITHIN the VALID FROM / TO dates. +bool OTInstrument::VerifyCurrentDate() +{ + const time_t CURRENT_TIME = time(NULL); + + if ((CURRENT_TIME >= m_VALID_FROM) && (CURRENT_TIME <= m_VALID_TO)) + return true; + else + return false; +} + +time_t OTInstrument::GetCurrentTime() const +{ + return time(NULL); +} + +void OTInstrument::InitInstrument() +{ + m_VALID_FROM = 0; + m_VALID_TO = 0; + + m_strContractType.Set("INSTRUMENT"); // should never happen in practice... +} + +OTInstrument::OTInstrument() : OTContract() +{ + InitInstrument(); + + +} + +OTInstrument::OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() +{ + InitInstrument(); + + m_ServerID = SERVER_ID; + m_AssetTypeID = ASSET_ID; +} + +OTInstrument::~OTInstrument() +{ + //Release(); + // OTContract::~OTContract is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. +} + + +void OTInstrument::Release() +{ + // Release any dynamically allocated instrument members here. + + // Next give the base class a chance to do the same... + OTContract::Release(); // since I've overridden the base class, I call it now... + + // Initialize everything back to 0 + InitInstrument(); +} + + +bool OTInstrument::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTInstrument.h b/OTLib/OTInstrument.h new file mode 100644 index 000000000..43be5b68c --- /dev/null +++ b/OTLib/OTInstrument.h @@ -0,0 +1,193 @@ +/************************************************************* + * + * OTInstrument.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_INSTRUMENT_H__ +#define __OT_INSTRUMENT_H__ + + +#include +#include + +#include "OTIdentifier.h" +#include "OTContract.h" + + +class OTInstrument : public OTContract +{ +protected: + OTIdentifier m_AssetTypeID; // Every cheque or cash note has an Asset Type + OTIdentifier m_ServerID; // ...As well as a Server ID... + + // Expiration Date (valid from/to date) + time_t m_VALID_FROM; // The date, in seconds, when the instrument is valid FROM. + time_t m_VALID_TO; // The date, in seconds, when the instrument expires. + + // overridden in child classes, not here. +// virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + +public: + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + // --------------------------------------------------- + + void InitInstrument(); + + OTInstrument(); + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + virtual ~OTInstrument(); + + virtual void Release(); + + time_t GetCurrentTime() const; + + bool VerifyCurrentDate(); // Verify whether the CURRENT date is WITHIN the VALID FROM / TO dates. + bool IsExpired(); // Verify whether the CURRENT date is AFTER the the "VALID TO" date. + + // overridden in child classes, not here. + //virtual void UpdateContents(); // I may remove this, since the subclasses will handle it. + + // ------------------------------------------------------------------------ + + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + + + +#endif // __OT_INSTRUMENT_H__ diff --git a/OTLib/OTItem.cpp b/OTLib/OTItem.cpp new file mode 100644 index 000000000..07e96e6aa --- /dev/null +++ b/OTLib/OTItem.cpp @@ -0,0 +1,1926 @@ +/******************************************************************** + * + * OTItem.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTAccount.h" +#include "OTPayload.h" +#include "OTPseudonym.h" +#include "OTMessage.h" +#include "OTStringXML.h" + +#include "OTTransactionType.h" +#include "OTTransaction.h" +#include "OTLedger.h" +#include "OTItem.h" +#include "OTLog.h" + + + + +// Server-side. +// +// By the time this is called, I know that the item, AND this balance item (this) +// both have the correct user id, server id, account id, and transaction id, and +// they have been signed properly by the owner. +// +// So what do I need to verify in this function? +// +// -- That the transactions on THE_NYM (server-side), minus the current transaction number being processed, +// are all still there. +// -- If theMessageNym is missing certain numbers that I expected to find on him, that means he is trying to +// trick the server into signing a new agreement where he is no longer responsible for those numbers. They must +// all be there. +// -- If theMessageNym has ADDED certain numbers that I DIDN'T expect to find on him, then he's trying to trick +// me into allowing him to add those numbers to his receipt -- OR it could mean that certain numbers were already +// removed on my side (such as the opening # for a cron item like a market offer that has already been closed), +// but the client-side isn't aware of this yet, and so he is trying to sign off on formerly-good numbers that +// have since expired. This shouldn't happen IF the client has been properly notified about these numbers before +// sending his request. Such notifications are dropped into the Nymbox AND related asset account inboxes. +// +bool OTItem::VerifyTransactionStatement(OTPseudonym & THE_NYM, OTTransaction & TARGET_TRANSACTION, + const bool bIsRealTransaction/*=true*/) // Sometimes the trans# is 0 (like when processing Nymbox) +{ + if (this->GetType() != OTItem::transactionStatement) + { + OTLog::Output(0, "OTItem::VerifyTransactionStatement: wrong item type.\n"); + return false; + } + + // + // So if the caller was planning to remove a number, or clear a receipt from the inbox, he'll have to do + // so first before calling this function, and then ADD IT AGAIN if this function fails. (Because the new + // Balance Agreement is always the user signing WHAT THE NEW VERSION WILL BE AFTER THE TRANSACTION IS PROCESSED.) + // + const OTString SERVER_ID(GetPurportedServerID()); + + OTPseudonym theRemovedNym; + + if (bIsRealTransaction) // Sometimes my "transaction number" is 0 since we're accepting numbers from the Nymbox (which is done by message, not transaction.) + { // In such cases, there's no point in checking the server-side to "make sure it has number 0!" (because it won't.) + bool bIWasFound = THE_NYM.VerifyIssuedNum(SERVER_ID, GetTransactionNum()); + + if (!bIWasFound) + { + OTLog::vOutput(0, "OTItem::VerifyTransactionStatement: Transaction# (%ld) doesn't appear on Nym's issued list.\n", + GetTransactionNum()); + return false; + } + + // In the case that this is a real transaction, it must be a cancelCronItem, payment plan or + // market offer (since the other transaction types require a balance statement, not a transaction + // statement.) Also this might not be a transaction at all, but in that case we won't enter this + // block anyway. + // + switch (TARGET_TRANSACTION.GetType()) + { + // In the case of cancelCronItem(), we'd expect, if success, the number would be removed, so we have + // to remove it now, to simulate success for the verification. Then we add it again afterwards, before + // returning. + // + case OTTransaction::cancelCronItem: + // Only adding it to theRemovedNym here since VerifyIssuedNum() is called just above. + // (Don't want to "add it back" if it wasn't there in the first place!) + // + if (THE_NYM.RemoveIssuedNum(SERVER_ID, this->GetTransactionNum())) // doesn't save. + theRemovedNym.AddIssuedNum(SERVER_ID, this->GetTransactionNum()); + else + OTLog::vOutput(0, "OTItem::VerifyTransactionStatemen: Expected THE_NYM to have trans# %ld but didn't find it.\n", + this->GetTransactionNum()); + break; + + // IN the case of the offer/plan, we do NOT want to remove from issued list. That only happens when + // the plan or offer is removed from Cron and closed. As the plan or offer continues processing, + // the user is responsible for its main transaction number until he signs off on final closing, + // after many receipts have potentially been received. + // + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: +// THE_NYM.RemoveIssuedNum(SERVER_ID, this->GetTransactionNum()); // commented out, explained just above. + break; + default: + OTLog::Error("OTItem::VerifyTransactionStatement: Unexpected transaction type.\n"); + break; + } + + // Client side will NOT remove from issued list in this case (market offer, payment plan, which are + // the only transactions that use a transactionStatement, which is otherwise used for Nymbox.) + } + + // ---------------------------------------------------- + // + // VERIFY that the Nyms have a matching list of transaction numbers... + + bool bSuccess = false; + + OTString strMessageNym; + + this->GetAttachment(strMessageNym); + OTPseudonym theMessageNym; + + // ---------------------- + + if ((strMessageNym.GetLength() > 2) && theMessageNym.LoadFromString(strMessageNym)) + { + // If success, I know the server-side copy of the user's Nym (THE_NYM) has the same number + // of transactions as the message nym, and that EVERY ONE OF THEM was found individually. + // + bSuccess = THE_NYM.VerifyIssuedNumbersOnNym(theMessageNym); // <==== ************************************ + } + // --------------------------------------------------------------- + + // NOW let's set things back how they were before, so we can RETURN. + // + if (bIsRealTransaction) + { + switch (TARGET_TRANSACTION.GetType()) + { + case OTTransaction::cancelCronItem: + // Should only actually iterate once, in this case. + for (int i = 0; i < theRemovedNym.GetIssuedNumCount(GetPurportedServerID()); i++) + { + long lTemp = theRemovedNym.GetIssuedNum(GetPurportedServerID(), i); + + if (i > 0) + OTLog::Error("OTItem::VerifyTransactionStatement: THIS SHOULD NOT HAPPEN.\n"); + else if (false == THE_NYM.AddIssuedNum(SERVER_ID, lTemp)) // doesn't save. + OTLog::Error("Failed adding issued number back to THE_NYM in OTItem::VerifyTransactionStatement.\n"); + } + break; + + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + default: +// THE_NYM.RemoveIssuedNum(SERVER_ID, this->GetTransactionNum()); // commented out, explained just above. + break; + } + } + + // Might want to consider saving the Nym here. + // Also want to save the latest signed receipt, since it VERIFIES. + // Or maybe let caller decide? + + return bSuccess; +} + + + + + + +/* + old debug notes... + + // inbox item target transaction + if (pSubItem->GetAmount() != (pTransaction->GetReceiptAmount() * (-1))) + { + "OTItem::VerifyBalanceStatement: %s transaction (%ld) " pszLedgerType, pSubItem->GetTransactionNum(), + + // . Inbox/Outbox item . The target transaction . The balance item + "amounts don't match: %ld, expected %ld. (this->GetAmount() == %ld.)\n", + + pSubItem->GetAmount(), pTransaction->GetReceiptAmount()*(-1), this->GetAmount()); + */ + +/* + OTItem::VerifyBalanceStatement: Inbox transaction (1882) + ERROR verifying balance statement while withdrawing cash. Acct ID: + PhmhKernutijMa2XXxH1dZnTluIDQUVn1tifSOq9H4x + */ + + + + + +// Server-side. +// +// By the time this is called, I know that the item, AND this balance item (this) +// both have the correct user id, server id, account id, and transaction id, and +// they have been signed properly by the owner. +// +// So what do I need to verify in this function? +// +// 1) That THE_ACCOUNT.GetBalance() + lActualAdjustment equals the amount in this->GetAmount(). +// +// 2) That the inbox transactions and outbox transactions match up to the list of sub-items +// on THIS balance item. +// +// 3) That the transactions on the Nym, minus the current transaction number being processed, +// are all still there. +// +bool OTItem::VerifyBalanceStatement(const long lActualAdjustment, + OTPseudonym & THE_NYM, + OTLedger & THE_INBOX, + OTLedger & THE_OUTBOX, + const OTAccount & THE_ACCOUNT, + OTTransaction & TARGET_TRANSACTION, + const long lOutboxTrnsNum/*=0*/) // Only used in the case of transfer, where the user +{ // doesn't know the outbox trans# in advance, so he sends + if (GetType() != OTItem::balanceStatement) // a dummy number (currently '1') which we verify against + { // the actual outbox trans# successfully, only in that special case. + OTLog::Output(0, "OTItem::VerifyBalanceStatement: wrong item type.\n"); + return false; + } + + // We need to verify: + // + // 1) That THE_ACCOUNT.GetBalance() + lActualAdjustment equals the amount in this->GetAmount(). + + if ((THE_ACCOUNT.GetBalance() + lActualAdjustment) != this->GetAmount()) // this->GetAmount() contains what the balance WOULD be AFTER successful transaction. + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: Wrong balance %ld (expected %ld).\n", + this->GetAmount(), (THE_ACCOUNT.GetBalance() + lActualAdjustment)); + return false; + } + + // 2) That the inbox transactions and outbox transactions match up to the list of sub-items + // on THIS balance item. + + int nInboxItemCount = 0, nOutboxItemCount = 0; + + const char * szInbox = "Inbox"; + const char * szOutbox = "Outbox"; + + const char * pszLedgerType = NULL; + +// OTLog::vOutput(1, "OTItem::VerifyBalanceStatement: (ENTERING LOOP)... INBOX COUNT: %d\n" +// "# of inbox/outbox items on this balance statement: %d\n", +// THE_INBOX.GetTransactionCount(), this->GetItemCount()); + + for (int i=0; i < this->GetItemCount(); i++) + { + OTItem * pSubItem = this->GetItem(i); + + OT_ASSERT(NULL != pSubItem); + +// OTLog::Output(1, "OTItem::VerifyBalanceStatement: TOP OF LOOP (through sub-items).......\n"); + + long lReceiptAmountMultiplier = 1; // needed for outbox items. + + OTLedger * pLedger = NULL; + + switch (pSubItem->GetType()) + { + case OTItem::chequeReceipt: + case OTItem::marketReceipt: + case OTItem::paymentReceipt: + case OTItem::transferReceipt: + case OTItem::basketReceipt: + case OTItem::finalReceipt: + nInboxItemCount++; + pLedger = &THE_INBOX; + pszLedgerType = szInbox; + +// OTLog::Output(1, "OTItem::VerifyBalanceStatement: Subitem is Inbox receipt item (NOT pending transfer)....\n"); + + case OTItem::transfer: + break; + default: + { + OTString strItemType; + GetTypeString(strItemType); + OTLog::vOutput(1, "OTItem::VerifyBalanceStatement: Ignoring %s item " + "in balance statement while verifying it against inbox.\n", strItemType.Get()); + } + continue; + } + + switch (pSubItem->GetType()) + { + case OTItem::transfer: + if (pSubItem->GetAmount() < 0) // it's an outbox item + { +// OTLog::Output(1, "OTItem::VerifyBalanceStatement: Subitem is pending transfer (in outbox)....\n"); + + lReceiptAmountMultiplier = -1; // transfers out always reduce your balance. + nOutboxItemCount++; + pLedger = &THE_OUTBOX; + pszLedgerType = szOutbox; + } + else + { +// OTLog::Output(1, "OTItem::VerifyBalanceStatement: Subitem is pending transfer (in inbox)....\n"); + + lReceiptAmountMultiplier = 1; // transfers in always increase your balance. + nInboxItemCount++; + pLedger = &THE_INBOX; + pszLedgerType = szInbox; + } + break; + case OTItem::finalReceipt: + // Here: If there is a finalReceipt on this balance statement, then ALL the other + // related receipts in the inbox (with same "reference to" value) had better ALSO + // be on the same balance statement! + + // HMM that is true, but NOT HERE... That's only true when PROCESSING the final Receipt + // from the inbox (in that case, all the marketReceipts must also be processed with it.) + // But here, I am looping through the inbox report, and there happens to be a finalReceipt + // on it. (Which doesn't mean necessarily that it's being processed out...) + case OTItem::basketReceipt: + + case OTItem::transferReceipt: + case OTItem::chequeReceipt: + case OTItem::marketReceipt: + case OTItem::paymentReceipt: + lReceiptAmountMultiplier = 1; + break; + default: + OTLog::Error("OTItem::VerifyBalanceStatement: Bad Subitem type (SHOULD NEVER HAPPEN)....\n"); + + continue; // This will never happen, due to the first continue above in the first switch. + } + + OTTransaction * pTransaction = NULL; + + // In the special case of account transfer, the user has put an outbox transaction + // into his balance agreement with the special number '1', since he has no idea what + // actual number will be generated on the server side (for the outbox) when his + // message is received by the server. + // + // When that happens (ONLY in account transfer) then lOutboxTrnsNum will be passed + // in with the new transaction number chosen by the server (a real number, like 18736 + // or whatever, instead of the default of 0 that will otherwise be passed in here.) + // + // Therefore, if lOutboxTrnsNum is larger than 0, AND if we're on an outbox item, + // then we can expect lOutboxTrnsNum to contain an actual transaction number, and + // we can expect there is a CHANCE that the sub-item will be trans# 1. (It might + // NOT be number 1, since there may be other outbox items-we're looping through them + // right now in this block.) So we'll check to see if this is the '1' and if so, + // we'll look up pTransaction from the outbox using the real transaction number, + // instead of '1' which of course would not find it (since the version in the ledger + // contains the ACTUAL number now, since the server just issued it.) + // + if ((lOutboxTrnsNum > 0) && (&THE_OUTBOX == pLedger) && (pSubItem->GetTransactionNum() == 1)) // TODO use a constant for this 1. + { + OTLog::vOutput(3, "OTItem::VerifyBalanceStatement: Subitem is new Outbox Transaction... retrieving by special ID: %ld\n", + lOutboxTrnsNum); + + pTransaction = pLedger->GetTransaction(lOutboxTrnsNum); + } + else + { + OTLog::vOutput(4, "OTItem::VerifyBalanceStatement: Subitem is normal Transaction... retrieving by ID: %ld\n", + pSubItem->GetTransactionNum()); + + pTransaction = pLedger->GetTransaction(pSubItem->GetTransactionNum()); + } + + // Make sure that the transaction number of each sub-item is found + // on the appropriate ledger (inbox or outbox). + if (NULL == pTransaction) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: Expected %s transaction (serv %ld, client %ld)\n" + "not found. (Amount %ld.)\n", + pszLedgerType, lOutboxTrnsNum, pSubItem->GetTransactionNum(), + pSubItem->GetAmount()); + return false; + } + + if (pSubItem->GetReferenceToNum() != pTransaction->GetReferenceToNum()) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) mismatch Reference Num: %ld, expected %ld\n", + pszLedgerType, pSubItem->GetTransactionNum(), pSubItem->GetReferenceToNum(), + pTransaction->GetReferenceToNum()); + return false; + } + + long lTransactionAmount = pTransaction->GetReceiptAmount(); + lTransactionAmount *= lReceiptAmountMultiplier; + + if (pSubItem->GetAmount() != lTransactionAmount) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) " + "amounts don't match: report amount is %ld, but expected %ld. Trans Receipt Amt: %ld (this->GetAmount() == %ld.)\n", + pszLedgerType, pSubItem->GetTransactionNum(), + pSubItem->GetAmount(), lTransactionAmount, pTransaction->GetReceiptAmount(), + this->GetAmount()); + return false; + } + + if ((pSubItem->GetType() == OTItem::transfer) && + (pTransaction->GetType() != OTTransaction::pending)) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type.\n", + pszLedgerType, pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::chequeReceipt) && + (pTransaction->GetType() != OTTransaction::chequeReceipt)) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type.\n", + pszLedgerType, pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::marketReceipt) && + (pTransaction->GetType() != OTTransaction::marketReceipt)) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type.\n", + pszLedgerType, pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::paymentReceipt) && + (pTransaction->GetType() != OTTransaction::paymentReceipt)) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type.\n", + pszLedgerType, pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::transferReceipt) && + (pTransaction->GetType() != OTTransaction::transferReceipt)) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type.\n", + pszLedgerType, pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::basketReceipt) && + // ------------------------------------------------------------ + ((pTransaction->GetType() != OTTransaction::basketReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type or closing num (%ld).\n", + pszLedgerType, pSubItem->GetTransactionNum(), pSubItem->GetClosingNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::finalReceipt) && + // ------------------------------------------------------------ + ((pTransaction->GetType() != OTTransaction::finalReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: %s transaction (%ld) wrong type or closing num (%ld).\n", + pszLedgerType, pSubItem->GetTransactionNum(), pSubItem->GetClosingNum()); + return false; + } + + } + + // By this point, I have an accurate count of the inbox items, and outbox items, represented + // by this. let's compare those counts to the actual inbox and outbox on my side: + + if ((nInboxItemCount != THE_INBOX.GetTransactionCount()) || + (nOutboxItemCount != THE_OUTBOX.GetTransactionCount())) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: Inbox or Outbox mismatch in expected transaction count.\n" + " --- THE_INBOX count: %d --- THE_OUTBOX count: %d\n" + "--- nInboxItemCount count: %d --- nOutboxItemCount count: %d\n\n", + THE_INBOX.GetTransactionCount(), THE_OUTBOX.GetTransactionCount(), + nInboxItemCount, nOutboxItemCount); + + return false; + } + + // Now I KNOW that the inbox and outbox counts are the same, AND I know that EVERY transaction number + // on the balance item (this) was also found in the inbox or outbox, wherever it was expected to be found. + // I also know: + // the amount was correct, + // the "in reference to" number was correct, + // and the type was correct. + // + // So if the caller was planning to remove a number, or clear a receipt from the inbox, he'll have to do + // so first before calling this function, and then ADD IT AGAIN if this function fails. (Because the new + // Balance Agreement is always the user signing WHAT THE NEW VERSION WILL BE AFTER THE TRANSACTION IS PROCESSED. + // Thus, if the transaction fails to process, the action hasn't really happened, so need to add it back again.) + + // ---------------------------------------------------------- + + // 3) Also need to verify the transactions on the Nym, against the transactions stored on this + // (in a message Nym attached to this.) Check for presence of each, then compare count, like above. + + OTPseudonym theRemovedNym; + + OTString SERVER_ID(GetPurportedServerID()); + + // GetTransactionNum() is the ID for this balance agreement, THUS it's also the ID + // for whatever actual transaction is being attempted. If that ID is not verified as + // on my issued list, then the whole transaction is invalid (not authorized.) + // + bool bIWasFound = THE_NYM.VerifyIssuedNum(SERVER_ID, GetTransactionNum()); + + if (!bIWasFound) + { + OTLog::Output(0, "OTItem::VerifyBalanceStatement: Transaction has # that doesn't appear on Nym's issued list.\n"); + return false; + } + + // BELOW THIS POINT, WE *KNOW* THE ISSUED NUM IS CURRENTLY ON THE LIST... + // + // (SO I CAN remove it and add it again, KNOWING that I'm never re-adding a num that wasn't there in the first place. + + // For process inbox, deposit, and withdrawal, the client will remove from issued list as soon as he + // receives my acknowledgment OR rejection. He expects server (me) to remove, so he signs a balance + // agreement to that effect. (With the number removed from issued list.) + // + // Therefore, to verify the balance agreement, we remove it on our side as well, so that they will match. + // The picture thus formed is what would be correct assuming a successful transaction. That way if + // the transaction goes through, we have our signed receipt showing the new state of things (without + // which we would not permit the transaction to go through :) + // + // This allows the client side to then ACTUALLY remove the number when they receive our response, + // as well as permits me (server) to actually remove from issued list. + // + // If ANYTHING ELSE fails during this verify process (other than processInbox, deposit, and withdraw) + // then we have to ADD THE # AGAIN since we still don't have a valid signature on that number. So + // you'll see this code repeated a few times in reverse, down inside this function. For example, + // + switch (TARGET_TRANSACTION.GetType()) + { + case OTTransaction::processInbox: + case OTTransaction::deposit: + case OTTransaction::withdrawal: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + // We DID verify the issued num (above) but I'm still just being safe here... + // ... since theRemovedNym contains numbers being re-added, just wanna make sure + // they were there in the first place. + // + if (THE_NYM.RemoveIssuedNum(SERVER_ID, this->GetTransactionNum())) // doesn't save. + theRemovedNym.AddIssuedNum(SERVER_ID, this->GetTransactionNum()); + break; + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + // These, assuming success, do NOT remove an issued number. So no need to anticipate setting up the list that way, to get a match. + break; + default: + // Error + OTLog::vError("OTItem::VerifyBalanceStatement: wrong target transaction type: %s\n", + TARGET_TRANSACTION.GetTypeString()); + break; + } + + // ---------------------------------------------------- + + long lTransactionNumber = 0; // Used in the loop below. + + int nNumberOfTransactionNumbers1 = 0; // The Nym on this side + int nNumberOfTransactionNumbers2 = 0; // The Message Nym. + + OTString strMessageNym; + + // First, loop through the Nym on my side, and count how many numbers total he has... + // + for (mapOfTransNums::iterator iii = THE_NYM.GetMapIssuedNum().begin(); + iii != THE_NYM.GetMapIssuedNum().end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + const OTIdentifier theServerID(strServerID.c_str()); + + if (!(pDeque->empty()) && (theServerID == this->GetPurportedServerID())) + { + nNumberOfTransactionNumbers1 += pDeque->size(); + break; // There's only one, in this loop, that would/could/should match. (Therefore, break after finding it.) + } + } // for + + // Next, loop through theMessageNym, and count his numbers as well... + // But ALSO verify that each one exists on THE_NYM, so that each individual + // number is checked. + this->GetAttachment(strMessageNym); + OTPseudonym theMessageNym; + + if ((strMessageNym.GetLength() > 2) && theMessageNym.LoadFromString(strMessageNym)) + { + for (mapOfTransNums::iterator iii = theMessageNym.GetMapIssuedNum().begin(); + iii != theMessageNym.GetMapIssuedNum().end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + const OTIdentifier theServerID(strServerID.c_str()); + const OTString OTstrServerID(theServerID); + + if (!(pDeque->empty()) && (theServerID == this->GetPurportedServerID())) + { + nNumberOfTransactionNumbers2 += pDeque->size(); + + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + if (false == THE_NYM.VerifyIssuedNum(OTstrServerID, lTransactionNumber)) // FAILURE + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: Issued transaction # %ld from Message Nym not found on this side.\n", + lTransactionNumber); + + // I have to do this whenever I RETURN :-( + switch (TARGET_TRANSACTION.GetType()) + { + case OTTransaction::processInbox: + case OTTransaction::deposit: + case OTTransaction::withdrawal: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + // Should only actually iterate once, in this case. + for (int i = 0; i < theRemovedNym.GetIssuedNumCount(GetPurportedServerID()); i++) + { + long lTemp = theRemovedNym.GetIssuedNum(GetPurportedServerID(), i); + + if (i > 0) + OTLog::Error("OTItem::VerifyBalanceStatement: THIS SHOULD NOT HAPPEN.\n"); + else if (false == THE_NYM.AddIssuedNum(SERVER_ID, lTemp)) // doesn't save. + OTLog::Error("Failed adding issued number back to THE_NYM in OTItem::VerifyBalanceStatement.\n"); + } + break; + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + break; + default: + // Error + OTLog::vError("OTItem::VerifyBalanceStatement: wrong target transaction type: %s\n", + TARGET_TRANSACTION.GetTypeString()); + break; + } + + return false; + } + } // for (numbers for a specific server.) + } // If the server ID matches + + break; // Only one server ID should match, so we can break after finding it. + + } // for (deques of numbers for each server) + } + + // Finally, verify that the counts match... + if (nNumberOfTransactionNumbers1 != nNumberOfTransactionNumbers2) + { + OTLog::vOutput(0, "OTItem::VerifyBalanceStatement: Transaction # Count mismatch: %d and %d\n", + nNumberOfTransactionNumbers1, nNumberOfTransactionNumbers2); + + // I have to do this whenever I RETURN :-( + switch (TARGET_TRANSACTION.GetType()) + { + case OTTransaction::processInbox: + case OTTransaction::deposit: + case OTTransaction::withdrawal: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + // Should only actually iterate once, in this case. + for (int i = 0; i < theRemovedNym.GetIssuedNumCount(GetPurportedServerID()); i++) + { + long lTemp = theRemovedNym.GetIssuedNum(GetPurportedServerID(), i); + + if (i > 0) + OTLog::Error("OTItem::VerifyBalanceStatement: THIS SHOULD NOT HAPPEN.\n"); + else if (false == THE_NYM.AddIssuedNum(SERVER_ID, lTemp)) // doesn't save. + OTLog::Error("Failed adding issued number back to THE_NYM in OTItem::VerifyBalanceStatement.\n"); + } + break; + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + break; + default: + // Error + OTLog::vError("OTItem::VerifyBalanceStatement: wrong target transaction type: %s\n", + TARGET_TRANSACTION.GetTypeString()); + break; + } + + return false; + } + + // By this point, I know the local Nym has the same number of transactions as the message nym, and that + // EVERY ONE OF THEM was found individually. + + // Might want to consider saving the Nym here. + // Also want to save the latest signed receipt, since it VERIFIES. + // Or maybe let caller decide? + + + // I have to do this whenever I RETURN :-( + // EVEN IF SUCCESS, we have only succeeded to verify the balance statement. + // We must still go on to verify the transaction itself, and ONLY THEN will + // we (possibly) remove the issued number from the list. And the decision will + // change from situation to situation, depending on the instrument. + // Therefore I add it back here as well. We only fiddled with it in the first place + // in order to verify the balance statement. Done. So now let the other pieces decide + // their own logic from there. + // + switch (TARGET_TRANSACTION.GetType()) + { + case OTTransaction::processInbox: + case OTTransaction::deposit: + case OTTransaction::withdrawal: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + // Should only actually iterate once, in this case. + for (int i = 0; i < theRemovedNym.GetIssuedNumCount(GetPurportedServerID()); i++) + { + long lTemp = theRemovedNym.GetIssuedNum(GetPurportedServerID(), i); + + if (i > 0) + OTLog::Error("OTItem::VerifyBalanceStatement: THIS SHOULD NOT HAPPEN.\n"); + else if (false == THE_NYM.AddIssuedNum(SERVER_ID, lTemp)) // doesn't save. + OTLog::Error("Failed adding issued number back to THE_NYM in OTItem::VerifyBalanceStatement.\n"); + } + break; + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + break; + default: + // Error + OTLog::vError("OTItem::VerifyBalanceStatement: wrong target transaction type: %s\n", + TARGET_TRANSACTION.GetTypeString()); + break; + } + + return true; +} + + + +void OTItem::ReleaseItems() +{ + OTItem * pItem = NULL; + + while (!m_listItems.empty()) + { + pItem = m_listItems.front(); + m_listItems.pop_front(); + delete pItem; + pItem = NULL; + } +} + + + +// You have to allocate the item on the heap and then pass it in as a reference. +// OTTransaction will take care of it from there and will delete it in destructor. +void OTItem::AddItem(OTItem & theItem) +{ + m_listItems.push_back(&theItem); +} + + +// While processing a transaction, you may wish to query it for items of a certain type. +OTItem * OTItem::GetItem(int nIndex) +{ + OTItem * pItem = NULL; + + int nTempIndex = (-1); + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + nTempIndex++; // first iteration this becomes 0 here. + + if (nTempIndex == nIndex) + return pItem; + } + + return NULL; +} + + +// While processing an item, you may wish to query it for sub-items +OTItem * OTItem::GetItemByTransactionNum(const long lTransactionNumber) +{ + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + if (pItem->GetTransactionNum() == lTransactionNumber) + return pItem; + } + + return NULL; +} + +// Count the number of items that are IN REFERENCE TO some transaction#. +// +// Might want to change this so that it only counts ACCEPTED receipts. +// +int OTItem::GetItemCountInRefTo(const long lReference) +{ + int nCount = 0; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + OTItem * pItem = *ii; + OT_ASSERT(NULL != pItem); + + if (pItem->GetReferenceToNum() == lReference) + nCount++; + } + + return nCount; +} + + + +// The final receipt item MAY be present, and co-relates to others that share +// its "in reference to" value. (Others such as marketReceipts and paymentReceipts.) +// +OTItem * OTItem::GetFinalReceiptItemByReferenceNum(const long lReferenceNumber) +{ + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + if (OTItem::finalReceipt != pItem->GetType()) + continue; + //---------------------- + if (pItem->GetReferenceToNum() == lReferenceNumber) + return pItem; + } + + return NULL; +} + + + + + + + + +void OTItem::GetAttachment(OTString & theStr) const +{ + m_ascAttachment.GetString(theStr); +} + +void OTItem::SetAttachment(const OTString & theStr) +{ + m_ascAttachment.SetString(theStr); +} + + + +#define MINIMUM_CLEARTEXT_SIZE_OTASCIIARMOR 100 + +#define OTASSCIIARMOR_PADDING_TEXT " IGNORE -- NOTE PADDING -- IGNORE -- NOTE PADDING \nIGNORE -- NOTE PADDING -- IGNORE -- NOTE PADDING \n" + +void OTItem::SetNote(const OTString & theStr) +{ + if (theStr.Exists() && theStr.GetLength() > 2) + { + OTString theString(theStr); + if (theStr.GetLength() < MINIMUM_CLEARTEXT_SIZE_OTASCIIARMOR) + { + OTString strPadding(OTASSCIIARMOR_PADDING_TEXT); + + theString.Concatenate(strPadding); + } + + m_ascNote.SetString(theString); + } + else + { + m_ascNote.Release(); + } + +} + +void OTItem::GetNote(OTString & theStr) const +{ + if (m_ascNote.GetLength() > 2) + { + m_ascNote.GetString(theStr); + + if (theStr.Contains(OTASSCIIARMOR_PADDING_TEXT)) + theStr.Truncate(theStr.GetLength() - MINIMUM_CLEARTEXT_SIZE_OTASCIIARMOR); + } + else + { + theStr.Release(); + } + +} + + + +// Let's say you have created a transaction, and you are creating an item to put into it. +// Well in that case, you don't care to verify that the real IDs match the purported IDs, since +// you are creating this item yourself, not verifying it from someone else. +// Use this function to create the new Item before you add it to your new Transaction. +OTItem * OTItem::CreateItemFromTransaction(const OTTransaction & theOwner, OTItem::itemType theType, OTIdentifier * pDestinationAcctID/*=NULL*/) +{ + OTItem * pItem = new OTItem(theOwner.GetUserID(), theOwner, theType, pDestinationAcctID); + + if (pItem) + { + pItem->SetPurportedAccountID(theOwner.GetPurportedAccountID()); + pItem->SetPurportedServerID(theOwner.GetPurportedServerID()); + return pItem; + } + return NULL; +} + + +// Sometimes I don't know user ID of the originator, or the account ID of the originator, +// until after I have loaded the item. It's simply impossible to set those values ahead +// of time, sometimes. In those cases, we set the values appropriately but then we need +// to verify that the user ID is actually the owner of the AccountID. TOdo that. +OTItem * OTItem::CreateItemFromString(const OTString & strItem, const OTIdentifier & theServerID, long lTransactionNumber) +{ + if (!strItem.Exists()) + { + OTLog::Error("OTItem::CreateItemFromString: strItem is empty. (Expected an item.)\n"); + return NULL; + } + + OTItem * pItem = new OTItem(); + + // So when it loads its own server ID, we can compare to this one. + pItem->SetRealServerID(theServerID); + + // This loads up the purported account ID and the user ID. + if (pItem->LoadContractFromString(strItem)) + { + const OTIdentifier & ACCOUNT_ID = pItem->GetPurportedAccountID(); + pItem->SetRealAccountID(ACCOUNT_ID);// I do this because it's all we've got in this case. It's what's in the + // xml, so it must be right. If it's a lie, the signature will fail or the + // user will not show as the owner of that account. But remember, the server + // sent the message in the first place. + + pItem->SetTransactionNum(lTransactionNumber); + + if (pItem->VerifyContractID()) // this compares purported and real account IDs, as well as server IDs. + { + return pItem; + } + else { + delete pItem; + pItem = NULL; + } + } + + return NULL; +} + + +void OTItem::InitItem() +{ + m_lAmount = 0; // Accounts default to ZERO. They can only change that amount by receiving from another account. + m_Type = OTItem::error_state; + m_Status = OTItem::request; // (Unless an issuer account, which can create currency + m_lNewOutboxTransNum=0; // When the user puts a "1" in his outbox for a balance agreement (since he doesn't know what trans# the actual outbox item + // will have if the transaction is successful, since the server hasn't issued it yet) then the balance receipt will have 1 in + // the user's portion for that outbox transaction, and the balance receipt will also have, say, #34 (the actual number) here + // in this variable, in the server's reply portion of that same receipt. + + m_lClosingTransactionNo = 0; + + m_strContractType = "TRANSACTION ITEM"; // CONTRACT, MESSAGE, TRANSACTION, LEDGER, TRANSACTION ITEM +} + + + + +// this one is private (I hope to keep it that way.) +// probvably not actually. If I end up back here, it's because +// sometimes I dont' WANT to assign the stuff, but leave it blank +// because I'm about to load it. +OTItem::OTItem() : OTTransactionType(), + m_lAmount(0), + m_Type(OTItem::error_state), + m_Status(OTItem::request), + m_lNewOutboxTransNum(0), + m_lClosingTransactionNo(0) +{ + InitItem(); +} + + +// From owner we can get acct ID, server ID, and transaction Num +OTItem::OTItem(const OTIdentifier & theUserID, const OTTransaction & theOwner) +: OTTransactionType(theUserID, theOwner.GetRealAccountID(), theOwner.GetRealServerID(), theOwner.GetTransactionNum()), + m_lAmount(0), + m_Type(OTItem::error_state), + m_Status(OTItem::request), + m_lNewOutboxTransNum(0), + m_lClosingTransactionNo(0) +{ + InitItem(); + +} + +// From owner we can get acct ID, server ID, and transaction Num +OTItem::OTItem(const OTIdentifier & theUserID, const OTItem & theOwner) +: OTTransactionType(theUserID, theOwner.GetRealAccountID(), theOwner.GetRealServerID(), theOwner.GetTransactionNum()), + m_lAmount(0), + m_Type(OTItem::error_state), + m_Status(OTItem::request), + m_lNewOutboxTransNum(0), + m_lClosingTransactionNo(0) +{ + InitItem(); + +} + +OTItem::OTItem(const OTIdentifier & theUserID, const OTTransaction & theOwner, OTItem::itemType theType, OTIdentifier * pDestinationAcctID/*=NULL*/) + : OTTransactionType(theUserID, theOwner.GetRealAccountID(), theOwner.GetRealServerID(), theOwner.GetTransactionNum()), + m_lAmount(0), + m_Type(OTItem::error_state), + m_Status(OTItem::request), + m_lNewOutboxTransNum(0), + m_lClosingTransactionNo(0) +{ + InitItem(); + + m_Type = theType; // This has to be below the InitItem() call that appears just above + + // Most transactions items don't HAVE a "to" account, just a primary account. + // (If you deposit, or withdraw, you don't need a "to" account.) + // But for the ones that do, you can pass the "to" account's ID in + // as a pointer, and we'll set that too.... + if (NULL != pDestinationAcctID) + { + m_AcctToID = *pDestinationAcctID; + } +} + + +/* +OTItem& OTItem::operator=(const OTItem& rhs) +{ + m_Type = rhs.m_Type; + m_Status = rhs.m_Status; + m_lAmount = rhs.m_lAmount; + m_lTransactionNum = rhs.m_lTransactionNum; + m_strNote = rhs.m_strNote; + m_AcctFromID = rhs.m_AcctFromID; + m_AcctToID = rhs.m_AcctToID; + m_AcctServerID = rhs.m_AcctServerID; + m_OutboxHash = rhs.m_OutboxHash; // not feasible on OT -- my outbox is signed by me on my side and server's side is signed by server. Plus server knows certain IDs only after I have sent the request, preventing me from directly including (one specifically) into the actual request. + m_ascInReferenceTo = rhs.m_ascInReferenceTo; + m_lInReferenceToTrans = rhs.m_lInReferenceToTrans; + + // Until there is a contract::op=, we'll just do it by hand here. + // (these are the members of OTContract) + m_strName = rhs.m_strName; + m_strFilename = rhs.m_strFilename; + m_ID = rhs.m_ID; + m_xmlUnsigned = rhs.m_xmlUnsigned; + m_strRawFile = rhs.m_strRawFile; + m_strSigHashType = rhs.m_strSigHashType; + m_strContractType = rhs.m_strContractType; + m_strVersion = rhs.m_strVersion; + + return *this; +} +*/ +OTItem::~OTItem() +{ + ReleaseItems(); +} + + + + + + + +OTItem::itemType GetItemTypeFromString(const OTString & strType) +{ + OTItem::itemType theType = OTItem::error_state; + + if (strType.Compare("transaction")) + theType = OTItem::transaction; + else if (strType.Compare("atTransaction")) + theType = OTItem::atTransaction; + // -------------------------------------------------------------- + else if (strType.Compare("transfer")) + theType = OTItem::transfer; + else if (strType.Compare("atTransfer")) + theType = OTItem::atTransfer; + // -------------------------------------------------------------- + else if (strType.Compare("acceptTransaction")) + theType = OTItem::acceptTransaction; + else if (strType.Compare("atAcceptTransaction")) + theType = OTItem::atAcceptTransaction; + // -------------------------------------------------------------- + else if (strType.Compare("acceptMessage")) + theType = OTItem::acceptMessage; + else if (strType.Compare("atAcceptMessage")) + theType = OTItem::atAcceptMessage; + // -------------------------------------------------------------- + else if (strType.Compare("acceptPending")) + theType = OTItem::acceptPending; + else if (strType.Compare("atAcceptPending")) + theType = OTItem::atAcceptPending; + else if (strType.Compare("rejectPending")) + theType = OTItem::rejectPending; + else if (strType.Compare("atRejectPending")) + theType = OTItem::atRejectPending; + // -------------------------------------------------------------- + else if (strType.Compare("acceptCronReceipt")) + theType = OTItem::acceptCronReceipt; + else if (strType.Compare("atAcceptCronReceipt")) + theType = OTItem::atAcceptCronReceipt; + else if (strType.Compare("disputeCronReceipt")) + theType = OTItem::disputeCronReceipt; + else if (strType.Compare("atDisputeCronReceipt")) + theType = OTItem::atDisputeCronReceipt; + else if (strType.Compare("acceptItemReceipt")) + theType = OTItem::acceptItemReceipt; + else if (strType.Compare("atAcceptItemReceipt")) + theType = OTItem::atAcceptItemReceipt; + else if (strType.Compare("disputeItemReceipt")) + theType = OTItem::disputeItemReceipt; + else if (strType.Compare("atDisputeItemReceipt")) + theType = OTItem::atDisputeItemReceipt; + // -------------------------------------------------------------- + + else if (strType.Compare("acceptFinalReceipt")) + theType = OTItem::acceptFinalReceipt; + else if (strType.Compare("atAcceptFinalReceipt")) + theType = OTItem::atAcceptFinalReceipt; + else if (strType.Compare("disputeFinalReceipt")) + theType = OTItem::disputeFinalReceipt; + else if (strType.Compare("atDisputeFinalReceipt")) + theType = OTItem::atDisputeFinalReceipt; + + else if (strType.Compare("acceptBasketReceipt")) + theType = OTItem::acceptBasketReceipt; + else if (strType.Compare("atAcceptBasketReceipt")) + theType = OTItem::atAcceptBasketReceipt; + else if (strType.Compare("disputeBasketReceipt")) + theType = OTItem::disputeBasketReceipt; + else if (strType.Compare("atDisputeBasketReceipt")) + theType = OTItem::atDisputeBasketReceipt; + + // -------------------------------------------------------------- + else if (strType.Compare("serverfee")) + theType = OTItem::serverfee; + else if (strType.Compare("atServerfee")) + theType = OTItem::atServerfee; + else if (strType.Compare("issuerfee")) + theType = OTItem::issuerfee; + else if (strType.Compare("atIssuerfee")) + theType = OTItem::atIssuerfee; + // -------------------------------------------------------------- + else if (strType.Compare("balanceStatement")) + theType = OTItem::balanceStatement; + else if (strType.Compare("atBalanceStatement")) + theType = OTItem::atBalanceStatement; + else if (strType.Compare("transactionStatement")) + theType = OTItem::transactionStatement; + else if (strType.Compare("atTransactionStatement")) + theType = OTItem::atTransactionStatement; + // -------------------------------------------------------------- + else if (strType.Compare("withdrawal")) + theType = OTItem::withdrawal; + else if (strType.Compare("atWithdrawal")) + theType = OTItem::atWithdrawal; + else if (strType.Compare("deposit")) + theType = OTItem::deposit; + else if (strType.Compare("atDeposit")) + theType = OTItem::atDeposit; + // -------------------------------------------------------------- + else if (strType.Compare("withdrawVoucher")) + theType = OTItem::withdrawVoucher; + else if (strType.Compare("atWithdrawVoucher")) + theType = OTItem::atWithdrawVoucher; + else if (strType.Compare("depositCheque")) + theType = OTItem::depositCheque; + else if (strType.Compare("atDepositCheque")) + theType = OTItem::atDepositCheque; + // -------------------------------------------------------------- + else if (strType.Compare("marketOffer")) + theType = OTItem::marketOffer; + else if (strType.Compare("atMarketOffer")) + theType = OTItem::atMarketOffer; + // -------------------------------------------------------------- + else if (strType.Compare("paymentPlan")) + theType = OTItem::paymentPlan; + else if (strType.Compare("atPaymentPlan")) + theType = OTItem::atPaymentPlan; + // -------------------------------------------------------------- + else if (strType.Compare("cancelCronItem")) + theType = OTItem::cancelCronItem; + else if (strType.Compare("atCancelCronItem")) + theType = OTItem::atCancelCronItem; + // -------------------------------------------------------------- + else if (strType.Compare("exchangeBasket")) + theType = OTItem::exchangeBasket; + else if (strType.Compare("atExchangeBasket")) + theType = OTItem::atExchangeBasket; + // -------------------------------------------------------------- + else if (strType.Compare("chequeReceipt")) + theType = OTItem::chequeReceipt; + else if (strType.Compare("marketReceipt")) + theType = OTItem::marketReceipt; + else if (strType.Compare("paymentReceipt")) + theType = OTItem::paymentReceipt; + else if (strType.Compare("transferReceipt")) + theType = OTItem::transferReceipt; + // -------------------------------------------------------------- + else if (strType.Compare("finalReceipt")) + theType = OTItem::finalReceipt; + else if (strType.Compare("basketReceipt")) + theType = OTItem::basketReceipt; + // -------------------------------------------------------------- + else + theType = OTItem::error_state; + // -------------------------------------------------------------- + + return theType; +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTItem::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + if (!strcmp("item", xml->getNodeName())) + { + OTString strType, strStatus; + + strType = xml->getAttributeValue("type"); + strStatus = xml->getAttributeValue("status"); + + // Type + m_Type = GetItemTypeFromString(strType); // just above. + + // ---------------------------------------- + + // Status + if (strStatus.Compare("request")) + m_Status = OTItem::request; + else if (strStatus.Compare("acknowledgement")) + m_Status = OTItem::acknowledgement; + else if (strStatus.Compare("rejection")) + m_Status = OTItem::rejection; + else + m_Status = OTItem::error_status; + + OTString strAcctFromID, strAcctToID, strServerID, strUserID, strOutboxNewTransNum; + + strAcctFromID = xml->getAttributeValue("fromAccountID"); + strAcctToID = xml->getAttributeValue("toAccountID"); + strServerID = xml->getAttributeValue("serverID"); + strUserID = xml->getAttributeValue("userID"); + + strOutboxNewTransNum = xml->getAttributeValue("outboxNewTransNum"); + + if (strOutboxNewTransNum.Exists()) + m_lNewOutboxTransNum = atol(strOutboxNewTransNum.Get()); + + + OTIdentifier ACCOUNT_ID(strAcctFromID), SERVER_ID(strServerID), DESTINATION_ACCOUNT(strAcctToID), + USER_ID(strUserID); + + SetPurportedAccountID(ACCOUNT_ID); // OTTransactionType::m_AcctID the PURPORTED Account ID + SetPurportedServerID(SERVER_ID); // OTTransactionType::m_AcctServerID the PURPORTED Server ID + SetDestinationAcctID(DESTINATION_ACCOUNT); + SetUserID(USER_ID); + SetTransactionNum(atol(xml->getAttributeValue("transactionNum"))); + SetReferenceToNum(atol(xml->getAttributeValue("inReferenceTo"))); + + m_lAmount = atol(xml->getAttributeValue("amount")); + + OTLog::vOutput(3, "Loaded transaction Item, transaction num %ld, In Reference To: %ld, type: %s, status: %s\n", +// "fromAccountID:\n%s\n UserID:\n%s\n toAccountID:\n%s\n serverID:\n%s\n----------\n", + GetTransactionNum(), + GetReferenceToNum(), strType.Get(), strStatus.Get() +// strAcctFromID.Get(), strUserID.Get(), strAcctToID.Get(), strServerID.Get() + ); + + return 1; + } + else if (!strcmp("note", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascNote)) + { + OTLog::Error("Error in OTItem::ProcessXMLNode: note field without value.\n"); + return (-1); // error condition + } + + return 1; + } + else if (!strcmp("inReferenceTo", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascInReferenceTo)) + { + OTLog::Error("Error in OTItem::ProcessXMLNode: inReferenceTo field without value.\n"); + return (-1); // error condition + } + + return 1; + } + else if (!strcmp("attachment", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascAttachment)) + { + OTLog::Error("Error in OTItem::ProcessXMLNode: attachment field without value.\n"); + return (-1); // error condition + } + + return 1; + } + else if (!strcmp("transactionReport", xml->getNodeName())) + { + if ((OTItem::balanceStatement == m_Type) || + (OTItem::atBalanceStatement == m_Type)) + { + // Notice it initializes with the wrong transaction number, in this case. + // That's okay, because I'm setting it below with pItem->SetTransactionNum... + OTItem * pItem = new OTItem(GetUserID(), *this); // But I've also got ITEM types with the same names... + // That way, it will translate the string and set the type correctly. + OT_ASSERT(NULL != pItem); // That way I can use each item to REPRESENT an inbox transaction + + // Type + OTString strType; + strType = xml->getAttributeValue("type"); // it's reading a TRANSACTION type: chequeReceipt, marketReceipt, or paymentReceipt. But I also have the same names for item types. + + pItem->SetType(GetItemTypeFromString(strType)); // It's actually translating a transaction type to an item type. (Same names in the case of the 3 receipts that matter for inbox reports for balance agreements.) + + pItem->SetAmount(atol(xml->getAttributeValue("adjustment"))); + + // Status + pItem->SetStatus(OTItem::acknowledgement); // I don't need this, but I'd rather it not say error state. This way if it changes to error_state later, I know I had a problem. + + OTString strAccountID, strServerID, strUserID; + + strAccountID = xml->getAttributeValue("accountID"); + strServerID = xml->getAttributeValue("serverID"); + strUserID = xml->getAttributeValue("userID"); + + OTIdentifier ACCOUNT_ID(strAccountID), SERVER_ID(strServerID), USER_ID(strUserID); + + pItem->SetPurportedAccountID(ACCOUNT_ID); // OTTransactionType::m_AcctID the PURPORTED Account ID + pItem->SetPurportedServerID(SERVER_ID); // OTTransactionType::m_AcctServerID the PURPORTED Server ID + pItem->SetUserID(USER_ID); + + // -------------------- + + OTString strTemp; + + strTemp = xml->getAttributeValue("transactionNum"); + if (strTemp.Exists()) + pItem->SetTransactionNum(atol(strTemp.Get())); + + strTemp = xml->getAttributeValue("inReferenceTo"); + if (strTemp.Exists()) + pItem->SetReferenceToNum(atol(strTemp.Get())); + + strTemp = xml->getAttributeValue("closingTransactionNum"); // only used in the inbox report for balance agreement. + if (strTemp.Exists()) + pItem->SetClosingNum(atol(strTemp.Get())); + + // -------------------- + + AddItem(*pItem); // <======= adding to list. + + OTLog::vOutput(3, "Loaded transactionReport Item, transaction num %ld, In Reference To: %ld, type: %s\n", + // "fromAccountID:\n%s\n UserID:\n%s\n toAccountID:\n%s\n serverID:\n%s\n----------\n", + pItem->GetTransactionNum(), + pItem->GetReferenceToNum(), strType.Get() + // strAcctFromID.Get(), strUserID.Get(), strAcctToID.Get(), strServerID.Get() + ); + } + else + { + OTLog::Error("Outbox hash in item wrong type (expected balanceStatement or atBalanceStatement.\n"); + } + + return 1; + } + + return 0; +} + + + + +// Used in balance agreement, part of the inbox report. +// ------------------------------------------------- +long OTItem::GetClosingNum() const +{ + return m_lClosingTransactionNo; +} + + +void OTItem::SetClosingNum(const long lClosingNum) +{ + m_lClosingTransactionNo = lClosingNum; +} +// ------------------------------------------------- + + +void OTItem::GetStringFromType(OTItem::itemType theType, OTString & strType) +{ + switch (theType) + { + case OTItem::transaction: + strType.Set("transaction"); + break; + case OTItem::transfer: + strType.Set("transfer"); + break; + case OTItem::acceptTransaction: + strType.Set("acceptTransaction"); + break; + case OTItem::acceptMessage: + strType.Set("acceptMessage"); + break; + case OTItem::acceptPending: + strType.Set("acceptPending"); + break; + case OTItem::rejectPending: + strType.Set("rejectPending"); + break; + case OTItem::acceptCronReceipt: + strType.Set("acceptCronReceipt"); + break; + case OTItem::disputeCronReceipt: + strType.Set("disputeCronReceipt"); + break; + case OTItem::acceptItemReceipt: + strType.Set("acceptItemReceipt"); + break; + case OTItem::disputeItemReceipt: + strType.Set("disputeItemReceipt"); + break; + case OTItem::acceptFinalReceipt: + strType.Set("acceptFinalReceipt"); + break; + case OTItem::acceptBasketReceipt: + strType.Set("acceptBasketReceipt"); + break; + case OTItem::disputeFinalReceipt: + strType.Set("disputeFinalReceipt"); + break; + case OTItem::disputeBasketReceipt: + strType.Set("disputeBasketReceipt"); + break; + case OTItem::serverfee: + strType.Set("serverfee"); + break; + case OTItem::issuerfee: + strType.Set("issuerfee"); + break; + case OTItem::withdrawal: + strType.Set("withdrawal"); + break; + case OTItem::deposit: + strType.Set("deposit"); + break; + case OTItem::withdrawVoucher: + strType.Set("withdrawVoucher"); + break; + case OTItem::depositCheque: + strType.Set("depositCheque"); + break; + case OTItem::marketOffer: + strType.Set("marketOffer"); + break; + case OTItem::paymentPlan: + strType.Set("paymentPlan"); + break; + case OTItem::balanceStatement: + strType.Set("balanceStatement"); + break; + case OTItem::transactionStatement: + strType.Set("transactionStatement"); + break; + + case OTItem::cancelCronItem: + strType.Set("cancelCronItem"); + break; + case OTItem::exchangeBasket: + strType.Set("exchangeBasket"); + break; + + case OTItem::atCancelCronItem: + strType.Set("atCancelCronItem"); + break; + case OTItem::atExchangeBasket: + strType.Set("atExchangeBasket"); + break; + + case OTItem::chequeReceipt: // used for inbox statements in balance agreement. + strType.Set("chequeReceipt"); + break; + case OTItem::marketReceipt: // used as market receipt, and also for inbox statement containing market receipt will use this as well. + strType.Set("marketReceipt"); + break; + case OTItem::paymentReceipt: // used as payment receipt, also used in inbox statement as payment receipt. + strType.Set("paymentReceipt"); + break; + case OTItem::transferReceipt: // used in inbox statement as transfer receipt. + strType.Set("transferReceipt"); + break; + // ----------------------------------- + case OTItem::finalReceipt: // used in inbox statement as final receipt. (For expiring or cancelled Cron Item.) + strType.Set("finalReceipt"); + break; + case OTItem::basketReceipt: // used in inbox statement as basket receipt. (For exchange.) + strType.Set("basketReceipt"); + break; + + + + case OTItem::atTransaction: + strType.Set("atTransaction"); + break; + case OTItem::atTransfer: + strType.Set("atTransfer"); + break; + case OTItem::atAcceptTransaction: + strType.Set("atAcceptTransaction"); + break; + case OTItem::atAcceptMessage: + strType.Set("atAcceptMessage"); + break; + case OTItem::atAcceptPending: + strType.Set("atAcceptPending"); + break; + case OTItem::atRejectPending: + strType.Set("atRejectPending"); + break; + case OTItem::atAcceptCronReceipt: + strType.Set("atAcceptCronReceipt"); + break; + case OTItem::atDisputeCronReceipt: + strType.Set("atDisputeCronReceipt"); + break; + case OTItem::atAcceptItemReceipt: + strType.Set("atAcceptItemReceipt"); + break; + case OTItem::atDisputeItemReceipt: + strType.Set("atDisputeItemReceipt"); + break; + + case OTItem::atAcceptFinalReceipt: + strType.Set("atAcceptFinalReceipt"); + break; + case OTItem::atAcceptBasketReceipt: + strType.Set("atAcceptBasketReceipt"); + break; + case OTItem::atDisputeFinalReceipt: + strType.Set("atDisputeFinalReceipt"); + break; + case OTItem::atDisputeBasketReceipt: + strType.Set("atDisputeBasketReceipt"); + break; + + case OTItem::atServerfee: + strType.Set("atServerfee"); + break; + case OTItem::atIssuerfee: + strType.Set("atIssuerfee"); + break; + case OTItem::atWithdrawal: + strType.Set("atWithdrawal"); + break; + case OTItem::atDeposit: + strType.Set("atDeposit"); + break; + case OTItem::atWithdrawVoucher: + strType.Set("atWithdrawVoucher"); + break; + case OTItem::atDepositCheque: + strType.Set("atDepositCheque"); + break; + case OTItem::atMarketOffer: + strType.Set("atMarketOffer"); + break; + case OTItem::atPaymentPlan: + strType.Set("atPaymentPlan"); + break; + case OTItem::atBalanceStatement: + strType.Set("atBalanceStatement"); + break; + case OTItem::atTransactionStatement: + strType.Set("atTransactionStatement"); + break; + + + + + + default: + strType.Set("error-unknown"); + break; + } + +} + + + +void OTItem::UpdateContents() // Before transmission or serialization, this is where the ledger saves its contents +{ + OTString strFromAcctID(GetPurportedAccountID()), strToAcctID(GetDestinationAcctID()), strServerID(GetPurportedServerID()), + strType, strStatus, strUserID(GetUserID()); + + GetStringFromType(m_Type, strType); + + switch (m_Status) { + case OTItem::request: + strStatus.Set("request"); + break; + case OTItem::acknowledgement: + strStatus.Set("acknowledgement"); + break; + case OTItem::rejection: + strStatus.Set("rejection"); + break; + default: + strStatus.Set("error-unknown"); + break; + } + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + + if (m_lNewOutboxTransNum > 0) + m_xmlUnsigned.Concatenate("\n\n", + strType.Get(), strStatus.Get(), + m_lNewOutboxTransNum, + GetTransactionNum(), strServerID.Get(), + strUserID.Get(), + strFromAcctID.Get(), strToAcctID.Get(), GetReferenceToNum(), m_lAmount); + else + m_xmlUnsigned.Concatenate("\n\n", + strType.Get(), strStatus.Get(), + GetTransactionNum(), strServerID.Get(), + strUserID.Get(), + strFromAcctID.Get(), strToAcctID.Get(), GetReferenceToNum(), m_lAmount); + + if (m_ascNote.GetLength() > 2) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascNote.Get()); + } + + if (m_ascInReferenceTo.GetLength() > 2) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + } + + if (m_ascAttachment.GetLength() > 2) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascAttachment.Get()); + } + + if ((OTItem::balanceStatement == m_Type) || + (OTItem::atBalanceStatement == m_Type)) + { + + // loop through the sub-items (only used for balance agreement.) + + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + OTString strAcctID(pItem->GetPurportedAccountID()), + strServerID(pItem->GetPurportedServerID()), + strUserID(pItem->GetUserID()); + + OTString strReceiptType; + GetStringFromType(pItem->GetType(), strReceiptType); + + m_xmlUnsigned.Concatenate("\n\n", + strReceiptType.Exists() ? strReceiptType.Get() : "error_state", + pItem->GetAmount(), + strAcctID.Get(), + strUserID.Get(), + strServerID.Get(), + pItem->GetTransactionNum(), + pItem->GetClosingNum(), + pItem->GetReferenceToNum()); + } + } + + m_xmlUnsigned.Concatenate("\n"); +} + + + +bool OTItem::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTItem.h b/OTLib/OTItem.h new file mode 100644 index 000000000..45649bcf0 --- /dev/null +++ b/OTLib/OTItem.h @@ -0,0 +1,416 @@ +/************************************************************* + * + * OTItem.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTITEM_H__ +#define __OTITEM_H__ + +#include + +#include "OTTransactionType.h" +#include "OTString.h" + +class OTAccount; +class OTLedger; +class OTMessage; +class OTTransaction; +class OTItem; +class OTPseudonym; + + +typedef std::list listOfItems; + + +// Item as in "Transaction Item" +// An OTLedger contains a list of transactions (pending transactions, inbox or outbox.) +// Each transaction has a list of items that make up that transaction. +// I think that the Item ID shall be the order in which the items are meant to +// be processed. +// Items are like tracks on a CD. It is assumed there will be several of them, they +// come in packs. You normally would deal with the transaction as a single entity, +// not the item. A transaction contains a list of items. +class OTItem : public OTTransactionType +{ + friend OTTransactionType * OTTransactionType::TransactionFactory(const OTString & strInput); + +public: + enum itemType + { + // TRANSACTION NUMBERS ARE REQUIRED FOR EVERY TRANSACTION + transaction, // this item is request for a transaction number + atTransaction, // this item contains a response to a request for a transaction number + // (If successful, the actual number(s) will be dropped into the Nymbox for pickup.) +// ------------------------------------------------------------------------------ + // TRANSFER + transfer, // this item is an outgoing transfer, probably part of an outoing transaction. + atTransfer, // Server reply. +// ------------------------------------------------------------------------------ + + // NYMBOX RESOLUTION + + acceptTransaction, // this item is a client-side acceptance of a transaction number (a blank) in my Nymbox + atAcceptTransaction, + acceptMessage, // this item is a client-side acceptance of a message in my Nymbox + atAcceptMessage, + +// ------------------------------------------------------------------------------ + + // INBOX RESOLUTION + + acceptPending, // this item is a client-side acceptance of a pending transfer + atAcceptPending, + rejectPending, // this item is a client-side rejection of a pending transfer + atRejectPending, + + // RECEIPT ACKNOWLEDGMENT / DISPUTE + acceptCronReceipt, // this item is a client-side acceptance of a cron receipt in his inbox. + atAcceptCronReceipt, // this item is a server reply to that acceptance. + + acceptItemReceipt, // this item is a client-side acceptance of an item receipt in his inbox. + atAcceptItemReceipt, // this item is a server reply to that acceptance. + + disputeCronReceipt, // this item is a client dispute of a cron receipt in his inbox. + atDisputeCronReceipt, // Server reply to dispute message. + + disputeItemReceipt, // this item is a client dispute of an item receipt in his inbox. + atDisputeItemReceipt, // Server reply to dispute message. + + // Sometimes the attachment will be an OTItem, and sometimes it will be + // an OTPaymentPlan or OTTrade. These different types above help the + // code to differentiate. + // -------------------------------------------- + + acceptFinalReceipt, // this item is a client-side acceptance of a final receipt in his inbox. (All related receipts must also be closed!) + atAcceptFinalReceipt, // server reply + + acceptBasketReceipt, // this item is a client-side acceptance of a basket receipt in his inbox. + atAcceptBasketReceipt, // server reply + + disputeFinalReceipt, // this item is a client-side rejection of a final receipt in his inbox. (All related receipts must also be closed!) + atDisputeFinalReceipt, // server reply + + disputeBasketReceipt, // this item is a client-side rejection of a basket receipt in his inbox. + atDisputeBasketReceipt, // server reply + +// ------------------------------------------------------------------------------ + + // FEEs + serverfee, // this item is a fee from the transaction server (per contract) + atServerfee, + issuerfee, // this item is a fee from the issuer (per contract) + atIssuerfee, +// ------------------------------------------------------------------------------ + // INFO (BALANCE, HASH, etc) these are still all messages with replies. + balanceStatement, // this item is a statement of balance. (For asset account.) + atBalanceStatement, + transactionStatement, // this item is a transaction statement. (For Nym -- which numbers are assigned to him.) + atTransactionStatement, +// ------------------------------------------------------------------------------ + // CASH WITHDRAWAL / DEPOSIT + withdrawal, // this item is a cash withdrawal (of chaumian blinded tokens) + atWithdrawal, + deposit, // this item is a cash deposit (of a purse containing blinded tokens.) + atDeposit, +// ------------------------------------------------------------------------------ + // CHEQUES AND VOUCHERS + withdrawVoucher,// this item is a request to purchase a voucher (a cashier's cheque) + atWithdrawVoucher, + depositCheque, // this item is a request to deposit a cheque + atDepositCheque,// this item is a server response to that request. +// ------------------------------------------------------------------------------ + // TRADING ON MARKETS + marketOffer, // this item is an offer to be put on a market. + atMarketOffer, // server reply or updated notification regarding a market offer. +// ------------------------------------------------------------------------------ + // PAYMENT PLANS + paymentPlan, // this item is a new payment plan + atPaymentPlan, // server reply or updated notification regarding a payment plan. +// ------------------------------------------------------------------------------ + // CANCELLING: Market Offers and Payment Plans. + cancelCronItem, // this item is intended to cancel a market offer or payment plan. + atCancelCronItem,// reply from the server regarding said cancellation. +// -------------------------------------------------------------------------------------- + // EXCHANGE IN/OUT OF A BASKET CURRENCY + exchangeBasket, // this item is an exchange in/out of a basket currency. + atExchangeBasket,// reply from the server regarding said exchange. +// ------------------------------------------------------------------------------ + // Now these three receipts have a dual use: as the receipts in the inbox, and also + // as the representation for transactions in the inbox report (for balance statements.) + // Actually chequeReceipt is ONLY used for inbox report, and otherwise is not actually + // needed for real cheque receipts. marketReceipt and paymentReceipt are used as real + // receipts, and also in inbox reports to represent transaction items in an inbox. + chequeReceipt, // Currently don't create an OTItem for cheque receipt in inbox. Not needed. + // I also don't create one for the transfer receipt, currently. + // (Although near the top, I do have item types to go in a processInbox message and + // clear those transaction types out of my inbox.) + marketReceipt, // server receipt dropped into inbox as result of market trading. + paymentReceipt, // server receipt dropped into an inbox as result of payment occuring. + transferReceipt, // server receipt dropped into an inbox as result of transfer being accepted. +// ------------------------------------------------------------------------------ + finalReceipt, // server receipt dropped into inbox as result of cron item expiring or being canceled. + basketReceipt, // server receipt dropped into inbox as result of a basket exchange. +// ------------------------------------------------------------------------------ + error_state // error state versus error status + }; + + // FOR EXAMPLE: A client may send a TRANSFER request, setting type to Transfer and status to Request. + // The server may respond with type atTransfer and status Acknowledgment. + // Make sense? + + enum itemStatus + { + request, // This item is a request from the client + acknowledgement, // This item is an acknowledgment from the server. (The server has signed it.) + rejection, // This item represents a rejection of the request by the server. (Server will not sign it.) + error_status // error status versus error state + }; + +protected: + + // There is the OTTransaction transfer, which is a transaction type, and there is also + // the OTItem transfer, which is an item type. They are related. Every transaction has + // a list of items, and these perform the transaction. A transaction trying to TRANSFER + // would have these items: transfer, serverfee, balance, and possibly outboxhash. + // + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + OTIdentifier m_AcctToID; // DESTINATION ACCOUNT for transfers. NOT the account holder. + + OTItem(); // <============================= Here for now, if I can get away with it. + + long m_lAmount; // for balance, or fee, etc. Only an item can actually have an amount. (Or a "TO" account.) + + + listOfItems m_listItems; // Sometimes an item needs to have a list of yet more items. Like balance statements have a list of inbox items. (Just the relevant data, not all the attachments and everything.) + + itemType m_Type; // the item type. Could be a transfer, a fee, a balance or client accept/rejecting an item + itemStatus m_Status; // request, acknowledgment, or rejection. + + long m_lNewOutboxTransNum; // Used for balance agreement. The user puts transaction "1" in his outbox when doing a transfer, since he has no idea + // what # will actually be issued on the server side after he sends his message. Let's say the server issues # 34, and + // puts that in the outbox. It thus sets this member to 34, and it is understood that 1 in the client request corresponds + // to 34 on this member variable in the reply. Only one transfer can be done at a time. In cases where verifying a balance + // receipt and you come across transaction #1 in the outbox, simply look up this variable on the server's portion of the reply + // and then look up that number instead. + + long m_lClosingTransactionNo; // Used in balance agreement (to represent an inbox item) + +public: + long GetClosingNum() const; + void SetClosingNum(const long lClosingNum); + + // used for looping through the items in a few places. + inline listOfItems & GetItemList() { return m_listItems; } + + OTItem * GetItem(int nIndex); // While processing an item, you may wish to query it for sub-items of a certain type. + OTItem * GetItemByTransactionNum(const long lTransactionNumber); // While processing an item, you may wish to query it for sub-items + OTItem * GetFinalReceiptItemByReferenceNum(const long lReferenceNumber); // The final receipt item MAY be present, and co-relates to others that share its "in reference to" value. (Others such as marketReceipts and paymentReceipts.) + int GetItemCountInRefTo(const long lReference); // Count the number of items that are IN REFERENCE TO some transaction#. + inline int GetItemCount() const { return m_listItems.size(); } + void AddItem(OTItem & theItem); // You have to allocate the item on the heap and then pass it in as a reference. + // OTItem will take care of it from there and will delete it in destructor. + + void ReleaseItems(); + + // the "From" accountID and the ServerID are now in the parent class. (2 of each.) + + inline void SetNewOutboxTransNum(const long lTransNum) { m_lNewOutboxTransNum = lTransNum; } + inline long GetNewOutboxTransNum() const { return m_lNewOutboxTransNum; } // See above comment in protected section. + + OTASCIIArmor m_ascNote; // a text field for the user. Cron may also store receipt data here. Also inbox reports go here for balance agreement + OTASCIIArmor m_ascAttachment; // the digital cash token is sent here, signed, and returned here. (or purse of tokens.) + // As well as a cheque, or a voucher, or a server update on a market offer, or a nym full of transactions for balance agreement. + + // Call this on the server side, on a balanceStatement item, to verify + // whether the wallet side set it up correctly (and thus it's okay to sign and return with acknowledgement.) + bool VerifyBalanceStatement(const long lActualAdjustment, + OTPseudonym & THE_NYM, + OTLedger & THE_INBOX, + OTLedger & THE_OUTBOX, + const OTAccount & THE_ACCOUNT, + OTTransaction & TARGET_TRANSACTION, + const long lOutboxTrnsNum=0); // Used in special case of transfers (the user + // didn't know the outbox trans# when constructing + // the original request.) Unused when 0. + // server-side + bool VerifyTransactionStatement(OTPseudonym & THE_NYM, OTTransaction & TARGET_TRANSACTION, + const bool bIsRealTransaction=true); // We use this when the trans# is 0 (like when processing Nymbox.) + + inline OTItem::itemStatus GetStatus() const { return m_Status; } + inline void SetStatus(const OTItem::itemStatus & theVal) { m_Status = theVal; } + inline OTItem::itemType GetType() const { return m_Type; } + inline void SetType(OTItem::itemType theType) { m_Type = theType; } + + inline long GetAmount() const { return m_lAmount; } + inline void SetAmount(long lAmount) { m_lAmount = lAmount; } + + void GetNote(OTString & theStr) const; + void SetNote(const OTString & theStr); + + void GetAttachment(OTString & theStr) const; + void SetAttachment(const OTString & theStr); + + inline const OTIdentifier & GetDestinationAcctID() const { return m_AcctToID; } + inline void SetDestinationAcctID(const OTIdentifier & theID) { m_AcctToID = theID; } + + static OTItem * CreateItemFromString(const OTString & strItem, const OTIdentifier & theServerID, long lTransactionNumber); + + + static OTItem * CreateItemFromTransaction(const OTTransaction & theOwner, OTItem::itemType theType, OTIdentifier * pDestinationAcctID=NULL); + + static void GetStringFromType(OTItem::itemType theType, OTString & strType); + + inline void GetTypeString(OTString & strType) { OTItem::GetStringFromType(GetType(), strType); } + + OTItem(const OTIdentifier & theUserID, const OTItem & theOwner);// From owner we can get acct ID, server ID, and transaction Num + OTItem(const OTIdentifier & theUserID, const OTTransaction & theOwner);// From owner we can get acct ID, server ID, and transaction Num + OTItem(const OTIdentifier & theUserID, const OTTransaction & theOwner, OTItem::itemType theType, OTIdentifier * pDestinationAcctID=NULL); + + virtual ~OTItem(); +// OTItem& operator=(const OTItem& rhs); + void InitItem(); + + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + + + + +#endif // __OTITEM_H__ + + + + diff --git a/OTLib/OTLedger.cpp b/OTLib/OTLedger.cpp new file mode 100644 index 000000000..ed41d27ef --- /dev/null +++ b/OTLib/OTLedger.cpp @@ -0,0 +1,1243 @@ +/************************************************************************ + * + * OTLedger.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#include +#include +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + +#include "OTData.h" +#include "OTIdentifier.h" +#include "OTAccount.h" +#include "OTPayload.h" +#include "OTMessage.h" +#include "OTStringXML.h" + +#include "OTItem.h" +#include "OTTransaction.h" +#include "OTLedger.h" + +#include "OTPseudonym.h" +#include "OTLog.h" + + + + + +const char * OTLedger::_TypeStrings[] = +{ + "message", // used in OTMessages, to send various lists of transactions back and forth. + "inbox", // each asset account has an inbox, with pending transfers as well as receipts inside. + "outbox", // if you SEND a pending transfer, it sits in your outbox until it's accepted, rejected, or canceled. + "nymbox", // the nymbox is per user account (versus per asset account) and is used to receive new transaction numbers (and messages.) + "error_state" +}; + + + +bool OTLedger::LoadGeneric(OTLedger::ledgerType theType) +{ + OTString strID; + GetIdentifier(strID); + + m_Type = theType; + + const char * pszFolder = NULL; + const char * pszType = GetTypeString(); + + switch (theType) + { + case OTLedger::inbox: + pszFolder = OTLog::InboxFolder(); + break; + case OTLedger::outbox: + pszFolder = OTLog::OutboxFolder(); + break; + case OTLedger::nymbox: + pszFolder = OTLog::NymboxFolder(); + break; + default: + return false; + } + // -------------------------------------------------------- + + m_strFoldername = pszFolder; + m_strFilename = strID.Get(); + + const char * szFoldername = m_strFoldername.Get(); + const char * szFilename = m_strFilename.Get(); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vOutput(3, "%s does not exist in OTLedger::Load%s:\n%s%s%s\n", pszType, + pszType, m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + return false; + } + + // -------------------------------------------------------------------- + + // Try to load the ledger from disk. + else if (false == LoadContract()) + { + OTLog::vError("Failed loading %s in OTLedger::Load%s:\n%s%s%s\n", + pszType, pszType, m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + return false; + } + else + { + OTLog::vOutput(2, "Successfully loaded %s in OTLedger::Load%s:\n%s%s%s\n", + pszType, pszType, m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + } + + return true; +} + + + +// the below four functions (load/save in/outbox) assume that the ID is already set +// properly. +// Then it uses the ID to form the path for the file that is opened. Easy, right? + +bool OTLedger::LoadInbox() +{ + return LoadGeneric(OTLedger::inbox); +} + +//TODO really should verify the ServerID after loading the ledger. +// Perhaps just call "VerifyContract" and we'll make sure, for ledgers +// VerifyContract is overriden and explicitly checks the serverID. +// Should also check the Type at the same time. + +bool OTLedger::LoadOutbox() +{ + return LoadGeneric(OTLedger::outbox); +} + +bool OTLedger::LoadNymbox() +{ + return LoadGeneric(OTLedger::nymbox); +} + + +bool OTLedger::SaveGeneric(OTLedger::ledgerType theType) +{ + OTString strID; + GetIdentifier(strID); + + const char * pszFolder = NULL; + const char * pszType = GetTypeString(); + + switch (theType) + { + case OTLedger::inbox: + pszFolder = OTLog::InboxFolder(); + break; + case OTLedger::outbox: + pszFolder = OTLog::OutboxFolder(); + break; + case OTLedger::nymbox: + pszFolder = OTLog::NymboxFolder(); + break; + default: + return false; + } + // ------------------------------------- + + m_strFoldername = pszFolder; + m_strFilename = strID.Get(); + + OT_ASSERT(m_strFoldername.GetLength() > 2); + OT_ASSERT(m_strFilename.GetLength() > 2); + + if (false == SaveContract(pszFolder, strID.Get())) + { + OTLog::vError("Error saving %s in OTLedger::Save%s: %s%s%s\n", + pszType, pszType, m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + return false; + } + else + { + OTLog::vOutput(2, "Successfully saved %s: %s%s%s\n", pszType, + m_strFoldername.Get(), OTLog::PathSeparator(), m_strFilename.Get()); + } + + return true; +} + + +// If you're going to save this, make sure you sign it first. +bool OTLedger::SaveInbox() +{ + if (m_Type != OTLedger::inbox) + { + OTLog::Error("Wrong ledger type passed to OTLedger::SaveInbox.\n"); + return false; + } + + return SaveGeneric(m_Type); +} + + +// If you're going to save this, make sure you sign it first. +bool OTLedger::SaveOutbox() +{ + if (m_Type != OTLedger::outbox) + { + OTLog::Error("Wrong ledger type passed to OTLedger::SaveOutbox.\n"); + return false; + } + + return SaveGeneric(m_Type); +} + +// If you're going to save this, make sure you sign it first. +bool OTLedger::SaveNymbox() +{ + if (m_Type != OTLedger::nymbox) + { + OTLog::Error("Wrong ledger type passed to OTLedger::SaveNymbox.\n"); + return false; + } + + return SaveGeneric(m_Type); +} + + +OTLedger * OTLedger::GenerateLedger(const OTIdentifier & theUserID, const OTIdentifier & theAcctID, // AcctID should be "OwnerID" since could be acct OR Nym (with nymbox) + const OTIdentifier & theServerID, + const ledgerType theType, bool bCreateFile/*=false*/) +{ + OTLedger * pLedger = new OTLedger(theUserID, theAcctID, theServerID); + + OT_ASSERT(NULL != pLedger); + + pLedger->GenerateLedger(theAcctID, theServerID, theType, bCreateFile); + pLedger->SetUserID(theUserID); + + return pLedger; +} + +bool OTLedger::GenerateLedger(const OTIdentifier & theAcctID, + const OTIdentifier & theServerID, const ledgerType theType, + bool bCreateFile/*=false*/) +{ + // First we set the "Safe" ID and try to load the file, to make sure it doesn't already exist. + OTString strID(theAcctID); + + switch (theType) { + case OTLedger::nymbox: + m_strFoldername = OTLog::NymboxFolder(); + m_strFilename = strID.Get(); + break; + case OTLedger::inbox: + m_strFoldername = OTLog::InboxFolder(); + m_strFilename = strID.Get(); + break; + case OTLedger::outbox: + m_strFoldername = OTLog::OutboxFolder(); + m_strFilename = strID.Get(); + break; + case OTLedger::message: + OTLog::Output(4, "Generating message ledger...\n"); + SetRealAccountID(theAcctID); + SetPurportedAccountID(theAcctID); // It's safe to set these the same here, since we're creating the ledger now. + SetRealServerID(theServerID); + SetPurportedServerID(theServerID); // Always want the server ID on anything that the server signs. + m_Type = theType; + return true; + default: + OT_ASSERT_MSG(false, "OTLedger::GenerateLedger: GenerateLedger is only for message, inbox, outbox, and nymbox ledgers.\n"); + return false; // this return is unecessary because of the assert. But I like having it anyway. + } + + m_Type = theType; // Todo make this Get/Set methods + + SetRealAccountID(theAcctID); // set this before calling LoadContract... (In this case, will just be the Nym ID as well...) + SetRealServerID(theServerID); // (Ledgers/transactions/items were originally meant just for account-related functions.) + + if (bCreateFile) + { + // -------------------------------------------------------------------- + const char * szFoldername = m_strFoldername.Get(); + const char * szFilename = m_strFilename.Get(); + + if (OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vOutput(0, "ERROR: trying to generate ledger that already exists: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + + // Okay, it doesn't already exist. Let's generate it. + OTLog::vOutput(0, "Generating %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + } + + if (OTLedger::nymbox != theType) + { + // Have to look up the UserID here. No way around it. + // Plus it helps verify things. + OTAccount * pAccount = OTAccount::LoadExistingAccount(theAcctID, theServerID); + OTCleanup theAccountGuardian(pAccount); // No worries about having to clean it up. + + if (pAccount) + SetUserID(pAccount->GetUserID()); + } + else + { + SetUserID(theAcctID); // In the case of nymbox, the acct ID IS the user ID. (Should change it to "owner ID" to make it sound right either way.) + } + + + // Notice I still don't actually create the file here. The programmer still has to call + // "SaveInbox" or "SaveOutbox" to actually save the file. But he cannot do that unless he + // generates it first here, and the "bCreateFile" parameter insures that he isn't overwriting + // one that is already there (even if we don't actually save the file in this function.) + SetPurportedAccountID(theAcctID); + SetPurportedServerID(theServerID); + + return true; +} + + + + + +void OTLedger::InitLedger() +{ + m_strContractType = "LEDGER"; // CONTRACT, MESSAGE, TRANSACTION, LEDGER, TRANSACTION ITEM + + // This is the default type for a ledger. + // Inboxes and Outboxes are generated with the right type, with files. + // Until the GenerateLedger function is called, message is the default type. + m_Type = OTLedger::message; +} + + +// ID refers to account ID. +// Since a ledger is normally used as an inbox for a specific account, in a specific file, +// then I've decided to restrict ledgers to a single account. +OTLedger::OTLedger(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID) +: OTTransactionType(theUserID, theAccountID, theServerID), m_Type(OTLedger::message) +{ + InitLedger(); +} + +// ONLY call this if you need to load a ledger where you don't already know the person's UserID +// For example, if you need to load someone ELSE's inbox in order to send them a transfer, then +// you only know their account number, not their user ID. So you call this function to get it +// loaded up, and the UserID will hopefully be loaded up with the rest of it. +OTLedger::OTLedger(const OTIdentifier & theAccountID, const OTIdentifier & theServerID) +: OTTransactionType(), m_Type(OTLedger::message) +{ + InitLedger(); + + SetRealAccountID(theAccountID); + SetRealServerID(theServerID); +} + +// This is private now and hopefully will stay that way. +OTLedger::OTLedger() : OTTransactionType(), m_Type(OTLedger::message) +{ + InitLedger(); +} +// ------------------------------------------------------- + + + +mapOfTransactions & OTLedger::GetTransactionMap() +{ + return m_mapTransactions; +} + +/// If transaction #87, in reference to #74, is in the inbox, you can remove it +/// by calling this function and passing in 87. +/// +bool OTLedger::RemoveTransaction(long lTransactionNum) // if false, transaction wasn't found. +{ + // See if there's something there with that transaction number. + mapOfTransactions::iterator it = m_mapTransactions.find(lTransactionNum); + + // If it's not already on the list, then there's nothing to remove. + if ( it == m_mapTransactions.end() ) + { + OTLog::vError("Attempt to remove Transaction from ledger, when not already there: %ld\n", + lTransactionNum); + return false; + } + // Otherwise, if it WAS already there, remove it properly. + else + { + OTTransaction * pTransaction = (*it).second; + + OT_ASSERT(NULL != pTransaction); + + m_mapTransactions.erase(it); + delete pTransaction; + return true; + } + + return false; +} + +/// If transaction #87, in reference to #74, is in the inbox, you can remove it +/// by calling this function and passing in 74. +/// +bool OTLedger::RemovePendingTransaction(long lTransactionNum) // if false, transaction wasn't found. +{ + // loop through the items that make up this transaction. + OTTransaction * pTransaction = NULL; + + mapOfTransactions::iterator it; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + it = ii; + + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + bool bCorrectType = false; + + switch (pTransaction->GetType()) + { + case OTTransaction::pending: + case OTTransaction::transferReceipt: + case OTTransaction::chequeReceipt: + bCorrectType = true; + break; + default: + break; + } + + if (bCorrectType && pTransaction->GetReferenceToNum() == lTransactionNum) + break; + else + pTransaction = NULL; + + } + + // If it's not already on the list, then there's nothing to remove. + if ( NULL == pTransaction ) + { + OTLog::vError("OTLedger::RemovePendingTransaction: Attempt to remove Transaction from ledger,\n" + "when not already there: (the number in reference to) %ld\n", + lTransactionNum); + return false; + } + // Otherwise, if it WAS already there, remove it properly. + else + { + m_mapTransactions.erase(it); + delete pTransaction; + return true; + } + + return false; +} + +bool OTLedger::AddTransaction(OTTransaction & theTransaction) +{ + // See if there's something else already there with the same transaction number. + mapOfTransactions::iterator it = m_mapTransactions.find(theTransaction.GetTransactionNum()); + + // If it's not already on the list, then add it... + if ( it == m_mapTransactions.end() ) + { + m_mapTransactions[theTransaction.GetTransactionNum()] = &theTransaction; + return true; + } + // Otherwise, if it was already there, log an error. + else + { + OTLog::vError("Attempt to add Transaction to ledger when already there for that number: %ld\n", + theTransaction.GetTransactionNum()); + } + + return false; +} + + + + +// While processing a transaction, you may wish to query it for items of a certain type. +OTTransaction * OTLedger::GetTransaction(const OTTransaction::transactionType theType) +{ + // loop through the items that make up this transaction + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + OTTransaction * pTransaction = (*ii).second; + OT_ASSERT(NULL != pTransaction); + + if (theType == pTransaction->GetType()) + return pTransaction; + } + + return NULL; +} + + + +// Look up a transaction by transaction number and see if it is in the ledger. +// If it is, return a pointer to it, otherwise return NULL. +OTTransaction * OTLedger::GetTransaction(long lTransactionNum) +{ + // loop through the items that make up this transaction + +// OTLog::vError("OTLedger::GetTransaction: Checking ledger for trans %ld. COUNT: %d \n", lTransactionNum, GetTransactionCount()); + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + OTTransaction * pTransaction = (*ii).second; + OT_ASSERT(NULL != pTransaction); + +// OTLog::vError("OTLedger::GetTransaction: Looping. Currently on trans %ld \n", pTransaction->GetTransactionNum()); + + if (pTransaction->GetTransactionNum() == lTransactionNum) + { +// OTLog::vOutput(5, "OTLedger::GetTransaction: Returning transaction# %ld \n", lTransactionNum); + + return pTransaction; + } +// else // this was for debugging only. It's actually normal for non-matching numbers to be on this list. +// OTLog::vOutput(5"Expected transaction number %ld, but found %ld on the list instead. Bad data?\n", +// lTransactionNum, pTransaction->GetTransactionNum()); + } + +// OTLog::Error("OTLedger::GetTransaction: Returning NULL \n"); + + return NULL; +} + + + +// Return a count of all the transactions in this ledger that are IN REFERENCE TO a specific trans#. +// +// Might want to change this so that it only counts ACCEPTED receipts. +// +int OTLedger::GetTransactionCountInRefTo(const long lReferenceNum) +{ + int nCount = 0; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + OTTransaction * pTransaction = (*ii).second; + OT_ASSERT(NULL != pTransaction); + + if (pTransaction->GetReferenceToNum() == lReferenceNum) + nCount++; + } + + return nCount; +} + + + + +// Look up a transaction by transaction number and see if it is in the ledger. +// If it is, return a pointer to it, otherwise return NULL. +OTTransaction * OTLedger::GetTransactionByIndex(int nIndex) +{ + // Out of bounds. + if ((nIndex < 0) || (nIndex >= GetTransactionCount())) + return NULL; + + int nIndexCount = -1; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + nIndexCount++; // On first iteration, this is now 0, same as nIndex. + OTTransaction * pTransaction = (*ii).second; + OT_ASSERT((NULL != pTransaction)); // Should always be good. + + // If this transaction is the one at the requested index + if (nIndexCount == nIndex) + return pTransaction; + } + + return NULL; // Should never reach this point, since bounds are checked at the top. +} + + + + +// If you TRANSFER REQUEST to me (transaction #1), then the server will create a +// PENDING transaction in my inbox (transaction #41) and a PENDING transaction in +// your outbox (also transaction #41) which both contain a copy of transaction#1 in their +// "In Reference To" ascii-armored field. +// +// The above function would look up #41 in my inbox, or #41 in your outbox, but +// you could NOT pass #1 to that function and get a pointer back. You'd get NULL. +// But the below function specifically returns the pointer of a transaction ONLY +// IF THE "IN REFERENCE TO" Transaction ID matches the one passed in (such as #1 +// in the example above. +// If it can't find anything, it will return NULL. +OTTransaction * OTLedger::GetPendingTransaction(long lTransactionNum) +{ + // loop through the items that make up this transaction. + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + if (pTransaction->GetReferenceToNum() == lTransactionNum) + return pTransaction; + } + + return NULL; +} + +// Find the finalReceipt in this Inbox, that has lTransactionNum as its "in reference to". +// This is useful for cases where a marketReceipt or paymentReceipt has been found, +// yet the transaction # for that receipt isn't on my issued list... it's been closed. +// Normally this would be a problem: why is it in my inbox then? Because those receipts +// are still valid as long as there is a "FINAL RECEIPT" in the same inbox, that references +// the same original transaction that they do. The below function makes it easy to find that +// final receipt, if it exists. +// +OTTransaction * OTLedger::GetFinalReceipt(long lReferenceNum) +{ + // loop through the items that make up this transaction. + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + if (OTTransaction::finalReceipt != pTransaction->GetType()) // <======= + continue; + // --------------------------------- + if (pTransaction->GetReferenceToNum() == lReferenceNum) + return pTransaction; + } + + return NULL; +} + +// If my outbox has a pending transfer, #1901, referencing 1884, and then the +// recipient accepts it with his #781, referencing 1884, then it will pop into my inbox +// as a transfer receipt, #1902 (say) and referencing 781. Attached to that +// transfer receipt is a copy of the actual #781, which is in reference to 1884. +// +// Why does this matter? Because when I am verifying a balance agreement, and an +// outbox item 1901/1884 is missing, that means there is probably a corresponding +// transferReceipt in the Inbox. In that case, I START with #1901 referencing 1884 (from +// the outbox) and I need to FIND #1902, in reference to 781, referencing 1884 in the inbox. +// +// Therefore, loop through all items and filter by transfer receipt. For each, load its +// Reference string (containing the acceptPending) and get ITS ReferenceNum() to compare +// to the one passed in. +// +// Therefore 1884 would be passed in, and the appropriate transferReceipt will be returned. +// +OTTransaction * OTLedger::GetTransferReceipt(long lTransactionNum) +{ + // loop through the items that make up this transaction. + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + if (OTTransaction::transferReceipt == pTransaction->GetType()) + { + OTString strReference; + pTransaction->GetReferenceString(strReference); + + OTItem * pOriginalItem = OTItem::CreateItemFromString(strReference, + pTransaction->GetPurportedServerID(), + pTransaction->GetReferenceToNum()); + OT_ASSERT(NULL != pOriginalItem); + OTCleanup theItemAngel(*pOriginalItem); + + if (pOriginalItem->GetType() != OTItem::acceptPending) + { + OTLog::Error("OTLedger::GetTransferReceipt: Wrong item type attached to transferReceipt!\n"); + return NULL; + } + else + { + if (pOriginalItem->GetReferenceToNum() == lTransactionNum) + return pTransaction; // FOUND IT! + } + } + } + + return NULL; +} + + +/// Only if it is an inbox, a ledger will loop through the transactions +/// and produce the XML output for the report that's necessary during +/// a balance agreement. (Any balance agreement for an account must +/// include the list of transactions the nym has issued for use, as +/// well as a listing of the transactions in the inbox for that account. +/// This function does that last part :) +/// +/// returns a new balance statement item containing the inbox report +/// CALLER IS RESPONSIBLE TO DELETE. +OTItem * OTLedger::GenerateBalanceStatement(const long lAdjustment, const OTTransaction & theOwner, + OTPseudonym & theNym, const OTAccount & theAccount, OTLedger & theOutbox) +{ + if (OTLedger::inbox != GetType()) + { + OTLog::Error("OTLedger::GenerateBalanceStatement: Wrong ledger type.\n"); + return NULL; + } + + // ------------------------------------------------------ + + const OTIdentifier theNymID(theNym); + + if ( + (theAccount.GetPurportedAccountID() != GetPurportedAccountID()) || + (theAccount.GetPurportedServerID() != GetPurportedServerID()) || + (theAccount.GetUserID() != GetUserID()) ) + { + OTLog::Error("Wrong Account passed in to OTLedger::GenerateBalanceStatement.\n"); + return NULL; + } + if ( + (theOutbox.GetPurportedAccountID() != GetPurportedAccountID()) || + (theOutbox.GetPurportedServerID() != GetPurportedServerID()) || + (theOutbox.GetUserID() != GetUserID()) ) + { + OTLog::Error("Wrong Outbox passed in to OTLedger::GenerateBalanceStatement.\n"); + return NULL; + } + if ( + (theNymID != GetUserID())) + { + OTLog::Error("Wrong Nym passed in to OTLedger::GenerateBalanceStatement.\n"); + return NULL; + } + // --------------------------------------------------------- + + // theOwner is the withdrawal, or deposit, or whatever, that wants to change + // the account balance, and thus that needs a new balance agreement signed. + // + OTItem * pBalanceItem = OTItem::CreateItemFromTransaction(theOwner, OTItem::balanceStatement); // <=== balanceStatement type, with user ID, server ID, account ID, transaction ID. + + // The above has an ASSERT, so this this will never actually happen. + if (NULL == pBalanceItem) + return NULL; + + // --------------------------------------------------------- + + // COPY THE ISSUED TRANSACTION NUMBERS FROM THE NYM to the MESSAGE NYM. + + OTPseudonym theMessageNym; + + theMessageNym.HarvestIssuedNumbers(this->GetPurportedServerID(), + theNym /*unused in this case, not saving to disk*/, theNym, false); // bSave = false; + + // ------------------------------------- + + + + switch (theOwner.GetType()) + { + // These five options will remove the transaction number from the issued list, SUCCESS OR FAIL. + // Server will expect the number to be missing from the list, in the case of these. + // Therefore I remove it here in order to generate a proper balance agreement, acceptable to the server. + case OTTransaction::processInbox: + case OTTransaction::deposit: + case OTTransaction::withdrawal: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + + theMessageNym.RemoveIssuedNum(theOwner.GetRealServerID(), theOwner.GetTransactionNum()); // a transaction number is being used, and REMOVED from my list of responsibility, + theMessageNym.RemoveTransactionNum(theOwner.GetRealServerID(), theOwner.GetTransactionNum()); // a transaction number is being used, and REMOVED from my list of available numbers. + break; + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + // Nothing removed here since the transaction is still in play. (Assuming success.) + // If the server replies with rejection for any of these three, then I can remove + // the transaction number from my list of issued/signed for. But if success, then I + // am responsible for the transaction number until I sign off on closing it. + // Since the Balance Statement ANTICIPATES SUCCESS, NOT FAILURE, it assumes the number + // to be "in play" here, and thus DOES NOT remove it (vs the cases above, which do.) + break; + default: + // Error + OTLog::vError("OTLedger::GenerateBalanceStatement: wrong owner transaction type: %s\n", + theOwner.GetTypeString()); + break; + } + + OTString strMessageNym(theMessageNym); // Okay now we have the transaction numbers in this MessageNym string. + + pBalanceItem->SetAttachment(strMessageNym); // <======== This is where the server will read the transaction numbers from (A nym in item.m_ascAttachment) + + // --------------------------------------------------------- + + long lCurrentBalance = theAccount.GetBalance(); + + pBalanceItem->SetAmount(lCurrentBalance + lAdjustment); // <==== Here's the new (predicted) balance for after the withdrawal is complete. (item.GetAmount) + + // --------------------------------------------------------- + // loop through the INBOX transactions, and produce a sub-item onto pBalanceItem for each, which will + // be a report on each transaction in this inbox, therefore added to the balance item. + // (So the balance item contains a complete report on the receipts in this inbox.) + OTTransaction * pTransaction = NULL; + + OTLog::Output(2, "About to loop through the inbox items and produce a report for each one...\n"); + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); + ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + OTLog::Output(2, "Producing a report...\n"); + + // it only reports receipts where we don't yet have balance agreement. +// pTransaction->ProduceInboxReportItem(*pBalanceItem, const_cast(theOwner)); + pTransaction->ProduceInboxReportItem(*pBalanceItem); // <======= This function adds a receipt sub-item to pBalanceItem, where appropriate for INBOX items. + // self note: I added the const_cast because the function needs to loop through it, even though it doesn't really change it + // (doesn't violate the const, just needs to perform a loop and the const screws with the loop.) + } + + // --------------------------------------------------------- + + theOutbox.ProduceOutboxReport(*pBalanceItem); // <======= This function adds receipt sub-items to pBalanceItem, where appropriate for the OUTBOX items. + + // --------------------------------------------------------- + + pBalanceItem->SignContract(theNym); // <=== Sign, save, and return. OTTransactionType needs to weasel in a "date signed" variable. + pBalanceItem->SaveContract(); + + return pBalanceItem; +} + + + + +// for inbox only, allows you to lookup the total value of pending transfers within the inbox. +// (And it really loads the items to check the amount, but does all this ONLY for pending transfers.) +// +long OTLedger::GetTotalPendingValue() +{ + long lTotalPendingValue = 0; + + if (OTLedger::inbox != GetType()) + { + OTLog::Error("OTLedger::GetTotalPendingValue: Wrong ledger type (expected inbox).\n"); + return 0; + } + + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); + ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + if (pTransaction->GetType() == OTTransaction::pending) + lTotalPendingValue += pTransaction->GetReceiptAmount(); // this actually loads up the original item and reads the amount. + } + + return lTotalPendingValue; +} + + + +// Called by the above function. +// This ledger is an outbox, and it is creating a report of itself, +// adding each report item to this balance item. +// DO NOT call this, it's meant to be used only by above function. +void OTLedger::ProduceOutboxReport(OTItem & theBalanceItem) +{ + if (OTLedger::outbox != GetType()) + { + OTLog::Error("OTLedger::ProduceOutboxReport: Wrong ledger type.\n"); + return; + } + + // loop through the OUTBOX transactions, and produce a sub-item onto theBalanceItem for each, which will + // be a report on each pending transfer in this outbox, therefore added to the balance item. + // (So the balance item contains a complete report on the outoing transfers in this outbox.) + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); + ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + // it only reports receipts where we don't yet have balance agreement. + pTransaction->ProduceOutboxReportItem(theBalanceItem); // <======= This function adds a pending transfer sub-item to theBalanceItem, where appropriate. + } + + // --------------------------------------------------------- +} + + + +// SignContract will call this function at the right time. +void OTLedger::UpdateContents() // Before transmission or serialization, this is where the ledger saves its contents +{ + // Notice I use the PURPORTED Account ID and Server ID to create the output. That's because + // I don't want to inadvertantly substitute the real ID for a bad one and then sign it. + // So if there's a bad one in there when I read it, THAT's the one that I write as well! + OTString strType(GetTypeString()), + strLedgerAcctID(GetPurportedAccountID()), + strLedgerAcctServerID(GetPurportedServerID()), + strUserID(GetUserID()); + + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + // m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", m_strVersion.Get(), strType.Get(), + strLedgerAcctID.Get(), strUserID.Get(), strLedgerAcctServerID.Get()); + + // loop through the transactions and print them out here. + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); + ii != m_mapTransactions.end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT(NULL != pTransaction); + + OTString strTransaction; + pTransaction->SaveContract(strTransaction); + + OTASCIIArmor ascTransaction; + ascTransaction.SetString(strTransaction, true); // linebreaks = true + + m_xmlUnsigned.Concatenate("\n%s\n\n", ascTransaction.Get()); + } + + m_xmlUnsigned.Concatenate("\n"); +} + + +// LoadContract will call this function at the right time. +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTLedger::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + OTString strKeyName; + OTString strKeyValue; + + OTString strTransaction; + OTASCIIArmor ascTransaction; + + if (!strcmp("accountLedger", xml->getNodeName())) + { + OTString strType, strLedgerAcctID, strLedgerAcctServerID, strUserID; + + strType = xml->getAttributeValue("type"); + + if (strType.Compare("message")) + m_Type = OTLedger::message; + else if (strType.Compare("inbox")) + m_Type = OTLedger::inbox; + else if (strType.Compare("outbox")) + m_Type = OTLedger::outbox; + else if (strType.Compare("nymbox")) + m_Type = OTLedger::nymbox; + else + m_Type = OTLedger::error_state; + + m_strVersion = xml->getAttributeValue("version"); + strLedgerAcctID = xml->getAttributeValue("accountID"); + strLedgerAcctServerID = xml->getAttributeValue("serverID"); + strUserID = xml->getAttributeValue("userID"); + + OTIdentifier ACCOUNT_ID(strLedgerAcctID), SERVER_ID(strLedgerAcctServerID), USER_ID(strUserID); + + SetPurportedAccountID(ACCOUNT_ID); + SetPurportedServerID(SERVER_ID); + SetUserID(USER_ID); + + OTLog::vOutput(2, "Loaded account ledger of type \"%s\", version: %s\n", +// "accountID:\n%s\n userID:\n%s\n serverID:\n%s\n----------\n", + strType.Get(), + m_strVersion.Get() +// strLedgerAcctID.Get(), strUserID.Get(), strLedgerAcctServerID.Get() + ); + + // Since we just loaded this stuff, let's verify it. + // We may have to remove this verification here and do it outside this call. + // But for now... + if (VerifyContractID()) + return 1; + else { + return -1; + } + + } + else if (!strcmp("transaction", xml->getNodeName())) + { + // go to the next node and read the text. + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + // the ledger contains a series of transactions. + // Each transaction is initially stored as an OTASCIIArmor string. + ascTransaction.Set(xml->getNodeData()); // Put the ascii-armored node data into the ascii-armor object + ascTransaction.GetString(strTransaction); // Decode that into strTransaction, so we can load the transaction object from that string. + OTTransaction * pTransaction = new OTTransaction(GetUserID(), GetPurportedAccountID(), GetPurportedServerID()); + + // If we're able to successfully base64-decode the string and load it up as + // a transaction, then let's add it to the ledger's list of transactions + if (pTransaction && pTransaction->LoadContractFromString(strTransaction) + && pTransaction->VerifyContractID()) + // I responsible here to call pTransaction->VerifyContract() since + // I am loading it here and adding it to the ledger. (So I do.) + { + m_mapTransactions[pTransaction->GetTransactionNum()] = pTransaction; +// OTLog::Output(5, "Loaded transaction and adding to m_mapTransactions in OTLedger\n"); + } + else { + OTLog::Error("ERROR: loading transaction in OTLedger::ProcessXMLNode\n"); + if (pTransaction) + { + delete pTransaction; + pTransaction = NULL; + } + return (-1); + } + + } + else { + OTLog::Error("Error in OTLedger::ProcessXMLNode: transaction without value.\n"); + return (-1); // error condition + } + + return 1; + } + + return 0; +} + + +OTLedger::~OTLedger() +{ +// No need to call Release() here, it's called already by the framework. +} + + +void OTLedger::ReleaseTransactions() +{ + // If there were any dynamically allocated objects, clean them up here. + + while (!m_mapTransactions.empty()) + { + OTTransaction * pTransaction = m_mapTransactions.begin()->second; + m_mapTransactions.erase(m_mapTransactions.begin()); + delete pTransaction; + pTransaction = NULL; + } +} + +void OTLedger::Release() +{ + ReleaseTransactions(); + + OTTransactionType::Release(); // since I've overridden the base class, I call it now... +} + + +bool OTLedger::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTLedger.h b/OTLib/OTLedger.h new file mode 100644 index 000000000..0c4c66243 --- /dev/null +++ b/OTLib/OTLedger.h @@ -0,0 +1,265 @@ +/************************************************************* + * + * OTLedger.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTLEDGER_H__ +#define __OTLEDGER_H__ + +#include + +#include "OTTransactionType.h" +#include "OTTransaction.h" +#include "OTString.h" + +class OTAccount; +class OTMessage; + +// transaction ID is a long, assigned by the server. Each transaction has one. +// FIRST the server issues the ID. THEN we create the blank transaction object with the +// ID in it and store it in our inbox. THEN if we want to send a transaction, we use +// the blank to do so. If there is no blank available, we message the server and request one. + +typedef std::map mapOfTransactions; + + +// the "inbox" and "outbox" functionality is implemented in this class +// +class OTLedger : public OTTransactionType +{ + friend OTTransactionType * OTTransactionType::TransactionFactory(const OTString & strInput); + +private: + mapOfTransactions m_mapTransactions; // a ledger contains a map of transactions. + +protected: + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + OTLedger(); // Hopefully stays here. + +public: + + enum ledgerType { + message, // used in OTMessages, to send various lists of transactions back and forth. + inbox, // each asset account has an inbox, with pending transfers as well as receipts inside. + outbox, // if you SEND a pending transfer, it sits in your outbox until it's accepted, rejected, or canceled. + nymbox, // the nymbox is per user account (versus per asset account) and is used to receive new transaction numbers (and messages.) + error_state + }; + + ledgerType m_Type; + +protected: + bool LoadGeneric(ledgerType theType); + bool SaveGeneric(ledgerType theType); + +public: + inline ledgerType GetType() const { return m_Type; } + + + // This function assumes that this is an INBOX. + // If you don't use an INBOX to call this method, then it will return NULL immediately. + // If you DO use an inbox, then it will create a balanceStatement item to go onto your + // transaction. (Transactions require balance statements. And when you get the atBalanceStatement + // reply from the server, KEEP THAT RECEIPT. Well, OT will do that for you.) + // You only have to keep the latest receipt, unlike systems that don't store balance + // agreement. We also store a list of issued transactions, the new balance, and the outbox hash. + OTItem * GenerateBalanceStatement(const long lAdjustment, const OTTransaction & theOwner, + OTPseudonym & theNym, const OTAccount & theAccount, OTLedger & theOutbox); + + void ProduceOutboxReport(OTItem & theBalanceItem); + + bool AddTransaction(OTTransaction & theTransaction); + bool RemoveTransaction(long lTransactionNum); // if false, transaction wasn't found. + bool RemovePendingTransaction(long lTransactionNum); // if false, transaction wasn't found. + + OTTransaction * GetTransaction(const OTTransaction::transactionType theType); + OTTransaction * GetTransaction(long lTransactionNum); + OTTransaction * GetTransactionByIndex(int nIndex); + OTTransaction * GetPendingTransaction(long lTransactionNum); + OTTransaction * GetFinalReceipt(long lReferenceNum); + OTTransaction * GetTransferReceipt(long lTransactionNum); + + bool SaveInbox(); + bool LoadInbox(); + + bool SaveNymbox(); + bool LoadNymbox(); + + bool SaveOutbox(); + bool LoadOutbox(); + + mapOfTransactions & GetTransactionMap(); + + inline int GetTransactionCount() const { return m_mapTransactions.size(); } + int GetTransactionCountInRefTo(const long lReferenceNum); + + long GetTotalPendingValue(); // for inbox only, allows you to lookup the total value of pending transfers within. + + OTLedger(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + virtual ~OTLedger(); + + virtual void Release(); + + void ReleaseTransactions(); + + // ONLY call this if you need to load a ledger where you don't already know the person's UserID + // For example, if you need to load someone ELSE's inbox in order to send them a transfer, then + // you only know their account number, not their user ID. So you call this function to get it + // loaded up, and the UserID will hopefully be loaded up with the rest of it. + OTLedger(const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + + void InitLedger(); + + static OTLedger * GenerateLedger(const OTIdentifier & theUserID, const OTIdentifier & theAcctID, + const OTIdentifier & theServerID, + const ledgerType theType, bool bCreateFile=false); + + + bool GenerateLedger(const OTIdentifier & theAcctID, const OTIdentifier & theServerID, + const ledgerType theType, bool bCreateFile=false); + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); + + // -------------------------------------------------------------- + + static const char * _TypeStrings[]; // for translating transaction type into a string. + + static inline const char * _GetTypeString(ledgerType theType) + { int nType = (int)theType; return OTLedger::_TypeStrings[nType]; } + + inline const char * GetTypeString() { return OTLedger::_GetTypeString(m_Type); } + +}; + +#endif // __OTLEDGER_H__ diff --git a/OTLib/OTLib.cp b/OTLib/OTLib.cp new file mode 100644 index 000000000..613638f5b --- /dev/null +++ b/OTLib/OTLib.cp @@ -0,0 +1,101 @@ +/************************************************************************************ + * + * OTLib.cp + * + * Open Transactions: Library, Protocol, Server, and Test Client + * + * -- Anonymous Numbered Accounts + * -- Untraceable Digital Cash + * -- Triple-Signed Receipts + * -- Basket Currencies + * -- Signed XML Contracts + * + * Copyright (C) 2010 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * F3llowTraveler@gmail.com --- SEE PGP PUBLIC KEY IN CREDITS FILE. + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * WEBSITE: + * http://www.OpenTransactions.org + * + * OFFICIAL PROJECT WIKI: + * http://wiki.github.com/FellowTraveler/Open-Transactions/ + * + * ---------------------------------------------------------------- + * + * Open Transactions was written including these libraries: + * + * Lucre --- Copyright (C) 1999-2009 Ben Laurie. + * http://anoncvs.aldigital.co.uk/lucre/ + * irrXML --- Copyright (C) 2002-2005 Nikolaus Gebhardt + * http://irrlicht.sourceforge.net/author.html + * easyzlib --- Copyright (C) 2008 First Objective Software, Inc. + * Used with permission. http://www.firstobject.com/ + * PGP to OpenSSL --- Copyright (c) 2010 Mounir IDRASSI + * Used with permission. http://www.idrix.fr + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * ---------------------------------------------------------------- + * + * Open Transactions links to these libraries: + * + * OpenSSL --- (Version 1.0.0a at time of writing.) + * http://openssl.org/about/ + * zlib --- Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * ---------------------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * If you would like to use this software outside of the free software + * license, please contact FellowTraveler. + * + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. + * The Laurie requirements are light, but if there is any problem with his + * license, simply remove the Lucre code. Although there are no other blind + * token algorithms in Open Transactions (yet), the other functionality will + * continue to operate . + * + * OpenSSL WAIVER: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. + * + * DISCLAIMER: + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + ************************************************************************************/ + + + +#include +#include "OTLib.h" +#include "OTLibPriv.h" + +void OTLib::HelloWorld(const char * s) +{ + OTLibPriv *theObj = new OTLibPriv; + theObj->HelloWorldPriv(s); + delete theObj; +}; + +void OTLibPriv::HelloWorldPriv(const char * s) +{ + std::cout << s << std::endl; +}; + diff --git a/OTLib/OTLib.h b/OTLib/OTLib.h new file mode 100644 index 000000000..877c0134b --- /dev/null +++ b/OTLib/OTLib.h @@ -0,0 +1,145 @@ +/************************************************************* + * + * OTLib.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef OTLib_ +#define OTLib_ + +/* The classes below are exported */ +#pragma GCC visibility push(default) + +class OTLib +{ + public: + void HelloWorld(const char *); +}; + +#pragma GCC visibility pop +#endif diff --git a/OTLib/OTLib.xcodeproj/project.pbxproj b/OTLib/OTLib.xcodeproj/project.pbxproj new file mode 100644 index 000000000..894b50952 --- /dev/null +++ b/OTLib/OTLib.xcodeproj/project.pbxproj @@ -0,0 +1,619 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 50149BDA09E781A5002DEE6A /* OTLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 50149BD909E781A5002DEE6A /* OTLib.h */; }; + 5073E0CB09E734E500EC74B6 /* OTLib.cp in Sources */ = {isa = PBXBuildFile; fileRef = 5073E0C409E734A800EC74B6 /* OTLib.cp */; }; + 8306A36F11C202D200A8AFDC /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8306A36D11C202D100A8AFDC /* libcrypto.a */; }; + 8306A37011C202D200A8AFDC /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8306A36E11C202D200A8AFDC /* libssl.a */; }; + 8306A52D11C2627C00A8AFDC /* OTEnvelope.h in Headers */ = {isa = PBXBuildFile; fileRef = 8306A52B11C2627C00A8AFDC /* OTEnvelope.h */; }; + 8306A52E11C2627C00A8AFDC /* OTEnvelope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8306A52C11C2627C00A8AFDC /* OTEnvelope.cpp */; }; + 8339D9F611DD3A8F007BED46 /* easyzlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 8339D9F411DD3A8F007BED46 /* easyzlib.c */; }; + 8339D9F711DD3A8F007BED46 /* easyzlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 8339D9F511DD3A8F007BED46 /* easyzlib.h */; }; + 8377234D1216B401003712F8 /* OTSignedFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8377234B1216B401003712F8 /* OTSignedFile.h */; }; + 8377234E1216B401003712F8 /* OTSignedFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8377234C1216B401003712F8 /* OTSignedFile.cpp */; }; + 837ECC781255C0B900EC4855 /* OTTrackable.h in Headers */ = {isa = PBXBuildFile; fileRef = 837ECC761255C0B900EC4855 /* OTTrackable.h */; }; + 837ECC791255C0B900EC4855 /* OTTrackable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 837ECC771255C0B900EC4855 /* OTTrackable.cpp */; }; + 839228B011B46C8300AF54AF /* OTASCIIArmor.h in Headers */ = {isa = PBXBuildFile; fileRef = 839228AE11B46C8300AF54AF /* OTASCIIArmor.h */; }; + 839228B111B46C8300AF54AF /* OTSignature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 839228AF11B46C8300AF54AF /* OTSignature.cpp */; }; + 83922B3F11B5DABE00AF54AF /* OTASCIIArmor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83922B3D11B5DABE00AF54AF /* OTASCIIArmor.cpp */; }; + 83922B4011B5DABE00AF54AF /* OTSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = 83922B3E11B5DABE00AF54AF /* OTSignature.h */; }; + 83922BFC11B6559D00AF54AF /* OTIdentifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83922BFA11B6559D00AF54AF /* OTIdentifier.cpp */; }; + 83922BFD11B6559D00AF54AF /* OTIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 83922BFB11B6559D00AF54AF /* OTIdentifier.h */; }; + 83922D2211B79A7C00AF54AF /* OTAsymmetricKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 83922D2011B79A7C00AF54AF /* OTAsymmetricKey.h */; }; + 83922D2311B79A7C00AF54AF /* OTAsymmetricKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83922D2111B79A7C00AF54AF /* OTAsymmetricKey.cpp */; }; + 8392315B11B9B02500AF54AF /* irrXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392315211B9B02500AF54AF /* irrXML.cpp */; }; + 8392317311B9B08100AF54AF /* OTStringXML.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392317111B9B08100AF54AF /* OTStringXML.cpp */; }; + 8392317411B9B08100AF54AF /* OTStringXML.h in Headers */ = {isa = PBXBuildFile; fileRef = 8392317211B9B08100AF54AF /* OTStringXML.h */; }; + 8392317B11B9B0B200AF54AF /* OTContract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392317911B9B0B200AF54AF /* OTContract.cpp */; }; + 8392317C11B9B0B200AF54AF /* OTContract.h in Headers */ = {isa = PBXBuildFile; fileRef = 8392317A11B9B0B200AF54AF /* OTContract.h */; }; + 8392318A11B9B10900AF54AF /* OTPseudonym.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392318811B9B10900AF54AF /* OTPseudonym.cpp */; }; + 8392318B11B9B10900AF54AF /* OTPseudonym.h in Headers */ = {isa = PBXBuildFile; fileRef = 8392318911B9B10900AF54AF /* OTPseudonym.h */; }; + 8392319D11B9B40300AF54AF /* OTMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8392319B11B9B40300AF54AF /* OTMessage.h */; }; + 8392319E11B9B40300AF54AF /* OTMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392319C11B9B40300AF54AF /* OTMessage.cpp */; }; + 839231A311B9B50A00AF54AF /* OTAssetContract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392319F11B9B50A00AF54AF /* OTAssetContract.cpp */; }; + 839231A411B9B50A00AF54AF /* OTAssetContract.h in Headers */ = {isa = PBXBuildFile; fileRef = 839231A011B9B50A00AF54AF /* OTAssetContract.h */; }; + 839231A511B9B50A00AF54AF /* OTServerContract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 839231A111B9B50A00AF54AF /* OTServerContract.cpp */; }; + 839231A611B9B50A00AF54AF /* OTServerContract.h in Headers */ = {isa = PBXBuildFile; fileRef = 839231A211B9B50A00AF54AF /* OTServerContract.h */; }; + 8392393F11BC5ED100AF54AF /* OTAccount.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392393D11BC5ED100AF54AF /* OTAccount.cpp */; }; + 8392394011BC5ED100AF54AF /* OTAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = 8392393E11BC5ED100AF54AF /* OTAccount.h */; }; + 83A158AA11B0B86E00B05397 /* OTData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A158A911B0B86E00B05397 /* OTData.cpp */; }; + 83A158AE11B0B87C00B05397 /* OTData.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A158AD11B0B87C00B05397 /* OTData.h */; }; + 83A158B211B0B88300B05397 /* OTDataCheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A158B111B0B88300B05397 /* OTDataCheck.cpp */; }; + 83A158B411B0B88700B05397 /* OTDataCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A158B311B0B88700B05397 /* OTDataCheck.h */; }; + 83A158B811B0B89300B05397 /* OTglobal.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A158B711B0B89300B05397 /* OTglobal.h */; }; + 83A158BC11B0B8A100B05397 /* OTString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A158BB11B0B8A100B05397 /* OTString.cpp */; }; + 83A158C011B0B8A700B05397 /* OTString.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A158BF11B0B8A700B05397 /* OTString.h */; }; + 83A7D1281245E83F00DE6C1B /* OTAgreement.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D1261245E83F00DE6C1B /* OTAgreement.h */; }; + 83A7D1291245E83F00DE6C1B /* OTAgreement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D1271245E83F00DE6C1B /* OTAgreement.cpp */; }; + 83A7D12E1245E85D00DE6C1B /* OTCron.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D12C1245E85D00DE6C1B /* OTCron.h */; }; + 83A7D12F1245E85D00DE6C1B /* OTCron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D12D1245E85D00DE6C1B /* OTCron.cpp */; }; + 83A7D1341245E88600DE6C1B /* OTCronItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D1321245E88600DE6C1B /* OTCronItem.h */; }; + 83A7D1351245E88600DE6C1B /* OTCronItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D1331245E88600DE6C1B /* OTCronItem.cpp */; }; + 83A7D13A1245E8B000DE6C1B /* OTTrade.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D1381245E8B000DE6C1B /* OTTrade.h */; }; + 83A7D13B1245E8B000DE6C1B /* OTTrade.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D1391245E8B000DE6C1B /* OTTrade.cpp */; }; + 83A7D1401245E8CD00DE6C1B /* OTOffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D13E1245E8CD00DE6C1B /* OTOffer.h */; }; + 83A7D1411245E8CD00DE6C1B /* OTOffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D13F1245E8CD00DE6C1B /* OTOffer.cpp */; }; + 83A7D1461245E8DD00DE6C1B /* OTMarket.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D1441245E8DD00DE6C1B /* OTMarket.h */; }; + 83A7D1471245E8DD00DE6C1B /* OTMarket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D1451245E8DD00DE6C1B /* OTMarket.cpp */; }; + 83A7D1631246C8A600DE6C1B /* OTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A7D1611246C8A600DE6C1B /* OTLog.h */; }; + 83A7D1641246C8A600DE6C1B /* OTLog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A7D1621246C8A600DE6C1B /* OTLog.cpp */; }; + 83AC18D5120D5E8400C5A816 /* OTInstrument.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AC18D3120D5E8400C5A816 /* OTInstrument.h */; }; + 83AC18D6120D5E8400C5A816 /* OTInstrument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AC18D4120D5E8400C5A816 /* OTInstrument.cpp */; }; + 83AC18DB120D5E9D00C5A816 /* OTCheque.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AC18D9120D5E9D00C5A816 /* OTCheque.h */; }; + 83AC18DC120D5E9D00C5A816 /* OTCheque.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AC18DA120D5E9D00C5A816 /* OTCheque.cpp */; }; + 83BF03B311CDDB6D00372F8D /* OTTransactionType.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BF03B111CDDB6D00372F8D /* OTTransactionType.h */; }; + 83BF03B411CDDB6D00372F8D /* OTTransactionType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BF03B211CDDB6D00372F8D /* OTTransactionType.cpp */; }; + 83BF07B011CF6C2400372F8D /* OTToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BF07AE11CF6C2400372F8D /* OTToken.h */; }; + 83BF07B111CF6C2400372F8D /* OTToken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BF07AF11CF6C2400372F8D /* OTToken.cpp */; }; + 83BF07BD11D1D0CF00372F8D /* OTMint.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BF07BB11D1D0CF00372F8D /* OTMint.h */; }; + 83BF07BE11D1D0CF00372F8D /* OTMint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BF07BC11D1D0CF00372F8D /* OTMint.cpp */; }; + 83BF098911D37AE100372F8D /* OTBasket.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BF098711D37AE100372F8D /* OTBasket.h */; }; + 83BF098A11D37AE100372F8D /* OTBasket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BF098811D37AE100372F8D /* OTBasket.cpp */; }; + 83BF09C011D4988600372F8D /* OTPurse.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BF09BE11D4988600372F8D /* OTPurse.h */; }; + 83BF09C111D4988600372F8D /* OTPurse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BF09BF11D4988600372F8D /* OTPurse.cpp */; }; + 83BFFA8711C83A0B00372F8D /* OTTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BFFA8511C83A0B00372F8D /* OTTransaction.h */; }; + 83BFFA8811C83A0B00372F8D /* OTTransaction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BFFA8611C83A0B00372F8D /* OTTransaction.cpp */; }; + 83BFFA8D11C83A2A00372F8D /* OTLedger.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BFFA8B11C83A2A00372F8D /* OTLedger.h */; }; + 83BFFA8E11C83A2A00372F8D /* OTLedger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BFFA8C11C83A2A00372F8D /* OTLedger.cpp */; }; + 83BFFA9811C854B100372F8D /* OTItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BFFA9611C854B100372F8D /* OTItem.h */; }; + 83BFFA9911C854B100372F8D /* OTItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BFFA9711C854B100372F8D /* OTItem.cpp */; }; + 83C092A011B0C1B700FDCACD /* OTPayload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0929E11B0C1B700FDCACD /* OTPayload.cpp */; }; + 83C092A111B0C1B700FDCACD /* OTPayload.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C0929F11B0C1B700FDCACD /* OTPayload.h */; }; + 83C0955F11B238BC00FDCACD /* bank-new.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0953D11B238BB00FDCACD /* bank-new.cpp */; }; + 83C0956111B238BC00FDCACD /* bank-sign.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0954011B238BB00FDCACD /* bank-sign.cpp */; }; + 83C0956311B238BC00FDCACD /* bank-verify.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0954311B238BB00FDCACD /* bank-verify.cpp */; }; + 83C0956811B238BC00FDCACD /* bankimp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0954B11B238BC00FDCACD /* bankimp.cpp */; }; + 83C0956E11B238BC00FDCACD /* coin-request.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0955511B238BC00FDCACD /* coin-request.cpp */; }; + 83C0957011B238BC00FDCACD /* coin-unblind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C0955811B238BC00FDCACD /* coin-unblind.cpp */; }; + 83C5F4B8122E0CBC00964E36 /* OTMessageBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C5F4B6122E0CBC00964E36 /* OTMessageBuffer.cpp */; }; + 83C5F4B9122E0CBC00964E36 /* OTMessageBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C5F4B7122E0CBC00964E36 /* OTMessageBuffer.h */; }; + 83E162E91256F9C3005CE14B /* OTPaymentPlan.h in Headers */ = {isa = PBXBuildFile; fileRef = 83E162E71256F9C3005CE14B /* OTPaymentPlan.h */; }; + 83E162EA1256F9C3005CE14B /* OTPaymentPlan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83E162E81256F9C3005CE14B /* OTPaymentPlan.cpp */; }; + 83E651D4122E32B200320598 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 83E651D3122E32B200320598 /* Makefile */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 32BAE0B70371A74B00C91783 /* OTLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTLib_Prefix.pch; sourceTree = ""; }; + 50149BD909E781A5002DEE6A /* OTLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTLib.h; sourceTree = ""; }; + 5073E0C409E734A800EC74B6 /* OTLib.cp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = OTLib.cp; sourceTree = ""; }; + 5073E0C609E734A800EC74B6 /* OTLibProj.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = OTLibProj.xcconfig; sourceTree = ""; }; + 5073E0C709E734A800EC74B6 /* OTLibTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = OTLibTarget.xcconfig; sourceTree = ""; }; + 50B2938909F016FC00694E55 /* OTLibPriv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTLibPriv.h; sourceTree = ""; }; + 8306A36D11C202D100A8AFDC /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcrypto.a; sourceTree = ""; }; + 8306A36E11C202D200A8AFDC /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libssl.a; sourceTree = ""; }; + 8306A52B11C2627C00A8AFDC /* OTEnvelope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTEnvelope.h; sourceTree = ""; }; + 8306A52C11C2627C00A8AFDC /* OTEnvelope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTEnvelope.cpp; sourceTree = ""; }; + 8339D9F411DD3A8F007BED46 /* easyzlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = easyzlib.c; sourceTree = ""; }; + 8339D9F511DD3A8F007BED46 /* easyzlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = easyzlib.h; sourceTree = ""; }; + 8377234B1216B401003712F8 /* OTSignedFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTSignedFile.h; sourceTree = ""; }; + 8377234C1216B401003712F8 /* OTSignedFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTSignedFile.cpp; sourceTree = ""; }; + 837ECC761255C0B900EC4855 /* OTTrackable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTTrackable.h; sourceTree = ""; }; + 837ECC771255C0B900EC4855 /* OTTrackable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTTrackable.cpp; sourceTree = ""; }; + 839228AE11B46C8300AF54AF /* OTASCIIArmor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTASCIIArmor.h; sourceTree = ""; }; + 839228AF11B46C8300AF54AF /* OTSignature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTSignature.cpp; sourceTree = ""; }; + 83922B3D11B5DABE00AF54AF /* OTASCIIArmor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTASCIIArmor.cpp; sourceTree = ""; }; + 83922B3E11B5DABE00AF54AF /* OTSignature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTSignature.h; sourceTree = ""; }; + 83922BFA11B6559D00AF54AF /* OTIdentifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTIdentifier.cpp; sourceTree = ""; }; + 83922BFB11B6559D00AF54AF /* OTIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTIdentifier.h; sourceTree = ""; }; + 83922D2011B79A7C00AF54AF /* OTAsymmetricKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTAsymmetricKey.h; sourceTree = ""; }; + 83922D2111B79A7C00AF54AF /* OTAsymmetricKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTAsymmetricKey.cpp; sourceTree = ""; }; + 8392314C11B9B02500AF54AF /* CXMLReaderImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXMLReaderImpl.h; sourceTree = ""; }; + 8392314D11B9B02500AF54AF /* fast_atof.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fast_atof.h; sourceTree = ""; }; + 8392314E11B9B02500AF54AF /* heapsort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = heapsort.h; sourceTree = ""; }; + 8392314F11B9B02500AF54AF /* irrArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irrArray.h; sourceTree = ""; }; + 8392315011B9B02500AF54AF /* irrString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irrString.h; sourceTree = ""; }; + 8392315111B9B02500AF54AF /* irrTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irrTypes.h; sourceTree = ""; }; + 8392315211B9B02500AF54AF /* irrXML.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = irrXML.cpp; sourceTree = ""; }; + 8392315311B9B02500AF54AF /* irrXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irrXML.h; sourceTree = ""; }; + 8392317111B9B08100AF54AF /* OTStringXML.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTStringXML.cpp; sourceTree = ""; }; + 8392317211B9B08100AF54AF /* OTStringXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTStringXML.h; sourceTree = ""; }; + 8392317911B9B0B200AF54AF /* OTContract.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTContract.cpp; sourceTree = ""; }; + 8392317A11B9B0B200AF54AF /* OTContract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTContract.h; sourceTree = ""; }; + 8392318811B9B10900AF54AF /* OTPseudonym.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTPseudonym.cpp; sourceTree = ""; }; + 8392318911B9B10900AF54AF /* OTPseudonym.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTPseudonym.h; sourceTree = ""; }; + 8392319B11B9B40300AF54AF /* OTMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTMessage.h; sourceTree = ""; }; + 8392319C11B9B40300AF54AF /* OTMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTMessage.cpp; sourceTree = ""; }; + 8392319F11B9B50A00AF54AF /* OTAssetContract.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTAssetContract.cpp; sourceTree = ""; }; + 839231A011B9B50A00AF54AF /* OTAssetContract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTAssetContract.h; sourceTree = ""; }; + 839231A111B9B50A00AF54AF /* OTServerContract.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTServerContract.cpp; sourceTree = ""; }; + 839231A211B9B50A00AF54AF /* OTServerContract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTServerContract.h; sourceTree = ""; }; + 8392393D11BC5ED100AF54AF /* OTAccount.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTAccount.cpp; sourceTree = ""; }; + 8392393E11BC5ED100AF54AF /* OTAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTAccount.h; sourceTree = ""; }; + 83A158A911B0B86E00B05397 /* OTData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTData.cpp; sourceTree = ""; }; + 83A158AD11B0B87C00B05397 /* OTData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTData.h; sourceTree = ""; }; + 83A158B111B0B88300B05397 /* OTDataCheck.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTDataCheck.cpp; sourceTree = ""; }; + 83A158B311B0B88700B05397 /* OTDataCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTDataCheck.h; sourceTree = ""; }; + 83A158B711B0B89300B05397 /* OTglobal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTglobal.h; sourceTree = ""; }; + 83A158BB11B0B8A100B05397 /* OTString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTString.cpp; sourceTree = ""; }; + 83A158BF11B0B8A700B05397 /* OTString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTString.h; sourceTree = ""; }; + 83A7D1261245E83F00DE6C1B /* OTAgreement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTAgreement.h; sourceTree = ""; }; + 83A7D1271245E83F00DE6C1B /* OTAgreement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTAgreement.cpp; sourceTree = ""; }; + 83A7D12C1245E85D00DE6C1B /* OTCron.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTCron.h; sourceTree = ""; }; + 83A7D12D1245E85D00DE6C1B /* OTCron.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTCron.cpp; sourceTree = ""; }; + 83A7D1321245E88600DE6C1B /* OTCronItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTCronItem.h; sourceTree = ""; }; + 83A7D1331245E88600DE6C1B /* OTCronItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTCronItem.cpp; sourceTree = ""; }; + 83A7D1381245E8B000DE6C1B /* OTTrade.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTTrade.h; sourceTree = ""; }; + 83A7D1391245E8B000DE6C1B /* OTTrade.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTTrade.cpp; sourceTree = ""; }; + 83A7D13E1245E8CD00DE6C1B /* OTOffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTOffer.h; sourceTree = ""; }; + 83A7D13F1245E8CD00DE6C1B /* OTOffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTOffer.cpp; sourceTree = ""; }; + 83A7D1441245E8DD00DE6C1B /* OTMarket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTMarket.h; sourceTree = ""; }; + 83A7D1451245E8DD00DE6C1B /* OTMarket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTMarket.cpp; sourceTree = ""; }; + 83A7D1611246C8A600DE6C1B /* OTLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTLog.h; sourceTree = ""; }; + 83A7D1621246C8A600DE6C1B /* OTLog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTLog.cpp; sourceTree = ""; }; + 83AC18D3120D5E8400C5A816 /* OTInstrument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTInstrument.h; sourceTree = ""; }; + 83AC18D4120D5E8400C5A816 /* OTInstrument.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTInstrument.cpp; sourceTree = ""; }; + 83AC18D9120D5E9D00C5A816 /* OTCheque.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTCheque.h; sourceTree = ""; }; + 83AC18DA120D5E9D00C5A816 /* OTCheque.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTCheque.cpp; sourceTree = ""; }; + 83BF03B111CDDB6D00372F8D /* OTTransactionType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTTransactionType.h; sourceTree = ""; }; + 83BF03B211CDDB6D00372F8D /* OTTransactionType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTTransactionType.cpp; sourceTree = ""; }; + 83BF07AE11CF6C2400372F8D /* OTToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTToken.h; sourceTree = ""; }; + 83BF07AF11CF6C2400372F8D /* OTToken.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTToken.cpp; sourceTree = ""; }; + 83BF07BB11D1D0CF00372F8D /* OTMint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTMint.h; sourceTree = ""; }; + 83BF07BC11D1D0CF00372F8D /* OTMint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTMint.cpp; sourceTree = ""; }; + 83BF098711D37AE100372F8D /* OTBasket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTBasket.h; sourceTree = ""; }; + 83BF098811D37AE100372F8D /* OTBasket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTBasket.cpp; sourceTree = ""; }; + 83BF09BE11D4988600372F8D /* OTPurse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTPurse.h; sourceTree = ""; }; + 83BF09BF11D4988600372F8D /* OTPurse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTPurse.cpp; sourceTree = ""; }; + 83BFFA8511C83A0B00372F8D /* OTTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTTransaction.h; sourceTree = ""; }; + 83BFFA8611C83A0B00372F8D /* OTTransaction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTTransaction.cpp; sourceTree = ""; }; + 83BFFA8B11C83A2A00372F8D /* OTLedger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTLedger.h; sourceTree = ""; }; + 83BFFA8C11C83A2A00372F8D /* OTLedger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTLedger.cpp; sourceTree = ""; }; + 83BFFA9611C854B100372F8D /* OTItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTItem.h; sourceTree = ""; }; + 83BFFA9711C854B100372F8D /* OTItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTItem.cpp; sourceTree = ""; }; + 83C0929E11B0C1B700FDCACD /* OTPayload.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTPayload.cpp; sourceTree = ""; }; + 83C0929F11B0C1B700FDCACD /* OTPayload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTPayload.h; sourceTree = ""; }; + 83C0953D11B238BB00FDCACD /* bank-new.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "bank-new.cpp"; sourceTree = ""; }; + 83C0954011B238BB00FDCACD /* bank-sign.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "bank-sign.cpp"; sourceTree = ""; }; + 83C0954311B238BB00FDCACD /* bank-verify.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "bank-verify.cpp"; sourceTree = ""; }; + 83C0954511B238BB00FDCACD /* bank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bank.h; sourceTree = ""; }; + 83C0954B11B238BC00FDCACD /* bankimp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bankimp.cpp; sourceTree = ""; }; + 83C0955511B238BC00FDCACD /* coin-request.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "coin-request.cpp"; sourceTree = ""; }; + 83C0955811B238BC00FDCACD /* coin-unblind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "coin-unblind.cpp"; sourceTree = ""; }; + 83C5F4B6122E0CBC00964E36 /* OTMessageBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTMessageBuffer.cpp; sourceTree = ""; }; + 83C5F4B7122E0CBC00964E36 /* OTMessageBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTMessageBuffer.h; sourceTree = ""; }; + 83E162E71256F9C3005CE14B /* OTPaymentPlan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTPaymentPlan.h; sourceTree = ""; }; + 83E162E81256F9C3005CE14B /* OTPaymentPlan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTPaymentPlan.cpp; sourceTree = ""; }; + 83E651D3122E32B200320598 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + D2AAC09D05546B4700DB518D /* libOTLib.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libOTLib.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D2AAC09B05546B4700DB518D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8306A36F11C202D200A8AFDC /* libcrypto.a in Frameworks */, + 8306A37011C202D200A8AFDC /* libssl.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC09D05546B4700DB518D /* libOTLib.dylib */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* OTLib */ = { + isa = PBXGroup; + children = ( + 83E651D3122E32B200320598 /* Makefile */, + 8306A36D11C202D100A8AFDC /* libcrypto.a */, + 8306A36E11C202D200A8AFDC /* libssl.a */, + 8392314B11B9B02500AF54AF /* irrxml */, + 83C0953811B238BB00FDCACD /* Lucre */, + 5073E0CA09E734BC00EC74B6 /* Configuration Files */, + 08FB77ACFE841707C02AAC07 /* Source */, + 8339D9F411DD3A8F007BED46 /* easyzlib.c */, + 8339D9F511DD3A8F007BED46 /* easyzlib.h */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = OTLib; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 83A7D1441245E8DD00DE6C1B /* OTMarket.h */, + 83A7D1451245E8DD00DE6C1B /* OTMarket.cpp */, + 83A7D13E1245E8CD00DE6C1B /* OTOffer.h */, + 83A7D13F1245E8CD00DE6C1B /* OTOffer.cpp */, + 83A7D1381245E8B000DE6C1B /* OTTrade.h */, + 83A7D1391245E8B000DE6C1B /* OTTrade.cpp */, + 83E162E71256F9C3005CE14B /* OTPaymentPlan.h */, + 83E162E81256F9C3005CE14B /* OTPaymentPlan.cpp */, + 83A7D1261245E83F00DE6C1B /* OTAgreement.h */, + 83A7D1271245E83F00DE6C1B /* OTAgreement.cpp */, + 83A7D1321245E88600DE6C1B /* OTCronItem.h */, + 83A7D1331245E88600DE6C1B /* OTCronItem.cpp */, + 837ECC761255C0B900EC4855 /* OTTrackable.h */, + 837ECC771255C0B900EC4855 /* OTTrackable.cpp */, + 83A7D12C1245E85D00DE6C1B /* OTCron.h */, + 83A7D12D1245E85D00DE6C1B /* OTCron.cpp */, + 83A7D1611246C8A600DE6C1B /* OTLog.h */, + 83A7D1621246C8A600DE6C1B /* OTLog.cpp */, + 8377234B1216B401003712F8 /* OTSignedFile.h */, + 8377234C1216B401003712F8 /* OTSignedFile.cpp */, + 83AC18D3120D5E8400C5A816 /* OTInstrument.h */, + 83AC18D4120D5E8400C5A816 /* OTInstrument.cpp */, + 83AC18D9120D5E9D00C5A816 /* OTCheque.h */, + 83AC18DA120D5E9D00C5A816 /* OTCheque.cpp */, + 83BF09BE11D4988600372F8D /* OTPurse.h */, + 83BF09BF11D4988600372F8D /* OTPurse.cpp */, + 83BF07AE11CF6C2400372F8D /* OTToken.h */, + 83BF07AF11CF6C2400372F8D /* OTToken.cpp */, + 83BF07BB11D1D0CF00372F8D /* OTMint.h */, + 83BF07BC11D1D0CF00372F8D /* OTMint.cpp */, + 83BF03B111CDDB6D00372F8D /* OTTransactionType.h */, + 83BF03B211CDDB6D00372F8D /* OTTransactionType.cpp */, + 83BFFA9611C854B100372F8D /* OTItem.h */, + 83BFFA9711C854B100372F8D /* OTItem.cpp */, + 83BF098711D37AE100372F8D /* OTBasket.h */, + 83BF098811D37AE100372F8D /* OTBasket.cpp */, + 83BFFA8511C83A0B00372F8D /* OTTransaction.h */, + 83BFFA8611C83A0B00372F8D /* OTTransaction.cpp */, + 83BFFA8B11C83A2A00372F8D /* OTLedger.h */, + 83BFFA8C11C83A2A00372F8D /* OTLedger.cpp */, + 8392393E11BC5ED100AF54AF /* OTAccount.h */, + 8392393D11BC5ED100AF54AF /* OTAccount.cpp */, + 8306A52B11C2627C00A8AFDC /* OTEnvelope.h */, + 8306A52C11C2627C00A8AFDC /* OTEnvelope.cpp */, + 839231A011B9B50A00AF54AF /* OTAssetContract.h */, + 8392319F11B9B50A00AF54AF /* OTAssetContract.cpp */, + 839231A111B9B50A00AF54AF /* OTServerContract.cpp */, + 839231A211B9B50A00AF54AF /* OTServerContract.h */, + 83C0929F11B0C1B700FDCACD /* OTPayload.h */, + 83C0929E11B0C1B700FDCACD /* OTPayload.cpp */, + 8392319B11B9B40300AF54AF /* OTMessage.h */, + 8392319C11B9B40300AF54AF /* OTMessage.cpp */, + 83C5F4B7122E0CBC00964E36 /* OTMessageBuffer.h */, + 83C5F4B6122E0CBC00964E36 /* OTMessageBuffer.cpp */, + 8392317A11B9B0B200AF54AF /* OTContract.h */, + 8392317911B9B0B200AF54AF /* OTContract.cpp */, + 8392318911B9B10900AF54AF /* OTPseudonym.h */, + 8392318811B9B10900AF54AF /* OTPseudonym.cpp */, + 8392317211B9B08100AF54AF /* OTStringXML.h */, + 8392317111B9B08100AF54AF /* OTStringXML.cpp */, + 83922BFB11B6559D00AF54AF /* OTIdentifier.h */, + 83922BFA11B6559D00AF54AF /* OTIdentifier.cpp */, + 83922D2011B79A7C00AF54AF /* OTAsymmetricKey.h */, + 83922D2111B79A7C00AF54AF /* OTAsymmetricKey.cpp */, + 839228AE11B46C8300AF54AF /* OTASCIIArmor.h */, + 83922B3D11B5DABE00AF54AF /* OTASCIIArmor.cpp */, + 83922B3E11B5DABE00AF54AF /* OTSignature.h */, + 839228AF11B46C8300AF54AF /* OTSignature.cpp */, + 83A158AD11B0B87C00B05397 /* OTData.h */, + 83A158A911B0B86E00B05397 /* OTData.cpp */, + 83A158B111B0B88300B05397 /* OTDataCheck.cpp */, + 83A158B311B0B88700B05397 /* OTDataCheck.h */, + 83A158BF11B0B8A700B05397 /* OTString.h */, + 83A158BB11B0B8A100B05397 /* OTString.cpp */, + 32BAE0B70371A74B00C91783 /* OTLib_Prefix.pch */, + 50149BD909E781A5002DEE6A /* OTLib.h */, + 50B2938909F016FC00694E55 /* OTLibPriv.h */, + 5073E0C409E734A800EC74B6 /* OTLib.cp */, + 83A158B711B0B89300B05397 /* OTglobal.h */, + ); + name = Source; + sourceTree = ""; + }; + 5073E0CA09E734BC00EC74B6 /* Configuration Files */ = { + isa = PBXGroup; + children = ( + 5073E0C609E734A800EC74B6 /* OTLibProj.xcconfig */, + 5073E0C709E734A800EC74B6 /* OTLibTarget.xcconfig */, + ); + name = "Configuration Files"; + sourceTree = ""; + }; + 8392314B11B9B02500AF54AF /* irrxml */ = { + isa = PBXGroup; + children = ( + 8392314C11B9B02500AF54AF /* CXMLReaderImpl.h */, + 8392314D11B9B02500AF54AF /* fast_atof.h */, + 8392314E11B9B02500AF54AF /* heapsort.h */, + 8392314F11B9B02500AF54AF /* irrArray.h */, + 8392315011B9B02500AF54AF /* irrString.h */, + 8392315111B9B02500AF54AF /* irrTypes.h */, + 8392315211B9B02500AF54AF /* irrXML.cpp */, + 8392315311B9B02500AF54AF /* irrXML.h */, + ); + path = irrxml; + sourceTree = ""; + }; + 83C0953811B238BB00FDCACD /* Lucre */ = { + isa = PBXGroup; + children = ( + 83C0953D11B238BB00FDCACD /* bank-new.cpp */, + 83C0955511B238BC00FDCACD /* coin-request.cpp */, + 83C0954011B238BB00FDCACD /* bank-sign.cpp */, + 83C0955811B238BC00FDCACD /* coin-unblind.cpp */, + 83C0954311B238BB00FDCACD /* bank-verify.cpp */, + 83C0954511B238BB00FDCACD /* bank.h */, + 83C0954B11B238BC00FDCACD /* bankimp.cpp */, + ); + path = Lucre; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC09905546B4700DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 50149BDA09E781A5002DEE6A /* OTLib.h in Headers */, + 83A158AE11B0B87C00B05397 /* OTData.h in Headers */, + 83A158B411B0B88700B05397 /* OTDataCheck.h in Headers */, + 83A158B811B0B89300B05397 /* OTglobal.h in Headers */, + 83A158C011B0B8A700B05397 /* OTString.h in Headers */, + 83C092A111B0C1B700FDCACD /* OTPayload.h in Headers */, + 839228B011B46C8300AF54AF /* OTASCIIArmor.h in Headers */, + 83922B4011B5DABE00AF54AF /* OTSignature.h in Headers */, + 83922BFD11B6559D00AF54AF /* OTIdentifier.h in Headers */, + 83922D2211B79A7C00AF54AF /* OTAsymmetricKey.h in Headers */, + 8392317411B9B08100AF54AF /* OTStringXML.h in Headers */, + 8392317C11B9B0B200AF54AF /* OTContract.h in Headers */, + 8392318B11B9B10900AF54AF /* OTPseudonym.h in Headers */, + 8392319D11B9B40300AF54AF /* OTMessage.h in Headers */, + 839231A411B9B50A00AF54AF /* OTAssetContract.h in Headers */, + 839231A611B9B50A00AF54AF /* OTServerContract.h in Headers */, + 8392394011BC5ED100AF54AF /* OTAccount.h in Headers */, + 8306A52D11C2627C00A8AFDC /* OTEnvelope.h in Headers */, + 83BFFA8711C83A0B00372F8D /* OTTransaction.h in Headers */, + 83BFFA8D11C83A2A00372F8D /* OTLedger.h in Headers */, + 83BFFA9811C854B100372F8D /* OTItem.h in Headers */, + 83BF03B311CDDB6D00372F8D /* OTTransactionType.h in Headers */, + 83BF07B011CF6C2400372F8D /* OTToken.h in Headers */, + 83BF07BD11D1D0CF00372F8D /* OTMint.h in Headers */, + 83BF098911D37AE100372F8D /* OTBasket.h in Headers */, + 83BF09C011D4988600372F8D /* OTPurse.h in Headers */, + 8339D9F711DD3A8F007BED46 /* easyzlib.h in Headers */, + 83AC18D5120D5E8400C5A816 /* OTInstrument.h in Headers */, + 83AC18DB120D5E9D00C5A816 /* OTCheque.h in Headers */, + 8377234D1216B401003712F8 /* OTSignedFile.h in Headers */, + 83C5F4B9122E0CBC00964E36 /* OTMessageBuffer.h in Headers */, + 83A7D1281245E83F00DE6C1B /* OTAgreement.h in Headers */, + 83A7D12E1245E85D00DE6C1B /* OTCron.h in Headers */, + 83A7D1341245E88600DE6C1B /* OTCronItem.h in Headers */, + 83A7D13A1245E8B000DE6C1B /* OTTrade.h in Headers */, + 83A7D1401245E8CD00DE6C1B /* OTOffer.h in Headers */, + 83A7D1461245E8DD00DE6C1B /* OTMarket.h in Headers */, + 83A7D1631246C8A600DE6C1B /* OTLog.h in Headers */, + 837ECC781255C0B900EC4855 /* OTTrackable.h in Headers */, + 83E162E91256F9C3005CE14B /* OTPaymentPlan.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC09C05546B4700DB518D /* OTLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB916008733D950010E9CD /* Build configuration list for PBXNativeTarget "OTLib" */; + buildPhases = ( + D2AAC09905546B4700DB518D /* Headers */, + D2AAC09B05546B4700DB518D /* Frameworks */, + D2AAC09A05546B4700DB518D /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OTLib; + productName = libOTLib; + productReference = D2AAC09D05546B4700DB518D /* libOTLib.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB916408733D950010E9CD /* Build configuration list for PBXProject "OTLib" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* OTLib */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC09C05546B4700DB518D /* OTLib */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC09A05546B4700DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5073E0CB09E734E500EC74B6 /* OTLib.cp in Sources */, + 83A158AA11B0B86E00B05397 /* OTData.cpp in Sources */, + 83A158B211B0B88300B05397 /* OTDataCheck.cpp in Sources */, + 83A158BC11B0B8A100B05397 /* OTString.cpp in Sources */, + 83C092A011B0C1B700FDCACD /* OTPayload.cpp in Sources */, + 83C0955F11B238BC00FDCACD /* bank-new.cpp in Sources */, + 83C0956111B238BC00FDCACD /* bank-sign.cpp in Sources */, + 83C0956311B238BC00FDCACD /* bank-verify.cpp in Sources */, + 83C0956811B238BC00FDCACD /* bankimp.cpp in Sources */, + 83C0956E11B238BC00FDCACD /* coin-request.cpp in Sources */, + 83C0957011B238BC00FDCACD /* coin-unblind.cpp in Sources */, + 839228B111B46C8300AF54AF /* OTSignature.cpp in Sources */, + 83922B3F11B5DABE00AF54AF /* OTASCIIArmor.cpp in Sources */, + 83922BFC11B6559D00AF54AF /* OTIdentifier.cpp in Sources */, + 83922D2311B79A7C00AF54AF /* OTAsymmetricKey.cpp in Sources */, + 8392315B11B9B02500AF54AF /* irrXML.cpp in Sources */, + 8392317311B9B08100AF54AF /* OTStringXML.cpp in Sources */, + 8392317B11B9B0B200AF54AF /* OTContract.cpp in Sources */, + 8392318A11B9B10900AF54AF /* OTPseudonym.cpp in Sources */, + 8392319E11B9B40300AF54AF /* OTMessage.cpp in Sources */, + 839231A311B9B50A00AF54AF /* OTAssetContract.cpp in Sources */, + 839231A511B9B50A00AF54AF /* OTServerContract.cpp in Sources */, + 8392393F11BC5ED100AF54AF /* OTAccount.cpp in Sources */, + 8306A52E11C2627C00A8AFDC /* OTEnvelope.cpp in Sources */, + 83BFFA8811C83A0B00372F8D /* OTTransaction.cpp in Sources */, + 83BFFA8E11C83A2A00372F8D /* OTLedger.cpp in Sources */, + 83BFFA9911C854B100372F8D /* OTItem.cpp in Sources */, + 83BF03B411CDDB6D00372F8D /* OTTransactionType.cpp in Sources */, + 83BF07B111CF6C2400372F8D /* OTToken.cpp in Sources */, + 83BF07BE11D1D0CF00372F8D /* OTMint.cpp in Sources */, + 83BF098A11D37AE100372F8D /* OTBasket.cpp in Sources */, + 83BF09C111D4988600372F8D /* OTPurse.cpp in Sources */, + 8339D9F611DD3A8F007BED46 /* easyzlib.c in Sources */, + 83AC18D6120D5E8400C5A816 /* OTInstrument.cpp in Sources */, + 83AC18DC120D5E9D00C5A816 /* OTCheque.cpp in Sources */, + 8377234E1216B401003712F8 /* OTSignedFile.cpp in Sources */, + 83C5F4B8122E0CBC00964E36 /* OTMessageBuffer.cpp in Sources */, + 83E651D4122E32B200320598 /* Makefile in Sources */, + 83A7D1291245E83F00DE6C1B /* OTAgreement.cpp in Sources */, + 83A7D12F1245E85D00DE6C1B /* OTCron.cpp in Sources */, + 83A7D1351245E88600DE6C1B /* OTCronItem.cpp in Sources */, + 83A7D13B1245E8B000DE6C1B /* OTTrade.cpp in Sources */, + 83A7D1411245E8CD00DE6C1B /* OTOffer.cpp in Sources */, + 83A7D1471245E8DD00DE6C1B /* OTMarket.cpp in Sources */, + 83A7D1641246C8A600DE6C1B /* OTLog.cpp in Sources */, + 837ECC791255C0B900EC4855 /* OTTrackable.cpp in Sources */, + 83E162EA1256F9C3005CE14B /* OTPaymentPlan.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB916108733D950010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5073E0C709E734A800EC74B6 /* OTLibTarget.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = OTLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_GLIBCXX_DEBUG=1", + "_GLIBCXX_DEBUG_PEDANTIC=1", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + }; + name = Debug; + }; + 1DEB916208733D950010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5073E0C709E734A800EC74B6 /* OTLibTarget.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = OTLib_Prefix.pch; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + STRIP_INSTALLED_PRODUCT = YES; + STRIP_STYLE = "non-global"; + }; + name = Release; + }; + 1DEB916508733D950010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5073E0C609E734A800EC74B6 /* OTLibProj.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ""; + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "\"/usr/local/ssl/include/openssl\" /usr/include/ \"/Users/REDACTED/Projects/Open-Transactions/\""; + }; + name = Debug; + }; + 1DEB916608733D950010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5073E0C609E734A800EC74B6 /* OTLibProj.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + OTHER_LDFLAGS = ""; + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "/usr/include/ \"/Users/REDACTED/Projects/Open-Transactions/\""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB916008733D950010E9CD /* Build configuration list for PBXNativeTarget "OTLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB916108733D950010E9CD /* Debug */, + 1DEB916208733D950010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB916408733D950010E9CD /* Build configuration list for PBXProject "OTLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB916508733D950010E9CD /* Debug */, + 1DEB916608733D950010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/OTLib/OTLib/OTLib.vcxproj b/OTLib/OTLib/OTLib.vcxproj new file mode 100644 index 000000000..a7f97aff6 --- /dev/null +++ b/OTLib/OTLib/OTLib.vcxproj @@ -0,0 +1,265 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + TCP Debug + Win32 + + + TCP Release + Win32 + + + + {726DCDCE-002E-47FD-87A6-557EF9BFB5D2} + Win32Proj + OTLib + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + C:\~\protobuf\src;C:\~\msgpack\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib\irrxml;C:\~\Open-Transactions\OTLib\bigint;C:\~\Open-Transactions\OTLib\Lucre;$(IncludePath) + C:\~\protobuf\vsprojects\Debug;C:\~\msgpack\lib;$(LibraryPath) + + + C:\~\protobuf\src;C:\~\msgpack\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib\irrxml;C:\~\Open-Transactions\OTLib\bigint;C:\~\Open-Transactions\OTLib\Lucre;$(IncludePath) + C:\~\protobuf\vsprojects\Debug;C:\~\msgpack\lib;$(LibraryPath) + + + C:\~\protobuf\src;C:\~\msgpack\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib\bigint;C:\~\Open-Transactions\OTLib\irrxml;C:\~\Open-Transactions\OTLib\Lucre;$(IncludePath) + C:\~\protobuf\vsprojects\Release;C:\~\msgpack\lib;$(LibraryPath) + + + C:\~\protobuf\src;C:\~\msgpack\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib\bigint;C:\~\Open-Transactions\OTLib\irrxml;C:\~\Open-Transactions\OTLib\Lucre;$(IncludePath) + C:\~\protobuf\vsprojects\Release;C:\~\msgpack\lib;$(LibraryPath) + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/OTLib/OTLib/stdafx.cpp b/OTLib/OTLib/stdafx.cpp new file mode 100755 index 000000000..6f2cdc89b --- /dev/null +++ b/OTLib/OTLib/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// OTLib.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/OTLib/OTLib/stdafx.h b/OTLib/OTLib/stdafx.h new file mode 100755 index 000000000..fe36448a4 --- /dev/null +++ b/OTLib/OTLib/stdafx.h @@ -0,0 +1,13 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + + +// TODO: reference additional headers your program requires here diff --git a/OTLib/OTLib/targetver.h b/OTLib/OTLib/targetver.h new file mode 100755 index 000000000..90e767bfc --- /dev/null +++ b/OTLib/OTLib/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/OTLib/OTLibPriv.h b/OTLib/OTLibPriv.h new file mode 100644 index 000000000..42107cc18 --- /dev/null +++ b/OTLib/OTLibPriv.h @@ -0,0 +1,142 @@ +/************************************************************* + * + * OTLibPriv.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +/* The classes below are not exported */ +#pragma GCC visibility push(hidden) + +class OTLibPriv +{ + public: + void HelloWorldPriv(const char *); +}; + +#pragma GCC visibility pop diff --git a/OTLib/OTLibProj.xcconfig b/OTLib/OTLibProj.xcconfig new file mode 100644 index 000000000..363b2d1dc --- /dev/null +++ b/OTLib/OTLibProj.xcconfig @@ -0,0 +1,6 @@ + PREBINDING = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GCC_MODEL_TUNING = G5; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; diff --git a/OTLib/OTLibTarget.xcconfig b/OTLib/OTLibTarget.xcconfig new file mode 100644 index 000000000..04d1a3f95 --- /dev/null +++ b/OTLib/OTLibTarget.xcconfig @@ -0,0 +1,11 @@ + PRODUCT_NAME = libOTLib; + INSTALL_PATH = /usr/local/lib; + MACH_O_TYPE = mh_dylib; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = OTLib_Prefix.pch; + GCC_ENABLE_CPP_EXCEPTIONS = YES; + GCC_ENABLE_CPP_RTTI = YES; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = Dynamic; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; diff --git a/OTLib/OTLib_Prefix.pch b/OTLib/OTLib_Prefix.pch new file mode 100644 index 000000000..b5c4129c7 --- /dev/null +++ b/OTLib/OTLib_Prefix.pch @@ -0,0 +1,6 @@ +// +// Prefix header for all source files of the 'OTLib' target in the 'OTLib' project. +// + + +//#include diff --git a/OTLib/OTLog.cpp b/OTLib/OTLog.cpp new file mode 100644 index 000000000..2e532cc76 --- /dev/null +++ b/OTLib/OTLog.cpp @@ -0,0 +1,847 @@ +/******************************************************************* + * + * OTLog.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// The long-awaited logging class. + + +#include +#include +#include // The C one +#include +#include +#include +#include + +#include // The C++ one + + + +// Use Win or Posix +// IF I need this while porting, then uncomment it. +#ifdef _WIN32 +#include +//#else +//#ifndef POSIX +//#warning POSIX will be used (but you did not define it) +//#endif +//#include +#endif + + +extern "C" +{ + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +} + + + +#ifdef ANDROID +#include +#endif + + +#include "OTString.h" +#include "OTLog.h" + + + +// If it MUST output, set the verbosity to 0. Less important logs are +// at higher and higher levels. +// +// All are sent to stdout, but the 0 are the most important ones. +// By default, only those are actually logged. If you want to see the other messages, +// then set this log level to a higher value sometime when you start execution. +// (Or right here.) + +#if defined (DSP) +int OTLog::__CurrentLogLevel = 0; // If you build with DSP=1, it assumes a special location for OpenSSL, +#else // and it turns off all the output. +int OTLog::__CurrentLogLevel = 0; +#endif + + +// These are default values. There are configurable in the config file. +// +int OTLog::__latency_send_no_tries = 5; // Number of times will try to send a message. +int OTLog::__latency_receive_no_tries = 25; // Number of times will try to receive a reply. + +int OTLog::__latency_send_ms = 200; // number of ms to wait before retrying send. +int OTLog::__latency_receive_ms = 200; // number of ms to wait before retrying receive. + + +OTString OTLog::__Version = "0.72b"; + + + +// --------------------------------------------------------------------------------- +// This is the "global" path to the subdirectories. The wallet file is probably also there. +OTString OTLog::__OTPath("."); // it defaults to '.' but then it is set by the client and server. + +// All my paths now use the global path above, and are constructed using +// the path separator below. So the filesystem aspect of Open Transactions +// should be a LOT more portable to Windows, though I haven't actually tried +// it on Windows. +#ifdef _WIN32 +OTString OTLog::__OTPathSeparator = "\\"; +#else +OTString OTLog::__OTPathSeparator = "/"; +#endif + +// --------------------------------------------------------------------------------- + + +// Just a default value, since this is configurable programmatically. + + +OTString OTLog::__OTCronFolder = "cron"; +OTString OTLog::__OTNymFolder = "nyms"; +OTString OTLog::__OTAccountFolder = "accounts"; +OTString OTLog::__OTUserAcctFolder = "useraccounts"; +OTString OTLog::__OTReceiptFolder = "receipts"; +OTString OTLog::__OTNymboxFolder = "nymbox"; +OTString OTLog::__OTInboxFolder = "inbox"; +OTString OTLog::__OTOutboxFolder = "outbox"; +OTString OTLog::__OTCertFolder = "certs"; +OTString OTLog::__OTPubkeyFolder = "pubkeys"; +OTString OTLog::__OTContractFolder = "contracts"; +OTString OTLog::__OTMintFolder = "mints"; +OTString OTLog::__OTSpentFolder = "spent"; +OTString OTLog::__OTPurseFolder = "purse"; +OTString OTLog::__OTMarketFolder = "markets"; + +OTString OTLog::__OTLogfile; +// If Logfile uninitialized, we assume NO logfile, and we log to output. +// Otherwise, we append to the logfile, and leave output clear. + +// -------------------------------------------------- + +dequeOfStrings OTLog::__logDeque; // Stores the last 1024 logs in memory. + + +// static +// Changes ~/blah to /Users/au/blah +// +void OTLog::TransformFilePath(const char * szInput, OTString & strOutput) +{ + if (NULL == szInput) + return; + +#ifndef _WIN32 // if UNIX (NOT windows) + wordexp_t exp_result; + wordexp(szInput, &exp_result, 0); + + strOutput.Set(exp_result.we_wordv[0]); + + wordfree(&exp_result); +#else + strOutput.Set(szInput); +#endif +} + + + + +const char * OTLog::GetMemlogAtIndex(int nIndex) +{ + unsigned int uIndex = static_cast (nIndex); + + if ((uIndex < 0) || (uIndex >= __logDeque.size())) + { + OTLog::vError("OTLog::GetMemlogAtIndex: index out of bounds: %d\n", nIndex); + return NULL; + } + + OTString * pStr = __logDeque.at(uIndex); + + if ((NULL != pStr) && (pStr->Exists())) + return pStr->Get(); + + return NULL; +} + + +// -------------------------------------------------- +// We keep 1024 logs in memory, to make them available via the API. + +int OTLog::GetMemlogSize() +{ + return __logDeque.size(); +} + + +const char * OTLog::PeekMemlogFront() +{ + if (__logDeque.size() <= 0) + return NULL; + + OTString * pStr = __logDeque.front(); + + if ((NULL != pStr) && (pStr->Exists())) + return pStr->Get(); + + return NULL; +} + + +const char * OTLog::PeekMemlogBack() +{ + if (__logDeque.size() <= 0) + return NULL; + + OTString * pStr = __logDeque.back(); + + if ((NULL != pStr) && (pStr->Exists())) + return pStr->Get(); + + return NULL; +} + + +bool OTLog::PopMemlogFront() +{ + if (__logDeque.size() <= 0) + return false; + + OTString * pStr = __logDeque.front(); + + if (NULL != pStr) + { + delete pStr; + pStr = NULL; + } + + __logDeque.pop_front(); + + return true; +} + + +bool OTLog::PopMemlogBack() +{ + if (__logDeque.size() <= 0) + return false; + + OTString * pStr = __logDeque.back(); + + if (NULL != pStr) + { + delete pStr; + pStr = NULL; + } + + __logDeque.pop_back(); + + return true; +} + + +bool OTLog::PushMemlogFront(const char * szLog) +{ + OT_ASSERT(NULL != szLog); + + OTString * pStr = new OTString(szLog); + + OT_ASSERT(NULL != pStr); + + __logDeque.push_front(pStr); + + if (__logDeque.size() > 1024) // todo: stop hardcoding. + { + OTLog::PopMemlogBack(); // We start removing from the back when it reaches this size. + } + + return true; +} + +bool OTLog::PushMemlogBack(const char * szLog) +{ + OT_ASSERT(NULL != szLog); + + OTString * pStr = new OTString(szLog); + + OT_ASSERT(NULL != pStr); + + __logDeque.push_back(pStr); + + return true; +} + + +// -------------------------------------------------- + + +/* + void sleep( unsigned int in_mseconds ) + { + + } + + + void ssleep( unsigned int in_seconds ) + { + } + */ + + + +// --------------------------------------------------------------------------------- + +void OTLog::SleepSeconds(long lSeconds) +{ +#ifdef _WIN32 + Sleep(1000 * lSeconds); +#else + sleep(lSeconds); +#endif +} + + +void OTLog::SleepMilliseconds(long lMilliseconds) +{ +#ifdef _WIN32 + Sleep( lMilliseconds ); +#else + usleep( lMilliseconds * 1000 ); +#endif +} + + +// --------------------------------------------------------------------------------- + + +// Private; never actually called. +OTLog::OTLog() +{ + +} + +// Never actually called. Never instantiated. +OTLog::~OTLog() +{ + +} + +// ------------------------------------------------------- + +// This function is for things that should NEVER happen. +// In fact you should never even call it -- use the OT_ASSERT() macro instead. + +int OTLog::Assert(const char * szFilename, int nLinenumber, const char * szMessage) +{ + if (NULL != szMessage) + { +#ifndef ANDROID // if NOT android + std::cerr << szMessage << "\n"; + // ----------------------------- + LogToFile(szMessage); LogToFile("\n"); + // ----------------------------- +#else // if Android + __android_log_write(ANDROID_LOG_FATAL,"OT Assert", szMessage); +#endif + } + + return OTLog::Assert(szFilename, nLinenumber); +} + +int OTLog::Assert(const char * szFilename, int nLinenumber) +{ + if ((NULL != szFilename)) + { +#ifndef ANDROID // if NOT android + std::cerr << "OT_ASSERT in " << szFilename << " at line " << nLinenumber << "\n"; + + // ----------------------------- + // Grab this if we can, too... + // + OTString strTemp; + strTemp.Format("OT_ASSERT in %s at line %d\n", szFilename, nLinenumber); + LogToFile(strTemp.Get()); + // ----------------------------- + +#else // if Android + OTString strAndroidAssertMsg; + strAndroidAssertMsg.Format("\nOT_ASSERT in %s at line %d\n", szFilename, nLinenumber); + __android_log_write(ANDROID_LOG_FATAL,"OT Assert", (const char *)strAndroidAssertMsg.Get()); +#endif + } + + abort(); + return -1; +} + + +// If there's no logfile, then send it to stderr. +// (So we can still see it on the screen, but it doesn't interfere with any +// command line utilities who might otherwise interpret it as their own input, +// if I was actually writing to stdout.) +// +void OTLog::LogToFile(const char * szOutput) +{ + // Append to logfile + if ((NULL != szOutput) && OTLog::__OTLogfile.Exists()) + { + std::ofstream logfile; + logfile.open (OTLog::Logfile(), std::ios::app); + + if(!logfile.fail()) + { + logfile << szOutput; + logfile.close(); + } + } +// else // We now do this either way. + { + std::cerr << szOutput; + std::cerr.flush(); + } +} + + + +// ------------------------------------------------------- + +// For normal output. The higher the verbosity, the less important the message. +// (Verbose level 0 ALWAYS logs.) Currently goes to stdout. + +void OTLog::Output(int nVerbosity, const char *szOutput) +{ + // If log level is 0, and verbosity of this message is 2, don't bother logging it. +// if (nVerbosity > OTLog::__CurrentLogLevel || (NULL == szOutput)) + if ((nVerbosity > OTLog::__CurrentLogLevel) || (NULL == szOutput) || (OTLog::__CurrentLogLevel == (-1))) + return; + + // We store the last 1024 logs so programmers can access them via the API. + OTLog::PushMemlogFront(szOutput); + + // --------------------------------------- + +#ifndef ANDROID // if NOT android + + LogToFile(szOutput); + +#else // if IS Android + /* + typedef enum android_LogPriority { + ANDROID_LOG_UNKNOWN = 0, + ANDROID_LOG_DEFAULT, // only for SetMinPriority() + ANDROID_LOG_VERBOSE, + ANDROID_LOG_DEBUG, + ANDROID_LOG_INFO, + ANDROID_LOG_WARN, + ANDROID_LOG_ERROR, + ANDROID_LOG_FATAL, + ANDROID_LOG_SILENT, // only for SetMinPriority(); must be last + } android_LogPriority; + */ + switch (nVerbosity) { + case 0: + case 1: + __android_log_write(ANDROID_LOG_INFO,"OT Output", szOutput); + break; + case 2: + case 3: + __android_log_write(ANDROID_LOG_DEBUG,"OT Debug", szOutput); + break; + case 4: + case 5: + __android_log_write(ANDROID_LOG_VERBOSE,"OT Verbose", szOutput); + break; + default: + __android_log_write(ANDROID_LOG_UNKNOWN,"OT Unknown", szOutput); + break; + } +#endif +} + +void OTLog::Output(int nVerbosity, OTString & strOutput) +{ + if (strOutput.Exists()) + OTLog::Output(nVerbosity, strOutput.Get()); +} + +// the vOutput is to avoid name conflicts. +void OTLog::vOutput(int nVerbosity, const char *szOutput, ...) +{ + // If log level is 0, and verbosity of this message is 2, don't bother logging it. + if (nVerbosity > OTLog::__CurrentLogLevel || (NULL == szOutput)) + return; + + va_list args; + + // _WIN32 + static char * new_string = NULL; + + if (NULL == new_string) + { + new_string = new char[MAX_STRING_LENGTH]; // This only happens once -- static var. + + OT_ASSERT(NULL != new_string); + + memset(new_string, 0, MAX_STRING_LENGTH); + } + + new_string[0] = '\0'; + // _end _WIN32 + + va_start(args, szOutput); + +#ifdef _WIN32 + vsprintf_s(new_string, MAX_STRING_LENGTH, szOutput, args); +#else + vsnprintf(new_string, MAX_STRING_LENGTH, szOutput, args); +#endif + + va_end(args); + + OTLog::Output(nVerbosity, new_string); +} + + + +// ----------------------------------------------------------------- + +// An error has occurred, that somehow doesn't match the Assert or Output functions. +// So use this one instead. This ALWAYS logs and currently it all goes to stderr. + +void OTLog::Error(const char *szError) +{ + if ((NULL == szError)) + return; + + // We store the last 1024 logs so programmers can access them via the API. + OTLog::PushMemlogFront(szError); + +#ifndef ANDROID // if NOT android + + LogToFile(szError); + +#else // if Android + __android_log_write(ANDROID_LOG_ERROR,"OT Error", szError); +#endif +} + +void OTLog::Error(OTString & strError) +{ + if (strError.Exists()) + OTLog::Error(strError.Get()); +} + +// the vError name is to avoid name conflicts +void OTLog::vError(const char *szError, ...) +{ + if ((NULL == szError)) + return; + + va_list args; + + // _WIN32 + static char * new_string = NULL; + + if (NULL == new_string) + { + new_string = new char[MAX_STRING_LENGTH]; // This only happens once -- static var. + + OT_ASSERT(NULL != new_string); + + memset(new_string, 0, MAX_STRING_LENGTH); + } + + new_string[0] = '\0'; + // _end _WIN32 + + va_start(args, szError); + +#ifdef _WIN32 + vsprintf_s(new_string, MAX_STRING_LENGTH, szError, args); +#else + vsnprintf(new_string, MAX_STRING_LENGTH, szError, args); +#endif + + va_end(args); + + OTLog::Error(new_string); +} + + + + + + + +// Used for making sure that certain necessary folders actually exist. (Creates them otherwise.) +// +// If you pass in "spent", then this function will make sure that "/spent" actually exists, +// or create it. WARNING: If what you want to pass is "spent/sub-folder-to-spent" then make SURE +// you call it with "spent" FIRST, so you are sure THAT folder has been created, otherwise the +// folder creation will definitely fail on the sub-folder call (if the primary folder wasn't +// already there, that is.) +// +bool OTLog::ConfirmOrCreateFolder(const char * szFolderName) +{ + OT_ASSERT(NULL != szFolderName); + + + // DIRECTORY IS PRESENT? + struct stat st; + + OTString strPath; + strPath.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), szFolderName); + + bool bDirIsPresent = (0 == stat(strPath.Get(), &st)); + + // ---------------------------------------------------------------------------- + + // IF NO, CREATE IT + if (!bDirIsPresent) + { +#ifdef _WIN32 + if (_mkdir(strPath.Get()) == -1) +#else + if (mkdir(strPath.Get(), 0700) == -1) +#endif + { + OTLog::vError("OTLog::ConfirmOrCreateFolder: Unable to create %s.\n", + strPath.Get()); + return false; + } + + // Now we have created it, so let's check again... + bDirIsPresent = (0 == stat(strPath.Get(), &st)); + + if (bDirIsPresent) + OTLog::vOutput(0, "Created folder: %s\n", strPath.Get()); + } + + // ---------------------------------------------------------------------------- + + // At this point if the folder still doesn't exist, nothing we can do. We + // already tried to create the folder, and SUCCEEDED, and then STILL failed + // to find it (if this is still false.) + if (!bDirIsPresent) + { + OTLog::vError("OTLog::ConfirmOrCreateFolder: Unable to find newly-created folder: %s\n", + strPath.Get()); + return false; + } + + return true; +} + +// Returns true or false whether a specific file exists. +// Adds the main path prior to checking. +bool OTLog::ConfirmFile(const char * szFileName) +{ + OT_ASSERT(NULL != szFileName); + + + // FILE IS PRESENT? + struct stat st; + + OTString strPath; + strPath.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), szFileName); + + return (0 == stat(strPath.Get(), &st)); +} + + +// Returns true or false whether a specific file exists. +bool OTLog::ConfirmExactPath(const char * szFileName) +{ + OT_ASSERT(NULL != szFileName); + + // FILE IS PRESENT? + struct stat st; + + OTString strPath; + OTLog::TransformFilePath(szFileName, strPath); + + return (0 == stat(strPath.Get(), &st)); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTLog.h b/OTLib/OTLog.h new file mode 100644 index 000000000..51bf2dfe1 --- /dev/null +++ b/OTLib/OTLog.h @@ -0,0 +1,341 @@ +/************************************************************** + * + * OTLog.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// The long-awaited logging class. + +#ifndef __OTLOG_H__ +#define __OTLOG_H__ + +// x must be a boolean expression + +#define OT_ASSERT(x) ( (false == (x)) ? OTLog::Assert(__FILE__, __LINE__) : (1)) +#define OT_ASSERT_MSG(x, s) ( (false == (x)) ? OTLog::Assert(__FILE__, __LINE__, (s)) : (1)) + + +#include + +#include "OTString.h" + +typedef std::deque dequeOfStrings; + +class OTLog +{ +private: + OTLog(); + + static int __CurrentLogLevel; + static OTString __Version; // current version of Open Transactions is stored here. + + static OTString __OTPath; // Path to either server or client directory. (Whichever is running.) + static OTString __OTPathSeparator; // double-backslash in Windows, forward-slash in others. + + static OTString __OTCronFolder; // Just the folder name for the cron records (trades, payment plans...) + static OTString __OTNymFolder; // Just the folder name + static OTString __OTAccountFolder; // Just the folder name + static OTString __OTUserAcctFolder; // Just the folder name + static OTString __OTReceiptFolder; // Just the folder name + static OTString __OTNymboxFolder; // Just the folder name + static OTString __OTInboxFolder; // Just the folder name + static OTString __OTOutboxFolder; // Just the folder name + static OTString __OTCertFolder; // Just the folder name + static OTString __OTPubkeyFolder; // Just the folder name + static OTString __OTContractFolder; // Just the folder name + static OTString __OTMintFolder; // Just the folder name + static OTString __OTSpentFolder; // Just the folder name + static OTString __OTPurseFolder; // Just the folder name + static OTString __OTMarketFolder; // Just the folder name + + static OTString __OTLogfile; // Optional, logfile (full path.) + + static dequeOfStrings __logDeque; // Stores the last 1024 logs in memory. + + // ------------------------------------------------- + + static int __latency_send_no_tries; // Number of times will try to send a message. + static int __latency_receive_no_tries; // Number of times will try to receive a reply. + + static int __latency_send_ms; // number of ms to wait before retrying send. + static int __latency_receive_ms; // number of ms to wait before retrying receive. + + // ------------------------------------------------- + +public: + ~OTLog(); + + // Changes ~/blah to /Users/au/blah + // + static void TransformFilePath(const char * szInput, OTString & strOutput); + + static void LogToFile(const char * szOutput); + + // -------------------------------------------------- + // We keep 1024 logs in memory, to make them available via the API. + + static int GetMemlogSize(); + + static const char * GetMemlogAtIndex(int nIndex); + + static const char * PeekMemlogFront(); + static const char * PeekMemlogBack(); + + static bool PopMemlogFront(); + static bool PopMemlogBack(); + + static bool PushMemlogFront(const char * szLog); + static bool PushMemlogBack(const char * szLog); + + // -------------------------------------------------- + + static void SleepSeconds(long lSeconds); + static void SleepMilliseconds(long lMilliseconds); + + // Used for making sure that certain necessary folders actually exist. (Creates them otherwise.) + // Creates inside Path(). IE: /szFolderName + static bool ConfirmOrCreateFolder(const char * szFolderName); + static bool ConfirmFile(const char * szFileName); + static bool ConfirmExactPath(const char * szFileName); // This one expects fully-qualified path. + + // OTPath is where all the subdirectories can be found. + // If the server is what's running, then it's the server folder. + // Otherwise it's the client folder. + + // ------------------------------------------------------------ + + static const char * Path() { return __OTPath.Get(); } + static const char * PathSeparator() { return __OTPathSeparator.Get(); } + + static void SetMainPath(const char * szPath) { __OTPath.Set(szPath); } + static void SetPathSeparator(const char * szPathSeparator) { __OTPathSeparator.Set(szPathSeparator); } + + // ------------------------------------------------------------ + + static const char * CronFolder() { return __OTCronFolder.Get(); } + static void SetCronFolder(const char * szPath) { __OTCronFolder.Set(szPath); } + + static const char * NymFolder() { return __OTNymFolder.Get(); } + static void SetNymFolder(const char * szPath) { __OTNymFolder.Set(szPath); } + + static const char * ReceiptFolder() { return __OTReceiptFolder.Get(); } + static void SetReceiptFolder(const char * szPath) { __OTReceiptFolder.Set(szPath); } + + static const char * NymboxFolder() { return __OTNymboxFolder.Get(); } + static void SetNymboxFolder(const char * szPath) { __OTNymboxFolder.Set(szPath); } + + static const char * AccountFolder() { return __OTAccountFolder.Get(); } + static void SetAccountFolder(const char * szPath){ __OTAccountFolder.Set(szPath); } + + static const char * UserAcctFolder() { return __OTUserAcctFolder.Get(); } + static void SetUserAcctFolder(const char * szPath){ __OTUserAcctFolder.Set(szPath); } + + static const char * InboxFolder() { return __OTInboxFolder.Get(); } + static void SetInboxFolder(const char * szPath) { __OTInboxFolder.Set(szPath); } + + static const char * OutboxFolder() { return __OTOutboxFolder.Get(); } + static void SetOutboxFolder(const char * szPath) { __OTOutboxFolder.Set(szPath); } + + static const char * CertFolder() { return __OTCertFolder.Get(); } + static void SetCertFolder(const char * szPath) { __OTCertFolder.Set(szPath); } + + static const char * PubkeyFolder() { return __OTPubkeyFolder.Get(); } + static void SetPubkeyFolder(const char * szPath){ __OTPubkeyFolder.Set(szPath); } + + static const char * ContractFolder() { return __OTContractFolder.Get(); } + static void SetContractFolder(const char * szPath) { __OTContractFolder.Set(szPath); } + + static const char * MintFolder() { return __OTMintFolder.Get(); } + static void SetMintFolder(const char * szPath) { __OTMintFolder.Set(szPath); } + + static const char * SpentFolder() { return __OTSpentFolder.Get(); } + static void SetSpentFolder(const char * szPath) { __OTSpentFolder.Set(szPath); } + + static const char * PurseFolder() { return __OTPurseFolder.Get(); } + static void SetPurseFolder(const char * szPath) { __OTPurseFolder.Set(szPath); } + + static const char * MarketFolder() { return __OTMarketFolder.Get(); } + static void SetMarketFolder(const char * szPath){ __OTMarketFolder.Set(szPath); } + + static const char * Logfile() { return __OTLogfile.Get(); } + static void SetLogfile(const char * szPath) { __OTLogfile.Set(szPath); } + + // ------------------------------------------------------------ + + static const char * Version() { return __Version.Get(); } + + static int GetLogLevel() { return __CurrentLogLevel; } + static void SetLogLevel(int nLevel) { __CurrentLogLevel = nLevel; } + + static int GetLatencySendNoTries() { return __latency_send_no_tries; } + static void SetLatencySendNoTries(int nVal) { __latency_send_no_tries = nVal; } + static int GetLatencyReceiveNoTries() { return __latency_receive_no_tries; } + static void SetLatencyReceiveNoTries(int nVal) { __latency_receive_no_tries = nVal; } + + static int GetLatencySendMs() { return __latency_send_ms; } + static void SetLatencySendMs(int nVal) { __latency_send_ms = nVal; } + static int GetLatencyReceiveMs() { return __latency_receive_ms; } + static void SetLatencyReceiveMs(int nVal) { __latency_receive_ms = nVal; } + // + // Re: Above... There are certain config values set in OpenTransactions.cpp and + // OTServer.cpp. So look for them there, if you don't see them above. + + // For things that represent internal inconsistency in the code. + // Normally should NEVER happen even with bad input from user. + // (Don't call this directly. Use the above #defined macro instead.) + static int Assert(const char * szFilename, int nLinenumber); // assert + static int Assert(const char * szFilename, int nLinenumber, const char * szMessage); // assert + + // Output() logs normal output, which carries a verbosity level. + // + // If nVerbosity of a message is 0, the message will ALWAYS log. (ALL output levels are higher or equal to 0.) + // If nVerbosity is 1, the message will run only if __CurrentLogLevel is 1 or higher. + // If nVerbosity if 2, the message will run only if __CurrentLogLevel is 2 or higher. + // Etc. + // THEREFORE: The higher the verbosity level for a message, the more verbose the + // software must be configured in order to display that message. + // + // Default verbosity level for the software is 0, and output that MUST appear on + // the screen should be set at level 0. For output that you don't want to see as often, + // set it up to 1. Set it up even higher for the really verbose stuff (e.g. only if you + // really want to see EVERYTHING.) + + static void Output(int nVerbosity, const char * szOutput); // stdout + static void Output(int nVerbosity, OTString & strOutput); // stdout + static void vOutput(int nVerbosity, const char *szOutput, ...); + + // This logs an error condition, which usually means bad input from the user, or a file wouldn't open, + // or something like that. This contrasted with Assert() which should NEVER actually happen. The software + // expects bad user input from time to time. But it never expects a loaded mint to have a NULL pointer. + // The bad input would log with Error(), whereas the NULL pointer would log with Assert(); + static void Error(const char * szError); // stderr + static void Error(OTString & strError); // stderr + static void vError(const char * szError, ...); // stderr +}; + +#endif // __OTLOG_H__ diff --git a/OTLib/OTMarket.cpp b/OTLib/OTMarket.cpp new file mode 100644 index 000000000..52f9865f7 --- /dev/null +++ b/OTLib/OTMarket.cpp @@ -0,0 +1,2382 @@ +/************************************************************************ + * + * OTMarket.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + +// A market has a list of OTOffers for all the bids, and another list of OTOffers for all the asks. +// Presumably the server will have different markets for different asset types. + +#include +#include +#include +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + +#include "OTPseudonym.h" +#include "OTCron.h" + +#include "OTOffer.h" +#include "OTTrade.h" +#include "OTMarket.h" +#include "OTTransaction.h" +#include "OTItem.h" +#include "OTAccount.h" +#include "OTLedger.h" +#include "OTLog.h" + + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTMarket::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + + if (!strcmp("market", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + m_lScale = atol( xml->getAttributeValue("marketScale")); + m_lLastSalePrice = atol( xml->getAttributeValue("lastSalePrice")); + + // --------------------- + + const OTString strServerID(xml->getAttributeValue("serverID")), + strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strCurrencyTypeID(xml->getAttributeValue("currencyTypeID")); + + m_SERVER_ID.SetString(strServerID); + m_ASSET_TYPE_ID.SetString(strAssetTypeID); + m_CURRENCY_TYPE_ID.SetString(strCurrencyTypeID); + + // --------------------- + + OTLog::vOutput(0, "\n\nMarket. Scale: %ld\n", + m_lScale); + + OTLog::vOutput(1, + " assetTypeID: %s\n" + " currencyTypeID: %s\n" + " ServerID: %s\n", + strAssetTypeID.Get(), strCurrencyTypeID.Get(), + strServerID.Get()); + + nReturnVal = 1; + } + + else if (!strcmp("offer", xml->getNodeName())) + { + OTString strData; + + if (!LoadEncodedTextField(xml, strData) || !strData.Exists()) + { + OTLog::Error("Error in OTMarket::ProcessXMLNode: offer field without value.\n"); + return (-1); // error condition + } + else + { + OTOffer * pOffer = new OTOffer(m_SERVER_ID, m_ASSET_TYPE_ID, m_CURRENCY_TYPE_ID, m_lScale); + + OT_ASSERT(NULL != pOffer); + + if (pOffer->LoadContractFromString(strData) && + AddOffer(*pOffer, false)) // bSaveMarket = false (Don't SAVE -- we're loading right now!) + { + OTLog::Output(1, "Successfully loaded offer and added to market.\n"); + } + else + { + OTLog::Error("Error adding offer to market while loading market.\n"); + delete pOffer; + pOffer = NULL; + return (-1); + } + } + + nReturnVal = 1; + } + + return nReturnVal; +} + + + + +void OTMarket::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + // ------------------------------------------------------------- + + const OTString SERVER_ID(m_SERVER_ID), + ASSET_TYPE_ID(m_ASSET_TYPE_ID), + CURRENCY_TYPE_ID(m_CURRENCY_TYPE_ID); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + SERVER_ID.Get(), + ASSET_TYPE_ID.Get(), + CURRENCY_TYPE_ID.Get(), + m_lScale, + m_lLastSalePrice); + + + // ------------------------------------------------------------- + + // Save the offers for sale. + OTOffer * pOffer = NULL; + for (mapOfOffers::iterator ii = m_mapAsks.begin(); ii != m_mapAsks.end(); ++ii) + { + pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + + OTString strOffer(*pOffer); // Extract the offer contract into string form. + OTASCIIArmor ascOffer(strOffer);// Base64-encode that for storage. + + m_xmlUnsigned.Concatenate("\n%s\n\n", ascOffer.Get()); + } + + // Save the bids. + for (mapOfOffers::iterator ii = m_mapBids.begin(); ii != m_mapBids.end(); ++ii) + { + pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + + OTString strOffer(*pOffer); // Extract the offer contract into string form. + OTASCIIArmor ascOffer(strOffer);// Base64-encode that for storage. + + m_xmlUnsigned.Concatenate("\n%s\n\n", ascOffer.Get()); + } + + // ------------------------------------------------------------- + + m_xmlUnsigned.Concatenate("\n"); +} + + + + +long OTMarket::GetTotalAvailableAssets() +{ + long lTotal = 0; + + OTOffer * pOffer = NULL; + for (mapOfOffers::iterator ii = m_mapAsks.begin(); ii != m_mapAsks.end(); ++ii) + { + pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + + lTotal += pOffer->GetAmountAvailable(); + } + + return lTotal; +} + + +// ****************************************************** +// Get list of offers for a particular Nym, to send that Nym +// +bool OTMarket::GetNym_OfferList(const OTIdentifier & NYM_ID, OTDB::OfferListNym & theOutputList, int & nNymOfferCount) +{ + nNymOfferCount = 0; // Outputs the count of offers for NYM_ID (on this market.) + + // --------------------------------------- + + // Loop through the offers, up to some maximum depth, and then add each + // as a data member to an offer list, then pack it into ascOutput. + + for (mapOfOffersTrnsNum::iterator ii = m_mapOffers.begin(); ii != m_mapOffers.end(); ++ii) + { + OTOffer * pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + + OTTrade * pTrade = pOffer->GetTrade(); + + // We only return offers for a specific Nym ID, since this is private info only for that Nym. + // + if ((NULL == pTrade) || (pTrade->GetSenderUserID() != NYM_ID)) + continue; + + // Below this point, I KNOW pTrade and pOffer are both good pointers. + // with no need to cleanup. I also know they are for the right Nym. + // -------------------------------------------- + + OTDB::OfferDataNym * pOfferData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_OFFER_DATA_NYM)); + OTCleanup theDataAngel(*pOfferData); + + // -------------------------------------------- + + const long & lTransactionNum = pOffer->GetTransactionNum(); + const long & lPriceLimit = pOffer->GetPriceLimit(); + const long & lTotalAssets = pOffer->GetTotalAssetsOnOffer(); + const long & lFinishedSoFar = pOffer->GetFinishedSoFar(); + const long & lMinimumIncrement = pOffer->GetMinimumIncrement(); + const long & lScale = pOffer->GetScale(); + + const time_t tValidFrom = pOffer->GetValidFrom(); + const time_t tValidTo = pOffer->GetValidTo(); + + const OTIdentifier & theServerID = pOffer->GetServerID(); const OTString strServerID(theServerID); + const OTIdentifier & theAssetID = pOffer->GetAssetID(); const OTString strAssetID(theAssetID); + const OTIdentifier & theAssetAcctID = pTrade->GetSenderAcctID(); const OTString strAssetAcctID(theAssetAcctID); + const OTIdentifier & theCurrencyID = pOffer->GetCurrencyID(); const OTString strCurrencyID(theCurrencyID); + const OTIdentifier & theCurrencyAcctID = pTrade->GetCurrencyAcctID(); const OTString strCurrencyAcctID(theCurrencyAcctID); + + const bool bSelling = pOffer->IsAsk(); + + // ------------------------------------------------------- + + if (pTrade->IsStopOrder()) + { + if (pTrade->IsGreaterThan()) + pOfferData->stop_sign = ">"; + else if (pTrade->IsLessThan()) + pOfferData->stop_sign = "<"; + // ------------------------------- + if (!pOfferData->stop_sign.compare(">") || !pOfferData->stop_sign.compare("<")) + { + const long & lStopPrice = pTrade->GetStopPrice(); + pOfferData->stop_price = to_string(lStopPrice); + } + } + + // ------------------------------------------------------ + + pOfferData->transaction_id = to_string(lTransactionNum); + pOfferData->price_per_scale = to_string(lPriceLimit); + pOfferData->total_assets = to_string(lTotalAssets); + pOfferData->finished_so_far = to_string(lFinishedSoFar); + pOfferData->minimum_increment = to_string(lMinimumIncrement); + pOfferData->scale = to_string(lScale); + + pOfferData->valid_from = to_string(tValidFrom); + pOfferData->valid_to = to_string(tValidTo); + + pOfferData->server_id = strServerID.Get(); + pOfferData->asset_type_id = strAssetID.Get(); + pOfferData->asset_acct_id = strAssetAcctID.Get(); + pOfferData->currency_type_id = strCurrencyID.Get(); + pOfferData->currency_acct_id = strCurrencyAcctID.Get(); + + pOfferData->selling = bSelling; + + // ------------------------------------------------------ + + // *pOfferData is CLONED at this time (I'm still responsible to delete.) + // That's also why I add it here, below: So the data is set right before the cloning occurs. + // + theOutputList.AddOfferDataNym(*pOfferData); + nNymOfferCount++; + } + + // ------------------------------------------------------------- + + return true; +} + + + +bool OTMarket::GetRecentTradeList(OTASCIIArmor & ascOutput, int & nTradeCount) +{ + nTradeCount = 0; // Output the count of trades in the list being returned. (If success..) + + // ------------------------- + + if (NULL == m_pTradeList) + { +// OTLog::Error("OTMarket::GetRecentTradeList: m_pTradeList is NULL. \n"); + return true; + // Returning true, since it's normal for this to be NULL when the list is empty. + } + + // ------------------------------------------ + + // The market already keeps a list of recent trades (informational only) + // + + const size_t sizeList = m_pTradeList->GetTradeDataMarketCount(); + nTradeCount = sizeList; + + if (nTradeCount == 0) + return true; // Success, but there are 0 trade datas to return. (empty list.) + + // So now, let's pack the list into strOutput... + else if (nTradeCount > 0) + { + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*m_pTradeList); // Now we PACK our market's recent trades list. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing pTradeList in OTCron::GetRecentTradeList. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + // Now we need to translate pBuffer into strOutput. + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + if ((NULL != pUint) || (theSize < 2)) + { + OTData theData(pUint, theSize); + + // This function will base64 ENCODE theData, + // and then Set() that as the string contents. + ascOutput.SetData(theData); + + return true; + } + else + OTLog::Error("Error while getting buffer data in OTMarket::GetRecentTradeList.\n"); + } + + else + OTLog::vError("Error: nTradeCount with negative value in OTMarket::GetRecentTradeList: %d.\n", nTradeCount); + + return false; +} + + + + +// OTDB::OfferListMarket +// +bool OTMarket::GetOfferList(OTASCIIArmor & ascOutput, long lDepth, int & nOfferCount) +{ + nOfferCount = 0; // Outputs the actual count of offers being returned. + // ---------------------------- + if (0 == lDepth) + lDepth = MAX_MARKET_QUERY_DEPTH; + + // Loop through the offers, up to some maximum depth, and then add each + // as a data member to an offer list, then pack it into ascOutput. + + OTDB::OfferListMarket * pOfferList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_OFFER_LIST_MARKET)); + OTCleanup theListAngel(*pOfferList); + + // ----------------------------------------------------------- + +// mapOfOffers m_mapBids; // The buyers, ordered by price limit +// mapOfOffers m_mapAsks; // The sellers, ordered by price limit + + OTOffer * pOffer = NULL; + int nTempDepth = 0; + + for (mapOfOffers::iterator ii = m_mapBids.begin(); ii != m_mapBids.end(); ++ii) + { + if (nTempDepth++ > lDepth) + break; + + // -------------------------------------------- + + pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + // OfferDataMarket + OTDB::BidData * pOfferData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_BID_DATA)); + OTCleanup theDataAngel(*pOfferData); + + // -------------------------------------------- + + const long & lTransactionNum = pOffer->GetTransactionNum(); + const long & lPriceLimit = pOffer->GetPriceLimit(); + const long lAvailableAssets = pOffer->GetAmountAvailable(); + const long & lMinimumIncrement = pOffer->GetMinimumIncrement(); + + pOfferData->transaction_id = to_string(lTransactionNum); + pOfferData->price_per_scale = to_string(lPriceLimit); + pOfferData->available_assets = to_string(lAvailableAssets); + pOfferData->minimum_increment = to_string(lMinimumIncrement); + + // ------------------------------------------------------ + + // *pOfferData is CLONED at this time (I'm still responsible to delete.) + // That's also why I add it here, below: So the data is set right before the cloning occurs. + // + pOfferList->AddBidData(*pOfferData); + nOfferCount++; + } + + pOffer = NULL; + nTempDepth = 0; + + for (mapOfOffers::iterator ii = m_mapAsks.begin(); ii != m_mapAsks.end(); ++ii) + { + if (nTempDepth++ > lDepth) + break; + + // -------------------------------------------- + + pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + // OfferDataMarket + OTDB::AskData * pOfferData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_ASK_DATA)); + OTCleanup theDataAngel(*pOfferData); + + // -------------------------------------------- + + const long & lTransactionNum = pOffer->GetTransactionNum(); + const long & lPriceLimit = pOffer->GetPriceLimit(); + const long lAvailableAssets = pOffer->GetAmountAvailable(); + const long & lMinimumIncrement = pOffer->GetMinimumIncrement(); + + pOfferData->transaction_id = to_string(lTransactionNum); + pOfferData->price_per_scale = to_string(lPriceLimit); + pOfferData->available_assets = to_string(lAvailableAssets); + pOfferData->minimum_increment = to_string(lMinimumIncrement); + + // ------------------------------------------------------ + + // *pOfferData is CLONED at this time (I'm still responsible to delete.) + // That's also why I add it here, below: So the data is set right before the cloning occurs. + // + pOfferList->AddAskData(*pOfferData); + nOfferCount++; + } + + // ------------------------------------------------------------- + + // Now pack the list into strOutput... + + if (nOfferCount == 0) + return true; // Success, but there were zero offers found. + + if (nOfferCount > 0) + { + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->Pack(*pOfferList); // Now we PACK our market's offer list. + + if (NULL == pBuffer) + { + OTLog::Error("Failed packing pOfferList in OTCron::GetOfferList. \n"); + return false; + } + + OTCleanup theBufferAngel(*pBuffer); // make sure memory is cleaned up. + + // -------------------------------------------------------- + + // Now we need to translate pBuffer into strOutput. + + const uint8_t* pUint = static_cast(pBuffer->GetData()); + const size_t theSize = pBuffer->GetSize(); + + if (NULL != pUint) + { + OTData theData(pUint, theSize); + + // This function will base64 ENCODE theData, + // and then Set() that as the string contents. + ascOutput.SetData(theData); + + return true; + } + else + OTLog::Error("Error while getting buffer data in OTMarket::GetOfferList.\n"); + } + + else + OTLog::Error("invalid: nOfferCount is < 0 in OTMarket::GetOfferList.\n"); + + return false; +} + + +// ------------------------------------------------------------------- + + + + + +// To insure that offers of a specific price are always inserted at the upper bound, +// use this: my_mmap.insert(my_mmap.upper_bound(key), my_mmap::value_type(key, val)); +// This way I can read them from the lower bound later, and always get them in the +// order received for that price. +// +//typedef std::multimap mapOfOffers; +//mapOfOffers m_mapBids; // The buyers, ordered +//mapOfOffers m_mapAsks; // The sellers, ordered + + + +OTOffer * OTMarket::GetOffer(const long & lTransactionNum) +{ + // See if there's something there with that transaction number. + mapOfOffersTrnsNum::iterator ii = m_mapOffers.find(lTransactionNum); + + if ( ii == m_mapOffers.end() ) + { + // nothing found. + return NULL; + } + // Found it! + else + { + OTOffer * pOffer = (*ii).second; + + OT_ASSERT((NULL != pOffer)); + + if (pOffer->GetTransactionNum() == lTransactionNum) + return pOffer; + else + OTLog::vError("Expected Offer with transaction number %ld, but found %ld inside. Bad data?\n", + lTransactionNum, pOffer->GetTransactionNum()); + } + + return NULL; +} + + +bool OTMarket::RemoveOffer(const long & lTransactionNum) // if false, offer wasn't found. +{ + bool bReturnValue = false; + + // See if there's something there with that transaction number. + mapOfOffersTrnsNum::iterator ii = m_mapOffers.find(lTransactionNum); + + // If it's not already on the list, then there's nothing to remove. + if ( ii == m_mapOffers.end() ) + { + OTLog::vError("Attempt to remove non-existent Offer from Market. Transaction #: %ld\n", + lTransactionNum); + return false; + } + // Otherwise, if it WAS already there, remove it properly. + else + { + OTOffer * pOffer = (*ii).second; + + OT_ASSERT(NULL != pOffer); + + + // This removes it from one list (the one indexed by transaction number.) + // But it's still on one of the other lists... + m_mapOffers.erase(ii); + + // The code operates the same whether ask or bid. Just use a pointer. + mapOfOffers * pMap = (pOffer->IsBid() ? &m_mapBids : &m_mapAsks); + + // Future solution here: instead of looping through all the offers and finding it, + // I could just have each Offer store a copy of the iterator that's returned when + // it's first inserted. Later I just erase that iterator from the right list to remove. Todo. + OTOffer * pSameOffer = NULL; + + for (mapOfOffers::iterator iii = pMap->begin(); iii != pMap->end(); ++iii) + { + pSameOffer = (*iii).second; + + OT_ASSERT_MSG(NULL != pSameOffer, "NULL offer pointer in OTMarket::RemoveOffer.\n"); + + // found it! + if (lTransactionNum == pSameOffer->GetTransactionNum()) + { + pMap->erase(iii); + break; + } + + // Later on, below this loop, this pointer will be NULL or not, and I will know if it was removed. + pSameOffer = NULL; + } + + if (NULL == pSameOffer) + { + OTLog::Error("Removed Offer from offers list, but not found on bid/ask list.\n"); + } + else // This means it was found and removed from the second list as well. + { + bReturnValue = true; // Success. + } + + // pOffer was found on the Offers list. + // pSameOffer was found on the Bid or Ask list, with the same transaction ID. + // They SHOULD be pointers to the SAME object. + // Therefore I CANNOT delete them both. + // + OT_ASSERT(pOffer == pSameOffer); + + delete pOffer; + pOffer = NULL; + pSameOffer = NULL; + } + + if (bReturnValue) + return SaveMarket(); // <====== SAVE since an offer was removed. + else + return false; +} + + + +// This method demands an Offer reference in order to verify that it really exists. +// HOWEVER, it MUST be heap-allocated, since the Market takes ownership and will delete it. +// +// If NOT successful adding, caller must clear up his own memory. +// +bool OTMarket::AddOffer(OTOffer & theOffer, bool bSaveFile/*=true*/) +{ + const long lTransactionNum = theOffer.GetTransactionNum(), + lPriceLimit = theOffer.GetPriceLimit(); + + // Make sure the offer is even appropriate for this market... + if (ValidateOfferForMarket(theOffer)) + { + // I store duplicate lists of offer pointers. Two multimaps ordered by price, + // (for buyers and sellers) and one map ordered by transaction number. + + // ------------------------------------------------------------------------------ + + // See if there's something else already there with the same transaction number. + mapOfOffersTrnsNum::iterator ii = m_mapOffers.find(lTransactionNum); + + // If it's not already on the list, then add it... + if ( ii == m_mapOffers.end() ) + { + m_mapOffers[lTransactionNum] = &theOffer; + OTLog::Output(4, "Offer added as an offer to the market...\n"); + } + // Otherwise, if it was already there, log an error. + else + { + OTLog::vError("Attempt to add Offer to Market with pre-existing transaction number: %ld\n", + lTransactionNum); + return false; + } + + // ------------------------------------------------------------------------------ + + // Okay so we successfully added it to one list (indexed by Transaction Num) and we + // know it validated as an offer, AND we know it wasn't already on the market. + // + // So next, let's add it to the lists that are indexed by price: + + + // Determine if it's a buy or sell, and add it to the right list. + if (theOffer.IsBid()) + { + // No bother checking if the offer is already on this list, + // since the code above basically already verifies that for us. + m_mapBids.insert (m_mapBids.lower_bound(lPriceLimit), // highest bidders go first, so I am last in line at lower bound. + std::pair(lPriceLimit, &theOffer) ); + OTLog::Output(4, "Offer added as a bid to the market.\n"); + } + else + { + m_mapAsks.insert (m_mapAsks.upper_bound(lPriceLimit), // lowest price sells first, so I am last in line at upper bound. + std::pair(lPriceLimit, &theOffer) ); + OTLog::Output(4, "Offer added as an ask to the market.\n"); + } + + + if (bSaveFile) + return SaveMarket(); // <====== SAVE since an offer was added to the Market. + else + return true; + } + else + { + OTLog::Error("Attempt to add Invalid Offer to market.\n"); + return false; + } + + return false; +} + + + + +bool OTMarket::LoadMarket() +{ + OT_ASSERT(NULL != GetCron()); + OT_ASSERT(NULL != GetCron()->GetServerNym()); + + OTIdentifier MARKET_ID(*this); + OTString str_MARKET_ID(MARKET_ID); + + // ------------------------------------------------------------------------ + + const char * szFoldername = OTLog::MarketFolder(); + const char * szFilename = str_MARKET_ID.Get(); + + // -------------------------------------------------------------------- + + bool bSuccess = false; + + bSuccess = LoadContract(szFoldername, szFilename); + + if (bSuccess) + bSuccess = VerifySignature(*(GetCron()->GetServerNym())); + + // -------------------------------------------------------------------- + // Load the list of recent market trades (informational only.) + // + if (bSuccess) + { + if (NULL != m_pTradeList) + delete m_pTradeList; + + const char * szSubFolder = "recent"; // todo stop hardcoding. + + m_pTradeList = dynamic_cast(OTDB::QueryObject(OTDB::STORED_OBJ_TRADE_LIST_MARKET, + szFoldername, // markets + szSubFolder, // markets/recent + szFilename)); // markets/recent/market_ID + } + + // -------------------------------------------------------------------- + + return bSuccess; +} + + + +bool OTMarket::SaveMarket() +{ + OT_ASSERT(NULL != GetCron()); + OT_ASSERT(NULL != GetCron()->GetServerNym()); + + OTIdentifier MARKET_ID(*this); + OTString str_MARKET_ID(MARKET_ID); + + // ------------------------------------------------------------------------ + + const char * szFoldername = OTLog::MarketFolder(); + const char * szFilename = str_MARKET_ID.Get(); + + // ------------------------------------------------------------------------ + + // Remember, if the market has changed, the new contents will not be written anywhere + // until that market has been signed. So I have to re-sign here, or it would just save + // the old version of the market from before the most recent changes. + ReleaseSignatures(); + + // Sign it, save it internally to string, and then save that out to the file. + if (!SignContract(*(GetCron()->GetServerNym())) || !SaveContract() || !SaveContract(szFoldername, szFilename)) + { + OTLog::vError("Error saving Market:\n%s%s%s\n", szFoldername, + OTLog::PathSeparator(), szFilename); + return false; + } + + // ------------------------------------------------------------------------ + // Save a copy of recent trades. + + if (NULL != m_pTradeList) + { + const char * szSubFolder = "recent"; // todo stop hardcoding. + + // If this fails, oh well. It's informational, anyway. + if (false == OTDB::StoreObject(*m_pTradeList, + szFoldername, // markets + szSubFolder, // markets/recent + szFilename)) // markets/recent/Market_ID + OTLog::vError("Error saving recent trades for Market:\n%s%s%s%s%s\n", szFoldername, + OTLog::PathSeparator(), szSubFolder, OTLog::PathSeparator(), szFilename); + } + + return true; +} + + + +// A Market's ID is based on the asset type, the currency type, and the scale. +void OTMarket::GetIdentifier(OTIdentifier & theIdentifier) +{ + OTString strTemp, strAsset(GetAssetID()), strCurrency(GetCurrencyID()); + + long lScale = GetScale(); + + // In this way we generate a unique ID that will always be consistent + // for the same asset ID, currency ID, and market scale. + strTemp.Format("ASSET TYPE:\n%s\nCURRENCY TYPE:\n%s\nMARKET SCALE:\n%ld\n", + strAsset.Get(), strCurrency.Get(), lScale); + + m_ID.CalculateDigest(strTemp); + + OTContract::GetIdentifier(theIdentifier); +} + + + + +// ----------------------------------------------------------------------------- + +// returns 0 if there are no bids. Otherwise returns the value of the highest bid on the market. +long OTMarket::GetHighestBidPrice() +{ + long lPrice = 0; + + mapOfOffers::reverse_iterator rr = m_mapBids.rbegin(); + + if (rr != m_mapBids.rend()) + { + lPrice = (*rr).first; + } + + return lPrice; +} + +// returns 0 if there are no asks. Otherwise returns the value of the lowest ask on the market. +long OTMarket::GetLowestAskPrice() +{ + long lPrice = 0; + + mapOfOffers::iterator ii = m_mapAsks.begin(); + + if (ii != m_mapAsks.end()) + { + lPrice = (*ii).first; + } + + return lPrice; +} + + + + + + + +// This utility function is used directly below (only). +void cleanup_four_accounts(OTAccount * p1, OTAccount * p2, OTAccount * p3, OTAccount * p4) +{ + if (p1) + delete p1; + if (p2) + delete p2; + if (p3) + delete p3; + if (p4) + delete p4; +} + + +// This utility function is used directly below (only). +// It is ASSUMED that the first two accounts are DEBITS, and the second two accounts are CREDITS. +// The bool is the original result of the debit or credit that was attempted (and is now being rolled back.) +// so for example, p1 tried to debit, and if it returned true (debit was successful!) then we NEED to roll +// p1 back (since that's what this function does.) +// Whereas if it had returned false (debit failed) then the false would be passed in here, and I would know +// NOT to try to credit the account again, since the money never left. If b1 is false, for each var, do nothing. +// If true, try to roll it back. +void rollback_four_accounts(OTAccount & p1, bool b1, const long & a1, OTAccount & p2, bool b2, const long & a2, + OTAccount & p3, bool b3, const long & a3, OTAccount & p4, bool b4, const long & a4) +{ + if (b1) + p1.Credit(a1); + if (b2) + p2.Credit(a2); + if (b3) + p3.Debit(a3); + if (b4) + p4.Debit(a4); +} + + + +// By the time this is called, we have already verified most things: +// -- The trade and offer belong to each other. +// -- theOtherOffer is a matching offer that was found to exist already on the market. +// -- Both offers have been verified on and to the market. (Their Asset types included.) +// -- Both offers are within each other's price limit. +// -- Both offers have enough assets for sale/purchase to meet their respective minimums. +// -- TheTrade will get the PriceLimit offered by theOtherOffer, and not vice-versa. +// (See explanation below this function if you need to know the reasoning.) +// +// Basically, by the time you get to this function, the two offers do not need to be +// verified in terms of whether they can trade. They can DEFINITELY trade, that's why +// they're here. So any failures within here will be more related to successfully processing +// that trade, not determining whether to do it. (For example, perhaps one of the accounts +// doesn't actually have enough money to do the trade... that failure would occur here.) +// +void OTMarket::ProcessTrade(OTTrade & theTrade, OTOffer & theOffer, OTOffer & theOtherOffer) +{ + OTTrade * pOtherTrade = theOtherOffer.GetTrade(); + + OTCron * pCron = theTrade.GetCron(); + + // Make sure have pointer to both trades. + + OT_ASSERT_MSG (NULL != pOtherTrade, "Offer was on the market, but somehow got into processing without a trade pointer.\n"); + OT_ASSERT (NULL != pCron); // also need the Cron pointer which SHOULD ALWAYS be there. + + OTPseudonym * pServerNym = pCron->GetServerNym(); + + OT_ASSERT_MSG(NULL != pServerNym, "Somehow a Market is running even though there is no Server Nym on the Cron object authorizing the trades."); + + + const OTIdentifier SERVER_ID(pCron->GetServerID()); + + + if (pCron->GetTransactionCount() < 1) + { + OTLog::Output(0, "Failed to process trades: Out of transaction numbers!\n"); + return; + } + + // Make sure these two separate trades don't have the same Account IDs inside + // otherwise we would have to take care not to load them twice, like with the Nyms below. + // (Instead I just disallow the trade entirely.) + if ((theTrade.GetSenderAcctID() == pOtherTrade->GetSenderAcctID()) || + (theTrade.GetSenderAcctID() == pOtherTrade->GetCurrencyAcctID()) || + (theTrade.GetCurrencyAcctID() == pOtherTrade->GetSenderAcctID()) || + (theTrade.GetCurrencyAcctID() == pOtherTrade->GetCurrencyAcctID())) + { + OTLog::Output(5, "Failed to process trades: they had account IDs in common.\n"); + // No need to remove either of the trades since they might still be valid when + // matched up to others. + // I put the log on the most verbose level because if this happens, it will probably + // happen over and over again. (Unless the market has enough depth to process them + // both out.) + + // TODO May need to choose (or add a config option) so server operators can remove the + // oldest or newest trade when this happens, or both. Or it can choose to do nothing, + // and let them both process out with other trades (as this does now.) + + return; + } + // No need to compare asset types, since those are already verified by the time + // we get here. BUT, when the accounts are actually loaded up, THEN should compare + // the asset types to make sure they were what we expected them to be. + + + + // -------------- Make sure have both nyms loaded and checked out. -------------------------------------------------- + // WARNING: 1 or both of the Nyms could be also the Server Nym. They could also be the same Nym, but NOT the Server. + // In all of those different cases, I don't want to load the same file twice and overwrite it with itself, losing + // half of all my changes. I have to check all three IDs carefully and set the pointers accordingly, and then operate + // using the pointers from there. + + const OTIdentifier FIRST_NYM_ID(theTrade.GetSenderUserID()), // The newest trade's Nym. + OTHER_NYM_ID(pOtherTrade->GetSenderUserID()), // The Nym of the trade that was already on the market. (Could be same Nym.) + SERVER_NYM_ID(*pServerNym); // The Server Nym (could be one or both of the above.) + + OTPseudonym theNym, theOtherNym; // We MIGHT use ONE, OR BOTH, of these, or none. + + // Find out if either Nym is actually also the server. + bool bFirstNymIsServerNym = ((FIRST_NYM_ID == SERVER_NYM_ID) ? true : false); + bool bOtherNymIsServerNym = ((OTHER_NYM_ID == SERVER_NYM_ID) ? true : false); + + // We also see, after all that is done, whether both pointers go to the same entity. We'll want to know that later. + bool bTradersAreSameNym = ((FIRST_NYM_ID == OTHER_NYM_ID) ? true : false); + + // Initially both nym pointers are set to their own blank objects + OTPseudonym * pFirstNym = NULL; + OTPseudonym * pOtherNym = NULL; + + // Unless either of them is actually the server, + // in which case the pointer is re-pointed to the server Nym. + if (bFirstNymIsServerNym) // If the First Nym is the server, then just point to that. + { + pFirstNym = pServerNym; + } + else // Else load the First Nym from storage. + { + theNym.SetIdentifier(FIRST_NYM_ID); // theNym is pFirstNym + + if (false == theNym.LoadPublicKey()) + { + OTString strNymID(FIRST_NYM_ID); + OTLog::vError("Failure loading First Nym public key in OTMarket::ProcessTrade: %s\n", strNymID.Get()); + theTrade.FlagForRemoval(); + return; + } + + if (theNym.VerifyPseudonym() && + theTrade.VerifySignature(*pServerNym) && + theOffer.VerifySignature(*pServerNym) && + theNym.LoadSignedNymfile(*pServerNym)) // ServerNym here is not theNym's identity, but merely the signer on this file. + { + pFirstNym = &theNym; // <===== + } + else + { + OTString strNymID(FIRST_NYM_ID); + OTLog::vError("OTMarket::ProcessTrade: Failure verifying trade, offer, or nym, or loading signed Nymfile: %s\n", + strNymID.Get()); + theTrade.FlagForRemoval(); + return; + } + } + + + if (bOtherNymIsServerNym) // If the Other Nym is the server, then just point to that. + { + pOtherNym = pServerNym; + } + else if (bTradersAreSameNym) // Else if the Traders are the same Nym, point to the one we already loaded. + { + pOtherNym = pFirstNym; // theNym is pFirstNym + } + else // Otherwise load the Other Nym from Disk and point to that. + { + theOtherNym.SetIdentifier(OTHER_NYM_ID); + + if (false == theOtherNym.LoadPublicKey()) + { + OTString strNymID(OTHER_NYM_ID); + OTLog::vError("Failure loading Other Nym public key in OTMarket::ProcessTrade: %s\n", strNymID.Get()); + pOtherTrade->FlagForRemoval(); + return; + } + + if (theOtherNym.VerifyPseudonym() && + pOtherTrade->VerifySignature(*pServerNym) && + theOtherOffer.VerifySignature(*pServerNym) && + theOtherNym.LoadSignedNymfile(*pServerNym)) + { + pOtherNym = &theOtherNym; // <===== + } + else + { + OTString strNymID(OTHER_NYM_ID); + OTLog::vError("Failure loading or verifying Other Nym public key in OTMarket::ProcessTrade: %s\n", strNymID.Get()); + pOtherTrade->FlagForRemoval(); + return; + } + } + + + // AT THIS POINT, I have pServerNym, pFirstNym, and pOtherNym. + // ALL are loaded from disk (where necessary.) AND... + // ALL are valid pointers, (even if they sometimes point to the same object,) + // AND none are capable of overwriting the storage of the other (by accidentally + // loading the same storage twice.) + // We also have boolean variables at this point to tell us exactly which are which, + // (in case some of those pointers do go to the same object.) + // They are: + // bFirstNymIsServerNym, bOtherNymIsServerNym, and bTradersAreSameNym. + // + // We also have theTrade, theOffer, pOtherTrade, and theOtherOffer, + // and we know they are all good also. + // + + + // Make sure have ALL FOUR accounts loaded and checked out. + // (first nym's asset/currency, and other nym's asset/currency.) + + OTAccount * pFirstAssetAcct = OTAccount::LoadExistingAccount(theTrade.GetSenderAcctID(), SERVER_ID); + OTAccount * pFirstCurrencyAcct = OTAccount::LoadExistingAccount(theTrade.GetCurrencyAcctID(), SERVER_ID); + + OTAccount * pOtherAssetAcct = OTAccount::LoadExistingAccount(pOtherTrade->GetSenderAcctID(), SERVER_ID); + OTAccount * pOtherCurrencyAcct = OTAccount::LoadExistingAccount(pOtherTrade->GetCurrencyAcctID(), SERVER_ID); + + + if ((NULL == pFirstAssetAcct) || + (NULL == pFirstCurrencyAcct)) + { + OTLog::Output(0, "ERROR verifying existence of one of the first trader's accounts during attempted Market trade.\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + theTrade.FlagForRemoval(); // Removes from Cron. + return; + } + + else if ((NULL == pOtherAssetAcct) || + (NULL == pOtherCurrencyAcct)) + { + OTLog::Output(0, "ERROR verifying existence of one of the second trader's accounts during attempted Market trade.\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + pOtherTrade->FlagForRemoval(); // Removes from Cron. + return; + } + + // Are the accounts of the first trader of the right asset types? + // We already know the asset types matched as far as the market, trades, and offers were concerned. + // But only once the accounts themselves have been loaded can we VERIFY this to be true. + else if ((pFirstAssetAcct->GetAssetTypeID() != GetAssetID()) || // the traders' asset accts have the same asset type as the market. + (pFirstCurrencyAcct->GetAssetTypeID() != GetCurrencyID()) // the traders' currency accts have the same asset type as the market. + ) + { + OTLog::Error("ERROR - First Trader has accounts of wrong " + "asset types in OTMarket::ProcessTrade\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + theTrade.FlagForRemoval(); // Removes from Cron. + return; + } + + else if ((pOtherAssetAcct->GetAssetTypeID() != GetAssetID()) || // the traders' asset accts have the same asset type as the market. + (pOtherCurrencyAcct->GetAssetTypeID() != GetCurrencyID())) // the traders' currency accts have the same asset type as the market. + { + OTLog::Error("ERROR - Other Trader has accounts of wrong " + "asset types in OTMarket::ProcessTrade\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + pOtherTrade->FlagForRemoval(); // Removes from Cron. + return; + } + + // Make sure all accounts are signed by the server and have the owner they are expected to have. + + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if ((!pFirstAssetAcct->VerifyOwner(*pFirstNym) || !pFirstAssetAcct->VerifySignature(*pServerNym)) || + (!pFirstCurrencyAcct->VerifyOwner(*pFirstNym) || !pFirstCurrencyAcct->VerifySignature(*pServerNym))) + { + OTLog::Error("ERROR verifying ownership or signature on one of first trader's accounts in OTMarket::ProcessTrade\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + theTrade.FlagForRemoval(); // Removes from Cron. + return; + } + else if ((!pOtherAssetAcct->VerifyOwner(*pOtherNym) || !pOtherAssetAcct->VerifySignature(*pServerNym) ) || + (!pOtherCurrencyAcct->VerifyOwner(*pOtherNym) || !pOtherCurrencyAcct->VerifySignature(*pServerNym))) + { + OTLog::Error("ERROR verifying ownership or signature on one of other trader's accounts in OTMarket::ProcessTrade\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + pOtherTrade->FlagForRemoval(); // Removes from Cron. + return; + } + + // By this point, I know I have all four accounts loaded, and I know that they have the right asset types, + // and I know they have the right owners and they were all signed by the server. + // I also know that their account IDs in their internal records matched the account filename for each acct. + // I also have pointers to the Nyms who own these accounts, as well as the Trades and Offers associated with them. + + + + else + { + // Okay then, everything checks out. Let's add this to the sender's outbox and the recipient's inbox. + // IF they can be loaded up from file, or generated, that is. + + // Load the inbox/outbox in case they already exist + OTLedger theFirstAssetInbox (FIRST_NYM_ID, theTrade.GetSenderAcctID(), SERVER_ID), + theFirstCurrencyInbox (FIRST_NYM_ID, theTrade.GetCurrencyAcctID(), SERVER_ID), + theOtherAssetInbox (OTHER_NYM_ID, pOtherTrade->GetSenderAcctID(), SERVER_ID), + theOtherCurrencyInbox (OTHER_NYM_ID, pOtherTrade->GetCurrencyAcctID(),SERVER_ID); + + // ALL inboxes -- no outboxes. All will receive notification of something ALREADY DONE. + bool bSuccessLoadingFirstAsset = theFirstAssetInbox.LoadInbox(); + bool bSuccessLoadingFirstCurrency = theFirstCurrencyInbox.LoadInbox(); + bool bSuccessLoadingOtherAsset = theOtherAssetInbox.LoadInbox(); + bool bSuccessLoadingOtherCurrency = theOtherCurrencyInbox.LoadInbox(); + + // -------------------------------------------------------------------- + + // ...or generate them otherwise... + + if (true == bSuccessLoadingFirstAsset) + bSuccessLoadingFirstAsset = theFirstAssetInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingFirstAsset = theFirstAssetInbox.GenerateLedger(theTrade.GetSenderAcctID(), SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (true == bSuccessLoadingFirstCurrency) + bSuccessLoadingFirstCurrency = theFirstCurrencyInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingFirstCurrency = theFirstCurrencyInbox.GenerateLedger(theTrade.GetCurrencyAcctID(), SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (true == bSuccessLoadingOtherAsset) + bSuccessLoadingOtherAsset = theOtherAssetInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingOtherAsset = theOtherAssetInbox.GenerateLedger(pOtherTrade->GetSenderAcctID(), SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (true == bSuccessLoadingOtherCurrency) + bSuccessLoadingOtherCurrency = theOtherCurrencyInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingOtherCurrency = theOtherCurrencyInbox.GenerateLedger(pOtherTrade->GetCurrencyAcctID(), SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + + // -------------------------------------------------------------------- + + if ((false == bSuccessLoadingFirstAsset) || + (false == bSuccessLoadingFirstCurrency)) + { + OTLog::Error("ERROR loading or generating an inbox for first trader in OTMarket::ProcessTrade.\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + theTrade.FlagForRemoval(); // Removes from Cron. + return; + } + else if ((false == bSuccessLoadingOtherAsset) || + (false == bSuccessLoadingOtherCurrency)) + { + OTLog::Error("ERROR loading or generating an inbox for other trader in OTMarket::ProcessTrade.\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + pOtherTrade->FlagForRemoval(); // Removes from Cron. + return; + } + else + { + // Generate new transaction numbers for these new transactions + long lNewTransactionNumber = pCron->GetNextTransactionNumber(); + +// OT_ASSERT(lNewTransactionNumber > 0); // this can be my reminder. + if (0 == lNewTransactionNumber) + { + OTLog::Output(0, "WARNING: Market is unable to process because there are no more transaction numbers available.\n"); + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); + // (Here I flag neither trade for removal.) + return; + } + + // Why a new transaction number here? + // + // Each user had to burn one of his own numbers to generate his own Trade. + // + // So the First Trader might have used number 345, and the Other Trader might have + // used the number 912. Those numbers were used to CREATE the Trades initially, and + // they can be used to lookup the original trade request from each user. + // + // So whenever I give a receipt to either Trader, I am sure to tell Trader A that + // this is in reference to transaction 345, and I tell Trader B that this is in + // reference to transaction 912. + // + // I also have to get a new transaction number (here) because the first two numbers + // were requests signed by the users to post the trades. That was completed--those + // numbers have been used now, and they could not be used again without introducing + // duplication and confusion. To remove money from someone's account, which we have just + // done, you need a new transaction number for that! Because you need a new number if + // you're going to put some new receipt in their inbox, which is exactly what we are + // doing right now. + // + // So let's say I generate transaction # 10023 to represent this money exchange that has + // just occurred between these two traders. To me as a user, 345 was my original request + // to post the trade, 912 was the other guy's request to post his trade, and 10023 was + // the server's transferring funds (based on the authorization in those trades). Put + // another way, 345 has my signature, 912 has the other trader's signature, and 10023 + // has the server's signature. + + + // Start generating the receipts (for all four inboxes.) + + OTTransaction * pTrans1 = OTTransaction::GenerateTransaction(theFirstAssetInbox, + OTTransaction::marketReceipt, lNewTransactionNumber); + + OTTransaction * pTrans2 = OTTransaction::GenerateTransaction(theFirstCurrencyInbox, + OTTransaction::marketReceipt, lNewTransactionNumber); + + OTTransaction * pTrans3 = OTTransaction::GenerateTransaction(theOtherAssetInbox, + OTTransaction::marketReceipt, lNewTransactionNumber); + + OTTransaction * pTrans4 = OTTransaction::GenerateTransaction(theOtherCurrencyInbox, + OTTransaction::marketReceipt, lNewTransactionNumber); + + // (No need to OT_ASSERT on the above transactions since it occurs in GenerateTransaction().) + + + // All four inboxes will get receipts with the same (new) transaction ID. + // They all have a "reference to" containing the original trade. + // The first two will contain theTrade as the reference field, + // but the second two contain pOtherTrade as the reference field. + // The first two also thus reference a different original transaction number than the other two. + // That's because each end of the trade was originally authorized separately by each trader, and + // in each case he used his own unique transaction number to do so. + + + // set up the transaction items (each transaction may have multiple items... but not in this case.) + OTItem * pItem1 = OTItem::CreateItemFromTransaction(*pTrans1, OTItem::marketReceipt); + OTItem * pItem2 = OTItem::CreateItemFromTransaction(*pTrans2, OTItem::marketReceipt); + OTItem * pItem3 = OTItem::CreateItemFromTransaction(*pTrans3, OTItem::marketReceipt); + OTItem * pItem4 = OTItem::CreateItemFromTransaction(*pTrans4, OTItem::marketReceipt); + + // these may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave em. + OT_ASSERT(NULL != pItem1); OT_ASSERT(NULL != pItem2); + OT_ASSERT(NULL != pItem3); OT_ASSERT(NULL != pItem4); + + pItem1->SetStatus(OTItem::rejection); // the default. + pItem2->SetStatus(OTItem::rejection); // the default. + pItem3->SetStatus(OTItem::rejection); // the default. + pItem4->SetStatus(OTItem::rejection); // the default. + + + // Calculate the amount and remove / add it to the relevant accounts. + // Make sure each Account can afford it, and roll back in case of failure. + + bool bMove1 = false; + bool bMove2 = false; + bool bMove3 = false; + bool bMove4 = false; + + + // -- TheTrade will get the PriceLimit offered by theOtherOffer, and not vice-versa. + // (See explanation below this function if you need to know the reasoning.) + + // Some logic described: + // + // Calculate the price + // I know the amount available for trade is at LEAST the minimum increment on both + // sides, since that was validated before this function was even called. Therefore, + // let's calculate a price based on the largest of the two minimum increments. + // Figure out which is largest, then divide that by the scale to get the multiplier. + // Multiply THAT by the theOtherOffer's Price Limit to get the price per minimum increment. + // + // Since we are calculating the MINIMUM that must be processed per round, let's also + // calculate the MOST that could be traded between these two offers. Then let's + // mod that to the Scale and remove the remainder, then divide by the Scale and + // multiply by the price (to get the MOST that would have to be paid, if the offers + // fulfilled each other to the maximum possible according to their limits.) + // !! It's better to process it all at once and avoid the loop entirely. + // Plus, there's SUPPOSED to be enough funds in all the accounts to cover it. + // + // Anyway, if there aren't: + // + // Then LOOP (while available >= minimum increment) on both sides of the trade + // Inside, try to move funds across all 4 accounts. If any of them fail, roll them + // back and break. (I'll check balances first to avoid this.) + // As long as there's enough available in the accounts to continue exchanging the + // largest minimum increment, then keep looping like this and moving the digital assets. + // Each time, also, be sure to update the Offer so that less and less is available on each trade. + // At some point, the Trades will run out of authorization to transfer any more from the accounts. + // Perhaps one has a 10,000 bushel total limit and it has been reached. The trade is complete, + // from his side of it, anyway. Then the loop will be over for sure. + + + OTAccount * pAssetAccountToDebit = NULL; + OTAccount * pAssetAccountToCredit = NULL; + OTAccount * pCurrencyAccountToDebit = NULL; + OTAccount * pCurrencyAccountToCredit = NULL; + + if (theOffer.IsAsk()) // I'm selling, he's buying + { + pAssetAccountToDebit = pFirstAssetAcct; // I am selling gold. When I sell, my gold balance goes down. + pAssetAccountToCredit = pOtherAssetAcct; // He is bidding on gold. When he buys, his gold balance goes up. + pCurrencyAccountToDebit = pOtherCurrencyAcct; // He is paying in dollars. When he pays, his dollar balance goes down. + pCurrencyAccountToCredit = pFirstCurrencyAcct; // I am being paid in dollars. When I get paid, my dollar balance goes up. + } + else // I'm buying, he's selling + { + pAssetAccountToDebit = pOtherAssetAcct; // He is selling gold. When he sells, his gold balance goes down. + pAssetAccountToCredit = pFirstAssetAcct; // I am bidding on gold. When I buy, my gold balance goes up. + pCurrencyAccountToDebit = pFirstCurrencyAcct; // I am paying in dollars. When I pay, my dollar balance goes down. + pCurrencyAccountToCredit = pOtherCurrencyAcct; // He is being paid in dollars. When he gets paid, his dollar balance goes up. + } + + // Calculate minimum increment to be traded each round. + long lMinIncrementPerRound = + ((theOffer.GetMinimumIncrement() > theOtherOffer.GetMinimumIncrement()) ? + theOffer.GetMinimumIncrement() : theOtherOffer.GetMinimumIncrement()); + + const long lMultiplier = (lMinIncrementPerRound / GetScale()); // If the Market scale is 10, and the minimum increment is 50, multiplier is 5.. + // The price limit is per scale. (Per 10.) So if 1oz gold is $1300, then 10oz scale + // would be $13,000. So if my price limit is per SCALE, I might set my limit + // to $12,000 or $13,000 (PER 10 OZ OF GOLD, which is the SCALE for this market.) + + // Calc price of each round. + long lPrice = ( lMultiplier * theOtherOffer.GetPriceLimit() ); // So if my minimum increment is 50, then my multiplier is 5, which + // means multiply my price by 5: $13,000 * 5 == $65,000 for 50 oz. per minimum inc. + + // Why am I using the OTHER Offer's price limit, and not my own? + // See notes at top and bottom of this function for the answer. + // ---------------------------------------------------------------------------- + + // There's two ways to process this: in rounds (by minimum increment), for which the numbers were + // just calulated above... + // + // ...OR based on whatever is the MOST available from BOTH parties. (Whichever is the least of the + // two parties' "Most Available Left To Trade".) So I'll try THAT first, to avoid processing in + // rounds. (Since the funds SHOULD be there...) + + long lMostAvailable = ((theOffer.GetAmountAvailable() > theOtherOffer.GetAmountAvailable()) ? + theOtherOffer.GetAmountAvailable() : theOffer.GetAmountAvailable()); + long lTemp = lMostAvailable % GetScale(); // The Scale may not evenly divide into the amount available + lMostAvailable -= lTemp; // We'll subtract remainder amount, so it's even to scale (which is how it's priced.) + + // We KNOW the amount available on the offer is at least as much as the minimum increment (on both sides) + // because that is verified in the caller function. So we KNOW either side can process the minimum, at least + // based on the authorization in the offers (not necessarily in the accounts themselves, though they are + // SUPPOSED to have enough funds to cover it...). + // Next question is: can both sides process the MOST AVAILABLE? If so, do THAT, instead of rounds. + + const long lOverallMultiplier = lMostAvailable / GetScale(); // Price is per scale + + // Why theOtherOffer's price limit instead of theOffer's? See notes top/bottom this function. + const long lMostPrice = ( lOverallMultiplier * theOtherOffer.GetPriceLimit() ); + + // To avoid rounds, first I see if I can satisfy the entire order at once on either side... + if ((pAssetAccountToDebit->GetBalance() >= lMostAvailable) && + (pCurrencyAccountToDebit->GetBalance() >= lMostPrice) + ) + { // There's enough the accounts to do it all at once! No need for rounds. + + + lMinIncrementPerRound = lMostAvailable; + lPrice = lMostPrice; + + // By setting the ABOVE two values the way that I did, it means the below loop + // will execute properly, BUT ONLY ITERATING ONCE. Basically this section of + // code just optimizes that loop when possible by allowing it to execute + // only once. + } + + + // ---------------------------------------------------------------------------- + + // Otherwise, I go ahead and process it in rounds by minimum increment... + // (Since the funds ARE supposed to be there to process the whole thing, I COULD + // choose to cancel the offender right now! I might put an extra fee in this loop or + // just remove it. The software would still be functional, it would just enforce the + // account having enough funds to cover the full offer at all times--if it wants to + // trade at all.) + + bool bSuccess = false; + + long lOfferFinished = 0, lOtherOfferFinished = 0; // We store these up and then add the totals to the offers at the end (only upon success.) + long lTotalPaidOut = 0; // However much is paid for the assets, total. + + // Continuing the example from above, each round I will trade: + // 50 oz lMinIncrementPerRound, in return for $65,000 lPrice. + while ((lMinIncrementPerRound <= (theOffer.GetAmountAvailable()-lOfferFinished)) && // The primary offer has at least 50 available to trade (buy OR sell) + (lMinIncrementPerRound <= (theOtherOffer.GetAmountAvailable()-lOtherOfferFinished))&& // The other offer has at least 50 available for trade also. + (lMinIncrementPerRound <= pAssetAccountToDebit->GetBalance()) && // Asset Acct to be debited has at least 50 available. + (lPrice <= pCurrencyAccountToDebit->GetBalance()) ) // Currency Acct to be debited has at least 65000 available. + { + // Within this block, the offer is authorized on both sides, and there is enough in + // each of the relevant accounts to cover the round, (for SURE.) So let's DO it. + + bMove1 = pAssetAccountToDebit->Debit(lMinIncrementPerRound); + bMove2 = pCurrencyAccountToDebit->Debit(lPrice); + + bMove3 = pAssetAccountToCredit->Credit(lMinIncrementPerRound); + bMove4 = pCurrencyAccountToCredit->Credit(lPrice); + + // If ANY of these failed, then roll them all back and break. + if (!bMove1 || !bMove2 || !bMove3 || !bMove4) + { + OTLog::Error("Very strange! Funds were available but debit or credit failed while performing trade.\nAttempting rollback!\n"); + // We won't save the files anyway, if this failed. So the rollback is actually superfluous but somehow worthwhile. + rollback_four_accounts(*pAssetAccountToDebit, bMove1, lMinIncrementPerRound, + *pCurrencyAccountToDebit, bMove2, lPrice, + *pAssetAccountToCredit, bMove3, lMinIncrementPerRound, + *pCurrencyAccountToCredit, bMove4, lPrice); + + bSuccess = false; + break; + } + + // At this point, we know all the debits and credits were successful (FOR THIS ROUND.) + // Also notice that the Trades and Offers have not been changed at all--only the accounts. + bSuccess = true; + + // So let's adjust the offers to reflect this also... + // The while() above checks these values in GetAmountAvailable(). + lOfferFinished += lMinIncrementPerRound; + lOtherOfferFinished += lMinIncrementPerRound; + + lTotalPaidOut += lPrice; + } + + + // At this point, it has gone god-knows-how-many rounds, (or just one) and then broke out, + // with bSuccess=false, OR finished properly when the while() terms were fulfilled, with bSuccess = true. + // + // My point? If there was a screw-up, EVEN if the rollback was successful, it STILL only rolled-back + // the most RECENT round -- There still might have been 20 rounds processed before the break. + // (Funds could still have been moved, even if rollback was successful.) THEREFORE, DO NOT SAVE if false. + // We only save those accounts if bSuccess == true. The Rollback is not good enough + + + if (true == bSuccess) + { + // ALL of the four accounts involved need to get a receipt of this trade in their inboxes... + pItem1->SetStatus(OTItem::acknowledgement); // pFirstAssetAcct + pItem2->SetStatus(OTItem::acknowledgement); // pFirstCurrencyAcct + pItem3->SetStatus(OTItem::acknowledgement); // pOtherAssetAcct + pItem4->SetStatus(OTItem::acknowledgement); // pOtherCurrencyAcct + + + // Everytime a trade processes, a receipt is put in the user's inbox. + // This contains a copy of the current trade (which took money from the user's acct.) + // + // ==> So I increment the trade count each time before dropping the receipt. (I also use a fresh + // transaction number when I put it into the inbox.) That way, the user will never get the same + // receipt for the same trade twice. It cannot take funds from his account, without a new trade + // count and a new transaction number on a new receipt. Until the user accepts the receipt out + // of his inbox with a new balance agreement, the existing receipts can be added up and compared + // to the last balance agreement, to verify the current balance. Every receipt from a processing + // trade will have the user's authorization, signature, and terms, as well as the update in balances + // due to the trade, signed by the server. + + theTrade.IncrementTradesAlreadyDone(); + pOtherTrade->IncrementTradesAlreadyDone(); + + theOffer.IncrementFinishedSoFar(lOfferFinished); // I was storing these up in the loop above. + theOtherOffer.IncrementFinishedSoFar(lOtherOfferFinished); // I was storing these up in the loop above. + + // These have updated values, so let's save them. + theTrade.ReleaseSignatures(); + theTrade.SignContract(*pServerNym); + theTrade.SaveContract(); + + pOtherTrade->ReleaseSignatures(); + pOtherTrade->SignContract(*pServerNym); + pOtherTrade->SaveContract(); + + theOffer.ReleaseSignatures(); + theOffer.SignContract(*pServerNym); + theOffer.SaveContract(); + + theOtherOffer.ReleaseSignatures(); + theOtherOffer.SignContract(*pServerNym); + theOtherOffer.SaveContract(); + + // ----------------------------------------------------------- + + m_lLastSalePrice = theOtherOffer.GetPriceLimit(); // Priced per scale. + + // ----------------------------------------------------------- + // Here we save this trade in a list of the most recent 50 trades. + { + if (NULL == m_pTradeList) + { + m_pTradeList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_TRADE_LIST_MARKET)); + } + + OTDB::TradeDataMarket * pTradeData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_TRADE_DATA_MARKET)); + OTCleanup theDataAngel(*pTradeData); + + // -------------------------------------------- + + const long & lTransactionNum = theOffer.GetTransactionNum(); + const time_t theDate = time(NULL); + const long & lPriceLimit = theOtherOffer.GetPriceLimit(); // Priced per scale. + const long & lAmountSold = lOfferFinished; + + pTradeData->transaction_id = to_string(lTransactionNum); + pTradeData->date = to_string(theDate); + pTradeData->price = to_string(lPriceLimit); + pTradeData->amount_sold = to_string(lAmountSold); + + // ------------------------------------------------------ + + // *pTradeData is CLONED at this time (I'm still responsible to delete.) + // That's also why I add it here, below: So the data is set right before the cloning occurs. + // + m_pTradeList->AddTradeDataMarket(*pTradeData); + + // Here we erase the oldest elements so the list never exceeds 50 elements total. + // + while (m_pTradeList->GetTradeDataMarketCount() > MAX_MARKET_QUERY_DEPTH) + m_pTradeList->RemoveTradeDataMarket(0); + } + + // ------------------------------------------------------------- + + // Account balances have changed based on these trades that we just processed. + // Make sure to save the Market since it contains those offers that have just updated. + SaveMarket(); + + // The Trade has changed, and it is stored as a CronItem. So I save Cron as well, for + // the same reason I saved the Market. + pCron->SaveCron(); + } + + // ----------------------------------------------------------------- + // + // EVERYTHING BELOW is just about notifying the users, by dropping the receipt in their + // inboxes. + // + // (The Trade, Offer, Cron, and Market are ALL updated and SAVED as of this point.) + // + // ----------------------------------------------------------------- + + + + // The TRANSACTION will be sent with "In Reference To" information containing the + // ORIGINAL SIGNED TRADE (which includes the ORIGINAL SIGNED OFFER inside of it.) + // + // Whereas the TRANSACTION ITEM includes a "Note" containing the UPDATED TRADE, + // (with the SERVER's SIGNATURE) as well as an "attachment" containing the UPDATED + // OFFER (again, with the server's signature on it.) + + // I was doing this above, but had to move it all down here, since the Trade + // and Offer have just finally been updated to their final values... + + // Here I make sure that each trader's receipt (each inbox notice) references the + // transaction number that the trader originally used to issue the trade... + // This number is used to match up offers to trades, and used to track all cron items. + // (All Cron items require a transaction from the user to add them to Cron in the + // first place.) + // + pTrans1->SetReferenceToNum(theTrade.GetTransactionNum()); + pTrans2->SetReferenceToNum(theTrade.GetTransactionNum()); + pTrans3->SetReferenceToNum(pOtherTrade->GetTransactionNum()); + pTrans4->SetReferenceToNum(pOtherTrade->GetTransactionNum()); + + // Then, I make sure the Reference string on the Transaction contains the + // ORIGINAL TRADE (with the TRADER's SIGNATURE ON IT!) For both traders. + + OTCronItem * pOrigTrade = NULL; + OTCronItem * pOrigOtherTrade = NULL; + + // OTCronItem::LoadCronReceipt loads the original version with the user's signature. + // (Updated versions, as processing occurs, are signed by the server.) + pOrigTrade = OTCronItem::LoadCronReceipt(theTrade.GetTransactionNum()); + pOrigOtherTrade = OTCronItem::LoadCronReceipt(pOtherTrade->GetTransactionNum()); + + OT_ASSERT(NULL != pOrigTrade); + OT_ASSERT(NULL != pOrigOtherTrade); + + OT_ASSERT_MSG(pOrigTrade->VerifySignature(*pFirstNym), + "Signature was already verified on Trade when first added to market, but now it fails.\n"); + OT_ASSERT_MSG(pOrigOtherTrade->VerifySignature(*pOtherNym), + "Signature was already verified on Trade when first added to market, but now it fails.\n"); + + // I now have String copies (PGP-signed XML files) of the original Trade requests... + // Plus I know they were definitely signed by the Nyms (even though that was already + // verified when they were first added to the market--and they have been signed by the + // server nym ever since.) + OTString strOrigTrade(*pOrigTrade), strOrigOtherTrade(*pOrigOtherTrade); + + // The reference on the transaction contains OTCronItem, in this case. + // The original trade for each party, versus the updated trade (which is stored + // on the marketReceipt item just below here.) + // + pTrans1->SetReferenceString(strOrigTrade); + pTrans2->SetReferenceString(strOrigTrade); + pTrans3->SetReferenceString(strOrigOtherTrade); + pTrans4->SetReferenceString(strOrigOtherTrade); + + // Make sure to clean these up. + // TODO: Run a scanner on the code for memory leaks and buffer overflows. + delete pOrigTrade; pOrigTrade = NULL; + delete pOrigOtherTrade; pOrigOtherTrade = NULL; + + // ----------------------------------------------------------------- + + // Here's where the item stores the UPDATED TRADE (in its Note) + // and the UPDATED OFFER (in its attachment) with the SERVER's SIGNATURE + // on both. + // (As a receipt for each trader, so they can see their offer updating.) + + // Lucky I just signed and saved these trades / offers above, or they would + // still have the old data in them. + OTString strTrade(theTrade), strOtherTrade(*pOtherTrade), + strOffer(theOffer), strOtherOffer(theOtherOffer); + + // The marketReceipt ITEM's NOTE contains the UPDATED TRADE. + // + pItem1->SetNote(strTrade); + pItem2->SetNote(strTrade); + pItem3->SetNote(strOtherTrade); + pItem4->SetNote(strOtherTrade); + + /* + + NOTE, todo: Someday, need to reverse these, so that the updated Trade is stored in + the attachment, and the updated offer is stored in the note. This is much more consistent + with other cron receipts, such as paymentReceipt, and finalReceipt. Unfortunately, + marketReceipt is already implemented the opposite of these, but I will fix it someday just + for consistency. See large notes 2/3rds of the way down in OTTrade::onFinalReceipt(). + + */ + + // Also set the ** UPDATED OFFER ** as the ATTACHMENT on the ** item.** + // (With the SERVER's signature on it!) + // (As a receipt for each trader, so they can see their offer updating.) + pItem1->SetAttachment(strOffer); + pItem2->SetAttachment(strOffer); + pItem3->SetAttachment(strOtherOffer); + pItem4->SetAttachment(strOtherOffer); + + + // Inbox receipts need to clearly show the AMOUNT moved... + // Also need to clearly show negative or positive, since that + // is otherwise not obvious just because you have a marketReceipt... + // + // The AMOUNT is stored on the marketReceipt ITEM, on the item list for + // the marketReceipt TRANSACTION. + // + if (theOffer.IsAsk()) // I'm selling, he's buying + { + pItem1->SetAmount(lOfferFinished*(-1)); // first asset + pItem2->SetAmount(lTotalPaidOut); // first currency + pItem3->SetAmount(lOtherOfferFinished); // other asset + pItem4->SetAmount(lTotalPaidOut*(-1)); // other currency + } + else // I'm buying, he's selling + { + pItem1->SetAmount(lOfferFinished); // first asset + pItem2->SetAmount(lTotalPaidOut*(-1)); // first currency + pItem3->SetAmount(lOtherOfferFinished*(-1)); // other asset + pItem4->SetAmount(lTotalPaidOut); // other currency + } + + // ----------------------------------------------------------------- + + if (true == bSuccess) + { + // sign the item + pItem1->SignContract(*pServerNym); + pItem2->SignContract(*pServerNym); + pItem3->SignContract(*pServerNym); + pItem4->SignContract(*pServerNym); + + pItem1->SaveContract(); + pItem2->SaveContract(); + pItem3->SaveContract(); + pItem4->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTrans1->AddItem(*pItem1); + pTrans2->AddItem(*pItem2); + pTrans3->AddItem(*pItem3); + pTrans4->AddItem(*pItem4); + + pTrans1->SignContract(*pServerNym); + pTrans2->SignContract(*pServerNym); + pTrans3->SignContract(*pServerNym); + pTrans4->SignContract(*pServerNym); + + pTrans1->SaveContract(); + pTrans2->SaveContract(); + pTrans3->SaveContract(); + pTrans4->SaveContract(); + + // Here the transactions we just created are actually added to the ledgers. + theFirstAssetInbox. AddTransaction(*pTrans1); + theFirstCurrencyInbox. AddTransaction(*pTrans2); + theOtherAssetInbox. AddTransaction(*pTrans3); + theOtherCurrencyInbox. AddTransaction(*pTrans4); + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theFirstAssetInbox. ReleaseSignatures(); + theFirstCurrencyInbox. ReleaseSignatures(); + theOtherAssetInbox. ReleaseSignatures(); + theOtherCurrencyInbox. ReleaseSignatures(); + + pFirstAssetAcct-> ReleaseSignatures(); + pFirstCurrencyAcct-> ReleaseSignatures(); + pOtherAssetAcct-> ReleaseSignatures(); + pOtherCurrencyAcct-> ReleaseSignatures(); + + // Sign all four of them. + theFirstAssetInbox. SignContract(*pServerNym); + theFirstCurrencyInbox. SignContract(*pServerNym); + theOtherAssetInbox. SignContract(*pServerNym); + theOtherCurrencyInbox. SignContract(*pServerNym); + + pFirstAssetAcct-> SignContract(*pServerNym); + pFirstCurrencyAcct-> SignContract(*pServerNym); + pOtherAssetAcct-> SignContract(*pServerNym); + pOtherCurrencyAcct-> SignContract(*pServerNym); + + // Save all four of them internally + theFirstAssetInbox. SaveContract(); + theFirstCurrencyInbox. SaveContract(); + theOtherAssetInbox. SaveContract(); + theOtherCurrencyInbox. SaveContract(); + + pFirstAssetAcct-> SaveContract(); + pFirstCurrencyAcct-> SaveContract(); + pOtherAssetAcct-> SaveContract(); + pOtherCurrencyAcct-> SaveContract(); + + // TODO: Better rollback capabilities in case of failures here: + + // Save the four inboxes to storage. (File, DB, wherever it goes.) + theFirstAssetInbox. SaveInbox(); + theFirstCurrencyInbox. SaveInbox(); + theOtherAssetInbox. SaveInbox(); + theOtherCurrencyInbox. SaveInbox(); + + // Save the four accounts. + pFirstAssetAcct-> SaveAccount(); + pFirstCurrencyAcct->SaveAccount(); + pOtherAssetAcct-> SaveAccount(); + pOtherCurrencyAcct->SaveAccount(); + } + // If money was short, let's see WHO was short so we can remove his trade. + // Also, if money was short, inbox notices only go to the rejectees. + // But if success, then notices go to all four inboxes. + else + { + OTLog::Output(0, "Unable to perform trade in OTMarket::ProcessTrade\n"); + + // Let's figure out which one it was and remove his trade and offer. + bool bFirstTraderIsBroke = false, + bOtherTraderIsBroke = false; + + // --------------------------------------------------------------------- + + // Here's what's going on here: + // "Figure out if this guy was short, or if it was that guy. Send a notice + // to the one who got rejected for being short on cash. + // + // Else NEITHER was short, so delete them both with no notice. + // + // (After checking both asset accounts, there's another If statement below where + // I repeat this process for the currency accounts as well.) + // + // This whole section occurs because even though the trade and offer were valid + // and good to go, at least one of the four accounts was short of funds. + // + if (pAssetAccountToDebit->GetBalance() < lMinIncrementPerRound) + { + OTItem * pTempItem = NULL; + OTTransaction * pTempTransaction = NULL; + OTLedger * pTempInbox = NULL; + + if (pAssetAccountToDebit == pFirstAssetAcct) + { pTempItem = pItem1; bFirstTraderIsBroke = true; + pTempTransaction = pTrans1; pTempInbox = &theFirstAssetInbox; + + delete pItem3; pItem3 = NULL; + delete pTrans3; pTrans3 = NULL; + } + else // it's the other asset account + { pTempItem = pItem3; bOtherTraderIsBroke = true; + pTempTransaction = pTrans3; pTempInbox = &theOtherAssetInbox; + + delete pItem1; pItem1 = NULL; + delete pTrans1; pTrans1 = NULL; + } + + pTempItem->SetStatus(OTItem::rejection); + pTempItem->SignContract(*pServerNym); + pTempItem->SaveContract(); + + pTempTransaction->AddItem(*pTempItem); + pTempTransaction->SignContract(*pServerNym); + pTempTransaction->SaveContract(); + + pTempInbox->AddTransaction(*pTempTransaction); + + pTempInbox->ReleaseSignatures(); + pTempInbox->SignContract(*pServerNym); + pTempInbox->SaveContract(); + pTempInbox->SaveInbox(); + } + else + { + delete pItem1; pItem1 = NULL; + delete pTrans1; pTrans1 = NULL; + delete pItem3; pItem3 = NULL; + delete pTrans3; pTrans3 = NULL; + } + + // --------------------------------------------------------------------- + + // This section is identical to the one above, except for the currency accounts. + // + if (pCurrencyAccountToDebit->GetBalance() < lPrice) + { + OTItem * pTempItem = NULL; + OTTransaction * pTempTransaction = NULL; + OTLedger * pTempInbox = NULL; + + if (pCurrencyAccountToDebit == pFirstCurrencyAcct) + { pTempItem = pItem2; bFirstTraderIsBroke = true; + pTempTransaction = pTrans2; pTempInbox = &theFirstCurrencyInbox; + + delete pItem4; pItem4 = NULL; + delete pTrans4; pTrans4 = NULL; + } + else // it's the other asset account + { pTempItem = pItem4; bOtherTraderIsBroke = true; + pTempTransaction = pTrans4; pTempInbox = &theOtherCurrencyInbox; + + delete pItem2; pItem2 = NULL; + delete pTrans2; pTrans2 = NULL; + } + + pTempItem->SetStatus(OTItem::rejection); + pTempItem->SignContract(*pServerNym); + pTempItem->SaveContract(); + + pTempTransaction->AddItem(*pTempItem); + pTempTransaction->SignContract(*pServerNym); + pTempTransaction->SaveContract(); + + pTempInbox->AddTransaction(*pTempTransaction); + + pTempInbox->ReleaseSignatures(); + pTempInbox->SignContract(*pServerNym); + pTempInbox->SaveContract(); + pTempInbox->SaveInbox(); + } + else + { + delete pItem2; pItem2 = NULL; + delete pTrans2; pTrans2 = NULL; + delete pItem4; pItem4 = NULL; + delete pTrans4; pTrans4 = NULL; + } + // --------------------------------------------------------------------- + + // If either trader is broke, we flag the trade for removal. + // No other trades will process against it and it will be removed from market soon. + if (bFirstTraderIsBroke) + theTrade.FlagForRemoval(); + if (bOtherTraderIsBroke) + pOtherTrade->FlagForRemoval(); + + } // success == false + } // all four boxes were successfully loaded or generated. + } // "this entire function can be divided..." + + cleanup_four_accounts(pFirstAssetAcct, pFirstCurrencyAcct, pOtherAssetAcct, pOtherCurrencyAcct); +} +// Let's say pBid->Price is $10. He's bidding $10 as his price limit. +// If I was ALREADY selling at $11, then NOTHING HAPPENS. (If we're the only two people on the market.) +// If I was ALREADY SELLING at $8, and a $10 bid came in, it would immediately process our orders and be done. +// If I was ALREADY BIDDING at $10, and an $8 ask came in, it would immediately process our orders and be done. +// +// So the question is, who gets WHAT price? Does the transaction occur at $8 or at $10? Do I get my price limit, +// or does he? Do you split the difference? I decided what to do... here is the REASONING, then CONCLUSION: +// +// REASONING: +// +// If I'm already selling for $8, and a $10 bid comes in, he's only going to choose me since I'm the lowest +// one on the market (and first in line for my price.) Otherwise he has no reason not to choose one of the +// others who are also available at that low price, instead of choosing me. The server would just pick +// whoever was next in line. +// +// And the other sellers also do have a right to get their sales completed, since they ARE willing to sell +// for $8. Obviously none of the other bids wanted me so far, even though I'm the best deal on my market, +// or I would have been snapped up already. But I'm still here. The bidder shouldn't pay more than fair market +// rate, which means more than whatever my competition is charging, and as long as I'm not getting any less +// than my own ask limit, then I HAVE agreed to the price, and it's fair. (I always could have set it higher.) +// +// The prices also were different when I came onto the market. Things were different then. Obviously +// since I'm still here, I wasn't ALWAYS the lowest price. Maybe in fact the price was $3 before, and I had a +// long-standing trade there that said not to sell for less than $8 (with a stop order too, so it didn't even +// activate until then.) THE POINT? I COULD have had the best price on the market THEN, whatever it was, simply +// by checking it and then setting my limit to match. But I didn't choose that. Instead, I set it to $8 limit, +// and then my trade sat there waiting for 6 months or god knows how long until it became valid, when market +// conditions became more favorable to my trade. +// THEN my trade, at some point, became the lowest price on the market (finally) so when someone's brand +// new $10 limit bid comes in, he ALSO deserves the best price on the market, just as I had the same +// opportunity to get the best price when *I* first entered the market. And since I am now first in line with +// $8 as the best price in the market, he should get it at that $8 price. We have both agreed to it! It is +// within BOTH of our limits! Notice we also BOTH got our fair shot up front to have the absolute best price, +// and instead we set our limit outside of what prices were available in order to wait for better offers. +// +// +// CONCLUSION: +// +// THEREFORE: The new Trade should always get the better deal in this function, in the sense that he gets +// the best price possible (the limit) from the other trade (that was already on the market.) And he gets the +// number-one best deal available from that side of the market. The existing trade does NOT get theOffer's +// limit price, but theOffer DOES get the other trade's limit price. This is how it should work. We are not +// going to "split the difference" -- although we might split a percentage off the difference as a server fee. +// I haven't thought that through yet (it's an idea suggested by Andrew Muck.) + + + + +// Return True if Trade should stay on the Cron list for more processing. +// Return False if it should be removed and deleted. +bool OTMarket::ProcessTrade(OTTrade & theTrade, OTOffer & theOffer) +{ + if (theOffer.GetAmountAvailable() < theOffer.GetMinimumIncrement()) + { + OTLog::vOutput(0, "OTMarket::ProcessTrade: Removing offer from market. (Amount Available is less than Min Increment.)\n"); + return false; + } + + // ------------------------ + + long lRelevantPrice = 0; + + // If I'm trying to sell something, then I care about the highest bidder. + if (theOffer.IsAsk()) + lRelevantPrice = GetHighestBidPrice(); + // But if I'm trying to buy something, then I care about the lowest ask price. + else + lRelevantPrice = GetLowestAskPrice(); + + + // If there were no bids/asks (whichever is relevant to this trade) on the market at ALL, + // then lRelevant price will be 0 at this point. In which case we're DONE. + // If I'm selling, and the highest bid is less than my price limit, then we're DONE. + // If I'm buying, and the lowest ask price is higher than my price limit, then we're DONE. + if ((0 == lRelevantPrice) || + (theOffer.IsAsk() && (lRelevantPrice < theOffer.GetPriceLimit())) || + (theOffer.IsBid() && (lRelevantPrice > theOffer.GetPriceLimit()))) + { + // There is nothing on the market currently within my price limits. + // We're DONE. (For now.) + return true; + } + + // If I got this far, that means there ARE bidders or sellers (whichever the current trade cares about) + // in the market WITHIN THIS TRADE'S PRICE LIMITS. So we're going to go up the list of what's available, and trade. + + if (theOffer.IsAsk()) // If I'm selling, + { + OTOffer * pBid = NULL; // then I want to start at the highest bidder and loop DOWN until hitting my price limit. + + // rbegin puts us on the upper bound of the highest bidder (any new bidders at the same price would + // be added at the lower bound, where they are last in line.) The upper bound, on the other hand, is + // first in line. So we start there, and loop backwards until there are no other bids within my price range. + for (mapOfOffers::reverse_iterator rr = m_mapBids.rbegin(); rr != m_mapBids.rend(); rr++) + { + pBid = (*rr).second; + + OT_ASSERT(NULL != pBid); + + // I'm selling. + // If the bid is larger than, or equal to, my low-side-limit, + // and the amount available is at least my minimum increment, (and vice versa) then let's trade! + // + if ((pBid->GetPriceLimit() >= theOffer.GetPriceLimit())) + { + // Notice the above "if" is ONLY based on price... because the "else" returns! + // (Once I am out of my price range, no point to continue looping.) + // So all the other "if"s have to go INSIDE the block here: + if ((pBid->GetAmountAvailable() >= theOffer.GetMinimumIncrement()) && + (theOffer.GetAmountAvailable() >= pBid->GetMinimumIncrement()) && + (NULL != pBid->GetTrade()) && !pBid->GetTrade()->IsFlaggedForRemoval()) + ProcessTrade(theTrade, theOffer, *pBid); // <======== + } + // Else, the bid is lower than I am willing to sell. (And all the remaining bids are even lower.) + else + { + pBid = NULL; + return true; // stay on cron for more processing (for now.) + } + + // The offer has no more trading to do--it's done. + if (theTrade.IsFlaggedForRemoval() || // during processing, the trade may have gotten flagged. + (theOffer.GetMinimumIncrement() > theOffer.GetAmountAvailable())) + return false; // remove this trade from cron + + pBid = NULL; + } + } + // I'm buying + else + { + OTOffer * pAsk = NULL; // then I want to start at the lowest seller and loop UP until hitting my price limit. + + // begin puts us on the lower bound of the lowest seller (any new sellers at the same price would + // be added at the upper bound for that price, where they are last in line.) The lower bound, on the other hand, is + // first in line. So we start there, and loop forwards until there are no other asks within my price range. + for (mapOfOffers::iterator ii = m_mapAsks.begin(); ii != m_mapAsks.end(); ii++) + { + pAsk = (*ii).second; + + OT_ASSERT(NULL != pAsk); + + // I'm buying. + // If the ask price is less than, or equal to, my price limit, + // and the amount available for purchase is at least my minimum increment, (and vice versa) then let's trade! + if ((pAsk->GetPriceLimit() <= theOffer.GetPriceLimit())) + { + // Notice the above "if" is ONLY based on price... because the "else" returns! + // (Once I am out of my price range, no point to continue looping.) + // So all the other "if"s have to go INSIDE the block here: + if ((pAsk->GetAmountAvailable() >= theOffer.GetMinimumIncrement()) && + (theOffer.GetAmountAvailable() >= pAsk->GetMinimumIncrement()) && + (NULL != pAsk->GetTrade()) && !pAsk->GetTrade()->IsFlaggedForRemoval()) + ProcessTrade(theTrade, theOffer, *pAsk); // <======= + } + // Else, the ask price is higher than I am willing to pay. (And all the remaining sellers are even HIGHER.) + else + { + pAsk = NULL; + return true; // stay on the market for now. + } + + // The offer has no more trading to do--it's done. + if (theTrade.IsFlaggedForRemoval() || // during processing, the trade may have gotten flagged. + (theOffer.GetMinimumIncrement() > theOffer.GetAmountAvailable())) + return false; // remove this trade from the market. + + pAsk = NULL; + } + } + + return true; // stay on the market for now. +} + + + +// Make sure the offer is for the right asset type, the right currency, etc. +bool OTMarket::ValidateOfferForMarket(OTOffer & theOffer) +{ + if ((GetServerID() == theOffer.GetServerID()) && + (GetAssetID() == theOffer.GetAssetID()) && + (GetCurrencyID() == theOffer.GetCurrencyID()) && + (GetScale() == theOffer.GetScale()) && // The above four items must match in order for it to even be the same MARKET. + + (theOffer.GetPriceLimit() > 0) && // Price larger than 0. + (theOffer.GetMinimumIncrement() > 0) && // Offer min increment larger than 0. + (theOffer.GetMinimumIncrement() >= GetScale()) && // Offer min increment is at least market scale. + ((theOffer.GetMinimumIncrement() % GetScale()) == 0) && // Offer min evenly divisible by market scale. + (theOffer.GetMinimumIncrement() <= theOffer.GetAmountAvailable())) // Amount available on the offer is at least as much as its own minimum. + { + OTLog::Output(4, "Offer is valid for market.\n"); + return true; + } + else + { + OTLog::Output(4, "Offer is invalid for this market.\n"); + } + + return false; +} + + + + +OTMarket::OTMarket(const char * szFilename) : OTContract(), m_pCron(NULL), m_pTradeList(NULL), m_lScale(1), m_lLastSalePrice(0) +{ + OT_ASSERT(NULL != szFilename); + + m_pCron = NULL; // just for convenience, not responsible to delete. + InitMarket(); + + m_strFilename.Set(szFilename); + m_strFoldername.Set(OTLog::MarketFolder()); +} + + + +OTMarket::OTMarket() : OTContract(), m_pCron(NULL), m_pTradeList(NULL), m_lScale(1), m_lLastSalePrice(0) +{ + m_pCron = NULL; // just for convenience, not responsible to delete. + InitMarket(); +} + + + +OTMarket::OTMarket(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & CURRENCY_TYPE_ID, const long & lScale) : + OTContract(), m_pCron(NULL), m_pTradeList(NULL), m_lScale(1), m_lLastSalePrice(0) +{ + m_pCron = NULL; // just for convenience, not responsible to delete. + InitMarket(); + + m_ASSET_TYPE_ID = ASSET_TYPE_ID; + m_CURRENCY_TYPE_ID = CURRENCY_TYPE_ID; + + m_SERVER_ID = SERVER_ID; + + SetScale(lScale); +} + +// ----------------------------------------- + +OTMarket::~OTMarket() +{ + // No need to call Release() here, the framework will take care of that. +} + + +void OTMarket::InitMarket() +{ + m_strContractType = "MARKET"; + + SetScale(1); +} + + +void OTMarket::Release() +{ + m_ASSET_TYPE_ID.Release(); + m_CURRENCY_TYPE_ID.Release(); + + m_SERVER_ID.Release(); + + // Elements of this list are cleaned up automatically. + if (NULL != m_pTradeList) + { + delete m_pTradeList; + m_pTradeList = NULL; + } + + // If there were any dynamically allocated objects, clean them up here. + while (!m_mapBids.empty()) + { + OTOffer * pOffer = m_mapBids.begin()->second; + m_mapBids.erase(m_mapBids.begin()); + delete pOffer; + pOffer = NULL; + } + while (!m_mapAsks.empty()) + { + OTOffer * pOffer = m_mapAsks.begin()->second; + m_mapAsks.erase(m_mapAsks.begin()); + delete pOffer; + pOffer = NULL; + } + + OTContract::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything (just out of convenience. Not always the right move.) + InitMarket(); +} + + + + +bool OTMarket::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTMarket.h b/OTLib/OTMarket.h new file mode 100644 index 000000000..b79476c04 --- /dev/null +++ b/OTLib/OTMarket.h @@ -0,0 +1,293 @@ +/************************************************************** + * + * OTMarket.h + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// A market has a list of OTOffers for all the bids, and another list of OTOffers for all the asks. +// Presumably the server will have different markets for different asset types. + +#ifndef __OTMARKET_H__ +#define __OTMARKET_H__ + +#include "OTContract.h" +#include "OTOffer.h" +#include "OTStorage.h" + + +#define MAX_MARKET_QUERY_DEPTH 50 // todo add this to the ini file. (Now that we actually have one.) + +// Multiple offers, mapped by price limit. +// Using multi-map since there will be more than one offer for each single price. +// (Map would only allow a single item on the map for each price.) +typedef std::multimap mapOfOffers; + +// The same offers are also mapped (uniquely) to transaction number. +typedef std::map mapOfOffersTrnsNum; + + +class OTMarket : public OTContract +{ +private: + + OTCron * m_pCron; // The Cron object that owns this Market. + + + OTDB::TradeListMarket * m_pTradeList; + + mapOfOffers m_mapBids; // The buyers, ordered by price limit + mapOfOffers m_mapAsks; // The sellers, ordered by price limit + + mapOfOffersTrnsNum m_mapOffers; // All of the offers on a single list, ordered by transaction number. + + OTIdentifier m_SERVER_ID; // Always store this in any object that's associated with a specific server. + + // Every market involves a certain asset type being traded in a certain currency. + OTIdentifier m_ASSET_TYPE_ID; // This is the GOLD market. (Say.) | (GOLD for + OTIdentifier m_CURRENCY_TYPE_ID; // Gold is trading for DOLLARS. | DOLLARS, for example.) + + // Each Offer on the market must have a minimum increment that this divides equally into. + // (There is a "gold for dollars, minimum 1 oz" market, a "gold for dollars, min 500 oz" market, etc.) + long m_lScale; + + long m_lLastSalePrice; + + // The server stores a map of markets, one for each unique combination of asset types. + // That's what this market class represents: one asset type being traded and priced in another. + // It could be wheat for dollars, wheat for yen, or gold for dollars, or gold for wheat, or + // gold for oil, or oil for wheat. REALLY, THE TWO ARE JUST ARBITRARY ASSET TYPES. But in + // order to keep terminology clear, I will refer to one as the "asset type" and the other as + // the "currency type" so that it stays VERY clear which asset type is up for sale, and which + // asset type (currency type) it is being priced in. Other than that, the two are technically + // interchangeable. + +public: + bool ValidateOfferForMarket(OTOffer & theOffer); + + OTOffer * GetOffer(const long & lTransactionNum); + bool AddOffer(OTOffer & theOffer, bool bSaveFile=true); + bool RemoveOffer(const long & lTransactionNum); + + // ----------------------------------------------------- + + // returns general information about offers on the market + bool GetOfferList(OTASCIIArmor & ascOutput, long lDepth, int & nOfferCount); + bool GetRecentTradeList(OTASCIIArmor & ascOutput, int & nTradeCount); + + // Returns more detailed information about offers for a specific Nym. + bool GetNym_OfferList(const OTIdentifier & NYM_ID, OTDB::OfferListNym & theOutputList, int & nNymOfferCount); + + // Assumes a few things: Offer is part of Trade, and both have been + // proven already to be a part of this market. + // Basically the Offer is looked up on the Market by the Trade, and + // then both are passed in here. + // --Returns True if Trade should stay on the Cron list for more processing. + // --Returns False if it should be removed and deleted. + void ProcessTrade(OTTrade & theTrade, OTOffer & theOffer, OTOffer & theOtherOffer); + bool ProcessTrade(OTTrade & theTrade, OTOffer & theOffer); + + long GetHighestBidPrice(); + long GetLowestAskPrice(); + + mapOfOffers::size_type GetBidCount() { return m_mapBids.size(); } + mapOfOffers::size_type GetAskCount() { return m_mapAsks.size(); } + + // ----------------------------------------------------- + + void SetAssetID(const OTIdentifier & ASSET_ID) { m_ASSET_TYPE_ID = ASSET_ID; } + void SetCurrencyID(const OTIdentifier & CURRENCY_ID) { m_CURRENCY_TYPE_ID = CURRENCY_ID; } + void SetServerID(const OTIdentifier & SERVER_ID) { m_SERVER_ID = SERVER_ID; } + + inline const OTIdentifier & GetAssetID() const { return m_ASSET_TYPE_ID; } + inline const OTIdentifier & GetCurrencyID() const { return m_CURRENCY_TYPE_ID; } + inline const OTIdentifier & GetServerID() const { return m_SERVER_ID; } + + inline const long & GetScale() + { if (m_lScale < 1) m_lScale = 1; return m_lScale; } + inline void SetScale(const long & lScale) + { m_lScale = lScale; if (m_lScale < 1) m_lScale = 1; } + + inline const long & GetLastSalePrice() + { if (m_lLastSalePrice < 1) m_lLastSalePrice = 1; return m_lLastSalePrice; } + inline void SetLastSalePrice(const long & lLastSalePrice) + { m_lLastSalePrice = lLastSalePrice; if (m_lLastSalePrice < 1) m_lLastSalePrice = 1; } + + // ----------------------------- + + long GetTotalAvailableAssets(); + + // ----------------------------------------------------- + + OTMarket(); + OTMarket(const char * szFilename); + OTMarket(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & CURRENCY_TYPE_ID, const long & lScale); + + virtual ~OTMarket(); + + + // Overridden from OTContract. + virtual void GetIdentifier(OTIdentifier & theIdentifier); + + inline void SetCronPointer(OTCron & theCron) { m_pCron = &theCron; } + inline OTCron * GetCron() { return m_pCron; } + + // ----------------------------------------------------- + + bool LoadMarket(); + bool SaveMarket(); + + void InitMarket(); + + virtual void Release(); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + +#endif // __OTMARKET_H__ + + + + + + + + + + + + + + + diff --git a/OTLib/OTMessage.cpp b/OTLib/OTMessage.cpp new file mode 100644 index 000000000..a075f493a --- /dev/null +++ b/OTLib/OTMessage.cpp @@ -0,0 +1,3668 @@ +/************************************************************************************ + * + * OTMessage.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTMessage.h" +#include "OTString.h" +#include "OTStringXML.h" +#include "OTASCIIArmor.h" + +#include "OTLog.h" + +// PROTOCOL DOCUMENT ------------------------------------------- + +// --- This is the file that implements the entire message protocol. +// (Transactions are in a different file.) + + + + +// The framework (OTContract) will call this function at the appropriate time. +// OTMessage is special because it actually does something here, when most contracts +// are read-only and thus never update their contents. +// Messages, obviously, are different every time, and this function will be called +// just prior to the signing of the message, in OTContract::SignContract. +void OTMessage::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + m_xmlUnsigned.Concatenate("\n\n", m_strVersion.Get()); + + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("getMarketList")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@getMarketList")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " depth=\"%ld\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_lDepth + ); + + if (m_bSuccess && (m_ascPayload.GetLength() > 2) && (m_lDepth > 0)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + else if (!m_bSuccess && (m_ascInReferenceTo.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + +// std::cerr << m_xmlUnsigned.Get() << std::endl; + } // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("getMarketOffers")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " marketID=\"%s\"\n" // stored in NymID2 + " depth=\"%ld\"" + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strNymID2.Get(), // Storing Market ID + m_lDepth + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@getMarketOffers")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " marketID=\"%s\"\n" // stored in NymID2 + " depth=\"%ld\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strNymID2.Get(), // Storing Market ID + m_lDepth + ); + + if (m_bSuccess && (m_ascPayload.GetLength() > 2) && (m_lDepth > 0)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + else if (!m_bSuccess && (m_ascInReferenceTo.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("getMarketRecentTrades")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " marketID=\"%s\"" // stored in NymID2 + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strNymID2.Get() // Storing Market ID + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@getMarketRecentTrades")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " marketID=\"%s\"\n" // stored in NymID2 + " depth=\"%ld\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strNymID2.Get(), // Storing Market ID + m_lDepth + ); + + if (m_bSuccess && (m_ascPayload.GetLength() > 2) && (m_lDepth > 0)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + else if (!m_bSuccess && (m_ascInReferenceTo.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("getNym_MarketOffers")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@getNym_MarketOffers")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " depth=\"%ld\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_lDepth + ); + + if (m_bSuccess && (m_ascPayload.GetLength() > 2) && (m_lDepth > 0)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + else if (!m_bSuccess && (m_ascInReferenceTo.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // NOTE: the below two messages are not going to be used. TODO: remove them. + // ------------------------------------------------------------------------ + /* + if (m_strCommand.Compare("getOffer_Trades")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " inRefToNum=\"%ld\"" + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_lTransactionNum + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@getOffer_Trades")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " inRefToNum=\"%ld\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_lTransactionNum + ); + + if (!m_bSuccess && (m_ascInReferenceTo.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + else if (m_bSuccess && (m_ascPayload.GetLength() > 2)) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + */ + + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("checkServerID")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n%s\n\n", m_strNymPublicKey.Get()); + + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@checkServerID")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("createUserAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n%s\n\n", m_strNymPublicKey.Get()); + + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@createUserAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength() > 2) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("deleteUserAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " requestNum=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strRequestNum.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@deleteUserAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(),(m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength() > 2) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("checkUser")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " nymID2=\"%s\"\n" + " requestNum=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strNymID2.Get(), + m_strRequestNum.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@checkUser")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " nymID2=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strNymID2.Get(), + m_strServerID.Get() + ); + + if (m_bSuccess) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_strNymPublicKey.Get()); + else + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + // This one isn't part of the message protocol, but is used for outmail storage. + // (Because outmail isn't encrypted like the inmail is, since the Nymfile itself + // will soon be encrypted, and there's no need to be redundant also as well in addition on top of that. + // + if (m_strCommand.Compare("outmailMessage")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " nymID2=\"%s\"\n" + " requestNum=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strNymID2.Get(), + m_strRequestNum.Get(), + m_strServerID.Get() + ); + + if (m_ascPayload.GetLength() > 2) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("sendUserMessage")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " nymID2=\"%s\"\n" + " requestNum=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strNymID2.Get(), + m_strRequestNum.Get(), + m_strServerID.Get() + ); + + if (m_ascPayload.GetLength() > 2) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@sendUserMessage")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " nymID2=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strNymID2.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("getRequest")) + { + m_xmlUnsigned.Concatenate("<%s\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + // This is the ONE command where you see a request number coming back from the server. + // In all the other commands, it should be SENT to the server, not received from the server. + if (m_strCommand.Compare("@getRequest")) + { + m_xmlUnsigned.Concatenate("<%s\n" // command + " success=\"%s\"\n" // m_bSuccess + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"" + ">\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("issueAssetType")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"\n" + " assetType=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get(), + m_strAssetID.Get() + ); + + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@issueAssetType")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " accountID=\"%s\"\n" // the new issuer account ID + " nymID=\"%s\"\n" + " assetType=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strAcctID.Get(), + m_strNymID.Get(), + m_strAssetID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("issueBasket")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"\n" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get() + ); + + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@issueBasket")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " accountID=\"%s\"\n" // the new basket issuer account ID + " nymID=\"%s\"\n" + " assetType=\"%s\"\n" // the new Asset Type + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strAcctID.Get(), + m_strNymID.Get(), + m_strAssetID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("createAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"\n" + " assetType=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get(), + m_strAssetID.Get() + ); + +// OTLog::vError("DEBUG: Asset Type length: %d, Value:\n%s\n", m_strAssetID.GetLength(), m_strAssetID.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@createAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " accountID=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strAcctID.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("deleteAssetAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"\n" + " accountID=\"%s\"" + ">\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get(), + m_strAcctID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + if (m_strCommand.Compare("@deleteAssetAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " accountID=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + ">\n\n", + m_strCommand.Get(), (m_bSuccess ? "true" : "false"), + m_strAcctID.Get(), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("notarizeTransactions")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get(), + m_strRequestNum.Get() + ); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@notarizeTransactions")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("getTransactionNum")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@getTransactionNum")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("getNymbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@getNymbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("getInbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@getInbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("getOutbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@getOutbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("getAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTAccount object. + if (m_strCommand.Compare("@getAccount")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("getContract")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTAssetContract object. + if (m_strCommand.Compare("@getContract")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("getMint")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTMint object. + if (m_strCommand.Compare("@getMint")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("processInbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get(), + m_strRequestNum.Get() + ); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@processInbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " accountID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAcctID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("processNymbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strRequestNum.Get() + ); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTLedger object. + if (m_strCommand.Compare("@processNymbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + + + m_xmlUnsigned.Concatenate("\n"); +} + + + + + + + + + + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTMessage::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("OTmessage", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + OTLog::vOutput(2, "\n===> Loading XML for Message into memory structures...\n", m_strVersion.Get()); + + nReturnVal = 1; + } + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("getMarketList", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getMarketList", xml->getNodeName())) + { +// std::cerr << m_xmlUnsigned.Get() << std::endl; + + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + + OTString strDepth = xml->getAttributeValue("depth"); + + if (strDepth.GetLength() > 0) + m_lDepth = atol(strDepth.Get()); + + // ----------------------------------------------------- + + const char * pElementExpected = NULL; + if (m_bSuccess && (m_lDepth > 0)) + pElementExpected = "messagePayload"; + else if (!m_bSuccess) + pElementExpected = "inReferenceTo"; + + if (NULL != pElementExpected) + { + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload.Set(ascTextExpected); + else + m_ascInReferenceTo.Set(ascTextExpected); + } + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get()); // m_ascPayload.Get() + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("getMarketOffers", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + m_strNymID2 = xml->getAttributeValue("marketID"); + + OTString strDepth = xml->getAttributeValue("depth"); + + if (strDepth.GetLength() > 0) + m_lDepth = atol(strDepth.Get()); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n Market ID: %s\n Request #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get(), + m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getMarketOffers", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strNymID2 = xml->getAttributeValue("marketID"); + + + OTString strDepth = xml->getAttributeValue("depth"); + + if (strDepth.GetLength() > 0) + m_lDepth = atol(strDepth.Get()); + + // ----------------------------------------------------- + + const char * pElementExpected = NULL; + if (m_bSuccess && (m_lDepth > 0)) + pElementExpected = "messagePayload"; + else if (!m_bSuccess) + pElementExpected = "inReferenceTo"; + + if (NULL != pElementExpected) + { + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload.Set(ascTextExpected); + else + m_ascInReferenceTo = ascTextExpected; + } + + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n MarketID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get()); // m_ascPayload.Get() + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n MarketID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("getMarketRecentTrades", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + m_strNymID2 = xml->getAttributeValue("marketID"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n Market ID: %s\n Request #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get(), + m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getMarketRecentTrades", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strNymID2 = xml->getAttributeValue("marketID"); + + + OTString strDepth = xml->getAttributeValue("depth"); + + if (strDepth.GetLength() > 0) + m_lDepth = atol(strDepth.Get()); + + // ----------------------------------------------------- + + const char * pElementExpected = NULL; + if (m_bSuccess && (m_lDepth > 0)) + pElementExpected = "messagePayload"; + else if (!m_bSuccess) + pElementExpected = "inReferenceTo"; + + if (NULL != pElementExpected) + { + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload.Set(ascTextExpected); + else + m_ascInReferenceTo = ascTextExpected; + } + + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n MarketID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get()); // m_ascPayload.Get() + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n MarketID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get(), m_strNymID2.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("getNym_MarketOffers", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getNym_MarketOffers", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + + OTString strDepth = xml->getAttributeValue("depth"); + + if (strDepth.GetLength() > 0) + m_lDepth = atol(strDepth.Get()); + + // ----------------------------------------------------- + + const char * pElementExpected = NULL; + if (m_bSuccess && (m_lDepth > 0)) + pElementExpected = "messagePayload"; + else if (!m_bSuccess) + pElementExpected = "inReferenceTo"; + + if (NULL != pElementExpected) + { + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload.Set(ascTextExpected); + else + m_ascInReferenceTo = ascTextExpected; + } + + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get()); // m_ascPayload.Get() + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + // NOTE: the below two messages are not going to be used. TODO: remove them. + // ------------------------------------------------------------------------ + /* + else if (!strcmp("getOffer_Trades", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTString strTransactionNum; + strTransactionNum = xml->getAttributeValue("inRefToNum"); + if (strTransactionNum.Exists()) + m_lTransactionNum = atol(strTransactionNum.Get()); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getOffer_Trades", xml->getNodeName())) + { + OTString strSuccess, strTransactionNum; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + strTransactionNum = xml->getAttributeValue("inRefToNum"); + + if (strTransactionNum.Exists()) + m_lTransactionNum = atol(strTransactionNum.Get()); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "messagePayload"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload.Set(ascTextExpected); + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get()); // m_ascPayload.Get() + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + */ + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("checkServerID", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected = "nymPublicKey"; + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + m_strNymPublicKey.Set(ascTextExpected); + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n\nPublic Key:\n%s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strNymPublicKey.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@checkServerID", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + OTLog::vOutput(1, "\nCommand: %s\nSuccess: %s\nNymID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), strSuccess.Get(), m_strNymID.Get(), + m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("createUserAccount", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected = "nymPublicKey"; + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + m_strNymPublicKey.Set(ascTextExpected); + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n\nPublic Key:\n%s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strNymPublicKey.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@createUserAccount", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nServerID: %s\n\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), m_strNymID.Get(), + m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("deleteUserAccount", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@deleteUserAccount", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nServerID: %s\n\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), m_strNymID.Get(), + m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("getRequest", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@getRequest", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n" + "ServerID: %s\nRequest Number: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("outmailMessage", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strNymID2 = xml->getAttributeValue("nymID2"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + + const char * pElementExpected = "messagePayload"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + // --------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nNymID2: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("sendUserMessage", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strNymID2 = xml->getAttributeValue("nymID2"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + const char * pElementExpected = "messagePayload"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nNymID2: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@sendUserMessage", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strNymID2 = xml->getAttributeValue("nymID2"); + m_strServerID = xml->getAttributeValue("serverID"); + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nNymID2: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + + else if (!strcmp("checkUser", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strNymID2 = xml->getAttributeValue("nymID2"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nNymID2: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@checkUser", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strNymID2 = xml->getAttributeValue("nymID2"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "nymPublicKey"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_strNymPublicKey.Set(ascTextExpected); + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + if (m_bSuccess) + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nNymID2: %s\n" + "ServerID: %s\nNym2 Public Key:\n%s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get(), + m_strNymPublicKey.Get()); + else + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nNymID2: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strNymID2.Get(), m_strServerID.Get() // m_ascInReferenceTo.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("issueAssetType", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + + const char * pElementExpected = "assetContract"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + // --------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s \nNymID: %s\n" + "ServerID: %s\nRequest#: %s\nAsset Type:\n%s\n\n", + m_strCommand.Get(), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get(), m_strAssetID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@issueAssetType", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // If successful, we need to read 2 more things: inReferenceTo and issuerAccount payload. + // If failure, then we only need to read 1 thing: inReferenceTo + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + if (m_bSuccess) + { + const char * pElementExpected = "issuerAccount"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // --------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, + // OR if it was successful but the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength() || (m_bSuccess && !m_ascPayload.GetLength())) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected issuerAccount and/or inReferenceTo elements with text fields in " + "@issueAssetType reply\n"); + return (-1); // error condition + } + + OTString acctContents(m_ascPayload); + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\nAsset Type ID: %s\n" + "ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), m_strNymID.Get(), m_strAcctID.Get(), + m_strAssetID.Get(), m_strServerID.Get() + // m_ascInReferenceTo.Get(), + //acctContents.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("createAccount", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s \nNymID: %s\n" + "ServerID: %s\nRequest#: %s\nAsset Type:\n%s\n\n", + m_strCommand.Get(), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get(), m_strAssetID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@createAccount", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + + // If successful, we need to read 2 more things: inReferenceTo and issuerAccount payload. + // If failure, then we only need to read 1 thing: inReferenceTo + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + if (m_bSuccess) + { + const char * pElementExpected = "newAccount"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // --------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, + // OR if it was successful but the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength() || (m_bSuccess && !m_ascPayload.GetLength())) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected newAccount and/or inReferenceTo elements with text fields in " + "@createAccount reply\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\n" + "ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), m_strNymID.Get(), m_strAcctID.Get(), + m_strServerID.Get() + // m_ascInReferenceTo.Get(), + //acctContents.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("deleteAssetAccount", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + + OTLog::vOutput(1, "\n Command: %s \n NymID: %s\n AccountID: %s\n" + " ServerID: %s\n Request#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), m_strAcctID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@deleteAssetAccount", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // inReferenceTo contains the deleteAssetAccount (original request) + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + // Did we find everything we were looking for? + // If the "command responding to" isn't there, + // OR if it was successful but the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength()) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected inReferenceTo element with text fields in " + "@deleteAssetAccount reply\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\n" + "ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), m_strNymID.Get(), m_strAcctID.Get(), + m_strServerID.Get() + // m_ascInReferenceTo.Get(), + //acctContents.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("issueBasket", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + { + const char * pElementExpected = "currencyBasket"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + // Did we find everything we were looking for? + // If the Payload isn't there, then failure. + if (!m_ascPayload.GetLength()) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected currencyBasket element with text fields in " + "issueBasket message\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\nCommand: %s \nNymID: %s\n" + "ServerID: %s\nRequest#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@issueBasket", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, + // OR if it was successful but the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength()) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected inReferenceTo element with text fields in " + "@issueBasket reply\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\nAssetTypeID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), + m_strNymID.Get(), + m_strAcctID.Get(), + m_strAssetID.Get(), + m_strServerID.Get() + ); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + // ------------------------------------------------------------------------ + + else if (!strcmp("getTransactionNum", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\n Command: %s \n NymID: %s\n" + " ServerID: %s\n Request#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getTransactionNum", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + OTLog::vOutput(1, "\n Command: %s %s\n NymID: %s\n" + " ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), + m_strNymID.Get(), m_strServerID.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("notarizeTransactions", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + { + const char * pElementExpected = "accountLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + OTLog::vOutput(1, "\n Command: %s \n NymID: %s\n AccountID: %s\n" + " ServerID: %s\n Request#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), m_strAcctID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@notarizeTransactions", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // If successful or failure, we need to read 2 more things: + // inReferenceTo and the responseLedger payload. + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + { + const char * pElementExpected = "responseLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, or the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength() || (!m_ascPayload.GetLength())) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected responseLedger and/or inReferenceTo elements with text fields in " + "@notarizeTransactions reply\n"); + return (-1); // error condition + } + + // OTString acctContents(m_ascPayload); + OTLog::vOutput(1, "\n Command: %s %s\n NymID: %s\n AccountID: %s\n" + " ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), + m_strNymID.Get(), m_strAcctID.Get(), m_strServerID.Get() + // m_ascInReferenceTo.Get(), + //acctContents.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("getInbox", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nAccountID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strAcctID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("getNymbox", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(),m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getInbox", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "inboxLedger"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strAcctID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + else if (!strcmp("@getNymbox", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "nymboxLedger"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + else if (!strcmp("getOutbox", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nAccountID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strAcctID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getOutbox", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "outboxLedger"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strAcctID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + /* + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("getContract")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTAssetContract object. + if (m_strCommand.Compare("@getContract")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + if (m_strCommand.Compare("getMint")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"\n" + " requestNum=\"%s\"" + " >\n\n", + m_strCommand.Get(), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get(), + m_strRequestNum.Get() + ); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + } // ------------------------------------------------------------------------ + + + + // ------------------------------------------------------------------------ + + // the Payload contains an ascii-armored OTMint object. + if (m_strCommand.Compare("@getMint")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"\n" + " assetType=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get(), + m_strAssetID.Get() + ); + + if (!m_bSuccess && m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_bSuccess && m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + */ + + // ------------------------------------------------------------------------ + + else if (!strcmp("getAccount", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nAccountID: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strAcctID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getAccount", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "assetAccount"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAccountID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strAcctID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------ + + else if (!strcmp("getContract", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nAsset Type: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strAssetID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getContract", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "assetContract"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAsset Type ID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strAssetID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------ + + else if (!strcmp("getMint", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + OTLog::vOutput(1, "\nCommand: %s\nNymID: %s\nServerID: %s\nAsset Type: %s\nRequest #: %s\n", + m_strCommand.Get(), m_strNymID.Get(), m_strServerID.Get(), m_strAssetID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@getMint", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAssetID = xml->getAttributeValue("assetType"); + + // ----------------------------------------------------- + + const char * pElementExpected; + if (m_bSuccess) + pElementExpected = "mint"; + else + pElementExpected = "inReferenceTo"; + + OTASCIIArmor ascTextExpected; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + + if (m_bSuccess) + m_ascPayload = ascTextExpected; + else + m_ascInReferenceTo = ascTextExpected; + + // ----------------------------------------------------- + + OTLog::vOutput(1, "\nCommand: %s %s\nNymID: %s\nAsset Type ID: %s\n" + "ServerID: %s\n\n", + m_strCommand.Get(), (m_bSuccess ? "SUCCESS" : "FAILED"), + m_strNymID.Get(), m_strAssetID.Get(), m_strServerID.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("processInbox", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + { + const char * pElementExpected = "processLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // --------------------------------------------------- + + OTLog::vOutput(1, "\n Command: %s \n NymID: %s\n AccountID: %s\n" + " ServerID: %s\n Request#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), m_strAcctID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("processNymbox", xml->getNodeName())) + { + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strRequestNum = xml->getAttributeValue("requestNum"); + + // ---------------------------------------------------- + { + const char * pElementExpected = "processLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // --------------------------------------------------- + + OTLog::vOutput(1, "\n Command: %s \n NymID: %s\n" + " ServerID: %s\n Request#: %s\n\n", + m_strCommand.Get(), m_strNymID.Get(), + m_strServerID.Get(), m_strRequestNum.Get()); + + nReturnVal = 1; + } + + // ------------------------------------------------------------------------------------------- + + else if (!strcmp("@processInbox", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strAcctID = xml->getAttributeValue("accountID"); + + // If successful or failure, we need to read 2 more things: + // inReferenceTo and the responseLedger payload. + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + { + const char * pElementExpected = "responseLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, or the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength() || (!m_ascPayload.GetLength())) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected responseLedger and/or inReferenceTo elements with text fields in " + "@processInbox reply\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\n Command: %s %s\n NymID: %s\n AccountID: %s\n" + " ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), + m_strNymID.Get(), m_strAcctID.Get(), m_strServerID.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + + else if (!strcmp("@processNymbox", xml->getNodeName())) + { + OTString strSuccess; + strSuccess = xml->getAttributeValue("success"); + if (strSuccess.Compare("true")) + m_bSuccess = true; + else + m_bSuccess = false; + + m_strCommand = xml->getNodeName(); // Command + m_strNymID = xml->getAttributeValue("nymID"); + m_strServerID = xml->getAttributeValue("serverID"); + + // If successful or failure, we need to read 2 more things: + // inReferenceTo and the responseLedger payload. + // At this point, we do not send the REASON WHY if it failed. + + // ---------------------------------------------------- + { + const char * pElementExpected = "inReferenceTo"; + OTASCIIArmor & ascTextExpected = m_ascInReferenceTo; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + { + const char * pElementExpected = "responseLedger"; + OTASCIIArmor & ascTextExpected = m_ascPayload; + + if (false == LoadEncodedTextFieldByName(xml, ascTextExpected, pElementExpected)) + { + OTLog::vError("Error in OTMessage::ProcessXMLNode: " + "Expected %s element with text field, for %s.\n", + pElementExpected, m_strCommand.Get()); + return (-1); // error condition + } + } + // ---------------------------------------------------- + + // Did we find everything we were looking for? + // If the "command responding to" isn't there, or the Payload isn't there, then failure. + if (!m_ascInReferenceTo.GetLength() || (!m_ascPayload.GetLength())) + { + OTLog::Error("Error in OTMessage::ProcessXMLNode:\n" + "Expected responseLedger and/or inReferenceTo elements with text fields in " + "@processNymbox reply\n"); + return (-1); // error condition + } + + OTLog::vOutput(1, "\n Command: %s %s\n NymID: %s\n" + " ServerID: %s\n\n", + // "****New Account****:\n%s\n", + m_strCommand.Get(), (m_bSuccess?"SUCCESS":"FAILED"), + m_strNymID.Get(), m_strServerID.Get() + ); + + nReturnVal = 1; + } + + + // ------------------------------------------------------------------------------------------- + + return nReturnVal; +} + + +// Most contracts do not override this function... +// But OTMessage does, because every request sent to the server needs to be signed. +// And each new request is a new message, that requires a new signature, unlike most +// contracts, (that always stay the same after they are signed.) +// +// We need to update the m_xmlUnsigned member with the message members before the +// actual signing occurs. (Presumably this is the whole reason why the account is being re-signed.) +// +// Normally, in other OTContract and derived classes, m_xmlUnsigned is read +// from the file and then kept read-only, since contracts do not normally change. +// But as new messages are sent, they must be signed. This function insures that +// the most up-to-date member contents are included in the request before it is signed. +// +// Note: Above comment is slightly old. This override is now here only for the purpose +// of releasing the signatures. The other functionality is now handled by the +// UpdateContents member, which is called by the framework, and otherwise empty in +// default, but child classes such as OTMessage and OTAccount override it to save +// their contents just before signing. +// See OTMessage::UpdateContents near the top of this file for an example. +// +bool OTMessage::SignContract(const EVP_PKEY * pkey, OTSignature & theSignature, + const OTString & strHashType) +{ + // I release these, I assume, because a message only has one signer. + ReleaseSignatures(); + + m_bIsSigned = OTContract::SignContract(pkey, theSignature, strHashType); + + if (m_bIsSigned) + { +// OTLog::vError("\n******************************************************\n" +// "Contents of signed message:\n\n%s******************************************************\n\n", m_xmlUnsigned.Get()); + } + else + OTLog::vOutput(1, "Failure signing message:\n%s", m_xmlUnsigned.Get()); + + return m_bIsSigned; +} + + +// Unlike other contracts, which do not change over time, and thus calculate their ID +// from a hash of the file itself, OTMessage objects are different every time. Thus, we +// cannot use a hash of the file to produce the Message ID. +// +// Message ID will probably become an important part of the protocol (to prevent replay attacks..) +// So I will end up using it. But for now, VerifyContractID will always return true. +// +bool OTMessage::VerifyContractID() +{ + return true; +} + + +bool OTMessage::SignContract(const OTPseudonym & theNym) +{ + return OTContract::SignContract(theNym); +} + + +OTMessage::OTMessage() : OTContract(), + m_bIsSigned(false), m_lDepth(0), m_lTransactionNum(0), m_bSuccess(false), m_bBool(false) + +{ + OTContract::m_strContractType.Set("MESSAGE"); +} + + +OTMessage::~OTMessage() +{ + +} + + + + +// This actually saves to any file you want to pass it to. + +bool OTMessage::SaveContractWallet(std::ofstream & ofs) +{ + OTString strContract; + + if (SaveContract(strContract)) + { + ofs << strContract.Get(); + + return true; + } + else + { + return false; + } +} + +/* +bool OTMessage::SaveContractWallet(FILE * fl) +{ + OTString strContract; + + if (SaveContract(strContract)) + { + fprintf(fl, "%s", strContract.Get()); + return true; + } + else { + return false; + } +} +*/ + +/* + else if (!strcmp("condition", xml->getNodeName())) + { + strConditionName = xml->getAttributeValue("name"); + + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + strConditionValue = xml->getNodeData(); + } + else { +OTLog::vError("Error in OTContract::ProcessXMLNode: Condition without value: %s\n", + strConditionName.Get()); + return (-1); // error condition + } + + //Todo: add the conditions to a list in memory (on this object) + +OTLog::vError("Loading condition \"%s\": %s----------(END DATA)----------\n", strConditionName.Get(), + strConditionValue.Get()); + + return 1; + } + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTMessage.h b/OTLib/OTMessage.h new file mode 100644 index 000000000..9f691581d --- /dev/null +++ b/OTLib/OTMessage.h @@ -0,0 +1,202 @@ +/************************************************************** + * + * OTMessage.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTMESSAGE_H__ +#define __OTMESSAGE_H__ + +#include + +#include "irrxml/irrXML.h" +using namespace irr; // irrXML is located in the namespace irr::io +using namespace io; + +#include "OTContract.h" + + + + + +class OTMessage : public OTContract +{ +protected: + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); + virtual int ProcessXMLNode(IrrXMLReader*& xml); + + bool SignContract(const EVP_PKEY * pkey, + OTSignature & theSignature, + const OTString & strHashType); + virtual void UpdateContents(); + + bool m_bIsSigned; + +public: + OTMessage(); + virtual ~OTMessage(); + + bool VerifyContractID(); + + // for some inexplicable reason, polymorphism appears to fail and I can't sign + // a message without casting it as a contract first. So I'm explicitly overriding + // the method here so try and force the issue. + virtual bool SignContract(const OTPseudonym & theNym); + + OTString m_strCommand; // perhaps @register is the string for "reply to register" a-ha + OTString m_strServerID; // This is sent with every message for security reasons. + OTString m_strNymID; // The hash of the user's public key... or x509 cert. + OTString m_strNymID2; // If the user requests public key of another user. ALSO used for MARKET ID sometimes. + OTString m_strNymPublicKey; // The user's public key... or x509 cert. + OTString m_strAssetID; // The hash of the contract for whatever digital asset is referenced. + OTString m_strAcctID; // The unique ID of an asset account. + OTString m_strType; // . + OTString m_strRequestNum; // Every user has a request number. This prevents messages from + // being intercepted and repeated by attackers. + + OTASCIIArmor m_ascInReferenceTo;// If the server responds to a user command, he sends + // it back to the user here in ascii armored format. + OTASCIIArmor m_ascPayload; // If the reply needs to include a payload (such as a new account + // or a message envelope or request from another user etc) then + // it can be put here in ascii-armored format. + + long m_lDepth; // For Market-related messages... + long m_lTransactionNum; // For Market-related messages... + + bool m_bSuccess; // When the server replies to the client, this may be true or false + bool m_bBool; // Some commands need to send a bool. This variable is for those. +}; + + +#endif // __OTMESSAGE_H__ + + + + diff --git a/OTLib/OTMessageBuffer.cpp b/OTLib/OTMessageBuffer.cpp new file mode 100644 index 000000000..045fee8cb --- /dev/null +++ b/OTLib/OTMessageBuffer.cpp @@ -0,0 +1,173 @@ +/************************************************************* + * + * OTMessageBuffer.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include + +#include + +#include "OTMessageBuffer.h" + + + + + +void OTMessageBuffer::AddToList(OTMessage & theMessage) +{ + m_listMessages.push_back(&theMessage); +} + + + +// YOU are responsible to delete the OTMessage object +// once you receive the pointer that comes back from this function. +OTMessage * OTMessageBuffer::GetNextMessage() +{ + if (m_listMessages.empty()) + return NULL; + + OTMessage * pMsg = m_listMessages.front(); + + m_listMessages.pop_front(); + return pMsg; +} + + + + +OTMessageBuffer::OTMessageBuffer() +{ + +} + +OTMessageBuffer::~OTMessageBuffer() +{ + +} + diff --git a/OTLib/OTMessageBuffer.h b/OTLib/OTMessageBuffer.h new file mode 100644 index 000000000..12e7c2ae2 --- /dev/null +++ b/OTLib/OTMessageBuffer.h @@ -0,0 +1,154 @@ +/************************************************************* + * + * OTMessageBuffer.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTMESSAGEBUFFER_H__ +#define __OTMESSAGEBUFFER_H__ + +#include + +class OTMessage; + +typedef std::list listOfMessages; + +class OTMessageBuffer +{ + listOfMessages m_listMessages; +public: + OTMessageBuffer(); + ~OTMessageBuffer(); + + void AddToList(OTMessage & theMessage); + OTMessage * GetNextMessage(); +}; + + +#endif // __OTMESSAGEBUFFER_H__ + diff --git a/OTLib/OTMint.cpp b/OTLib/OTMint.cpp new file mode 100644 index 000000000..128d407ed --- /dev/null +++ b/OTLib/OTMint.cpp @@ -0,0 +1,1213 @@ +/************************************************************************************ + * + * OTMint.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + + +#include "OTContract.h" +#include "OTToken.h" +#include "OTMint.h" +#include "OTPseudonym.h" +#include "OTASCIIArmor.h" +#include "OTMessage.h" +#include "OTLog.h" + + +#include "Lucre/bank.h" // Lucre + + + +// Verify the current date against the VALID FROM / EXPIRATION dates. +// (As opposed to tokens, which are verified against the valid from/to dates.) +bool OTMint::Expired() const +{ + const time_t CURRENT_TIME = time(NULL); + + if ((CURRENT_TIME >= m_VALID_FROM) && (CURRENT_TIME <= m_EXPIRATION)) + return false; + else + return true; +} + +void OTMint::ReleaseDenominations() +{ + while (!m_mapPublic.empty()) + { + OTASCIIArmor * pArmor = m_mapPublic.begin()->second; + m_mapPublic.erase(m_mapPublic.begin()); + delete pArmor; + pArmor = NULL; + } + while (!m_mapPrivate.empty()) + { + OTASCIIArmor * pArmor = m_mapPrivate.begin()->second; + m_mapPrivate.erase(m_mapPrivate.begin()); + delete pArmor; + pArmor = NULL; + } +} + + +// If you want to load a certain Mint from string, then +// you will call LoadContractFromString() (say). Well this Releases the contract, +// before loading it, which calls InitMint() to zero out all the important pieces of +// data. +// +void OTMint::Release() +{ + ReleaseDenominations(); + + m_CashAccountID.Release(); + + if (m_pReserveAcct) + { + delete m_pReserveAcct; + m_pReserveAcct = NULL; + } + + OTContract::Release(); // I overrode the parent, so now I give him a chance to clean up. +} + + + + +void OTMint::InitMint() +{ + m_strContractType.Set("MINT"); + + m_nDenominationCount = 0; + + m_bSavePrivateKeys = false; // Determines whether it serializes private keys (no if false) + + // Mints expire and new ones are rotated in. + // All tokens have the same series, and validity dates, + // of the mint that created them. + m_nSeries = 0; + m_VALID_FROM = 0; + m_VALID_TO = 0; + m_EXPIRATION = 0; + + m_pReserveAcct = NULL; +} + + + +OTMint::OTMint(const OTString & strServerID, const OTString & strServerNymID, const OTString & strAssetTypeID) +: OTContract(strAssetTypeID), + m_ServerID(strServerID), + m_ServerNymID(strServerNymID), + m_AssetID(strAssetTypeID), + m_nDenominationCount(0), + m_bSavePrivateKeys(false), + m_nSeries(0), + m_VALID_FROM(0), + m_VALID_TO(0), + m_EXPIRATION(0), + m_pReserveAcct(NULL) +{ + m_strFoldername.Set(OTLog::MintFolder()); + m_strFilename.Format("%s%s%s", strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); + + InitMint(); +} + + +OTMint::OTMint(const OTString & strServerID, const OTString & strAssetTypeID) +: OTContract(strAssetTypeID), + m_ServerID(strServerID), + m_AssetID(strAssetTypeID), + m_nDenominationCount(0), + m_bSavePrivateKeys(false), + m_nSeries(0), + m_VALID_FROM(0), + m_VALID_TO(0), + m_EXPIRATION(0), + m_pReserveAcct(NULL) +{ + m_strFoldername.Set(OTLog::MintFolder()); + m_strFilename.Format("%s%s%s", strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); + + InitMint(); +} + + +OTMint::OTMint() : OTContract(), + m_nDenominationCount(0), + m_bSavePrivateKeys(false), + m_nSeries(0), + m_VALID_FROM(0), + m_VALID_TO(0), + m_EXPIRATION(0), + m_pReserveAcct(NULL) +{ + InitMint(); +} + + +bool OTMint::LoadContract() +{ + OTLog::Output(0, "OTMint::LoadContract OVERRIDE.\n"); + return LoadMint(); +} + +bool OTMint::LoadMint(const char * szAppend/*=NULL*/) +{ + if (!m_strFoldername.Exists()) + m_strFoldername.Set(OTLog::MintFolder()); + + const OTString strServerID(m_ServerID), strAssetTypeID(m_AssetID); + + if (!m_strFilename.Exists()) + { + if (NULL != szAppend) + m_strFilename.Format("%s%s%s%s", strServerID.Get(), OTLog::PathSeparator(), // server appends ".1" or ".PUBLIC" here. + strAssetTypeID.Get(), szAppend); + else + m_strFilename.Format("%s%s%s", strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); // client uses only asset ID, no append. + } + + OTString strFilename; + if (NULL != szAppend) + strFilename.Format("%s%s", strAssetTypeID.Get(), szAppend); + else + strFilename = strAssetTypeID.Get(); + + const char * szFolder1name = OTLog::MintFolder(); // "mints" + const char * szFolder2name = strServerID.Get(); // "mints/SERVER_ID" + const char * szFilename = strFilename.Get(); // "mints/SERVER_ID/ASSET_TYPE_ID" + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFolder1name, szFolder2name, szFilename)) + { + OTLog::vError("OTMint::LoadMint: File does not exist: %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFolder1name, szFolder2name, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTMint::LoadMint: Error reading file: %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + OTString strRawFile(strFileContents.c_str()); + + bool bSuccess = LoadContractFromString(strRawFile); + + return bSuccess; +} + + +bool OTMint::SaveMint(const char * szAppend/*=NULL*/) +{ + if (!m_strFoldername.Exists()) + m_strFoldername.Set(OTLog::MintFolder()); + + const OTString strServerID(m_ServerID), strAssetTypeID(m_AssetID); + + if (!m_strFilename.Exists()) + { + if (NULL != szAppend) + m_strFilename.Format("%s%s%s%s", strServerID.Get(), OTLog::PathSeparator(), + strAssetTypeID.Get(), szAppend); + else + m_strFilename.Format("%s%s%s", strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); + } + + OTString strFilename; + if (NULL != szAppend) + strFilename.Format("%s%s", strAssetTypeID.Get(), szAppend); + else + strFilename = strAssetTypeID.Get(); + + const char * szFolder1name = OTLog::MintFolder(); + const char * szFolder2name = strServerID.Get(); + const char * szFilename = strFilename.Get(); + + // -------------------------------------------------------------------- + + OTString strRawFile; + + // Sign it, save it internally to string, and then save that out to the file. + if (!SaveContract() || !SaveContract(strRawFile)) + { + OTLog::vError("Error saving Mintfile (to string):\n%s%s%s%s%s\n", szFolder1name, + OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + bool bSaved = OTDB::StorePlainString(strRawFile.Get(), szFolder1name, + szFolder2name, szFilename); // <=== SAVING TO DATA STORE. + + if (!bSaved) + { + if (NULL != szAppend) + OTLog::vError("OTMint::SaveMint: Error writing to file: %s%s%s%s%s%s\n", szFolder1name, + OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename, szAppend); + else + OTLog::vError("OTMint::SaveMint: Error writing to file: %s%s%s%s%s\n", szFolder1name, + OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + + return false; + } + // -------------------------------------------------------------------- + + return true; +} + + + +OTMint::~OTMint() +{ + // OTContract::~OTContract is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. +} + + +// Make sure this contract checks out. Very high level. +// Verifies ID and signature. +bool OTMint::VerifyMint(OTPseudonym & theOperator) +{ + // Make sure that the supposed Contract ID that was set is actually + // a hash of the contract file, signatures and all. + if (false == VerifyContractID()) + { + OTLog::Error("Error comparing Mint ID to Asset Contract ID in OTMint::VerifyMint\n"); + return false; + } + else if (false == VerifySignature(theOperator)) + { + OTLog::Error("Error verifying signature on mint in OTMint::VerifyMint.\n"); + return false; + } + + OTLog::Output(3, "\nWe now know that...\n" + "1) The Asset Contract ID matches the Mint ID loaded from the Mint file.\n" + "2) The SIGNATURE VERIFIED.\n\n"); + return true; +} + + + +// Unlike other contracts, which calculate their ID from a hash of the file itself, a mint has +// the same ID as its Asset Contract. When we open the Mint file, we read the Asset Type ID +// from it and then verify that it matches what we were expecting from the asset type. +bool OTMint::VerifyContractID() +{ + // I use the == operator here because there is no != operator at this time. + // That's why you see the ! outside the parenthesis. + if (!(m_ID == m_AssetID)) + { + OTString str1(m_ID), str2(m_AssetID); + + OTLog::vError("\nMint ID does NOT match Asset Type ID in OTMint::VerifyContractID.\n%s\n%s\n" + // "\nRAW FILE:\n--->%s<---" + "\n", + str1.Get(), str2.Get() + // m_strRawFile.Get() + ); + return false; + } + else { + OTString str1(m_ID); + OTLog::vOutput(2, "\nMint ID *SUCCESSFUL* match to Asset Contract ID:\n%s\n\n", str1.Get()); + return true; + } +} + + + +// The mint has a different key pair for each denomination. +// Pass in the actual denomination such as 5, 10, 20, 50, 100... +bool OTMint::GetPrivate(OTASCIIArmor & theArmor, long lDenomination) +{ + OTASCIIArmor * pArmor = NULL; + + for (mapOfArmor::iterator ii = m_mapPrivate.begin(); ii != m_mapPrivate.end(); ++ii) + { + pArmor = (*ii).second; + + OT_ASSERT_MSG(NULL != pArmor, "NULL mint pointer in OTMint::GetPrivate.\n"); + + if ((*ii).first == lDenomination) // if this denomination (say, 50) matches the one passed in... + { + theArmor.Set(*pArmor); + return true; + } + } + + return false; +} + +// The mint has a different key pair for each denomination. +// Pass in the actual denomination such as 5, 10, 20, 50, 100... +bool OTMint::GetPublic(OTASCIIArmor & theArmor, long lDenomination) +{ + OTASCIIArmor * pArmor = NULL; + + for (mapOfArmor::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii) + { + pArmor = (*ii).second; + + OT_ASSERT_MSG(NULL != pArmor, "NULL mint pointer in OTMint::GetPublic.\n"); + + if ((*ii).first == lDenomination) // if this denomination (say, 50) matches the one passed in... + { + theArmor.Set(*pArmor); + return true; + } + } + + return false; +} + + +// If you need to withdraw a specific amount, pass it in here and the +// mint will return the largest denomination that is equal to or smaller +// than the amount. +// Then you can subtract the denomination from the amount and call this method +// again, and again, until it reaches 0, in order to create all the necessary +// tokens to reach the full withdrawal amount. +long OTMint::GetLargestDenomination(long lAmount) +{ + for (int nIndex = GetDenominationCount()-1; nIndex >= 0; nIndex--) + { + long lDenom = GetDenomination(nIndex); + + if (lDenom <= lAmount) + return lDenom; + } + + return 0; +} + + +// If you call GetDenominationCount, you can then use this method +// to look up a denomination by index. +// You could also iterate through them by index. +long OTMint::GetDenomination(int nIndex) +{ + // index out of bounds. + if (nIndex > (m_nDenominationCount-1)) + { + return 0; + } + + int nIterateIndex = 0; + OTASCIIArmor * pArmor = NULL; + + for (mapOfArmor::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii, nIterateIndex++) + { + pArmor = (*ii).second; + + OT_ASSERT_MSG(NULL != pArmor, "NULL mint pointer in OTMint::GetDenomination.\n"); + + if (nIndex == nIterateIndex) + return (*ii).first; + } + + return 0; +} + + + +// The mint has a different key pair for each denomination. +// Pass the actual denomination such as 5, 10, 20, 50, 100... +bool OTMint::AddDenomination(OTPseudonym & theNotary, long lDenomination, int nPrimeLength/*=1024*/) +{ + bool bReturnValue = false; + + // Let's make sure it doesn't already exist + OTASCIIArmor theArmor; + if (GetPublic(theArmor, lDenomination)) + { + // it already exists. + OTLog::Error("Error: Denomination public already exists in OTMint::AddDenomination\n"); + return false; + } + if (GetPrivate(theArmor, lDenomination)) + { + // it already exists. + OTLog::Error("Error: Denomination private already exists in OTMint::AddDenomination\n"); + return false; + } + + // OTLog::Error("%s \n", + + if ((nPrimeLength/8) < (MIN_COIN_LENGTH+DIGEST_LENGTH)) + { + OTLog::vError("Prime must be at least %d bits\n", + (MIN_COIN_LENGTH+DIGEST_LENGTH)*8); + return false; + } + + if (nPrimeLength%8) + { + OTLog::Error("Prime length must be a multiple of 8\n"); + return false; + } + + SetMonitor(stderr); + + BIO *bio = BIO_new(BIO_s_mem()); + BIO *bioPublic = BIO_new(BIO_s_mem()); + + // Generate the mint private key information + Bank bank(nPrimeLength/8); + bank.WriteBIO(bio); + + // Generate the mint public key information + PublicBank pbank(bank); + pbank.WriteBIO(bioPublic); + + // Copy from BIO back to a normal OTString or Ascii-Armor + char privateBankBuffer[4096], publicBankBuffer[4096]; // todo stop hardcoding these string lengths + int privatebankLen = BIO_read(bio, privateBankBuffer, 4000); // cutting it a little short on purpose, with the buffer. + int publicbankLen = BIO_read(bioPublic, publicBankBuffer, 4000); // Just makes me feel more comfortable for some reason. + + if (privatebankLen && publicbankLen) + { + // With this, we have the Lucre public and private bank info converted to OTStrings + OTString strPublicBank; strPublicBank.Set(publicBankBuffer, publicbankLen); + OTString strPrivateBank; strPrivateBank.Set(privateBankBuffer, privatebankLen); + + OTASCIIArmor * pPublic = new OTASCIIArmor(); + OTASCIIArmor * pPrivate = new OTASCIIArmor(); + + OT_ASSERT(NULL != pPublic); + OT_ASSERT(NULL != pPrivate); + + // Set the public bank info onto pPublic + pPublic->SetString(strPublicBank, true); // linebreaks = true + + // Seal the private bank info up into an encrypted Envelope + // and set it onto pPrivate + OTEnvelope theEnvelope; + theEnvelope.Seal(theNotary, strPrivateBank); // Todo check the return values on these two functions + theEnvelope.GetAsciiArmoredData(*pPrivate); + + // Add the new key pair to the maps, using denomination as the key + m_mapPublic[lDenomination] = pPublic; + m_mapPrivate[lDenomination] = pPrivate; + + // Grab the Server Nym ID and save it with this Mint + theNotary.GetIdentifier(m_ServerNymID); + + // Grab the Server's public key and save it with this Mint + // OTAsymmetricKey op= only copies the public key, FYI. + m_keyPublic = theNotary.GetPublicKey(); + + m_nDenominationCount++; + + // Success! + bReturnValue = true; + OTLog::vOutput(1, "Successfully added denomination: %ld\n", lDenomination); + } + + // Release OpenSSL resources. + BIO_free_all(bio); // note: this WAS bio_free. I changed it to free_all. In case there is trouble later... + BIO_free_all(bioPublic); + + return bReturnValue; +} + + + + + + + +// The default behavior of this function does NOT save the private keys. It only +// serializes the public keys, and it is safe to send the object to the client. +// If the server needs to save the private keys, then call SetSavePrivateKeys() first. +void OTMint::UpdateContents() +{ + OTString SERVER_ID(m_ServerID), SERVER_NYM_ID(m_ServerNymID), + ASSET_ID(m_AssetID), CASH_ACCOUNT_ID(m_CashAccountID); + + long lFrom = m_VALID_FROM, lTo = m_VALID_TO, lExpiration = m_EXPIRATION; + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + SERVER_ID.Get(), + SERVER_NYM_ID.Get(), + ASSET_ID.Get(), + CASH_ACCOUNT_ID.Get(), + m_nSeries, + lExpiration, lFrom, lTo ); + + OTASCIIArmor armorPublicKey; + m_keyPublic.GetPublicKey(armorPublicKey); + m_xmlUnsigned.Concatenate("\n%s\n\n", armorPublicKey.Get()); + + if (m_nDenominationCount) + { + OTASCIIArmor * pArmor = NULL; + if (m_bSavePrivateKeys) + { + m_bSavePrivateKeys = false; // reset this back to false again. Use SetSavePrivateKeys() to set it true. + for (mapOfArmor::iterator ii = m_mapPrivate.begin(); ii != m_mapPrivate.end(); ++ii) + { + pArmor = (*ii).second; + + OT_ASSERT_MSG(NULL != pArmor, "NULL private mint pointer in OTMint::UpdateContents.\n"); + + m_xmlUnsigned.Concatenate("\n" + "%s\n\n", + (*ii).first, pArmor->Get()); + } + } + for (mapOfArmor::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii) + { + pArmor = (*ii).second; + + OT_ASSERT_MSG(NULL != pArmor, "NULL public mint pointer in OTMint::UpdateContents.\n"); + + m_xmlUnsigned.Concatenate("\n" + "%s\n\n", + (*ii).first, pArmor->Get()); + } + } + + m_xmlUnsigned.Concatenate("\n"); +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTMint::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("mint", xml->getNodeName())) + { + OTString strServerID, strServerNymID, strAssetID, strCashAcctID; + + m_strVersion = xml->getAttributeValue("version"); + strServerID = xml->getAttributeValue("serverID"); + strServerNymID = xml->getAttributeValue("serverNymID"); + strAssetID = xml->getAttributeValue("assetTypeID"); + strCashAcctID = xml->getAttributeValue("cashAcctID"); + + m_nSeries = atoi(xml->getAttributeValue("series")); + m_EXPIRATION = atol(xml->getAttributeValue("expiration")); + m_VALID_FROM = atol(xml->getAttributeValue("validFrom")); + m_VALID_TO = atol(xml->getAttributeValue("validTo")); + + m_ServerID.SetString(strServerID); + m_ServerNymID.SetString(strServerNymID); + m_AssetID.SetString(strAssetID); + m_CashAccountID.SetString(strCashAcctID); + + if (m_pReserveAcct) + { + delete m_pReserveAcct; + m_pReserveAcct = NULL; + } + + // Every Mint has its own cash account. Here we load ours so it's ready for transactions. + if (strCashAcctID.Exists()) + m_pReserveAcct = OTAccount::LoadExistingAccount(m_CashAccountID, m_ServerID); + + int nValidFrom = m_VALID_FROM, nValidTo = m_VALID_TO; + + OTLog::vOutput(1, + // "\n===> Loading XML for mint into memory structures..." + "\n\nMint version: %s\n Server ID: %s\n Asset Type ID: %s\n Cash Acct ID: %s\n" + "%s loading Cash Account into memory for pointer: OTMint::m_pReserveAcct\n" + " Series: %d\n Expiration: %d\n Valid From: %d\n Valid To: %d\n", + m_strVersion.Get(), strServerID.Get(), strAssetID.Get(), strCashAcctID.Get(), + (m_pReserveAcct != NULL) ? "SUCCESS" : "FAILURE", + m_nSeries, m_EXPIRATION, nValidFrom, nValidTo); + + nReturnVal = 1; + } + + + else if (!strcmp("mintPublicKey", xml->getNodeName())) + { + OTASCIIArmor armorPublicKey; + + if (false == LoadEncodedTextField(xml, armorPublicKey) || !armorPublicKey.Exists()) + { + OTLog::Error("Error in OTMint::ProcessXMLNode: mintPublicKey field without value.\n"); + return (-1); // error condition + } + else + { + m_keyPublic.SetPublicKey(armorPublicKey); // todo check this for failure. + } + + return 1; + } + + else if (!strcmp("mintPrivateInfo", xml->getNodeName())) + { + long lDenomination = atol(xml->getAttributeValue("denomination")); + + OTASCIIArmor * pArmor = new OTASCIIArmor; + + OT_ASSERT(NULL != pArmor); + + if (!LoadEncodedTextField(xml, *pArmor) || !pArmor->Exists()) + { + OTLog::Error("Error in OTMint::ProcessXMLNode: mintPrivateInfo field without value.\n"); + + delete pArmor; + pArmor = NULL; + + return (-1); // error condition + } + else + { + m_mapPrivate[lDenomination] = pArmor; + } + + return 1; + } + + else if (!strcmp("mintPublicInfo", xml->getNodeName())) + { + long lDenomination = atol(xml->getAttributeValue("denomination")); + + OTASCIIArmor * pArmor = new OTASCIIArmor; + + OT_ASSERT(NULL != pArmor); + + if (!LoadEncodedTextField(xml, *pArmor) || !pArmor->Exists()) + { + OTLog::Error("Error in OTMint::ProcessXMLNode: mintPublicInfo field without value.\n"); + + delete pArmor; + pArmor = NULL; + + return (-1); // error condition + } + else + { + m_mapPublic[lDenomination] = pArmor; + m_nDenominationCount++; // Whether client or server, both sides have public. Each public denomination should increment this count. + } + + return 1; + } + + return nReturnVal; +} + + + + + +/* + + enum tokenState { + blankToken, + protoToken, + signedToken, + spendableToken, + verifiedToken, + errorToken + }; + + + Create a memory BIO and write some data to it: + + BIO *mem = BIO_new(BIO_s_mem()); + BIO_puts(mem, "Hello World\n"); + + + Create a read only memory BIO: + + char data[] = "Hello World"; + BIO *mem; + mem = BIO_new_mem_buf(data, -1); + + + Extract the BUF_MEM structure from a memory BIO and then free up the BIO: + + BUF_MEM *bptr; + BIO_get_mem_ptr(mem, &bptr); + BIO_set_close(mem, BIO_NOCLOSE); // So BIO_free() leaves BUF_MEM alone + BIO_free(mem); + + */ + + + + +// Lucre step 3: the mint signs the token +// +bool OTMint::SignToken(OTPseudonym & theNotary, OTToken & theToken, OTString & theOutput, int nTokenIndex) +{ + bool bReturnValue = false; + + //OTLog::Error("%s []\n", + SetDumper(stderr); + +// OTLog::vError("OTMint::SignToken!!\nnTokenIndex: %d\n Denomination: %ld\n", nTokenIndex, theToken.GetDenomination()); + + BIO *bioBank = BIO_new(BIO_s_mem()); // input + BIO *bioRequest = BIO_new(BIO_s_mem()); // input + BIO *bioSignature = BIO_new(BIO_s_mem()); // output + + OTASCIIArmor thePrivate; + GetPrivate(thePrivate, theToken.GetDenomination()); + + // The Mint private info is encrypted in m_mapPrivates[theToken.GetDenomination()]. + // So I need to extract that first before I can use it. + OTEnvelope theEnvelope(thePrivate); + + OTString strContents; // output from opening the envelope. + // Decrypt the Envelope into strContents + if (!theEnvelope.Open(theNotary, strContents)) + return false; + + // copy strContents to a BIO + BIO_puts(bioBank, strContents.Get()); + +// OTLog::vError("BANK CONTENTS:\n%s--------------------------------------\n", strContents.Get()); + + // Instantiate the Bank with its private key + Bank bank(bioBank); +// OTLog::vError("BANK INSTANTIATED.--------------------------------------\n"); + + // I need the request. the prototoken. + OTASCIIArmor ascPrototoken; + bool bFoundToken = theToken.GetPrototoken(ascPrototoken, nTokenIndex); + + if (bFoundToken) + { + // base64-Decode the prototoken + OTString strPrototoken(ascPrototoken); + +// OTLog::vError("\n--------------------------------------\nDEBUG: PROTOTOKEN CONTENTS:\n" +// "-----------------%s---------------------\n", strPrototoken.Get() ); + + // copy strPrototoken to a BIO + BIO_puts(bioRequest, strPrototoken.Get()); + + // Load up the coin request from the bio (the prototoken) + PublicCoinRequest req(bioRequest); +// OTLog::Error("PROTOTOKEN INSTANTIATED.--------------------------------------\n"); + + // Sign it with the bank we previously instantiated. + // results will be in bnSignature (BIGNUM) + BIGNUM * bnSignature = bank.SignRequest(req); + + if (NULL == bnSignature) + { + OTLog::Error("MAJOR ERROR!: Bank.SignRequest failed in OTMint::SignToken\n"); + } + + else + { +// OTLog::Error("BANK.SIGNREQUEST SUCCESSFUL.--------------------------------------\n"); + + // Write the request contents, followed by the signature contents, + // to the Signature bio. Then free the BIGNUM. + req.WriteBIO(bioSignature); // the original request contents + DumpNumber(bioSignature,"signature=", bnSignature); // the new signature contents + BN_free(bnSignature); + + // Read the signature bio into a C-style buffer... + char sig_buf[1024]; // todo stop hardcoding these string lengths +// memset(sig_buf, 0, 1024); // zero it out. (I had this commented out, but the size was 2048, so maybe it's safe now at 1024.) + + int sig_len = BIO_read(bioSignature, sig_buf, 1000); // cutting it a little short on purpose, with the buffer. Just makes me feel more comfortable for some reason. + + + // Add the null terminator by hand (just in case.) + sig_buf[sig_len] = '\0'; + + if (sig_len) + { // *********************************************** +// OTLog::vError("\n--------------------------------------\n" +// "*** Siglen is %d. sig_str_len is %d.\nsig buf:\n------------%s------------\nLAST " +// "CHARACTER IS '%c' SECOND TO LAST CHARACTER IS '%c'\n", +// sig_len, sig_str_len, sig_buf, sig_buf[sig_str_len-1], sig_buf[sig_str_len-2]); + + // Copy the original coin request into the spendable field of the token object. + // (It won't actually be spendable until the client processes it, though.) + theToken.SetSpendable(ascPrototoken); + +// OTLog::vError("*** SPENDABLE:\n-----------%s---------------------\n", ascPrototoken.Get()); + + + // Base64-encode the signature contents into theToken.m_Signature. + OTString strSignature(sig_buf); + // strSignature.Set(sig_buf, sig_len-1); // sig_len includes null terminator, whereas Set() adds 1 for it. + +// OTLog::vError("SIGNATURE:\n--------------------%s" +// "------------------\n", strSignature.Get()); + + // Here we pass the signature back to the caller. + // He will probably set it onto the token. + theOutput.Set(sig_buf, sig_len); + bReturnValue = true; + + // This is also where we set the expiration date on the token. + // The client should have already done this, but we are explicitly + // setting the values here to prevent any funny business. + theToken.SetSeriesAndExpiration(m_nSeries, m_VALID_FROM, m_VALID_TO); + } + } + } + + BIO_free_all(bioBank); + BIO_free_all(bioRequest); + BIO_free_all(bioSignature); + + return bReturnValue; +} + +// Lucre step 5: mint verifies token when it is redeemed by merchant. +// This function is called by OTToken::VerifyToken. +// That's the one you should be calling, most likely, not this one. +bool OTMint::VerifyToken(OTPseudonym & theNotary, OTString & theCleartextToken, long lDenomination) +{ + bool bReturnValue = false; +// OTLog::Error("%s \n", argv[0]); + SetDumper(stderr); + + BIO *bioBank = BIO_new(BIO_s_mem()); // input + BIO *bioCoin = BIO_new(BIO_s_mem()); // input + + // --- copy theCleartextToken to bioCoin so lucre can load it + BIO_puts(bioCoin, theCleartextToken.Get()); + + // --- The Mint private info is encrypted in m_mapPrivate[lDenomination]. + // So I need to extract that first before I can use it. + OTASCIIArmor theArmor; + GetPrivate(theArmor, lDenomination); + OTEnvelope theEnvelope(theArmor); + + OTString strContents; // will contain output from opening the envelope. + // Decrypt the Envelope into strContents + if (theEnvelope.Open(theNotary, strContents)) + { + // copy strContents to a BIO + BIO_puts(bioBank, strContents.Get()); + + // ---- Now the bank and coin bios are both ready to go... + + Bank bank(bioBank); + Coin coin(bioCoin); + + if (bank.Verify(coin)) // Here's the boolean output: coin is verified! + { + bReturnValue = true; + + // (Done): When a token is redeemed, need to store it in the spent token database. + // Right now I can verify the token, but unless I check it against a database, then + // even though the signature verifies, it doesn't stop people from redeeming the same + // token again and again and again. + // + // (done): also need to make sure issuer has double-entries for total amount outstanding. + // + // UPDATE: These are both done now. The Spent Token database is implemented in the transaction server, + // (not OTLib proper) and the same server also now keeps a cash account to match all cash withdrawals. + // (Meaning, if 10,000 clams total have been withdrawn by various users, then the server actually has + // a clam account containing 10,000 clams. As the cash comes in for redemption, the server debits it from + // this account again before sending it to its final destination. This way the server tracks total outstanding + // amount, as an additional level of security after the blind signature itself.) + } + } + + // Cleanup openssl resources. + BIO_free_all(bioBank); + BIO_free_all(bioCoin); + + return bReturnValue; +} + + + +/* + + // Just make sure theMessage has these members populated: + // + // theMessage.m_strNymID; + // theMessage.m_strAssetID; + // theMessage.m_strServerID; + + // static method (call it without an instance, using notation: OTAccount::GenerateNewAccount) + OTAccount * OTAccount::GenerateNewAccount( const OTIdentifier & theUserID, const OTIdentifier & theServerID, + const OTPseudonym & theServerNym, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType=OTAccount::simple) + + + // The above method uses this one internally... + bool OTAccount::GenerateNewAccount(const OTPseudonym & theServer, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType=OTAccount::simple) + + + OTAccount * pAcct = NULL; + pAcct = OTAccount::LoadExistingAccount(ACCOUNT_ID, SERVER_ID); + */ + + + +// Lucre step 1: generate new mint +// Make sure the issuer here has a private key +// theMint.GenerateNewMint(nSeries, VALID_FROM, VALID_TO, ASSET_ID, m_nymServer, 1, 5, 10, 20, 50, 100, 500, 1000, 10000, 100000); +void OTMint::GenerateNewMint(int nSeries, time_t VALID_FROM, time_t VALID_TO, time_t MINT_EXPIRATION, + const OTIdentifier & theAssetID, const OTIdentifier & theServerID, + OTPseudonym & theNotary, + long nDenom1, long nDenom2, long nDenom3, long nDenom4, long nDenom5, + long nDenom6, long nDenom7, long nDenom8, long nDenom9, long nDenom10) +{ + Release(); + + m_AssetID = theAssetID; + m_ServerID = theServerID; + + OTIdentifier SERVER_NYM_ID(theNotary); + m_ServerNymID = SERVER_NYM_ID; + + m_nSeries = nSeries; + m_VALID_FROM = VALID_FROM; + m_VALID_TO = VALID_TO; + m_EXPIRATION = MINT_EXPIRATION; + + // Normally asset accounts are created based on an incoming message, + // so I'm just simulating that in order to make sure it gets its + // necessary input values, such as asset type, server ID, etc. + OTMessage theMessage; + SERVER_NYM_ID.GetString(theMessage.m_strNymID); + theAssetID.GetString( theMessage.m_strAssetID); + theServerID.GetString( theMessage.m_strServerID); + + /* OTAccount:: + GenerateNewAccount(const OTIdentifier & theUserID, const OTIdentifier & theServerID, + const OTPseudonym & theServerNym, const OTMessage & theMessage, + const AccountType eAcctType=simple); + */ + m_pReserveAcct = OTAccount::GenerateNewAccount(SERVER_NYM_ID, theServerID, theNotary, theMessage); + + if (m_pReserveAcct) + { + m_pReserveAcct->GetIdentifier(m_CashAccountID); + OTLog::Output(0, "Successfully created cash reserve account for new mint.\n"); + } + else { + OTLog::Error("Error creating cash reserve account for new mint.\n"); + } + + + if (nDenom1) + { + AddDenomination(theNotary, nDenom1); // int nPrimeLength default = 1024 + } + if (nDenom2) + { + AddDenomination(theNotary, nDenom2); // int nPrimeLength default = 1024 + } + if (nDenom3) + { + AddDenomination(theNotary, nDenom3); // int nPrimeLength default = 1024 + } + if (nDenom4) + { + AddDenomination(theNotary, nDenom4); // int nPrimeLength default = 1024 + } + if (nDenom5) + { + AddDenomination(theNotary, nDenom5); // int nPrimeLength default = 1024 + } + if (nDenom6) + { + AddDenomination(theNotary, nDenom6); // int nPrimeLength default = 1024 + } + if (nDenom7) + { + AddDenomination(theNotary, nDenom7); // int nPrimeLength default = 1024 + } + if (nDenom8) + { + AddDenomination(theNotary, nDenom8); // int nPrimeLength default = 1024 + } + if (nDenom9) + { + AddDenomination(theNotary, nDenom9); // int nPrimeLength default = 1024 + } + if (nDenom10) + { + AddDenomination(theNotary, nDenom10); // int nPrimeLength default = 1024 + } +} + + + +bool OTMint::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTMint.h b/OTLib/OTMint.h new file mode 100644 index 000000000..7d17cc887 --- /dev/null +++ b/OTLib/OTMint.h @@ -0,0 +1,258 @@ +/************************************************************************************ + * + * OTMint.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTMINT_H__ +#define __OTMINT_H__ + +#include + +#include "OTContract.h" +#include "OTEnvelope.h" +#include "OTASCIIArmor.h" +#include "OTToken.h" +#include "OTAccount.h" + + +class OTMint : public OTContract +{ +protected: + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + void InitMint(); + + mapOfArmor m_mapPrivate; // An ENVELOPE. You need to pass the Pseudonym to every method that uses this. Private. + // Then you have to set it into an envelope and then open it using the Nym. Encrypted. + mapOfArmor m_mapPublic; // An Ascii-armored string of the mint Public information. Base64-encoded only. + + + OTIdentifier m_ServerID; // The Server ID, (a hash of the server contract whose public key is m_keyPublic) + OTIdentifier m_ServerNymID; // The Nym ID of the Server, whose public key is m_keyPublic + + OTAsymmetricKey m_keyPublic; // The server's public key. + + OTIdentifier m_AssetID; // Each Asset type has its own mint. + + int m_nDenominationCount; // How many denominations of the currency are issued by this Mint? + // (Each requires its own key pair.) + + bool m_bSavePrivateKeys; // Determines whether it serializes private keys (no if true) + + + // --- MINT SERIES with EXPIRATION DATES ------------------ + + int m_nSeries; // Each series of the mint has a valid from and to date. Series should rotate. + // (That is, the new one should be introduced halfway through the validity period + // of the current one, and so on...) + + time_t m_VALID_FROM; // All tokens generated by this series will have the same From and To dates. + time_t m_VALID_TO; // This way they cannot be tracked by expiration date. + + time_t m_EXPIRATION; // The Mint itself expires before the tokens do. (As the new series rotates in...) + + OTIdentifier m_CashAccountID;// The Account ID for the cash reserve account. (Pointer below.) + + OTAccount * m_pReserveAcct; // When you withdraw cash, the Mint removes X dollars from your account, then + // it puts those X dollars into this reserve account, and then issues you the + // blinded tokens. When the tokens are deposited again, the money comes back out + // of the same reserve account and goes into the depositor's account. This way, + // all tokens will have 1-for-1 funds backing them, and any funds left over after + // the tokens expire, is the server operator's money to keep! + +public: + + inline int GetSeries() const { return m_nSeries; } // The series ID + inline time_t GetValidFrom() const { return m_VALID_FROM; } // The token "valid from" date for this series + inline time_t GetValidTo() const { return m_VALID_TO; } // The token "valid until" date for this series + inline time_t GetExpiration() const { return m_EXPIRATION; } // The date the mint expires (should be halfway + // between the above two dates.) + bool Expired() const; // true or false. Expired? + // Valid range is GetValidFrom() through GetExpiration(). + + // Server-side only. + inline OTAccount * GetCashReserveAccount() const { return m_pReserveAcct; } + + OTMint(); + OTMint(const OTString & strServerID, const OTString & strAssetTypeID); + OTMint(const OTString & strServerID, const OTString & strServerNymID, const OTString & strAssetTypeID); + virtual ~OTMint(); + virtual void Release(); + void ReleaseDenominations(); + + bool LoadMint(const char * szAppend=NULL); + bool SaveMint(const char * szAppend=NULL); + + virtual bool LoadContract(); + + // Will save the private keys on next serialization (not just public keys) + // (SignContract sets m_bSavePrivateKeys back to false again.) + inline void SetSavePrivateKeys(bool bDoIt=true) { m_bSavePrivateKeys = bDoIt; } + + + // The denomination indicated here is the actual denomination...1, 5, 20, 50, 100, etc + bool GetPrivate(OTASCIIArmor & theArmor, long lDenomination); + bool GetPublic(OTASCIIArmor & theArmor, long lDenomination); + + long GetDenomination(int nIndex); + long GetLargestDenomination(long lAmount); + bool AddDenomination(OTPseudonym & theNotary, long lDenomination, int nPrimeLength=1024); + inline int GetDenominationCount() const { return m_nDenominationCount; } + + virtual bool VerifyContractID(); + + bool VerifyMint(OTPseudonym & theOperator); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the token saves its contents + + inline void SetAssetID(const OTIdentifier & newID) { m_AssetID = newID; } + + // Lucre step 1: generate new mint + void GenerateNewMint(int nSeries, time_t VALID_FROM, time_t VALID_TO, time_t MINT_EXPIRATION, + const OTIdentifier & theAssetID, const OTIdentifier & theServerID, + OTPseudonym & theNotary, + long nDenom1=0, long nDenom2=0, long nDenom3=0, long nDenom4=0, long nDenom5=0, + long nDenom6=0, long nDenom7=0, long nDenom8=0, long nDenom9=0, long nDenom10=0); + + // step 2: (coin request is in OTToken) + + // Lucre step 3: mint signs token + bool SignToken(OTPseudonym & theNotary, OTToken & theToken, OTString & theOutput, int nTokenIndex); + + // step 4: (unblind coin is in OTToken) + + // Lucre step 5: mint verifies token when it is redeemed by merchant. + bool VerifyToken(OTPseudonym & theNotary, OTString & theCleartextToken, long lDenomination); + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); +}; + + +#endif // __OTMINT_H__ diff --git a/OTLib/OTOffer.cpp b/OTLib/OTOffer.cpp new file mode 100644 index 000000000..d59c9c853 --- /dev/null +++ b/OTLib/OTOffer.cpp @@ -0,0 +1,458 @@ +/************************************************************************************ + * + * OTOffer.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + +#include "OTOffer.h" +#include "OTLog.h" + +// Each instance of OTOffer represents a Bid or Ask. (A Market has a list of bid offers and a list of ask offers.) + + + + +/* + Let's say you wanted to add an Offer to a Market. But you don't know + which market. There are different markets for different combinations + of asset and currency. There are also higher and lower level markets + for different trade minimums. + + The server has to be able to match up your Offer to the Right Market, + so that it can trade with similar offers. + + So in this method, I combine the Asset Type ID, the Currency Type ID, + and the minimum increment, and use them to generate a UNIQUE ID, which + will also be the same, given the same input. + + That is the ID I will use for looking up the offers on the market. + Basically it's the Market ID, and the Offer just has the SAME ID, + and that's how you match it up to the market. + + (This is analogous to how Transactions and Transaction Items have the + same transaction number.) + + THIS MEANS that the user cannot simply set his minimum increment to + a "divide-into equally" with the market minimum increment. Why not? + Because since his number will be different from the next guy, they + will calculate different IDs and thus end up on different markets. + + TODO: therefore the user MUST SUPPLY the EXACT SAME minimum increment + of the market he wishes to trade on. There's no other way. However, + I CAN allow the user to ALSO provide a second minimum, which must be + a multiple of the first. + + TODO: Should add this same method to the Market object as well. + + + To use OTOffer::GetIdentifier is simple: + + void blah (OTOffer & theOffer) + { + OTIdentifier MARKET_ID(theOffer); // the magic happens right here. + + // (Done.) + } + */ +void OTOffer::GetIdentifier(OTIdentifier & theIdentifier) +{ + OTString strTemp, strAsset(GetAssetID()), strCurrency(GetCurrencyID()); + + long lScale = GetScale(); + + // In this way we generate a unique ID that will always be consistent + // for the same asset ID, currency ID, and market scale. + strTemp.Format("ASSET TYPE:\n%s\nCURRENCY TYPE:\n%s\nMARKET SCALE:\n%ld\n", + strAsset.Get(), strCurrency.Get(), lScale); + + m_ID.CalculateDigest(strTemp); + + OTContract::GetIdentifier(theIdentifier); +} + + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTOffer::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("marketOffer", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + OTString strIsSelling; + strIsSelling = xml->getAttributeValue("isSelling"); + if (strIsSelling.Compare("true")) + m_bSelling = true; + else + m_bSelling = false; + + m_strContractType.Set((m_bSelling ? "ASK" : "BID")); + + const OTString strServerID(xml->getAttributeValue("serverID")), + strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strCurrencyTypeID(xml->getAttributeValue("currencyTypeID")); + + const OTIdentifier SERVER_ID(strServerID), ASSET_ID(strAssetTypeID), + CURRENCY_TYPE_ID(strCurrencyTypeID); + + SetServerID(SERVER_ID); + SetAssetID(ASSET_ID); + SetCurrencyID(CURRENCY_TYPE_ID); + + SetPriceLimit( atol(xml->getAttributeValue("priceLimit"))); + SetTotalAssetsOnOffer( atol(xml->getAttributeValue("totalAssetsOnOffer"))); + SetFinishedSoFar( atol(xml->getAttributeValue("finishedSoFar"))); + SetScale( atol(xml->getAttributeValue("marketScale"))); + SetMinimumIncrement( atol(xml->getAttributeValue("minimumIncrement"))); + SetTransactionNum( atol(xml->getAttributeValue("transactionNum")) ); + SetValidFrom( atol(xml->getAttributeValue("validFrom"))); + SetValidTo( atol(xml->getAttributeValue("validTo"))); + + // --------------------- + + OTLog::vOutput(4, + "\n\nOffer. Transaction Number: %ld\n Valid From: %d\n Valid To: %d\n" + " AssetTypeID: %s\n CurrencyTypeID: %s\n ServerID: %s\n" + " Price Limit: %ld, Total Assets on Offer: %ld, %s so far: %ld\n " + " Scale: %ld. Minimum Increment: %ld. This offer is a%s.\n", + m_lTransactionNum, m_VALID_FROM, m_VALID_TO, + strAssetTypeID.Get(), strCurrencyTypeID.Get(), strServerID.Get(), + GetPriceLimit(), GetTotalAssetsOnOffer(), (m_bSelling ? "sold" : "bought"), + GetFinishedSoFar(), GetScale(), GetMinimumIncrement(), + (m_bSelling ? "n ASK" : " BID")); + + nReturnVal = 1; + } + + return nReturnVal; +} + + + +void OTOffer::UpdateContents() +{ + const OTString SERVER_ID(GetServerID()), ASSET_TYPE_ID(GetAssetID()), + CURRENCY_TYPE_ID(GetCurrencyID()); + + const long lFrom = GetValidFrom(), + lTo = GetValidTo(), + lPriceLimit = GetPriceLimit(), + lTotalAssetsOnOffer = GetTotalAssetsOnOffer(), + lFinishedSoFar = GetFinishedSoFar(), + lScale = GetScale(), + lMinimumIncrement = GetMinimumIncrement(), + lTransactionNum = GetTransactionNum(); + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", // <=== the tag ends here. + m_strVersion.Get(), + (IsBid() ? "false" : "true"), + SERVER_ID.Get(), + ASSET_TYPE_ID.Get(), + CURRENCY_TYPE_ID.Get(), + lPriceLimit, + lTotalAssetsOnOffer, + lFinishedSoFar, + lScale, + lMinimumIncrement, + lTransactionNum, + lFrom, lTo ); + +// m_xmlUnsigned.Concatenate("\n"); +} + + + + +bool OTOffer::MakeOffer(bool bBuyingOrSelling, // True == SELLING, False == BUYING + const long & lPriceLimit, // Per Minimum Increment... + const long & lTotalAssetsOffer, // Total assets available for sale or purchase. + const long & lMinimumIncrement, // The minimum increment that must be bought or sold for each transaction + const long & lTransactionNum, // The transaction number authorizing this trade. + const time_t & VALID_FROM/*=0*/, // defaults to RIGHT NOW + const time_t & VALID_TO/*=0*/) // defaults to 24 hours (a "Day Order") +{ + m_bSelling = bBuyingOrSelling; // Bid or Ask? + SetTransactionNum (lTransactionNum); + SetTotalAssetsOnOffer (lTotalAssetsOffer); // 500 bushels for sale. + + m_strContractType.Set((m_bSelling ? "ASK" : "BID")); + + // Make sure minimum increment isn't bigger than total Assets. + // (If you pass them into this function as the same value, it's functionally a "FILL OR KILL" order.) + long lRealMinInc = lMinimumIncrement; + if (lMinimumIncrement > lTotalAssetsOffer) // Once the total, minus finish so far, is smaller than the minimum increment, + lRealMinInc = lTotalAssetsOffer; // then the OTTrade object I am linked to will expire and remove me from the market. + // OR it could set the minimum increment to the remainder. But then need to calc price. + + SetMinimumIncrement (lRealMinInc); // Must sell in 50 bushel increments. (Perhaps on the 10-bushel market it will sell in 5 increments of 10.) + SetPriceLimit (lPriceLimit); // Won't sell for any less than $10 per increment. (Always get best market price.) + SetFinishedSoFar (0); // So far have already sold 350 bushels. Actual amount available is (total - finished). + + time_t REAL_VALID_FROM = VALID_FROM; + time_t REAL_VALID_TO = VALID_TO; + + if (0 >= VALID_FROM) + { + REAL_VALID_FROM = time(NULL); // This time is set to TODAY NOW + } + + if (0 >= VALID_TO) + { + // (All offers default to a "DAY ORDER" if valid dates not specified.) + REAL_VALID_TO = REAL_VALID_FROM + 86400; // 1 day. + } + + SetValidFrom(REAL_VALID_FROM); + SetValidTo(REAL_VALID_TO); + + return true; +} + +OTOffer::OTOffer() +: OTInstrument(), m_pTrade(NULL), // No need to free m_pTrade, not responsible. Only here for convenience. + m_bSelling (false), + m_lPriceLimit (0), + m_lTransactionNum (0), + m_lTotalAssetsOffer (0), + m_lFinishedSoFar (0), + m_lScale (1), // This must be 1 or greater. CANNOT be zero. Enforced. + m_lMinimumIncrement (1) // This must be 1 or greater. CANNOT be zero. Enforced. +{ + InitOffer(); +} + + + +OTOffer::OTOffer(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, const OTIdentifier & CURRENCY_ID, const long & lScale) +: OTInstrument(SERVER_ID, ASSET_ID), m_pTrade(NULL), // No need to free m_pTrade, not responsible. Only here for convenience. + m_bSelling (false), + m_lPriceLimit (0), + m_lTransactionNum (0), + m_lTotalAssetsOffer (0), + m_lFinishedSoFar (0), + m_lScale (1), // This must be 1 or greater. CANNOT be zero. Enforced. + m_lMinimumIncrement (1) // This must be 1 or greater. CANNOT be zero. Enforced. +{ + InitOffer(); + + SetScale(lScale); + + m_CURRENCY_TYPE_ID = CURRENCY_ID; +} + + +OTOffer::~OTOffer() +{ + // No need to call Release() here, it's handled by the framework. +} + +void OTOffer::InitOffer() +{ + m_strContractType.Set("OFFER"); // in practice should never appear. BID/ASK will overwrite. + + // This pointer will get wiped anytime Release() is called... which means anytime LoadContractFromString() + // is called. For some objects, that screws them up because suddenly the pointer went NULL when they needed it. + // In the case of this object, the pointer is reset whenever Cron processes, so this is safe. But in + // the case of other objects, it's better not to initialize the pointer here, but in the constructor instead. + // FYI. For example, OTCron has a pointer to m_pServerNym. LoadCron() and the pointer is NULL. Can't have that! + // So I moved it to the constructor in that case. + + m_bSelling = false; + m_lPriceLimit = 0; + m_lTransactionNum = 0; + m_lTotalAssetsOffer = 0; + m_lFinishedSoFar = 0; + m_lMinimumIncrement = 1; // This must be 1 or greater. CANNOT be zero. Enforced. + m_lScale = 1; // This must be 1 or greater. CANNOT be zero. Enforced. +} + + +void OTOffer::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + m_CURRENCY_TYPE_ID.Release(); + + OTInstrument::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything + InitOffer(); +} + + + + +bool OTOffer::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + diff --git a/OTLib/OTOffer.h b/OTLib/OTOffer.h new file mode 100644 index 000000000..17c5c2bc8 --- /dev/null +++ b/OTLib/OTOffer.h @@ -0,0 +1,273 @@ +/************************************************************************************ + * + * OTOffer.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// Each instance of OTOffer represents a Bid or Ask. (A Market has a list of bid offers and a list of ask offers.) + + +#ifndef __OTOFFER_H__ +#define __OTOFFER_H__ + +#include + +//#include "OTTrade.h" +#include "OTInstrument.h" + + +class OTTrade; + +/* + OTOffer + + Offer MUST STORE: + + X 1) Transaction ID (MUST be linked to a trade, so it can expire, and so it can be paid for.) + X 2) ASSET TYPE ID of whatever I’m trying to BUY or SELL. (Is this the Gold market?) + X 7) CURRENCY TYPE ID of whatever I’m trying to buy or sell it WITH. (Is it dollars? Euro? Yen?) + X 8) BUY OR SELL? (BOOL) + X 9) Bid/Ask price (limit / per minimum increment.) + + X 4) Total number of assets available for sale or purchase. (4 ounces of gold? 12 ounces of gold?) + X 5) Number of assets already traded, against the above total. + X 6) Minimum increment for sale or purchase (if matches “total number of assets for sale”, effectively becomes a FILL OR KILL order. MUST be 1 or greater. CANNOT be zero.) +*/ + +class OTOffer : public OTInstrument +{ + // From OTInstrument (parent class of this) + /* +public: + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + */ +protected: + OTTrade * m_pTrade; // If this offer is actually connected to a trade, it will have a pointer. + + OTIdentifier m_CURRENCY_TYPE_ID; // GOLD (Asset) is trading for DOLLARS (Currency). + bool m_bSelling; // true = ask. false = bid. + + // If a bid, this is the most I will pay. If an ask, this is the least I will sell for. My limit. + // (Normally the price I get is whatever is the best one on the market right now.) + long m_lPriceLimit; // Denominated in CURRENCY TYPE, and priced per SCALE. + // 1oz market price limit might be 1,300 + // 100oz market price limit might be 130,000 (or 127,987 or whatever) + + long m_lTransactionNum; // Matches to an OTTrade stored in OTCron. + long m_lTotalAssetsOffer; // Total amount of ASSET TYPE trying to BUY or SELL, this trade. + long m_lFinishedSoFar; // Number of ASSETs bought or sold already against the above total. + + long m_lScale; // 1oz market? 100oz market? 10,000oz market? This determines size and granularity. + long m_lMinimumIncrement; // Each sale or purchase against the above total must be in minimum increments. + // Minimum Increment must be evenly divisible by m_lScale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as m_lTotalAssetsOffer. Also, MUST be 1 + // or great. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + inline void SetTransactionNum(const long & lTransactionNum) { m_lTransactionNum = lTransactionNum; } + inline void SetPriceLimit(const long & lPriceLimit) { m_lPriceLimit = lPriceLimit; } + inline void SetTotalAssetsOnOffer(const long & lTotalAssets) { m_lTotalAssetsOffer = lTotalAssets; } + inline void SetFinishedSoFar(const long & lFinishedSoFar) { m_lFinishedSoFar = lFinishedSoFar; } + inline void SetMinimumIncrement(const long & lMinIncrement) + { m_lMinimumIncrement = lMinIncrement; if (m_lMinimumIncrement < 1) m_lMinimumIncrement = 1; } + inline void SetScale(const long & lScale) + { m_lScale = lScale; if (m_lScale < 1) m_lScale = 1; } + +public: + bool MakeOffer(bool bBuyingOrSelling, // True == SELLING, False == BUYING + const long & lPriceLimit, // Per Scale... + const long & lTotalAssetsOffer, // Total assets available for sale or purchase. + const long & lMinimumIncrement, // The minimum increment that must be bought or sold for each transaction + const long & lTransactionNum, // The transaction number authorizing this trade. + const time_t & VALID_FROM = 0, // defaults to RIGHT NOW + const time_t & VALID_TO = 0); // defaults to 24 hours (a "Day Order") + + // --------------------------------------------------------- + + inline void IncrementFinishedSoFar(const long & lFinishedSoFar) { m_lFinishedSoFar += lFinishedSoFar; } + + inline long GetAmountAvailable() const { return GetTotalAssetsOnOffer() - GetFinishedSoFar(); } + inline const long & GetTransactionNum() const { return m_lTransactionNum; } + + inline const long & GetPriceLimit() const { return m_lPriceLimit; } + inline const long & GetTotalAssetsOnOffer() const { return m_lTotalAssetsOffer; } + inline const long & GetFinishedSoFar() const { return m_lFinishedSoFar; } + inline const long & GetMinimumIncrement() + { if (m_lMinimumIncrement < 1) m_lMinimumIncrement = 1; return m_lMinimumIncrement; } + inline const long & GetScale() + { if (m_lScale < 1) m_lScale = 1; return m_lScale; } + + inline const OTIdentifier & GetCurrencyID() const { return m_CURRENCY_TYPE_ID; } + inline void SetCurrencyID(const OTIdentifier & CURRENCY_ID) { m_CURRENCY_TYPE_ID = CURRENCY_ID; } + + // Buying or selling? + inline bool IsBid() { return !m_bSelling; } + inline bool IsAsk() { return m_bSelling; } + + // Stores a pointer to theTrade for later use. (Not responsible to clean up, just convenient.) + inline OTTrade * GetTrade() { return m_pTrade; } + inline void SetTrade(const OTTrade & theTrade) { m_pTrade = &((OTTrade &)theTrade); } + + // ---------------------------------------------------------- + + OTOffer(); // The constructor contains the 3 variables needed to identify any market. + OTOffer(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, const OTIdentifier & CURRENCY_ID, const long & MARKET_SCALE); + virtual ~OTOffer(); + + // Overridden from OTContract. + virtual void GetIdentifier(OTIdentifier & theIdentifier); + + void InitOffer(); + + virtual void Release(); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + +#endif // __OTOFFER_H__ + + + + diff --git a/OTLib/OTPayload.cpp b/OTLib/OTPayload.cpp new file mode 100644 index 000000000..01b2f1afb --- /dev/null +++ b/OTLib/OTPayload.cpp @@ -0,0 +1,327 @@ +/************************************************************************************ + * + * OTPayload.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "OTDataCheck.h" + +#include "irrxml/irrXML.h" + +#include "OTStorage.h" + +#include "OTData.h" +#include "OTString.h" +#include "OTIdentifier.h" + +#include "OTPayload.h" +#include "OTEnvelope.h" +#include "OTMessage.h" +#include "OTLog.h" + + +OTPayload::OTPayload() : OTData() +{ + +} + +OTPayload::OTPayload(const OTPayload & rhs) : OTData(rhs) +{ + +} + +OTPayload::~OTPayload() +{ + +} + + +uint32_t OTPayload::ReadBytesFrom(OTData & theData, uint32_t lSize) +{ + // The size requested to read MUST be less or equal to size of theData + if (theData.GetSize() < lSize) + abort(); + + OTPayload & refPayload = (OTPayload &)theData; + + // Copy from theData to this, up until lSize + Assign(refPayload.GetPayloadPointer(), lSize); + + // Create a temp var, starting from theData+lSize, copying to the end of theData + OTData TEMPdata((unsigned char *)refPayload.GetPayloadPointer() + lSize, theData.GetSize() - lSize); + + // theData is assigned to TEMPdata (thus removing from it the bytes that we just read into this.) + theData.Assign(TEMPdata); + + return lSize; +} + + +// Envelope copied into payload to prepare for sending. +bool OTPayload::SetEnvelope(const OTEnvelope & theEnvelope) +{ + OTASCIIArmor theArmor; + + if (theEnvelope.GetAsciiArmoredData(theArmor)) + { + uint32_t lSize = theArmor.GetLength()+1; //+1 for the null terminater + + if (theArmor.GetLength()) + { + SetPayloadSize(lSize + 1); // +1 for the checksum byte. + + // Copy it in. + memcpy((void *)GetPointer(), theArmor.Get(), lSize); + + // Add the checksum, success. + AppendChecksum( (OT_BYTE*)GetPointer(), lSize ); + return true; + } + } + return false; +} + + + +bool OTPayload::SetMessage(const OTMessage & theMessage) +{ + uint32_t lSize = theMessage.m_strRawFile.GetLength()+1; //+1 for the null terminater + + if (theMessage.m_strRawFile.GetLength()) + { + SetPayloadSize(lSize + 1); // +1 for the checksum byte. + memcpy((void *)GetPointer(), theMessage.m_strRawFile.Get(), lSize); + + // Add the checksum + AppendChecksum( (OT_BYTE*)GetPointer(), lSize ); + return true; + } + return false; +} + + + +// Envelope retrieved from payload. +bool OTPayload::GetEnvelope(OTEnvelope & theEnvelope) const +{ + // validate checksum + uint32_t lSize = GetSize(); + uint32_t lIndex = lSize-2; // the index to where the NULL terminator SHOULD be if they + // sent us a base64-encoded string, containing an encrypted message. (which we expect...) + + // (lSize-1 would be the location of the checksum at the end.) + if (0 == lSize) + return false; + + if (IsChecksumValid((OT_BYTE*)GetPointer(), (uint32_t)lSize)) + { + // We add the null-terminator ourselves at this point, for security reasons, + // since we will process the data, soon after this function, as a string. + ((OT_BYTE *)GetPointer())[lIndex] = 0; + + theEnvelope.m_dataContents.Release(); + + OTASCIIArmor theArmor; + // Why is this safe, where I cast the Payload data pointer as + // a char * and tell the data object to set itself from that? + // Because (1) I just validated the checksum, and + // (2) There place where the NULL should be, I set to 0, by hand, + // just above 2 lines. So when this set operation occurs, the + // farthest it will go is to that 0. + theArmor.Set((const char *)GetPointer()); + + // Todo NOTE: If I ever want to process bookends here instead of assuming they aren't there, + // IT'S VERY EASY!! All I have to do is call theArmor.LoadFromString instead of theArmor.Set. + + // Now the ascii-armored string that was sent across is decoded back to binary into the + // Envelope object. + theEnvelope.SetAsciiArmoredData(theArmor); + return true; + } + else { + OTLog::Error("Invalid Checksum in OTPayload::GetEnvelope\n"); + return false; + } +} + +#ifdef _WIN32 +bool OTPAYLOAD_GetMessage(OTPayload & thePayload, OTMessage & theMessage) +{ + return thePayload.GetMessage(theMessage); +} +#endif + +// Message retrieved from Payload +bool OTPayload::GetMessage(OTMessage & theMessage) const +{ + // validate checksum + uint32_t lSize = GetSize(); + uint32_t lIndex = lSize-2; // the index to where the NULL terminator SHOULD be if they + // sent us a string like they were supposed to. (A contract.) + // (nSize-1 would be the location of the checksum at the end.) + if (0 == lSize) + return false; + + if (IsChecksumValid((OT_BYTE*)GetPointer(), (uint32_t)lSize)) + { + // We add the null-terminator ourselves at this point, for security reasons, + // since we will process the data, after this point, as a string. + ((OT_BYTE *)GetPointer())[lIndex] = 0; + + theMessage.Release(); + + // Why is this safe, where I cast the Payload data pointer as + // a char * and tell the string to set itself from that? + // Because (1) I just validated the checksum, and + // (2) There place where the NULL should be, I set to 0, by hand, + // just above 2 lines. So when this set operation occurs, the + // farthest it will go is to that 0. + theMessage.m_strRawFile.Set((const char *)GetPointer()); + return true; + } + else { + OTLog::Error("Invalid Checksum in OTPayload::GetMessage\n"); + return false; + } +} + + + +void OTPayload::SetPayloadSize(uint32_t lNewSize) +{ + SetSize(lNewSize); +} + +const void * OTPayload::GetPayloadPointer() const +{ + return GetPointer(); +} + diff --git a/OTLib/OTPayload.h b/OTLib/OTPayload.h new file mode 100644 index 000000000..615141be9 --- /dev/null +++ b/OTLib/OTPayload.h @@ -0,0 +1,191 @@ +/************************************************************* + * + * OTPayload.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#ifndef __OTPAYLOAD_H__ +#define __OTPAYLOAD_H__ + +#include "OTData.h" + +class OTMessage; +class OTEnvelope; + +#ifdef _WIN32 +class OTPayload; +bool OTPAYLOAD_GetMessage(OTPayload & thePayload, OTMessage & theMessage); +#endif + +class OTPayload : public OTData +{ +public: + OTPayload(); + OTPayload(const OTPayload & rhs); + virtual ~OTPayload(); + + using OTData::swap; + using OTData::operator=; + + uint32_t ReadBytesFrom(OTData & theData, uint32_t lSize); + + void SetPayloadSize(uint32_t lNewSize); + const void * GetPayloadPointer() const; + + // pass in an OTMessage and if the Payload + // contains a message, and checksum validates, + // it will set it for you and return true. + bool SetMessage(const OTMessage & theMessage); // Message copied into payload to prepare for sending. + bool GetMessage(OTMessage & theMessage) const; + + bool GetEnvelope(OTEnvelope & theEnvelope) const; // Envelope retrieved from payload. + bool SetEnvelope(const OTEnvelope & theEnvelope); // Envelope copied into payload to prepare for sending. +}; + +#endif // __OTPAYLOAD_H__ + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTPaymentPlan.cpp b/OTLib/OTPaymentPlan.cpp new file mode 100644 index 000000000..e043e4709 --- /dev/null +++ b/OTLib/OTPaymentPlan.cpp @@ -0,0 +1,1614 @@ +/************************************************************************************ + * + * OTPaymentPlan.cpp + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTAccount.h" +#include "OTLedger.h" +#include "OTTransaction.h" +#include "OTItem.h" + +#include "OTCron.h" +#include "OTPaymentPlan.h" +#include "OTLog.h" + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTPaymentPlan::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + if (0 != (nReturnVal = OTAgreement::ProcessXMLNode(xml))) + return nReturnVal; + + // Note: the closing transaction numbers are read in OTCronItem::ProcessXMLNode, + // and similarly, the closing Recipient transaction numbers are read in OTAgreement::ProcessXMLNode. + + +// ---------------------------------------------------- + + if (!strcmp("initialPayment", xml->getNodeName())) + { + // Yes, there IS apparently an initial payment. We can set the bool to true. + m_bInitialPayment = true; + + SetInitialPaymentDate( atoi(xml->getAttributeValue("date"))); + SetInitialPaymentCompletedDate( atoi(xml->getAttributeValue("dateCompleted"))); + SetLastFailedInitialPaymentDate(atoi(xml->getAttributeValue("dateOfLastAttempt"))); + SetNoInitialFailures( atoi(xml->getAttributeValue("numberOfAttempts"))); + SetInitialPaymentAmount( atol(xml->getAttributeValue("amount"))); + + OTString strCompleted(xml->getAttributeValue("completed")); + + if (strCompleted.Compare("true")) + m_bInitialPaymentDone = true; + else + m_bInitialPaymentDone = false; + + // --------------------- + + OTLog::vOutput(1, + "\n\nInitial Payment. Amount: %ld. Date: %d. Completed Date: %d\n" + " Number of failed attempts: %d. Date of last failed attempt: %d\n" + " Payment %s.\n", + m_lInitialPaymentAmount, m_tInitialPaymentDate, m_tInitialPaymentCompletedDate, + m_nNumberInitialFailures, m_tFailedInitialPaymentDate, + (m_bInitialPaymentDone ? "COMPLETED" : "NOT completed")); + + nReturnVal = 1; + } + + else if (!strcmp("paymentPlan", xml->getNodeName())) + { + // Yes, there IS apparently a payment plan. We can set the bool to true. + m_bPaymentPlan = true; + + SetPaymentPlanAmount( atol(xml->getAttributeValue("amountPerPayment"))); + SetTimeBetweenPayments( atoi(xml->getAttributeValue("timeBetweenPayments"))); + SetPaymentPlanStartDate( atoi(xml->getAttributeValue("planStartDate"))); + SetPaymentPlanLength( atoi(xml->getAttributeValue("planLength"))); + SetMaximumNoPayments( atoi(xml->getAttributeValue("maxNoPayments"))); + + SetDateOfLastPayment( atoi(xml->getAttributeValue("dateOfLastPayment"))); + SetDateOfLastFailedPayment( atoi(xml->getAttributeValue("dateOfLastFailedPayment"))); + + SetNoPaymentsDone( atoi(xml->getAttributeValue("completedNoPayments"))); + SetNoFailedPayments( atoi(xml->getAttributeValue("failedNoPayments"))); + + // --------------------- + + OTLog::vOutput(1, + "\n\nPayment Plan. Amount per payment: %ld. Time between payments: %d.\n" + " Payment plan Start Date: %d. Length: %d. Maximum No. of Payments: %d.\n" + " Completed No. of Payments: %d. Failed No. of Payments: %d\n" + " Date of last payment: %d Date of last failed payment: %d\n", + m_lPaymentPlanAmount, m_tTimeBetweenPayments, + m_tPaymentPlanStartDate, m_tPaymentPlanLength, m_nMaximumNoPayments, + m_nNoPaymentsDone, m_nNoFailedPayments, + m_tDateOfLastPayment, m_tDateOfLastFailedPayment); + + nReturnVal = 1; + } + + return nReturnVal; +} + + + + + + +void OTPaymentPlan::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + // ------------------------------------------------------------- + + const OTString SERVER_ID(GetServerID()), ASSET_TYPE_ID(GetAssetID()), + SENDER_ACCT_ID(GetSenderAcctID()), SENDER_USER_ID(GetSenderUserID()), + RECIPIENT_ACCT_ID(GetRecipientAcctID()), RECIPIENT_USER_ID(GetRecipientUserID()); + + // OTAgreement + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + SERVER_ID.Get(), + ASSET_TYPE_ID.Get(), + SENDER_ACCT_ID.Get(), + SENDER_USER_ID.Get(), + RECIPIENT_ACCT_ID.Get(), + RECIPIENT_USER_ID.Get(), + m_lTransactionNum, + GetCreationDate(), GetValidFrom(), GetValidTo() ); + + // ------------------------------------------------------------- + + // There are "closing" transaction numbers, used to CLOSE a transaction. + // Often where Cron items are involved such as this payment plan, or in baskets, + // where many asset accounts are involved and require receipts to be closed out. + + // OTCronItem + for (int i = 0; i < GetCountClosingNumbers(); i++) + { + long lClosingNumber = GetClosingTransactionNoAt(i); + OT_ASSERT(lClosingNumber > 0); + + m_xmlUnsigned.Concatenate("\n\n", + lClosingNumber); + + } + + // OTAgreement + // For the recipient, his OPENING *and* CLOSING transaction numbers go on + // this list. (For sender, the "opening" number is the GetTransactionNum() + // on this object, and the "closing" number is in the above list.) + for (int i = 0; i < GetRecipientCountClosingNumbers(); i++) + { + long lClosingNumber = GetRecipientClosingTransactionNoAt(i); + OT_ASSERT(lClosingNumber > 0); + + m_xmlUnsigned.Concatenate("\n\n", + lClosingNumber); + + } + + // ------------------------------------------------------------- + // OTPaymentPlan + + if (HasInitialPayment()) + { + const time_t tInitialPaymentDate = GetInitialPaymentDate(); + const long lAmount = GetInitialPaymentAmount(); + const int nNumberOfFailedAttempts = GetNoInitialFailures(); + const time_t tFailedInitialPaymentDate = GetLastFailedInitialPaymentDate(); + const time_t tCompletedInitialPaymentDate= GetInitialPaymentCompletedDate(); + + m_xmlUnsigned.Concatenate("\n\n", + tInitialPaymentDate, + lAmount, + nNumberOfFailedAttempts, + tFailedInitialPaymentDate, + tCompletedInitialPaymentDate, + (IsInitialPaymentDone() ? "true" : "false")); + } + + + // ------------------------------------------------------------- + // OTPaymentPlan + + if (HasPaymentPlan()) + { + const long lAmountPerPayment = GetPaymentPlanAmount(), + lTimeBetween = GetTimeBetweenPayments(), + lPlanStartDate = GetPaymentPlanStartDate(), + lPlanLength = GetPaymentPlanLength(), + lDateOfLastPayment = GetDateOfLastPayment(), + lDateOfLastFailedPayment= GetDateOfLastPayment(); + + const int nMaxNoPayments = GetMaximumNoPayments(), + nNoPaymentsComplete = GetNoPaymentsDone(), + nNoFailedPayments = GetNoFailedPayments(); + + m_xmlUnsigned.Concatenate("\n\n", + lAmountPerPayment, + lTimeBetween, + lPlanStartDate, + lPlanLength, + nMaxNoPayments, + nNoPaymentsComplete, + nNoFailedPayments, + lDateOfLastPayment, + lDateOfLastFailedPayment + ); + } + + // ------------------------------------------------------------- + // OTAgreement + + if (m_strConsideration.Exists()) + { + OTASCIIArmor ascTemp(m_strConsideration); + m_xmlUnsigned.Concatenate("\n%s\n\n", ascTemp.Get()); + } + + // ------------------------------------------------------------- + // OTAgreement + + if (m_strMerchantSignedCopy.Exists()) + { + OTASCIIArmor ascTemp(m_strMerchantSignedCopy); + m_xmlUnsigned.Concatenate("\n%s\n\n", ascTemp.Get()); + } + + // ------------------------------------------------------------- + + m_xmlUnsigned.Concatenate("\n"); +} + + + + + + + + +// -------------------------------------------------------------------------- +// *** Set Initial Payment *** / Make sure to call SetAgreement() first. + + +bool OTPaymentPlan::SetInitialPayment(const long & lAmount, time_t tTimeUntilInitialPayment/*=0*/) +{ + m_bInitialPayment = true; // There is now an initial payment. + m_bInitialPaymentDone = false;// It has not yet been paid. + + // The initial date passed it is measured relative to the creation date. + // (Assumes SetAgreement() was already called...) + const time_t INITIAL_PAYMENT_DATE = GetCreationDate() + tTimeUntilInitialPayment; + + SetInitialPaymentDate(INITIAL_PAYMENT_DATE); + + SetInitialPaymentAmount(lAmount); + + return true; +} + + + +bool OTPaymentPlan::Compare(const OTAgreement & rhs) const +{ + if (false == OTAgreement::Compare(rhs)) + return false; + + // Compare OTPaymentPlan specific info here. + const OTPaymentPlan * pPlan = dynamic_cast(&rhs); + + if ( + (NULL != pPlan) && + // -------------------------------------------------------------------- + (HasInitialPayment() == pPlan->HasInitialPayment()) && + (GetInitialPaymentDate() == pPlan->GetInitialPaymentDate()) && + (GetInitialPaymentAmount() == pPlan->GetInitialPaymentAmount()) && + // -------------------------------------------------------------------- + (HasPaymentPlan() == pPlan->HasPaymentPlan()) && + (GetPaymentPlanAmount() == pPlan->GetPaymentPlanAmount()) && + (GetTimeBetweenPayments() == pPlan->GetTimeBetweenPayments()) && + (GetPaymentPlanStartDate() == pPlan->GetPaymentPlanStartDate()) && + (GetPaymentPlanLength() == pPlan->GetPaymentPlanLength()) && + (GetMaximumNoPayments() == pPlan->GetMaximumNoPayments()) + ) + return true; + + return false; +} + + +// This function assumes that it is the customer's copy, with the customer's transaction numbers, +// and that the merchant's copy is attached within. The function tries to verify they are the same, +// and properly signed. +bool OTPaymentPlan::VerifyAgreement(OTPseudonym & RECIPIENT_NYM, OTPseudonym & SENDER_NYM) +{ + // Load up the merchant's copy. + OTPaymentPlan theMerchantCopy; + if (!m_strMerchantSignedCopy.Exists() || !theMerchantCopy.LoadContractFromString(m_strMerchantSignedCopy)) + { + OTLog::Error("OTPaymentPlan::VerifyAgreement: Expected Merchant's signed copy to be inside the " + "payment plan, but unable to load.\n"); + return false; + } + + // Compare this against the merchant's copy using Compare function. + if (!this->Compare(theMerchantCopy)) + { + OTLog::Output(0, "OTPaymentPlan::VerifyAgreement: Merchant's copy of payment plan isn't equal to Customer's copy.\n"); + return false; + } + + const OTString strServerID(GetServerID()); + + // Verify Transaction Num and Closing Nums against SENDER's issued list + if ((GetCountClosingNumbers() < 1) || !SENDER_NYM.VerifyIssuedNum(strServerID, GetTransactionNum())) + { + OTLog::Error("OTPaymentPlan::VerifyAgreement: Transaction number isn't on sender's issued list, " + "or there weren't enough closing numbers.\n"); + return false; + } + for (int i = 0; i < GetCountClosingNumbers(); i++) + if (!SENDER_NYM.VerifyIssuedNum(strServerID, GetClosingTransactionNoAt(i))) + { + OTLog::Error("OTPaymentPlan::VerifyAgreement: Closing transaction number isn't on sender's issued list.\n"); + return false; + } + // -------------------------------------------------------------------------- + // Verify Recipient closing numbers against RECIPIENT's issued list. + if (GetRecipientCountClosingNumbers() < 2) + { + OTLog::Error("OTPaymentPlan::VerifyAgreement: Expected 2 closing transaction numbers for recipient.\n"); + return false; + } + for (int i = 0; i < GetRecipientCountClosingNumbers(); i++) + if (!SENDER_NYM.VerifyIssuedNum(strServerID, GetRecipientClosingTransactionNoAt(i))) + { + OTLog::Error("OTPaymentPlan::VerifyAgreement: Recipient's Closing transaction number isn't on recipient's issued list.\n"); + return false; + } + + // Verify sender's signature on this. + if (!this->VerifySignature(SENDER_NYM)) + { + OTLog::Output(0, "OTPaymentPlan::VerifyAgreement: Sender's signature failed to verify.\n"); + return false; + } + + // Verify recipient's signature on merchant's copy. + // Verify sender's signature on this. + if (!theMerchantCopy.VerifySignature(RECIPIENT_NYM)) + { + OTLog::Output(0, "OTPaymentPlan::VerifyAgreement: Recipient's signature failed to verify on internal merchant copy of agreement.\n"); + return false; + } + + return true; // Success! +} + + + + + + + +// -------------------------------------------------------------------------- +// *** Set Payment Plan *** / Make sure to call SetAgreement() first. + // default: 1st payment in 30 days +bool OTPaymentPlan::SetPaymentPlan(const long & lPaymentAmount, time_t tTimeUntilPlanStart/*=2592000*/, + time_t tBetweenPayments/*=2592000*/, // Default: 30 days. + time_t tPlanLength/*=0*/, int nMaxPayments/*=0*/) +{ + // ----------------------------------------- + + if (lPaymentAmount <= 0 ) + { + OTLog::Error("Payment Amount less than zero in OTPaymentPlan::SetPaymentPlan\n"); + return false; + } + + SetPaymentPlanAmount(lPaymentAmount); + + // ----------------------------------------- + + // Note: this is just a safety mechanism. And while it should be turned back ON at some point, + // I need it off for testing at the moment. So if you're reading this now, go ahead and + // uncomment the below code so it is functional again. + +// if (tBetweenPayments < LENGTH_OF_DAY_IN_SECONDS) // If the time between payments is set to LESS than a 24-hour day, +// tBetweenPayments = LENGTH_OF_DAY_IN_SECONDS; // then set the minimum time to 24 hours. This is a safety mechanism. + if (tBetweenPayments < 10) // Every 10 seconds (still need some kind of standard, even while testing.) + tBetweenPayments = 10; // TODO: Remove this and uncomment the above code. + // TODO possible make it possible to configure this in the currency contract itself. + + SetTimeBetweenPayments(tBetweenPayments); + + // ----------------------------------------- + + // Assuming no need to check a time_t for <0 since it's probably unsigned... + const time_t PAYMENT_PLAN_START = GetCreationDate() + tTimeUntilPlanStart; + + SetPaymentPlanStartDate(PAYMENT_PLAN_START); + + // ----------------------------------------- + + // Is this even a problem? todo: verify that time_t is unisigned. + if (0 > tPlanLength) // if it's a negative number... + { + OTLog::Error("Attempt to use negative number for plan length.\n"); + return false; + } + + SetPaymentPlanLength(tPlanLength); // any zero (no expiry) or above-zero value will do. + + // ----------------------------------------- + + if (0 > nMaxPayments) // if it's a negative number... + { + OTLog::Error("Attempt to use negative number for plan max payments.\n"); + return false; + } + + SetMaximumNoPayments(nMaxPayments); // any zero (no expiry) or above-zero value will do. + + // ----------------------------------------- + + // Set these to zero, they will be incremented later at the right times. + m_tDateOfLastPayment = 0; + m_nNoPaymentsDone = 0; + + // Okay, we're a payment plan! (Still need to add the object to OTCron... But it's ready...) + m_bPaymentPlan = true; + + return true; +} + + + + +OTPaymentPlan::OTPaymentPlan() : OTAgreement(), m_bProcessingInitialPayment(false), m_bProcessingPaymentPlan(false) +{ + InitPaymentPlan(); +} + + +OTPaymentPlan::OTPaymentPlan(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTAgreement(SERVER_ID, ASSET_ID), m_bProcessingInitialPayment(false), m_bProcessingPaymentPlan(false) +{ + InitPaymentPlan(); +} + + +OTPaymentPlan::OTPaymentPlan(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID) : + OTAgreement(SERVER_ID, ASSET_ID, + SENDER_ACCT_ID, SENDER_USER_ID, RECIPIENT_ACCT_ID, RECIPIENT_USER_ID), m_bProcessingInitialPayment(false), m_bProcessingPaymentPlan(false) +{ + InitPaymentPlan(); +} + + +bool OTPaymentPlan::SetInitialPaymentDone() +{ + if (m_bInitialPaymentDone) // if done already. + return false; + + m_bInitialPaymentDone = true; + // We store the bool that it's done (above), and we also store the date when it was done: + SetInitialPaymentCompletedDate(GetCurrentTime()); + + return true; +} + + + +// TODO: Run a scanner on the code for memory leaks and buffer overflows. + + + + + +// This can be called by either the initial payment code, or by the payment plan code. +// true == success, false == failure. +// +bool OTPaymentPlan::ProcessPayment(const long & lAmount) +{ + const OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + + bool bSuccess = false; // The return value. + + + const OTIdentifier SERVER_ID(pCron->GetServerID()); + const OTIdentifier SERVER_USER_ID(*pServerNym); + + const OTIdentifier & SOURCE_ACCT_ID = GetSenderAcctID(); + const OTIdentifier & SENDER_USER_ID = GetSenderUserID(); + + const OTIdentifier & RECIPIENT_ACCT_ID = GetRecipientAcctID(); + const OTIdentifier & RECIPIENT_USER_ID = GetRecipientUserID(); + + + OTString strSenderUserID(SENDER_USER_ID), strRecipientUserID(RECIPIENT_USER_ID), + strSourceAcctID(SOURCE_ACCT_ID), strRecipientAcctID(RECIPIENT_ACCT_ID); + + + // Make sure they're not the same Account IDs ... + // Otherwise we would have to take care not to load them twice, like with the Nyms below. + // (Instead I just disallow it entirely.) + if (SOURCE_ACCT_ID == RECIPIENT_ACCT_ID) + { + OTLog::Output(0, "Failed to process payment: both account IDs were identical.\n"); + FlagForRemoval(); // Remove from Cron + return false; // TODO: should have a "Verify Payment Plan" function that weeds this crap out before we even get here. + } + // When the accounts are actually loaded up, then we should also compare + // the asset types to make sure they were what we expected them to be. + + + // ----------------------------------------------------------------- + + // Need to load up the ORIGINAL PAYMENT PLAN (with BOTH users' original SIGNATURES on it!) + // Will need to verify those signatures as well as attach a copy of it to the receipt. + + OTCronItem * pOrigCronItem = NULL; + + // OTCronItem::LoadCronReceipt loads the original version with the user's signature. + // (Updated versions, as processing occurs, are signed by the server.) + pOrigCronItem = OTCronItem::LoadCronReceipt(GetTransactionNum()); + + OT_ASSERT(NULL != pOrigCronItem); // How am I processing it now if the receipt wasn't saved in the first place?? + // TODO: Decide global policy for handling situations where the hard drive stops working, etc. + + // When theOrigPlanGuardian goes out of scope, pOrigCronItem gets deleted automatically. + OTCleanup theOrigPlanGuardian(*pOrigCronItem); + + // strOrigPlan is a String copy (a PGP-signed XML file, in string form) of the original Payment Plan request... + OTString strOrigPlan(*pOrigCronItem); // <====== Farther down in the code, I attach this string to the receipts. + + + // Make sure to clean these up. +// delete pOrigCronItem; // theOrigPlanGuardian will handle this now, whenever it goes out of scope. +// pOrigCronItem = NULL; // So I don't need to worry about deleting this anymore. I can keep it around and + // use it all I want, and return anytime, and it won't leak. + + + + // -------------- Make sure have both nyms loaded and checked out. -------------------------------------------------- + // WARNING: 1 or both of the Nyms could be also the Server Nym. They could also be the same Nym, but NOT the Server. + // In all of those different cases, I don't want to load the same file twice and overwrite it with itself, losing + // half of all my changes. I have to check all three IDs carefully and set the pointers accordingly, and then operate + // using the pointers from there. + + + OTPseudonym theSenderNym, theRecipientNym; // We MIGHT use ONE, OR BOTH, of these, or none. (But probably both.) + + // Find out if either Nym is actually also the server. + bool bSenderNymIsServerNym = ((SENDER_USER_ID == SERVER_USER_ID) ? true : false); + bool bRecipientNymIsServerNym = ((RECIPIENT_USER_ID == SERVER_USER_ID) ? true : false); + + // We also see, after all that is done, whether both pointers go to the same entity. + // (We'll want to know that later.) + bool bUsersAreSameNym = ((SENDER_USER_ID == RECIPIENT_USER_ID) ? true : false); + + OTPseudonym * pSenderNym = NULL; + OTPseudonym * pRecipientNym = NULL; + + // Figure out if Sender Nym is also Server Nym. + if (bSenderNymIsServerNym) + { + // If the First Nym is the server, then just point to that. + pSenderNym = pServerNym; + } + else // Else load the First Nym from storage. + { + theSenderNym.SetIdentifier(SENDER_USER_ID); // theSenderNym is pSenderNym + + if (false == theSenderNym.LoadPublicKey()) + { + OTString strNymID(SENDER_USER_ID); + OTLog::vError("Failure loading Sender Nym public key in OTPaymentPlan::ProcessPayment: %s\n", + strNymID.Get()); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + + if (theSenderNym.VerifyPseudonym() && + theSenderNym.LoadSignedNymfile(*pServerNym)) // ServerNym here is not theSenderNym's identity, but merely the signer on this file. + { + pSenderNym = &theSenderNym; // <===== + } + else + { + OTString strNymID(SENDER_USER_ID); + OTLog::vError("Failure loading or verifying Sender Nym public key in OTPaymentPlan::ProcessPayment: %s\n", + strNymID.Get()); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + } + + + // Next, we also find out if Recipient Nym is Server Nym... + if (bRecipientNymIsServerNym) + { + // If the Recipient Nym is the server, then just point to that. + pRecipientNym = pServerNym; + } + else if (bUsersAreSameNym) // Else if the participants are the same Nym, point to the one we already loaded. + { + pRecipientNym = pSenderNym; // theSenderNym is pSenderNym + } + else // Otherwise load the Other Nym from Disk and point to that. + { + theRecipientNym.SetIdentifier(RECIPIENT_USER_ID); + + if (false == theRecipientNym.LoadPublicKey()) + { + OTString strNymID(RECIPIENT_USER_ID); + OTLog::vError("Failure loading Recipient Nym public key in OTPaymentPlan::ProcessPayment: %s\n", + strNymID.Get()); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + + if (theRecipientNym.VerifyPseudonym() && + theRecipientNym.LoadSignedNymfile(*pServerNym)) + { + pRecipientNym = &theRecipientNym; // <===== + } + else + { + OTString strNymID(RECIPIENT_USER_ID); + OTLog::vError("Failure loading or verifying Recipient Nym public key in OTPaymentPlan::ProcessPayment: %s\n", + strNymID.Get()); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + } + + + // ----------------------------------------------------------------- + + + // Now that I have the original Payment Plan loaded, and all the Nyms ready to go, + // let's make sure that BOTH the nyms in question have SIGNED the original request. + // (Their signatures wouldn't be on the updated version in Cron--the server signs + // that one.) + + if (!pOrigCronItem->VerifySignature(*pSenderNym) || !pOrigCronItem->VerifySignature(*pRecipientNym)) + { + OTLog::Error("Failed authorization: Payment plan (while attempting to process...)\n"); + FlagForRemoval(); // Remove it from Cron. + return false; + } + + + // AT THIS POINT, I have pServerNym, pSenderNym, and pRecipientNym. + // ALL are loaded from disk (where necessary.) AND... + // ALL are valid pointers, (even if they sometimes point to the same object,) + // AND none are capable of overwriting the storage of the other (by accidentally + // loading the same storage twice.) + // We also have boolean variables at this point to tell us exactly which are which, + // (in case some of those pointers do go to the same object.) + // They are: + // bSenderNymIsServerNym, bRecipientNymIsServerNym, and bUsersAreSameNym. + // + // I also have pOrigCronItem, which is a dynamically-allocated copy of the original + // Cron Receipt for this Payment Plan. (And I don't need to worry about deleting it, either.) + // I know for a fact they have both signed pOrigCronItem... + + // ----------------------------------------------------------------- + + OTAccount * pSourceAcct = OTAccount::LoadExistingAccount(SOURCE_ACCT_ID, SERVER_ID); + + if (NULL == pSourceAcct) + { + OTLog::Output(0, "ERROR verifying existence of source account during attempted payment plan processing.\n"); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + // Past this point we know pSourceAcct is good and will clean itself up. + OTCleanup theSourceAcctSmrtPtr(*pSourceAcct); + // ----------------------------------------------------------------- + + OTAccount * pRecipientAcct = OTAccount::LoadExistingAccount(RECIPIENT_ACCT_ID, SERVER_ID); + + if (NULL == pRecipientAcct) + { + OTLog::Output(0, "ERROR verifying existence of recipient account during attempted payment plan processing.\n"); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + // Past this point we know pRecipientAcct is good and will clean itself up. + OTCleanup theRecipAcctSmrtPtr(*pRecipientAcct); + // ----------------------------------------------------------------- + + + // BY THIS POINT, both accounts are successfully loaded, and I don't have to worry about + // cleaning either one of them up, either. But I can now use pSourceAcct and pRecipientAcct... + // + // + // ----------------------------------------------------------------------------------- + + // A few verification if/elses... + + // Are both accounts of the same Asset Type? + if (pSourceAcct->GetAssetTypeID() != pRecipientAcct->GetAssetTypeID()) + { // We already know the SUPPOSED Asset IDs of these accounts... But only once + // the accounts THEMSELVES have been loaded can we VERIFY this to be true. + OTLog::Output(0, "ERROR - attempted payment between accounts of different " + "asset types in OTPaymentPlan::ProcessPayment\n"); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + + // Make sure all accounts are signed by the server and have the owner they are expected to have. + + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pSourceAcct->VerifyOwner(*pSenderNym) || !pSourceAcct->VerifySignature(*pServerNym) ) + { + OTLog::Output(0, "ERROR verifying ownership or signature on source account in OTPaymentPlan::ProcessPayment\n"); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + + else if (!pRecipientAcct->VerifyOwner(*pRecipientNym) || !pRecipientAcct->VerifySignature(*pServerNym) ) + { + OTLog::Output(0, "ERROR verifying ownership or signature on recipient account in OTPaymentPlan::ProcessPayment\n"); + FlagForRemoval(); // Remove it from future Cron processing, please. + return false; + } + + // By this point, I know I have both accounts loaded, and I know that they have the right asset types, + // and I know they have the right owners and they were all signed by the server. + // I also know that their account IDs in their internal records matched the account filename for each acct. + // I also have pointers to the Nyms who own these accounts. + + else + { + // Okay then, everything checks out. Let's add a receipt to the sender's outbox and the recipient's inbox. + // IF they can be loaded up from file, or generated, that is. + + // Load the inbox/outbox in case they already exist + OTLedger theSenderInbox (SENDER_USER_ID, SOURCE_ACCT_ID, SERVER_ID), + theRecipientInbox (RECIPIENT_USER_ID, RECIPIENT_ACCT_ID, SERVER_ID); + + // ALL inboxes -- no outboxes. All will receive notification of something ALREADY DONE. + bool bSuccessLoadingSenderInbox = theSenderInbox.LoadInbox(); + bool bSuccessLoadingRecipientInbox = theRecipientInbox.LoadInbox(); + + // -------------------------------------------------------------------- + + // ...or generate them otherwise... + + if (true == bSuccessLoadingSenderInbox) + bSuccessLoadingSenderInbox = theSenderInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingSenderInbox = theSenderInbox.GenerateLedger(SOURCE_ACCT_ID, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (true == bSuccessLoadingRecipientInbox) + bSuccessLoadingRecipientInbox = theRecipientInbox.VerifyAccount(*pServerNym); + else + bSuccessLoadingRecipientInbox = theRecipientInbox.GenerateLedger(RECIPIENT_ACCT_ID, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + // -------------------------------------------------------------------- + + if ((false == bSuccessLoadingSenderInbox) || + (false == bSuccessLoadingRecipientInbox)) + { + OTLog::Error("ERROR loading or generating inbox ledger in OTPaymentPlan::ProcessPayment.\n"); + } + else + { + // Generate new transaction numbers for these new transactions + long lNewTransactionNumber = GetCron()->GetNextTransactionNumber(); + +// OT_ASSERT(lNewTransactionNumber > 0); // this can be my reminder. + if (0 == lNewTransactionNumber) + { + OTLog::Output(0, "WARNING: Payment plan is unable to process because there are no more transaction numbers available.\n"); + // (Here I do NOT flag for removal.) + return false; + } + + OTTransaction * pTransSend = OTTransaction::GenerateTransaction(theSenderInbox, + OTTransaction::paymentReceipt, lNewTransactionNumber); + + OTTransaction * pTransRecip = OTTransaction::GenerateTransaction(theRecipientInbox, + OTTransaction::paymentReceipt, lNewTransactionNumber); + + // (No need to OT_ASSERT on the above transactions since it occurs in GenerateTransaction().) + + + // Both inboxes will get receipts with the same (new) transaction ID on them. + // They will have a "In reference to" field containing the original payment plan + // (with user's signature). + + // set up the transaction items (each transaction may have multiple items... but not in this case.) + OTItem * pItemSend = OTItem::CreateItemFromTransaction(*pTransSend, OTItem::paymentReceipt); + OTItem * pItemRecip = OTItem::CreateItemFromTransaction(*pTransRecip, OTItem::paymentReceipt); + + // these may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave em. + OT_ASSERT(NULL != pItemSend); + OT_ASSERT(NULL != pItemRecip); + + pItemSend->SetStatus(OTItem::rejection); // the default. + pItemRecip->SetStatus(OTItem::rejection); // the default. + + + // Here I make sure that each receipt (each inbox notice) references the original + // transaction number that was used to set the payment plan into place... + // This number is used to track all cron items. (All Cron items require a transaction + // number from the user in order to add them to Cron in the first place.) + // + // The number is also used to uniquely identify all other transactions, as you + // might guess from its name. + pTransSend->SetReferenceToNum(GetTransactionNum()); + pTransRecip->SetReferenceToNum(GetTransactionNum()); + + + // The TRANSACTION (a receipt in my inbox) will be sent with "In Reference To" information + // containing the ORIGINAL SIGNED PLAN. (With both parties' original signatures on it.) + // + // Whereas the TRANSACTION ITEM will include an "attachment" containing the UPDATED + // PLAN (this time with the SERVER's signature on it.) + // + // Here's the original one going onto the transaction: + // + pTransSend->SetReferenceString(strOrigPlan); + pTransRecip->SetReferenceString(strOrigPlan); + + + + + + // -------------------------------------------------------------------------- + + // MOVE THE DIGITAL ASSETS FROM ONE ACCOUNT TO ANOTHER... + + // Calculate the amount and debit/ credit the accounts + // Make sure each Account can afford it, and roll back in case of failure. + + bool bMoveSender = false; + bool bMoveRecipient = false; + + // Make sure he can actually afford it... + if (pSourceAcct->GetBalance() >= lAmount) + { + // Debit the source account. + bMoveSender = pSourceAcct->Debit(lAmount); // <====== DEBIT FUNDS + + // IF success, credit the recipient. + if (bMoveSender) + { + bMoveRecipient = pRecipientAcct->Credit(lAmount); // <=== CREDIT FUNDS + + // Okay, we already took it from the source account. + // But if we FAIL to credit the recipient, then we need to PUT IT BACK in the source acct. + // (EVEN THOUGH we'll just "NOT SAVE" after any failure, so it's really superfluous.) + // + if (!bMoveRecipient) + pSourceAcct->Credit(lAmount); // put the money back + else + bSuccess = true; + } + + // If ANY of these failed, then roll them all back and break. + if (!bMoveSender || !bMoveRecipient) + { + OTLog::Error("Very strange! Funds were available but debit or credit failed while performing payment.\n"); + // We won't save the files anyway, if this failed. + bSuccess = false; + } + } + + + + // -------------------------------------------------------------------------- + + + + + + // DO NOT SAVE ACCOUNTS if bSuccess is false. + // We only save these accounts if bSuccess == true. + // (But we do save the inboxes either way, since payment failures always merit an inbox notice.) + + if (true == bSuccess) // The payment succeeded. + { + // Both accounts involved need to get a receipt of this trade in their inboxes... + pItemSend->SetStatus(OTItem::acknowledgement); // pSourceAcct + pItemRecip->SetStatus(OTItem::acknowledgement); // pRecipientAcct + + pItemSend->SetAmount(lAmount*(-1)); // "paymentReceipt" is otherwise ambigious about whether you are paying or being paid. + pItemRecip->SetAmount(lAmount); // So, I decided for payment and market receipts, to use negative and positive amounts. + // I will probably do the same for cheques, since they can be negative as well (invoices). + + if (m_bProcessingInitialPayment) // if this is a success for an initial payment + { + SetInitialPaymentDone(); + OTLog::Output(3, "Initial payment performed in OTPaymentPlan::ProcessPayment\n"); + } + else if (m_bProcessingPaymentPlan) // if this is a success for payment plan payment. + { + IncrementNoPaymentsDone(); + SetDateOfLastPayment(GetCurrentTime()); + OTLog::Output(3, "Payment plan payment performed in OTPaymentPlan::ProcessPayment\n"); + } + + // (I do NOT save m_pCron here, since that already occurs after this function is called.) + } + else // bSuccess = false. The payment failed. + { + pItemSend->SetStatus(OTItem::rejection);// pSourceAcct // These are already initialized to false. + pItemRecip->SetStatus(OTItem::rejection);// pRecipientAcct // (But just making sure...) + + pItemSend->SetAmount(0); // No money changed hands. Just being explicit. + pItemRecip->SetAmount(0); // No money changed hands. Just being explicit. + + if (m_bProcessingInitialPayment) + { + IncrementNoInitialFailures(); + SetLastFailedInitialPaymentDate(GetCurrentTime()); + OTLog::Output(3, "Initial payment failed in OTPaymentPlan::ProcessPayment\n"); + } + else if (m_bProcessingPaymentPlan) + { + IncrementNoFailedPayments(); + SetDateOfLastFailedPayment(GetCurrentTime()); + OTLog::Output(3, "Payment plan payment failed in OTPaymentPlan::ProcessPayment\n"); + } + } + + // Everytime a payment processes, a receipt is put in the user's inbox, containing a + // CURRENT copy of the payment plan (which took just money from the user's acct, or not, + // and either way thus updated its status -- so its internal data has changed.) + // + // It will also contain a copy of the user's ORIGINAL signed payment plan, where the data + // has NOT changed, (so the user's original signature is still good.) + // + // In order for it to export the RIGHT VERSION of the CURRENT plan, which has just changed + // (above), then I need to re-sign it and save it first. (The original version I'll load from + // a separate file using OTCronItem::LoadCronReceipt(lTransactionNum). It has both original + // signatures on it. Nice, eh?) + + + this->ReleaseSignatures(); + this->SignContract(*pServerNym); + this->SaveContract(); + + + // No need to save Cron here, since both caller functions call SaveCron() EVERY time anyway, + // success or failure, rain or shine. + //m_pCron->SaveCron(); // Cron is where I am serialized, so if Cron's not saved, I'm not saved. + + // ----------------------------------------------------------------- + // + // EVERYTHING BELOW is just about notifying the users, by dropping the receipt in their + // inboxes. The rest is done. The accounts and inboxes will all be saved at the same time. + // + // The Payment Plan is entirely updated and saved by this point, and Cron will + // also be saved in the calling function once we return (no matter what.) + // + // ----------------------------------------------------------------- + + + // Basically I load up both INBOXES, which are actually LEDGERS, and then I create + // a new transaction, with a new transaction item, for each of the ledgers. + // (That's where the receipt information goes.) + // + + + + // ----------------------------------------------------------------- + + // The TRANSACTION will be sent with "In Reference To" information containing the + // ORIGINAL SIGNED PLAN. (With both of the users' original signatures on it.) + // + // Whereas the TRANSACTION ITEM will include an "attachment" containing the UPDATED + // PLAN (this time with the SERVER's signature on it.) + + // (Lucky I just signed and saved the updated plan (above), or it would still have + // have the old data in it.) + + // I also already loaded the original plan. Remember this from above, + // near the top of the function: + // OTCronItem * pOrigCronItem = NULL; + // OTString strOrigPlan(*pOrigCronItem); // <====== Farther down in the code, I attach this string to the receipts. + // ... then lower down... + // pTransSend->SetReferenceString(strOrigPlan); + // pTransRecip->SetReferenceString(strOrigPlan); + // + // So the original plan is already loaded and copied to the Transaction as the "In Reference To" + // Field. Now let's add the UPDATED plan as an ATTACHMENT on the Transaction ITEM: + // + OTString strUpdatedPlan(*this); + + // Set the updated plan as the attachment on the transaction item. + // (With the SERVER's signature on it!) + // (As a receipt for each trader, so they can see their offer updating.) + pItemSend->SetAttachment(strUpdatedPlan); + pItemRecip->SetAttachment(strUpdatedPlan); + + // ----------------------------------------------------------------- + + + // Success OR failure, either way I want a receipt in both inboxes. + // But if FAILURE, I do NOT want to save the Accounts, JUST the inboxes. + // So the inboxes happen either way, but the accounts are saved only on success. + + // sign the item + pItemSend->SignContract(*pServerNym); + pItemRecip->SignContract(*pServerNym); + + pItemSend->SaveContract(); + pItemRecip->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransSend->AddItem(*pItemSend); + pTransRecip->AddItem(*pItemRecip); + + pTransSend->SignContract(*pServerNym); + pTransRecip->SignContract(*pServerNym); + + pTransSend->SaveContract(); + pTransRecip->SaveContract(); + + // ------------------------------------------- + // Here, the transactions we just created are actually added to the ledgers. + // This happens either way, success or fail. + + theSenderInbox. AddTransaction(*pTransSend); + theRecipientInbox. AddTransaction(*pTransRecip); + + // ------------------------------------------- + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theSenderInbox. ReleaseSignatures(); + theRecipientInbox. ReleaseSignatures(); + + // Sign both of them. + theSenderInbox. SignContract(*pServerNym); + theRecipientInbox. SignContract(*pServerNym); + + // Save both of them internally + theSenderInbox. SaveContract(); + theRecipientInbox. SaveContract(); + + // Save both inboxes to storage. (File, DB, wherever it goes.) + theSenderInbox. SaveInbox(); + theRecipientInbox. SaveInbox(); + + // If success, save the accounts with new balance. (Save inboxes with receipts either way, + // and the receipts will contain a rejection or acknowledgment stamped by the Server Nym.) + if (true == bSuccess) + { + // ------------------------------------------- + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + pSourceAcct-> ReleaseSignatures(); + pRecipientAcct->ReleaseSignatures(); + + // Sign both of them. + pSourceAcct-> SignContract(*pServerNym); + pRecipientAcct->SignContract(*pServerNym); + + // Save both of them internally + pSourceAcct-> SaveContract(); + pRecipientAcct->SaveContract(); + + // TODO: Better rollback capabilities in case of failures here: + + // Save both accounts to storage. + pSourceAcct-> SaveAccount(); + pRecipientAcct->SaveAccount(); + + // NO NEED TO LOG HERE, since success / failure is already logged above. + } + } // both inboxes were successfully loaded or generated. + } // By the time we enter this block, accounts and nyms are already loaded. As we begin, inboxes are instantiated. + + return bSuccess; +} + + + + + +// Assumes we're due for this payment. Execution oriented. +// NOTE: there used to be more to this function, but it ended up like this. Que sera sera. +void OTPaymentPlan::ProcessInitialPayment() +{ + OT_ASSERT(NULL != GetCron()); + + m_bProcessingInitialPayment = true; + ProcessPayment(GetInitialPaymentAmount()); + m_bProcessingInitialPayment = false; + + // No need to save the Payment Plan itself since it's already + // saved inside the ProcessPayment() call as part of constructing the receipt. + + + // Since this' data file is actually a blob as part of Cron, + // then we need to save Cron as well. Only then are these changes truly saved. + // I'm actually lucky to even be able to save cron here, since I know for a fact + // that I have to save no matter what. In cases where I don't know for sure, the + // save call has to go a level deeper, since only there would the code know whether + // or not something has actually changed. + // HMM Todo: Look into adding a "DIRTY" field to OT objects. + // Double-hmm, todo: I could make a series of macros for serializable member variables, + // that would deal with all the xml read/write very compactly, and automatically track + // whether the variable was dirty. Then anywhere in the code I can just ask an object + // if it is dirty, or instruct it to update itself if it is. Anyway, let's save Cron... + + GetCron()->SaveCron(); + + // Todo: put the actual Cron items in separate files, so I don't have to update + // the entire cron file every time an item changes. That way the main cron file + // can just keep a record of the active items, and will change only when an item + // is added or removed. + // + // Until then, the entire Cron file will have to save EVERY time this call happens. + // + // (I'll add something to Cron so it can't save more than once per second or something.) + // (DONE: Payment Plans process hourly and Trades process every 10 seconds.) +} + + + +/* +// This is called by OTCronItem::HookRemovalFromCron +// (After calling this method, HookRemovalFromCron then calls onRemovalFromCron.) +// +void OTPaymentPlan::onFinalReceipt() +{ + + OTAgreement::onFinalReceipt(); + + // ----------------------------------------------------------- + + // Not much done in this one. + + // ----------------------------------------------------------- + + + +} + + +// This is called by OTCronItem::HookRemovalFromCron +// (Before calling this method, HookRemovalFromCron first calls onFinalReceipt.) +// +void OTPaymentPlan::onRemovalFromCron() +{ + + OTAgreement::onRemovalFromCron(); + + // ----------------------------------------------------------- + + // Not much done in this one. + + // ----------------------------------------------------------- + +} +*/ + + + + + + +// Assumes we're due for a payment. Execution oriented. +// NOTE: There used to be more to this function, but it ended up like this. Que sera sera. +void OTPaymentPlan::ProcessPaymentPlan() +{ + OT_ASSERT(NULL != GetCron()); + + // This way the ProcessPayment() function knows what kind of payment we're processing. + // Basically there's just one little spot in there where it needs to know. :-( + // But the member could be useful in the future anyway. + m_bProcessingPaymentPlan = true; + ProcessPayment(GetPaymentPlanAmount()); + m_bProcessingPaymentPlan = false; + + // No need to save the Payment Plan itself since it's already + // saved inside the ProcessPayment() call as part of constructing the receipt. + + + // Either way, Cron should save, since it just updated. + // (The above function call WILL change this payment plan + // and re-sign it and save it, no matter what. So I just + // call this here to keep it simple: + + GetCron()->SaveCron(); + + // ----------------------------------------------------- +} + + + +// OTCron calls this regularly, which is my chance to expire, etc. +// Return True if I should stay on the Cron list for more processing. +// Return False if I should be removed and deleted. +bool OTPaymentPlan::ProcessCron() +{ + OT_ASSERT(NULL != GetCron()); + + // ----------------------------------------------------------------- + // Right now Cron is called 10 times per second. + // I'm going to slow down all trades so they are once every GetProcessInterval() + if (GetLastProcessDate() > 0) + { +// OTLog::vOutput(3, "DEBUG: time: %d Last process date: %d Time since last: %d Interval: %d\n", +// GetCurrentTime(), GetLastProcessDate(), (GetCurrentTime() - GetLastProcessDate()), +// GetProcessInterval()); + + // (Default ProcessInternal is 1 second, but Trades will use 10 seconds, + // and Payment Plans will use an hour or day.) + if ((GetCurrentTime() - GetLastProcessDate()) <= GetProcessInterval()) + return true; + } + // Keep a record of the last time this was processed. + // (NOT saved to storage, only used while the software is running.) + // (Thus no need to release signatures, sign contract, save contract, etc.) + SetLastProcessDate(GetCurrentTime()); + // ----------------------------------------------------------------- + + // END DATE -------------------------------- + // First call the parent's version (which this overrides) so it has + // a chance to check its stuff. + // Currently it calls OTCronItem::ProcessCron, which checks IsExpired(). + // + if (false == OTAgreement::ProcessCron()) + { + OTLog::Output(3, "Cron job has expired.\n"); + return false; // It's expired or flagged for removal--remove it from Cron. + } + + // START DATE -------------------------------- + // Okay, so it's not expired. But might not have reached START DATE yet... + if (!VerifyCurrentDate()) + return true; // The Payment Plan is not yet valid, so we return. BUT, we also + // return TRUE, so it will STAY on Cron until it BECOMES valid. + + + // ----------------------------------------------------------------------------- + + if (GetCron()->GetTransactionCount() < 1) + { + OTLog::Output(0, "Failed to process payment: Out of transaction numbers!\n"); + return true; // If there aren't enough transaction numbers, this won't log + // 10 times per second, but instead every hour or every day, + } // since plans don't process any more often than that anyway. + + // ----------------------------------------------------------------------------- + + // First process the initial payment... + + if (HasInitialPayment() && // If I have an initial payment... + !IsInitialPaymentDone() && // and I have not yet processed it... + (GetCurrentTime() > GetInitialPaymentDate()) && // and we're past the initial payment due date... + ((GetCurrentTime() - GetLastFailedInitialPaymentDate()) > LENGTH_OF_DAY_IN_SECONDS)) // and it's been more than a day since I last failed attmpting this... + { // THEN we're due for the initial payment! Process it! + + OTLog::Output(3, "Cron: Processing initial payment...\n"); + + ProcessInitialPayment(); + } + + // ----------------------------------------------------------------------------- + + + // Next, process the payment plan... + OTLog::vOutput(3, "(payment plan): Flagged/Removal: %s Has Plan: %s Current time: %d Start Date: %d\n", + (IsFlaggedForRemoval() ? "TRUE" : "FALSE"), (HasPaymentPlan() ? "TRUE" : "FALSE"), + GetCurrentTime(), GetPaymentPlanStartDate()); + if (!IsFlaggedForRemoval() && HasPaymentPlan() && // This object COULD have gotten flagged for removal during the ProcessInitialPayment() + (GetCurrentTime() > GetPaymentPlanStartDate())) // call. Therefore, I am sure to check that it's NOT IsFlaggedForRemoval() before calling + { // this block of code. +// OTLog::Error("DEBUG: Payment Plan -------------\n"); + + // First I'll calculate whether the next payment would be due, based on start date, + // time between payments, and date of last payment. + + const time_t DURATION_SINCE_START = (GetCurrentTime() - GetPaymentPlanStartDate()); + + // Let's say the plan charges every week, and it's been 16 DAYS DURATION since starting. + // The first charge would have been on the 1st day, 16 days ago. + // Then the second charge would have been on the 8th day, (7 days later) + // Then the third charge would have been on the 15th day, (7 days later again) + // That means the next charge isn't due until the 22nd. + + // Right now in this example, DURATION_SINCE_START is: (16 * LENGTH_OF_DAY_IN_SECONDS). + // I must calculate from that, that three charges have already happened, and that the + // next one is not yet due. + // + // I also know that GetTimeBetweenPayments() is set to (LENGTH_OF_DAY_IN_SECONDS * 7) + // + // Duration / timebetween == 16/7 == 2 with 2 remainder. (+1 to get 3: THREE should have already happened.) + // if it was the 14th, 14/7 == 2 with 0 remainder. (+1 to get 3: THREE should have happened by the 14th) + // If it was the 22nd, 22/7 == 3 with 1 remainder. (+1 to get 4: FOUR payments should have already happened.) + // + // Can also just add the TimeBetweenPayments to the DateOfLastPayment... + // + const int nNoPaymentsThatShouldHaveHappenedByNow = ((DURATION_SINCE_START/GetTimeBetweenPayments()) + 1); + // The +1 is because it charges on the 1st day of the plan. So 14 days, which is 7 times 2, equals *3* payments, not 2. + +// OTLog::vOutput(3, "Payments that should have happened by now: %d\n" +// "Number payments done: %d date of last payment: %d\n" +// "Date of last failed payment: %d Time Between: %d", +// nNoPaymentsThatShouldHaveHappenedByNow, GetNoPaymentsDone(), GetDateOfLastPayment(), +// GetDateOfLastFailedPayment(), GetTimeBetweenPayments()); + // ------------------------------------------------------- + + // It's expired, remove it. (I check >0 because this one is an optional field.) + if ((GetMaximumNoPayments() > 0) && (GetNoPaymentsDone() >= GetMaximumNoPayments())) + { + OTLog::Output(1, "Payment plan has expired by reaching max number of payments allowed.\n"); + return false; // This payment plan will be removed from Cron by returning false. + } + // Again, I check >0 because the plan length is optional and might just be 0. + else if ((GetPaymentPlanLength() > 0) && (GetCurrentTime() >= (GetPaymentPlanStartDate() + GetPaymentPlanLength()))) + { + OTLog::Output(1, "Payment plan has expired by reaching its maximum length of time.\n"); + return false; // This payment plan will be removed from Cron by returning false. + } + else if (nNoPaymentsThatShouldHaveHappenedByNow <= GetNoPaymentsDone()) // if not enough payments have happened... + { +// OTLog::Output(3, "DEBUG: Enough payments have already been made.\n"); + } + else if ((GetCurrentTime() - GetDateOfLastPayment()) < GetTimeBetweenPayments()) // and the time since last payment is more than the payment period... + { +// OTLog::Output(3, "DEBUG: Not enough time has elapsed.\n"); + } + else if ((GetCurrentTime() - GetDateOfLastFailedPayment()) < LENGTH_OF_DAY_IN_SECONDS) // and it's been at least 24 hrs since the last failed payment... + { + OTLog::Output(3, "Cron (processing payment plan): Not enough time since last failed payment.\n"); + } + // Okay -- PROCESS IT! + else // The above 3 end-comments have opposite logic from their if(), since they used to be here. + { // I reversed the operators so they could be failures, resulting in this else block for success. + + OTLog::Output(3, "Cron: Processing payment...\n"); + + // This function assumes the payment is due, and it only fails in the case of + // the payer's account having insufficient funds. + ProcessPaymentPlan(); + } + } + + + // Notice something: Markets are very concerned whether a trade failed, or if the account + // was short of funds. They track that, and remove any trades when they have this problem. + // So in OTTrade right now, you would be checking if it was flagged for removal, and + // returning false in that case. + // + // But with a PAYMENT PLAN, if a payment fails, you don't want to cancel the plan!!! + // You want it to keep trying until it gets in more payments, and ONLY cancel in the + // case where the user REQUESTS it, or when one of the legitimate terms above expires naturally. + // Insufficient funds? NO PROBLEM: you can stay on your payment plan as long as you want! :-) + // + // There ARE however funny cases where you WOULD want the plan removed. + // For example: + // + if (IsFlaggedForRemoval() || + (HasInitialPayment() && IsInitialPaymentDone() && !HasPaymentPlan())) + { + OTLog::Output(3, "OTPaymentPlan::ProcessCron: Removing payment plan from cron processing...\n"); + return false; // if there's no plan, and initial payment is done, nothing left to do. Remove! + } + + return true; +} + + + +OTPaymentPlan::~OTPaymentPlan() +{ + // no need to call Release(), the framework will call it. +} + + +void OTPaymentPlan::InitPaymentPlan() +{ + m_strContractType = "PAYMENT PLAN"; + + SetProcessInterval(PLAN_PROCESS_INTERVAL); // Payment plans currently process every hour. (Could be reduced even more, to every day.) + + // Initial Payment... + m_bInitialPayment = false; // Will there be an initial payment? + m_tInitialPaymentDate = 0; // Date of the initial payment, measured seconds after creation date. + m_tInitialPaymentCompletedDate = 0; // Date the initial payment was finally completed. + m_lInitialPaymentAmount = 0; // Amount of the initial payment. + m_bInitialPaymentDone = false; // Has the initial payment been made? + m_nNumberInitialFailures = 0; // Number of times we failed to process this. + m_tFailedInitialPaymentDate = 0; // Date of the last failed initial payment. + + + // Payment Plan... + m_bPaymentPlan = false; // Will there be a payment plan? + m_lPaymentPlanAmount = 0; // Amount of each payment. + m_tTimeBetweenPayments = 2592000; // How long between each payment? (Default: 30 days) // TODO don't hardcode. + m_tPaymentPlanStartDate = 0; // Date for the first payment plan payment. Measured seconds after creation. + + m_tPaymentPlanLength = 0; // Optional. Plan length measured in seconds since plan start. + m_nMaximumNoPayments = 0; // Optional. The most number of payments that are authorized. + + m_tDateOfLastPayment = 0; // Recording of date of the last payment. + m_nNoPaymentsDone = 0; // Recording of the number of payments already processed. + + m_tDateOfLastFailedPayment = 0; // Recording of date of the last failed payment. + m_nNoFailedPayments = 0; // Every time a payment fails, we record that here. +} + + + + +// the framework will call this at the right time. +void OTPaymentPlan::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + + OTAgreement::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything + InitPaymentPlan(); +} + + + + +bool OTPaymentPlan::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTPaymentPlan.h b/OTLib/OTPaymentPlan.h new file mode 100644 index 000000000..f53d12571 --- /dev/null +++ b/OTLib/OTPaymentPlan.h @@ -0,0 +1,437 @@ +/************************************************************* + * + * OTPaymentPlan.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_PAYMENT_PLAN__ +#define __OT_PAYMENT_PLAN__ + + + +#ifndef LENGTH_OF_DAY_IN_SECONDS + +#define LENGTH_OF_MONTH_IN_SECONDS 2592000 +#define LENGTH_OF_DAY_IN_SECONDS 86400 +#define LENGTH_OF_HOUR_IN_SECONDS 3600 +#define LENGTH_OF_MINUTE_IN_SECONDS 60 + +#define TEST_LENGTH_IN_SECONDS 10 + +//#define PLAN_PROCESS_INTERVAL LENGTH_OF_HOUR_IN_SECONDS // todo put this back. +#define PLAN_PROCESS_INTERVAL TEST_LENGTH_IN_SECONDS + +#endif + + + + +#include "OTAgreement.h" + + +/* + OTPaymentPlan + + This instrument is signed by two parties or more (the first one, I think...) + + While processing payment, BOTH parties to a payment plan will be loaded up and + their signatures will be checked against the original plan, which is saved as a + cron receipt. + + There is also a "current version" of the payment plan, which contains updated info + from processing, and is signed by the server. + + BOTH the original version, and the updated version, are sent to EACH user whenever + a payment is processed, as his receipt. This way you have the user's signature on + the terms, and the server's signature whenever it carries out the terms. A receipt + with both is placed in the inbox of both users after any action. + + As with cheques, the server can use the receipts in the inboxes, plus the last agreed + balance, to prove the current balance of any account. The user removes the receipt from + his inbox by accepting it and, in the process, performing a new balance agreement. + + THIS MEANS that the OT server can carry out the terms of contracts! So far, at least, + cheques, trades, payment plans... as long as everything is signed off, we're free and + clear under the same triple-signed system that account transfer uses. (The Users cannot + repudiate their own signatures later, and the server can prove all balances with the + user's own signature.) + + Of course, either side is free to CANCEL a payment plan, or to leave their account bereft + of funds and prone to failed payments. But if they cancel, their signature will appear + on the cancellation request, and the recipient gets a copy of it in his inbox. And if + the funds are insufficient, the plan will keep trying to charge, leaving failure notices + in both inboxes when such things occur. + + You could even have the server manage an issuer account, backed in payment plan revenue, + that would form a new asset type that can then be traded on markets. (The same as you can + have the server manage the issuer account for a basket currency now, which is backed with + reserve accounts managed by the server, and you can then trade the basket currency on markets.) + + ——————————————————————————————— + */ + + + + + +class OTPaymentPlan : public OTAgreement +{ + // *************************** Methods for generating a payment plan: *************************** + +public: + // From parent: (This must be called first, before the other two methods below can be called.) + // + // bool SetAgreement(const long & lTransactionNum, const OTString & strConsideration, + // const time_t & VALID_FROM=0, const time_t & VALID_TO=0); + + // Then call one (or both) of these: + + bool SetInitialPayment(const long & lAmount, time_t tTimeUntilInitialPayment=0); // default: now. + + // These two can be called independent of each other. You can + // have an initial payment, AND/OR a payment plan. + + bool SetPaymentPlan(const long & lPaymentAmount, time_t tTimeUntilPlanStart=LENGTH_OF_MONTH_IN_SECONDS, + time_t tBetweenPayments=LENGTH_OF_MONTH_IN_SECONDS, // Default: 30 days. + time_t tPlanLength=0, int nMaxPayments=0); + + // VerifyAgreement() + // This function verifies both Nyms and both signatures. + // Due to the peculiar nature of how OTAgreement/OTPaymentPlan works, there are two signed + // copies stored. The merchant signs first, adding his transaction numbers (2), and then he + // sends it to the customer, who also adds two numbers and signs. (Also resetting the creation date.) + // The problem is, adding the additional transaction numbers invalidates the first (merchant's) + // signature. + // The solution is, when the customer confirms the agreement, he stores an internal copy of the + // merchant's signed version. This way later, in VERIFY AGREEMENT, the internal copy can be loaded, + // and BOTH Nyms can be checked to verify that BOTH transaction numbers are valid for each. + // The two versions of the contract can also be compared to each other, to make sure that none of + // the vital terms, values, clauses, etc are different between the two. + // + virtual bool VerifyAgreement(OTPseudonym & RECIPIENT_NYM, OTPseudonym & SENDER_NYM); + virtual bool Compare(const OTAgreement & rh) const; + + + // ********************* "INITIAL PAYMENT" public GET METHODS ********************* +public: + inline bool HasInitialPayment() const { return m_bInitialPayment; } + inline const time_t & GetInitialPaymentDate() const { return m_tInitialPaymentDate; } + inline const long & GetInitialPaymentAmount()const { return m_lInitialPaymentAmount; } + inline bool IsInitialPaymentDone() const { return m_bInitialPaymentDone; } + + inline const time_t & GetInitialPaymentCompletedDate() const { return m_tInitialPaymentCompletedDate; } + inline const time_t & GetLastFailedInitialPaymentDate() const { return m_tFailedInitialPaymentDate; } + inline int GetNoInitialFailures() const { return m_nNumberInitialFailures; } + + + // "INITIAL PAYMENT" private MEMBERS +private: + bool m_bInitialPayment; // Will there be an initial payment? + time_t m_tInitialPaymentDate; // Date of the initial payment, measured seconds after creation. + time_t m_tInitialPaymentCompletedDate; // Date the initial payment was finally transacted. + time_t m_tFailedInitialPaymentDate; // Date of the last failed payment, measured seconds after creation. + long m_lInitialPaymentAmount; // Amount of the initial payment. + bool m_bInitialPaymentDone; // Has the initial payment been made? + int m_nNumberInitialFailures; // If we've tried to process this multiple times, we'll know. + + // -------------------------------------------------------------------------- + // "INITIAL PAYMENT" protected SET METHODS +protected: + inline void SetInitialPaymentDate(const time_t & tInitialPaymentDate) { m_tInitialPaymentDate = tInitialPaymentDate; } + inline void SetInitialPaymentAmount(const long & lAmount) { m_lInitialPaymentAmount = lAmount; } + + // Sets the bool that officially the initial payment has been done. (Checks first to make sure not already done.) + bool SetInitialPaymentDone(); + + inline void SetInitialPaymentCompletedDate(const time_t & tInitialPaymentDate) + { m_tInitialPaymentCompletedDate = tInitialPaymentDate; } + inline void SetLastFailedInitialPaymentDate(const time_t & tFailedInitialPaymentDate) + { m_tFailedInitialPaymentDate = tFailedInitialPaymentDate; } + + inline void SetNoInitialFailures(const int & nNoFailures) { m_nNumberInitialFailures = nNoFailures; } + inline void IncrementNoInitialFailures() { m_nNumberInitialFailures++; } + + +// -------------------------------------------------------------------------- + + + + // ********************* "PAYMENT PLAN" public GET METHODS ********************* +public: + inline bool HasPaymentPlan() const { return m_bPaymentPlan; } + inline const long & GetPaymentPlanAmount() const { return m_lPaymentPlanAmount; } + inline const time_t & GetTimeBetweenPayments() const { return m_tTimeBetweenPayments; } + inline const time_t & GetPaymentPlanStartDate()const { return m_tPaymentPlanStartDate; } + inline const time_t & GetPaymentPlanLength() const { return m_tPaymentPlanLength; } + inline int GetMaximumNoPayments() const { return m_nMaximumNoPayments; } + + inline const time_t & GetDateOfLastPayment() const { return m_tDateOfLastPayment; } + inline const time_t & GetDateOfLastFailedPayment() const { return m_tDateOfLastFailedPayment; } + + inline int GetNoPaymentsDone() const { return m_nNoPaymentsDone; } + inline int GetNoFailedPayments() const { return m_nNoFailedPayments; } + + // -------------------------------------------------------------------------- + // "PAYMENT PLAN" private MEMBERS +private: + bool m_bPaymentPlan; // Will there be a payment plan? + long m_lPaymentPlanAmount; // Amount of each payment. + time_t m_tTimeBetweenPayments; // How long between each payment? + time_t m_tPaymentPlanStartDate;// Date for the first payment plan payment. + time_t m_tPaymentPlanLength; // Optional. Plan length measured in seconds since plan start. + int m_nMaximumNoPayments; // Optional. The most number of payments that are authorized. + + time_t m_tDateOfLastPayment; // Recording of date of the last payment. + time_t m_tDateOfLastFailedPayment; // Recording of date of the last failed payment. + int m_nNoPaymentsDone; // Recording of the number of payments already processed. + int m_nNoFailedPayments; // Every time a payment fails, we record that here. + + // -------------------------------------------------------------------------- + // "PAYMENT PLAN" protected SET METHODS +protected: + inline void SetPaymentPlanAmount(const long & lAmount) { m_lPaymentPlanAmount = lAmount; } + inline void SetTimeBetweenPayments(const time_t&tTimeBetween) { m_tTimeBetweenPayments = tTimeBetween; } + inline void SetPaymentPlanStartDate(const time_t&tPlanStartDate) { m_tPaymentPlanStartDate = tPlanStartDate; } + inline void SetPaymentPlanLength(const time_t&tPlanLength) { m_tPaymentPlanLength = tPlanLength; } + inline void SetMaximumNoPayments( int nMaxNoPayments) { m_nMaximumNoPayments = nMaxNoPayments; } + + inline void SetDateOfLastPayment(const time_t&tDateOfLast) { m_tDateOfLastPayment = tDateOfLast; } + inline void SetDateOfLastFailedPayment(const time_t&tDateOfLast) { m_tDateOfLastFailedPayment= tDateOfLast; } + + inline void SetNoPaymentsDone( int nNoPaymentsDone){ m_nNoPaymentsDone = nNoPaymentsDone; } + inline void SetNoFailedPayments( int nNoFailed) { m_nNoFailedPayments = nNoFailed; } + + inline void IncrementNoPaymentsDone() { m_nNoPaymentsDone++; } + inline void IncrementNoFailedPayments() { m_nNoFailedPayments++; } + +// -------------------------------------------------------------------------------------------------- + +private: // These are NOT stored as part of the payment plan. They are merely used during execution. + bool m_bProcessingInitialPayment; + bool m_bProcessingPaymentPlan; + +public: + // -------------------------------------------------------------------------- + + // From OTAgreement (parent class of this) + /* + inline OTIdentifier & GetRecipientAcctID() { return m_RECIPIENT_ACCT_ID; } + inline OTIdentifier & GetRecipientUserID() { return m_RECIPIENT_USER_ID; } + inline void SetRecipientAcctID(OTIdentifier & ACCT_ID) { m_RECIPIENT_ACCT_ID = ACCT_ID; } + inline void SetRecipientUserID(OTIdentifier & USER_ID) { m_RECIPIENT_USER_ID = USER_ID; } + + OTString m_strConsideration; // Presumably an agreement is in return for some consideration. Memo here. + */ + // Return True if should stay on OTCron's list for more processing. + // Return False if expired or otherwise should be removed. + virtual bool ProcessCron(); // OTCron calls this regularly, which is my chance to expire, etc. + + // -------------------------------------------------------------------------- + + // From OTCronItem (parent class of OTAgreement, parent class of this) + + /* + inline void SetCronPointer(OTCron & theCron) { m_pCron = &theCron; } + + inline void SetCreationDate(const time_t & CREATION_DATE) { m_CREATION_DATE = CREATION_DATE; } + inline const time_t & GetCreationDate() const { return m_CREATION_DATE; } + */ + + // -------------------------------------------------------------------------- + + // From OTTrackable (parent class of OTCronItem, parent class of OTAgreement, parent of this) + /* + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline void SetTransactionNum(long lTransactionNum) { m_lTransactionNum = lTransactionNum; } + + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + inline void SetSenderAcctID(const OTIdentifier & ACCT_ID) { m_SENDER_ACCT_ID = ACCT_ID; } + inline void SetSenderUserID(const OTIdentifier & USER_ID) { m_SENDER_USER_ID = USER_ID; } + */ + + // -------------------------------------------------------------------------- + + // From OTInstrument (parent of OTTrackable, parent of OTCronItem, parent of OTAgreement, parent of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + bool IsExpired() + */ + +protected: +// virtual void onFinalReceipt(); // Now handled in the parent class. +// virtual void onRemovalFromCron(); // Now handled in the parent class. + + bool ProcessPayment(const long & lAmount); + void ProcessInitialPayment(); + void ProcessPaymentPlan(); + +public: + OTPaymentPlan(); + OTPaymentPlan(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTPaymentPlan(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID); + virtual ~OTPaymentPlan(); + + void InitPaymentPlan(); + + virtual void Release(); + + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); + +}; + + + + + + + + +#endif // __OT_PAYMENT_PLAN__ diff --git a/OTLib/OTPseudonym.cpp b/OTLib/OTPseudonym.cpp new file mode 100644 index 000000000..7a030c328 --- /dev/null +++ b/OTLib/OTPseudonym.cpp @@ -0,0 +1,2971 @@ +/************************************************************************************ + * + * OTPseudonym.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 // Including this so it'll be above the openssl/ssl.h +#include // So there won't be a conflict with WinCrypt.h due to Windows sucking +#endif + + +extern "C" +{ +#include +#include + +#include + +#include +#include +#include + +#ifndef OPENSSL_NO_ENGINE +#include +#endif + + int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days); + int add_ext(X509 *cert, int nid, char *value); + +} + + + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTStringXML.h" +#include "OTIdentifier.h" +#include "OTAsymmetricKey.h" + +#include "OTASCIIArmor.h" +#include "OTPseudonym.h" +#include "OTSignedFile.h" +#include "OTItem.h" +#include "OTTransaction.h" +#include "OTMessage.h" + +#include "OTLog.h" + + + + + + + + +/// Though the parameter is a reference (forcing you to pass a real object), +/// the Nym DOES take ownership of the object. Therefore it MUST be allocated +/// on the heap, NOT the stack, or you will corrupt memory with this call. +/// +void OTPseudonym::AddMail(OTMessage & theMessage) // a mail message is a form of transaction, transported via Nymbox +{ + m_dequeMail.push_front(&theMessage); +} + +/// return the number of mail items available for this Nym. +// +int OTPseudonym::GetMailCount() +{ + return m_dequeMail.size(); +} + +// Look up a piece of mail by index. +// If it is, return a pointer to it, otherwise return NULL. +OTMessage * OTPseudonym::GetMailByIndex(const int nIndex) +{ + const unsigned int uIndex = nIndex; + + // Out of bounds. + if (m_dequeMail.empty() || + (nIndex < 0) || (uIndex >= m_dequeMail.size())) + return NULL; + + return m_dequeMail.at(nIndex); +} + + +bool OTPseudonym::RemoveMailByIndex(const int nIndex) // if false, mail index was bad. +{ + const unsigned int uIndex = nIndex; + + // Out of bounds. + if (m_dequeMail.empty() || + (nIndex < 0) || (uIndex >= m_dequeMail.size())) + return false; + + // ----------------------- + + OTMessage * pMessage = m_dequeMail.at(nIndex); + + OT_ASSERT(NULL != pMessage); + + m_dequeMail.erase(m_dequeMail.begin() + nIndex); + + delete pMessage; + + return true; +} + + +void OTPseudonym::ClearMail() +{ + while (GetMailCount() > 0) + RemoveMailByIndex(0); +} + + + +// -------------------- + + + +/// Though the parameter is a reference (forcing you to pass a real object), +/// the Nym DOES take ownership of the object. Therefore it MUST be allocated +/// on the heap, NOT the stack, or you will corrupt memory with this call. +/// +void OTPseudonym::AddOutmail(OTMessage & theMessage) // a mail message is a form of transaction, transported via Nymbox +{ + m_dequeOutmail.push_front(&theMessage); +} + +/// return the number of mail items available for this Nym. +// +int OTPseudonym::GetOutmailCount() +{ + return m_dequeOutmail.size(); +} + +// Look up a transaction by transaction number and see if it is in the ledger. +// If it is, return a pointer to it, otherwise return NULL. +OTMessage * OTPseudonym::GetOutmailByIndex(const int nIndex) +{ + const unsigned int uIndex = nIndex; + + // Out of bounds. + if (m_dequeOutmail.empty() || + (nIndex < 0) || (uIndex >= m_dequeOutmail.size())) + return NULL; + + return m_dequeOutmail.at(nIndex); +} + + +bool OTPseudonym::RemoveOutmailByIndex(const int nIndex) // if false, outmail index was bad. +{ + const unsigned int uIndex = nIndex; + + // Out of bounds. + if (m_dequeOutmail.empty() || + (nIndex < 0) || (uIndex >= m_dequeOutmail.size())) + return false; + + // ----------------------- + + OTMessage * pMessage = m_dequeOutmail.at(nIndex); + + OT_ASSERT(NULL != pMessage); + + m_dequeOutmail.erase(m_dequeOutmail.begin() + nIndex); + + delete pMessage; + + return true; +} + + +void OTPseudonym::ClearOutmail() +{ + while (GetOutmailCount() > 0) + RemoveOutmailByIndex(0); +} + + + +// -------------------- + + + +// Instead of a "balance statement", some messages require a "transaction statement". +// Whenever the number of transactions changes, you must sign the new list so you +// aren't responsible for cleared transactions, for example. Or so you server will +// allow you to take responsibility for a new transaction number (only if you've +// signed off on it!) +// +// There will have to be another version of this function for when you don't have +// a transaction (like a processNymbox!) Otherwise you would need a transaction number +// in order to do a processNymbox. This function therefore is available in that incarnation +// even when you don't have a transaction number. It'll just attach the balance item to +// the message directly. +// +OTItem * OTPseudonym::GenerateTransactionStatement(const OTTransaction & theOwner) +{ + if ( (theOwner.GetUserID() != m_nymID) ) + { + OTLog::Error("Transaction has wrong owner in OTPseudonym::GenerateTransactionStatement (expected to match nym).\n"); + return NULL; + } + + // --------------------------------------------------------- + + // theOwner is the depositPaymentPlan, or marketOffer that triggered the need for this transaction statement. + // since it uses up a transaction number, I will be sure to remove that one from my list before signing the list. + OTItem * pBalanceItem = OTItem::CreateItemFromTransaction(theOwner, OTItem::transactionStatement); // <=== transactionStatement type, with user ID, server ID, transaction ID. + + // The above has an ASSERT, so this this will never actually happen. + if (NULL == pBalanceItem) + return NULL; + + // --------------------------------------------------------- + + // COPY THE ISSUED TRANSACTION NUMBERS FROM THE NYM + + OTPseudonym theMessageNym; + + theMessageNym.HarvestIssuedNumbers(theOwner.GetPurportedServerID(), + *this /*unused in this case, not saving to disk*/, *this, false); // bSave = false; + + // --------------------------------------------------------- + switch (theOwner.GetType()) + { + case OTTransaction::cancelCronItem: + if (theOwner.GetTransactionNum() > 0) + { + theMessageNym.RemoveIssuedNum(theOwner.GetRealServerID(), theOwner.GetTransactionNum()); // a transaction number is being used, and REMOVED from my list of responsibility, + theMessageNym.RemoveTransactionNum(theOwner.GetRealServerID(), theOwner.GetTransactionNum()); // so I want the new signed list to reflect that number has been REMOVED. + } + break; + + // Transaction Statements usually only have a transaction number in the case of market offers and + // payment plans, in which case the number should NOT be removed, and remains in play until + // final closure from Cron. + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + default: + break; + } + // --------------------------------------------------------- + + // What about cases where no number is being used? (Such as processNymbox) + // Perhaps then if this function is even called, it's with a 0-number transaction, in which + // case the above Removes probably won't hurt anything. Todo. + + + OTString strMessageNym(theMessageNym); // Okay now we have the transaction numbers in this MessageNym string. + + pBalanceItem->SetAttachment(strMessageNym); // <======== This is where the server will read the transaction numbers from (A nym in item.m_ascAttachment) + + // --------------------------------------------------------- + + pBalanceItem->SignContract(*this); // <=== Sign, save, and return. OTTransactionType needs to weasel in a "date signed" variable. + pBalanceItem->SaveContract(); + + return pBalanceItem; +} + + + + +// use this to actually generate a new key pair and assorted nym files. +// +bool OTPseudonym::GenerateNym() +{ + bool bSuccess = false; + +// BIO * bio_err = NULL; + X509 * x509 = NULL; + EVP_PKEY * pNewKey = NULL; + +// CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); // memory leak detection. Leaving this for now. + +// bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); + + + mkcert(&x509, &pNewKey, 1024, 0, 3650); // actually generate the things. // TODO THESE PARAMETERS... + // Note: 512 bit key CRASHES + // 1024 is apparently a minimum requirement, if not an only requirement. + // Will need to go over just what sorts of keys are involved here... todo. + + + if (NULL == pNewKey) + { + OTLog::Error("Failed attempting to generate new private key.\n"); + + if (NULL != x509) + X509_free(x509); + + return false; + } + + if (NULL == x509) + { + OTLog::Error("Failed attempting to generate new x509 cert.\n"); + + if (NULL != pNewKey) + EVP_PKEY_free(pNewKey); + + return false; + } + + + // --------COMMENT THIS OUT FOR PRODUCTION -------- + // (Debug only.) + RSA_print_fp(stdout, pNewKey->pkey.rsa, 0); // human readable + X509_print_fp(stdout, x509); // human readable + + // write the private key, then the x509, to stdout. + PEM_write_PrivateKey(stdout, pNewKey, NULL, NULL, 0, NULL, NULL); + PEM_write_X509(stdout, x509); + // ------------------------------------------------ + + + + BIO * bio_out_pri = BIO_new(BIO_s_mem()); + BIO * bio_out_x509 = BIO_new(BIO_s_mem()); + + PEM_write_bio_PrivateKey(bio_out_pri, pNewKey, NULL, NULL, 0, NULL, NULL); + PEM_write_bio_X509(bio_out_x509, x509); + + + unsigned char buffer_pri[4096] = ""; // todo hardcoded + unsigned char buffer_x509[8192] = ""; // todo hardcoded + + OTString strx509; + OTString strPrivateKey; + + int len = 0; + + // todo hardcoded 4080 (see array above.) + if (0 < (len = BIO_read(bio_out_x509, buffer_x509, 8100))) // returns number of bytes successfully read. + { + buffer_x509[len] = '\0'; + + strx509.Set((const char*)buffer_x509); + + EVP_PKEY * pPublicKey = X509_get_pubkey(x509); + + if (NULL != pPublicKey) + m_pkeyPublic->SetKey(pPublicKey); + // else? + + // todo hardcoded 4080 (see array above.) + if (0 < (len = BIO_read(bio_out_pri, buffer_pri, 4080))) // returns number of bytes successfully read. + { + buffer_pri[len] = '\0'; + + strPrivateKey.Set((const char *)buffer_pri); // so I can write this string to file in a sec... + + m_pkeyPrivate->SetKey(pNewKey); // private key itself... might as well keep it loaded for now. + + bSuccess = true; + } + } + + + + // cleanup + X509_free(x509); + x509 = NULL; + + if (false == bSuccess) // if we failed, then free the key. + { + EVP_PKEY_free(pNewKey); + } + // if bsuccess is true, we do NOT free the key, since we just + // called SetKey() and thus gave ownership of it to m_keyPrivate. + + pNewKey = NULL; + + + //#ifndef OPENSSL_NO_ENGINE + // ENGINE_cleanup(); + //#endif + // CRYPTO_cleanup_all_ex_data(); + // + // CRYPTO_mem_leaks(bio_err); + + + // BIO_free(bio_err); + + + BIO_free(bio_out_pri); + BIO_free(bio_out_x509); + + + // At this point, the Nym's private key is set, and its public key is also set. + // So the object in memory is good to go. + // Now we just need to create some files, especially where the keys are stored, + // since the Nym normally never writes to those files (just reads.) + // + if (bSuccess) + { + const OTString strFilename("temp.nym"); // todo stop hardcoding. Plus this should select a random number too. + + OTString strFinal; + strFinal.Format((char*)"%s%s", strPrivateKey.Get(), strx509.Get()); + + if (false == OTDB::StorePlainString(strFinal.Get(), OTLog::CertFolder(), strFilename.Get())) + { + OTLog::vError("Failure storing new nym in OTPseudonym::GenerateNym: %s\n", strFilename.Get()); + return false; + } + + // ------------------------------------------ + + bool bPublic = false; + bool bPrivate = false; + + bPublic = m_pkeyPublic->LoadPublicKeyFromCertFile(OTLog::CertFolder(), strFilename.Get()); + bPrivate = m_pkeyPrivate->LoadPrivateKey(OTLog::CertFolder(), strFilename.Get()); + + if (!bPublic) + { + OTLog::vError("Although the ascii-armored file (%s) was read, LoadPublicKeyFromCert " + "returned false.\n", strFilename.Get()); + return false; + } + else + { + OTLog::vOutput(2, "Successfully loaded public key from Certfile: %s\n", strFilename.Get()); + } + + + if (!bPrivate) + { + OTLog::vError("Although the ascii-armored file (%s) was read, LoadPrivateKey returned false.\n", + strFilename.Get()); + return false; + } + else + { + OTLog::vOutput(2, "Successfully loaded private key from: %s\n", strFilename.Get()); + } + + // ----------------------------------------- + + OTString strPublicKey; + bool bGotPublicKey = GetPublicKey().GetPublicKey(strPublicKey); + + if (!bGotPublicKey) + { + OTLog::Error("Error getting public key in OTPseudonym::VerifyPseudonym.\n"); + return false; + } + + + OTIdentifier newID; + bool bSuccessCalculateDigest = newID.CalculateDigest(strPublicKey); + + if (!bSuccessCalculateDigest) + { + OTLog::Error("Error calculating Certificate digest.\n"); + return false; + } + + m_nymID = newID; + + OTString strID(m_nymID); + + // --------------------------------------- + + if (false == OTDB::StorePlainString(strFinal.Get(), OTLog::CertFolder(), strID.Get())) + { + OTLog::vError("Failure storing new nym in OTPseudonym::GenerateNym: %s\n", strID.Get()); + return false; + } + + bSuccess = SaveSignedNymfile(*this); // Now we'll generate the NymFile as well! + } + + return bSuccess; +} + + + + +// Sometimes for testing I need to clear out all the transaction numbers from a nym. +// So I added this method to make such a thing easy to do. +// +void OTPseudonym::RemoveAllNumbers() +{ + for (mapOfTransNums::iterator ii = m_mapIssuedNum.begin(); ii != m_mapIssuedNum.end(); ++ii) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + pDeque->clear(); + } + } + + for (mapOfTransNums::iterator ii = m_mapTransNum.begin(); ii != m_mapTransNum.end(); ++ii) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + pDeque->clear(); + } + } +} + + +// You can't go using a Nym at a certain server, if it's not registered there... +// BTW -- if you have never called GetRequest(), then this will wrongly return false! +// But as long as you call getRequest() upon successsful registration (or whenever) this +// function will return an accurate answer after that point, and forever. +// +bool OTPseudonym::IsRegisteredAtServer(const OTString & strServerID) +{ + bool bRetVal = false; // default is return false: "No, I'm NOT registered at that Server." + std::string strID = strServerID.Get(); + + // The Pseudonym has a map of the request numbers for different servers. + // For Server Bob, with this Pseudonym, I might be on number 34. + // For but Server Alice, I might be on number 59. + // + // So let's loop through all the numbers I have, and if the server ID on the map + // matches the Server ID that was passed in, then return TRUE. + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + if ( strID == ii->first ) + { + // The call has succeeded + bRetVal = true; + + break; + } + } + + return bRetVal; +} + + +// Removes Request Num for specific server +// (Like if Nym has deleted his account on that server...) +// Caller is responsible to save Nym after this. +// +bool OTPseudonym::UnRegisterAtServer(const OTString & strServerID) +{ + bool bRetVal = false; // default is return false: "No, I'm NOT registered at that Server." + std::string strID = strServerID.Get(); + + // The Pseudonym has a map of the request numbers for different servers. + // For Server Bob, with this Pseudonym, I might be on number 34. + // For but Server Alice, I might be on number 59. + // + // So let's loop through all the numbers I have, and if the server ID on the map + // matches the Server ID that was passed in, then delete that one. + // + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + if ( strID == ii->first ) + { + // The call has succeeded + bRetVal = true; + m_mapRequestNum.erase(ii); + break; + } + } + + return bRetVal; +} + + + + + +/* +typedef std::deque dequeOfTransNums; +typedef std::map mapOfTransNums; +*/ + + +// Verify whether a certain transaction number appears on a certain list. +// +bool OTPseudonym::VerifyGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long & lTransNum) +{ + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each servers. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then find the transaction number on + // that list, and then return true. Else return false. + for (mapOfTransNums::iterator ii = THE_MAP.begin(); ii != THE_MAP.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) // there are some numbers for that server ID + { + // Let's loop through them and see if the culprit is there + for (unsigned i = 0; i < pDeque->size(); i++) + { + // Found it! + if (lTransNum == pDeque->at(i)) + { + return true; + } + } + } + break; + } + } + + return false; +} + +// On the server side: A user has submitted a specific transaction number. +// Remove it from his file so he can't use it again. +bool OTPseudonym::RemoveGenericNum(mapOfTransNums & THE_MAP, OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum) +{ + bool bRetVal = RemoveGenericNum(THE_MAP, strServerID, lTransNum); + + if (bRetVal) + { + SaveSignedNymfile(SIGNER_NYM); + } + + return bRetVal; +} + +// This function is a little lower level, and doesn't worry about saving. Used internally. +// Returns true IF it successfully finds and removes the number. Otherwise returns false. +// +bool OTPseudonym::RemoveGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long & lTransNum) +{ + bool bRetVal = false; + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each servers. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then find the transaction number on + // that list, and then remove it, and return true. Else return false. + for (mapOfTransNums::iterator ii = THE_MAP.begin(); ii != THE_MAP.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) // there are some numbers for that server ID + { + // Let's loop through them and see if the culprit is there + for (unsigned i = 0; i < pDeque->size(); i++) + { + // Found it! + if (lTransNum == pDeque->at(i)) + { + pDeque->erase(pDeque->begin() + i); + bRetVal = true; + break; + } + } + } + break; + } + } + + return bRetVal; +} + + +// No signer needed for this one, and save is false. +// This version is ONLY for cases where we're not saving inside this function. +bool OTPseudonym::AddGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long lTransNum) +{ + bool bSuccessFindingServerID = false, bSuccess = false; + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each server. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then add the transaction number. + for (mapOfTransNums::iterator ii = THE_MAP.begin(); ii != THE_MAP.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + dequeOfTransNums::iterator iiii = std::find(pDeque->begin(), pDeque->end(), lTransNum); + + if (iiii == pDeque->end()) // Only add it if it's not already there. No duplicates! + pDeque->push_front(lTransNum); + + bSuccess = true; + bSuccessFindingServerID = true; + + break; + } + } + + // Apparently there is not yet a deque stored for this specific serverID. + // Fine. Let's create it then, and then add the transaction num to that new deque. + if (!bSuccessFindingServerID) + { + dequeOfTransNums * pDeque = new dequeOfTransNums; + + OT_ASSERT(NULL != pDeque); + + THE_MAP[strID] = pDeque; + pDeque->push_front(lTransNum); + bSuccess = true; + } + + return bSuccess; +} + + +// Returns count of transaction numbers available for a given server. +// +int OTPseudonym::GetGenericNumCount(mapOfTransNums & THE_MAP, const OTIdentifier & theServerID) +{ + int nReturnValue = 0; + + const OTString strServerID(theServerID); + std::string strID = strServerID.Get(); + + dequeOfTransNums * pDeque = NULL; + + // The Pseudonym has a deque of transaction numbers for each server. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then we found the right server. + for (mapOfTransNums::iterator ii = THE_MAP.begin(); ii != THE_MAP.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + break; + } + } + + // We found the right server, so let's count the transaction numbers + // that this nym has already stored for it. + if (NULL != pDeque) + { + nReturnValue = pDeque->size(); + } + + return nReturnValue; +} + + +// by index. +long OTPseudonym::GetIssuedNum(const OTIdentifier & theServerID, int nIndex) +{ + long lRetVal = 0; + + const OTString strServerID(theServerID); + + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each servers. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then find the transaction number on + // that list, and then remove it, and return true. Else return false. + for (mapOfTransNums::iterator ii = m_mapIssuedNum.begin(); ii != m_mapIssuedNum.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) // there are some numbers for that server ID + { + // Let's loop through them and see if the culprit is there + for (unsigned i = 0; i < pDeque->size(); i++) + { + // Found it! + if ((unsigned)nIndex == i) + { + lRetVal = pDeque->at(i); // <==== Got the issued number here. + break; + } + } + } + break; + } + } + + return lRetVal; +} + +// by index. +long OTPseudonym::GetTransactionNum(const OTIdentifier & theServerID, int nIndex) +{ + long lRetVal = 0; + + OTString strServerID(theServerID); + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each servers. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then find the transaction number on + // that list, and then remove it, and return true. Else return false. + for (mapOfTransNums::iterator ii = m_mapTransNum.begin(); ii != m_mapTransNum.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) // there are some numbers for that server ID + { + // Let's loop through them and see if the culprit is there + for (unsigned i = 0; i < pDeque->size(); i++) + { + // Found it! + if ((unsigned)nIndex == i) + { + lRetVal = pDeque->at(i); // <==== Got the transaction number here. + break; + } + } + } + break; + } + } + + return lRetVal; +} + + +// ************************************************************************************* + + + +// On the server side: A user has submitted a specific transaction number. +// Verify whether he actually has a right to use it. +bool OTPseudonym::VerifyTransactionNum(const OTString & strServerID, const long & lTransNum) // doesn't save +{ + return VerifyGenericNum(m_mapTransNum, strServerID, lTransNum); +} + +// On the server side: A user has submitted a specific transaction number. +// Remove it from his file so he can't use it again. +bool OTPseudonym::RemoveTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum) // saves +{ + return RemoveGenericNum(m_mapTransNum, SIGNER_NYM, strServerID, lTransNum); +} + + +// Returns count of transaction numbers available for a given server. +// +int OTPseudonym::GetTransactionNumCount(const OTIdentifier & theServerID) +{ + return GetGenericNumCount(m_mapTransNum, theServerID); +} + + +// No signer needed for this one, and save is false. +// This version is ONLY for cases where we're not saving inside this function. +bool OTPseudonym::AddTransactionNum(const OTString & strServerID, const long lTransNum) // doesn't save +{ + return AddGenericNum(m_mapTransNum, strServerID, lTransNum); +} + + +// ---------------------------------------------------------------------- + + +// On the server side: A user has submitted a specific transaction number. +// Verify whether it was issued to him and still awaiting final closing. +bool OTPseudonym::VerifyIssuedNum(const OTString & strServerID, const long & lTransNum) +{ + return VerifyGenericNum(m_mapIssuedNum, strServerID, lTransNum); +} + +// On the server side: A user has accepted a specific receipt. +// Remove it from his file so he's not liable for it anymore. +bool OTPseudonym::RemoveIssuedNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum) // saves +{ + return RemoveGenericNum(m_mapIssuedNum, SIGNER_NYM, strServerID, lTransNum); +} + +bool OTPseudonym::RemoveIssuedNum(const OTString & strServerID, const long & lTransNum) // doesn't save +{ + return RemoveGenericNum(m_mapIssuedNum, strServerID, lTransNum); +} + + +// Returns count of transaction numbers not yet cleared for a given server. +// +int OTPseudonym::GetIssuedNumCount(const OTIdentifier & theServerID) +{ + return GetGenericNumCount(m_mapIssuedNum, theServerID); +} + + +// No signer needed for this one, and save is false. +// This version is ONLY for cases where we're not saving inside this function. +bool OTPseudonym::AddIssuedNum(const OTString & strServerID, const long & lTransNum) // doesn't save. +{ + return AddGenericNum(m_mapIssuedNum, strServerID, lTransNum); +} + + + +// ---------------------------------------------------------------------- + + +bool OTPseudonym::RemoveTransactionNum(const OTString & strServerID, const long & lTransNum) // doesn't save. +{ + return RemoveGenericNum(m_mapTransNum, strServerID, lTransNum); +} + + +// Client side: We have received a new trans num from server. Store it. +// Now the server uses this too, for storing these numbers so it can verify them later. +// +bool OTPseudonym::AddTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long lTransNum, bool bSave) // SAVE OR NOT (your choice) High-Level. +{ + bool bSuccess1 = AddTransactionNum(strServerID, lTransNum); // Add to list of available-to-use, outstanding numbers. + bool bSuccess2 = AddIssuedNum(strServerID, lTransNum); // Add to list of numbers that haven't been closed yet. + + // ----------------------------------- + + if (bSuccess1 && !bSuccess2) + { + RemoveGenericNum(m_mapTransNum, strServerID, lTransNum); + } + else if (bSuccess2 && !bSuccess1) + { + RemoveGenericNum(m_mapIssuedNum, strServerID, lTransNum); + } + + // ----------------------------------- + + if (bSuccess1 && bSuccess2 && bSave) + { + bSave = SaveSignedNymfile(SIGNER_NYM); + } + else + bSave = true; // so the return at the bottom calculates correctly. + + return (bSuccess1 && bSuccess2 && bSave); +} + + +// Client side: We have accepted a certain receipt. Remove the transaction number from my list of issued numbers. +// The server uses this too, also for keeping track of issued numbers, and removes them around same time as client. +// (When receipt is accepted.) Also, There is no "RemoveTransactionNum" at this level since GetNextTransactionNum handles that. +// +bool OTPseudonym::RemoveIssuedNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum, bool bSave) // SAVE OR NOT (your choice) High-Level. +{ + bool bSuccess = RemoveIssuedNum(strServerID, lTransNum); // Remove from list of numbers that haven't been closed yet. + + // ----------------------------------- + + if (bSuccess && bSave) + { + bSave = SaveSignedNymfile(SIGNER_NYM); + } + else + { + bSave = true; // so the return at the bottom calculates correctly. + } + + // ----------------------------------- + + return (bSuccess && bSave); +} + + + + +/// OtherNym is used as container for server to send us new transaction numbers +/// Currently unused. +void OTPseudonym::HarvestTransactionNumbers(const OTIdentifier & theServerID, + OTPseudonym & SIGNER_NYM, + OTPseudonym & theOtherNym, bool bSave/*=true*/) +{ + bool bSuccess = false; + long lTransactionNumber = 0; + + for (mapOfTransNums::iterator iii = theOtherNym.GetMapTransNum().begin(); + iii != theOtherNym.GetMapTransNum().end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + OTString OTstrServerID = ((strServerID.size()) > 0 ? strServerID.c_str() : ""); + const OTIdentifier theTempID(OTstrServerID); + + if (!(pDeque->empty()) && (theServerID == theTempID) ) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + AddTransactionNum(SIGNER_NYM, OTstrServerID, lTransactionNumber, false); // bSave = false (but saved below...) + + bSuccess = true; + } + break; // We found it! Might as well break out. + } + } // for + + if (bSuccess && bSave) + { + SaveSignedNymfile(SIGNER_NYM); + } +} + + + + +/// OtherNym is used as container for us to send server list of issued transaction numbers. +void OTPseudonym::HarvestIssuedNumbers(const OTIdentifier & theServerID, + OTPseudonym & SIGNER_NYM, + OTPseudonym & theOtherNym, bool bSave/*=false*/) +{ + bool bSuccess = false; + long lTransactionNumber = 0; + + for (mapOfTransNums::iterator iii = theOtherNym.GetMapIssuedNum().begin(); + iii != theOtherNym.GetMapIssuedNum().end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + OTString OTstrServerID = ((strServerID.size()) > 0 ? strServerID.c_str() : ""); + const OTIdentifier theTempID(OTstrServerID); + + if (!(pDeque->empty()) && (theServerID == theTempID) ) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + // If number wasn't already on issued list, then add to BOTH lists. + // Otherwise do nothing (it's already on the issued list, and no longer + // valid on the available list--thus shouldn't be re-added there anyway.) + // + if (false == VerifyIssuedNum(OTstrServerID, lTransactionNumber)) + AddTransactionNum(SIGNER_NYM, OTstrServerID, lTransactionNumber, false); // bSave = false (but saved below...) + + bSuccess = true; + } + break; // We found it! Might as well break out. + } + } // for + + if (bSuccess && bSave) + { + SaveSignedNymfile(SIGNER_NYM); + } +} + + + + +/// Client side. +/// Get the next available transaction number for the serverID +/// The lTransNum parameter is for the return value. +/// SAVES if successful. +bool OTPseudonym::GetNextTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long &lTransNum, + bool bSave/*=true*/) +{ + bool bRetVal = false; + std::string strID = strServerID.Get(); + + // The Pseudonym has a deque of transaction numbers for each server. + // These deques are mapped by Server ID. + // + // So let's loop through all the deques I have, and if the server ID on the map + // matches the Server ID that was passed in, then send out the transaction number. + for (mapOfTransNums::iterator ii = m_mapTransNum.begin(); ii != m_mapTransNum.end(); ++ii) + { + // if the ServerID passed in matches the serverID for the current deque + if ( strID == ii->first ) + { + dequeOfTransNums * pDeque = (ii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + lTransNum = pDeque->front(); + + pDeque->pop_front(); + + // The call has succeeded + bRetVal = true; + } + break; + } + } + + if (bRetVal && bSave) + { + if (false == SaveSignedNymfile(SIGNER_NYM)) + OTLog::Error("Error saving signed NymFile in OTPseudonym::GetNextTransactionNum\n"); + } + + return bRetVal; +} + + + + +void OTPseudonym::ReleaseTransactionNumbers() +{ + while (!m_mapTransNum.empty()) + { + dequeOfTransNums * pDeque = m_mapTransNum.begin()->second; + + OT_ASSERT(NULL != pDeque); + + m_mapTransNum.erase(m_mapTransNum.begin()); + delete pDeque; + pDeque = NULL; + } + + while (!m_mapIssuedNum.empty()) + { + dequeOfTransNums * pDeque = m_mapIssuedNum.begin()->second; + + OT_ASSERT(NULL != pDeque); + + m_mapIssuedNum.erase(m_mapIssuedNum.begin()); + delete pDeque; + pDeque = NULL; + } +} + + + + + + + +// returns true on success, value goes into lReqNum +// Make sure the Nym is LOADED before you call this, +// otherwise it won't be there to get. +// and if the request number needs to be incremented, +// then make sure you call IncrementRequestNum (below) +bool OTPseudonym::GetCurrentRequestNum(const OTString & strServerID, long &lReqNum) +{ + bool bRetVal = false; + std::string strID = strServerID.Get(); + + // The Pseudonym has a map of the request numbers for different servers. + // For Server Bob, with this Pseudonym, I might be on number 34. + // For but Server Alice, I might be on number 59. + // + // So let's loop through all the numbers I have, and if the server ID on the map + // matches the Server ID that was passed in, then send out the request number. + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + if ( strID == ii->first ) + { + // Setup return value. + lReqNum = (ii->second); + + // The call has succeeded + bRetVal = true; + + break; + } + } + + return bRetVal; +} + + + +// Make SURE you call SavePseudonym after you call this. +// Otherwise it will increment in memory but not in the file. +// In fact, I cannot allow that. I will call SavePseudonym myself. +// Therefore, make SURE you fully LOAD this Pseudonym before you save it. +// You don't want to overwrite what's in that file. +// THEREFORE we need a better database than the filesystem. +// I will research a good, free, secure database (or encrypt everything +// before storing it there) and soon these "load/save" commands will use that +// instead of the filesystem. +void OTPseudonym::IncrementRequestNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID) +{ + bool bSuccess = false; + + // The Pseudonym has a map of the request numbers for different servers. + // For Server Bob, with this Pseudonym, I might be on number 34. + // For but Server Alice, I might be on number 59. + // + // So let's loop through all the numbers I have, and if the server ID on the map + // matches the Server ID that was passed in, then send out the request number and + // increment it so it will be ready for the next request. + // + // Make sure to save the Pseudonym so the new request number is saved. + std::string strID = strServerID.Get(); + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + if ( strID == ii->first ) + { + // We found it! + // Presumably we ONLY found it because this Nym has been properly loaded first. + // Good job! Otherwise, the list would have been empty even though the request number + // was sitting in the file. + + + // Grab a copy of the old request number + long lOldRequestNumber = m_mapRequestNum[ii->first]; + + // Set the new request number to the old one plus one. + m_mapRequestNum[ii->first] = lOldRequestNumber + 1; + + // Now we can log BOTH, before and after... // debug here + OTLog::vOutput(4, "Incremented Request Number from %ld to %ld. Saving...\n", + lOldRequestNumber, m_mapRequestNum[ii->first]); + // OTLog::Output(2, "DEBUG REQUESTNUM: first: %s Second: %ld\n", ii->first.c_str(), ii->second); + // OTLog::Output(2, "SAVING PSEUDONYM TO FILE: %s\n", m_strNymfile.Get()); + + // The call has succeeded + bSuccess = true; + break; + } + } + + // If I didn't find it in the list above (whether the list is empty or not....) + // that means it does not exist. So create it. + + if (!bSuccess) + { + OTLog::Output(0, "Creating Request Number entry as '1'. Saving...\n"); + m_mapRequestNum[strServerID.Get()] = 1; + bSuccess = true; + } + + + if (bSuccess) + { + SaveSignedNymfile(SIGNER_NYM); + } +} + + + + + + +// if the server sends us a @getRequest +void OTPseudonym::OnUpdateRequestNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long lNewRequestNumber) +{ + bool bSuccess = false; + + // The Pseudonym has a map of the request numbers for different servers. + // For Server Bob, with this Pseudonym, I might be on number 34. + // For but Server Alice, I might be on number 59. + // + // So let's loop through all the numbers I have, and if the server ID on the map + // matches the Server ID that was passed in, then send out the request number and + // increment it so it will be ready for the next request. + // + // Make sure to save the Pseudonym so the new request number is saved. + std::string strID = strServerID.Get(); + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + if ( strID == ii->first ) + { + // We found it! + // Presumably we ONLY found it because this Nym has been properly loaded first. + // Good job! Otherwise, the list would have been empty even though the request number + // was sitting in the file. + + // The call has succeeded + bSuccess = true; + + // Grab a copy of the old request number + long lOldRequestNumber = m_mapRequestNum[ii->first]; + + // Set the new request number to the old one plus one. + m_mapRequestNum[ii->first] = lNewRequestNumber; + + // Now we can log BOTH, before and after... + OTLog::vOutput(4, "Updated Request Number from %ld to %ld. Saving...\n", + lOldRequestNumber, m_mapRequestNum[ii->first]); + // OTLog::Output(2, "DEBUG REQUESTNUM: first: %s Second: %ld\n", ii->first.c_str(), ii->second); + // OTLog::Output(2, "SAVING PSEUDONYM TO FILE: %s\n", m_strNymfile.Get()); + break; + } + } + + // If I didn't find it in the list above (whether the list is empty or not....) + // that means it does not exist. So create it. + + if (!bSuccess) + { + OTLog::vOutput(0, "Creating Request Number entry as '%ld'. Saving...\n", lNewRequestNumber); + m_mapRequestNum[strServerID.Get()] = lNewRequestNumber; + bSuccess = true; + } + + + if (bSuccess) + { + SaveSignedNymfile(SIGNER_NYM); + } + +} + + + +/* +bool OTPseudonym::VerifyPseudonym() +{ + OTData binCert; // Here's where we'll put the decoded binary content. + + // m_ascCert should already contain the ascii-armored text from the + // Nym's x509 certificate file. (this happened in LoadPseudonym()) + + // This function decodes the base64 text into binary OTData... + bool bSuccessfulDecode = m_ascCert.GetData(binCert); + + if (!bSuccessfulDecode) + { + OTLog::Error("Error decoding Certificate!\n"); + return false; + } + + // Next we get a Message Digest of that binary Cert... + OTIdentifier newID; + + bool bSuccessCalculateDigest = newID.CalculateDigest(binCert); + + if (!bSuccessCalculateDigest) + { + OTLog::Error("Error calculating Certificate digest.\n"); + return false; + } + + // newID now contains the Hash aka Message Digest aka Fingerprint aka "IDENTIFIER" + // of the x.509 certificate (in its binary form). + // (Maybe later we'll choose to hash the text form instead.) + // + // Now let's compare that identifier to the one already loaded by the wallet + // and make sure they MATCH. + + if (!(m_nymID == newID)) + { + OTString str1, str2; + m_nymID.GetString(str1); + newID.GetString(str2); + OTLog::Output(0, "Hashes do NOT match in OTPseudonym::VerifyPseudonym!\n%s\n%s\n", + str1.Get(), str2.Get()); + return false; + } + else { + OTLog::Output(1, "\nNymID from wallet *SUCCESSFUL* match to " + "sha256 hash of the Cert.\n" + "---------------------------------------------------------------\n"); + return true; + } +} +*/ +/* +bool OTPseudonym::GetPublicKey(OTData & thePublicKey) +{ + +} +*/ + +/* + // Save this code. It may be possible to send the entire file + // to the library and just have it processed there. This code + // reads the file and then we can pass it to such a library. +bool OTPseudonym::LoadPseudonym() +{ + OTString & filename = m_strFilename; + + std::ifstream in(filename.Get(), std::ios::binary); + + if (in.fail()) + { + OTLog::vError("Error opening file in OTPseudonym::LoadPseudonym: %s\n", + m_strFilename.Get()); + return false; + } + + std::stringstream buffer; + buffer << in.rdbuf(); + + std::string contents(buffer.str()); + + m_strCertFileContents = contents.c_str(); + + OTLog::Output(1, "Loaded x.509 Certificate:\n%s\n", m_strCertFileContents.Get()); + + return true; +} +*/ + + + +/* + + + + + + + + + + + + */ + + +bool OTPseudonym::SetIdentifierByPubkey() +{ + OTString strPublicKey; + bool bGotPublicKey = GetPublicKey().GetPublicKey(strPublicKey); + + if (!bGotPublicKey) + { + OTLog::Error("Error getting public key in OTPseudonym::SetIdentifierByPubkey.\n"); + return false; + } + + OTIdentifier newID; + bool bSuccessCalculateDigest = newID.CalculateDigest(strPublicKey); + + if (!bSuccessCalculateDigest) + { + OTLog::Error("Error calculating digest in SetIdentifierByPubkey.\n"); + return false; + } + + m_nymID = newID; + + return true; +} + +bool OTPseudonym::VerifyPseudonym() const +{ + OTString strPublicKey; + bool bGotPublicKey = GetPublicKey().GetPublicKey(strPublicKey); + + if (!bGotPublicKey) + { + OTLog::Error("Error getting public key in OTPseudonym::VerifyPseudonym.\n"); + return false; + } + + + OTIdentifier newID; + bool bSuccessCalculateDigest = newID.CalculateDigest(strPublicKey); + + if (!bSuccessCalculateDigest) + { + OTLog::Error("Error calculating pubkey digest.\n"); + return false; + } + + + // newID now contains the Hash aka Message Digest aka Fingerprint aka "IDENTIFIER" + // of the public key (in its text form, with escaped bookends.) + // + // Now let's compare that identifier to the one already loaded by the wallet + // and make sure they MATCH. + + if (!(m_nymID == newID)) + { + OTString str1(m_nymID), str2(newID); + OTLog::vError("\nHashes do NOT match in OTPseudonym::VerifyPseudonym!\n%s\n%s\n", + str1.Get(), str2.Get()); + + + OT_ASSERT(false);// temp remove. debugging. + + + return false; + } + else { +// OTString str2(newID); +// OTLog::Output(1, "\nNymID from wallet *SUCCESSFUL* match to hash of Nym\'s public key:\n%s\n" +// "---------------------------------------------------------------\n", str2.Get()); + return true; + } +} + + + + + +void OTPseudonym::DisplayStatistics(OTString & strOutput) +{ + strOutput.Concatenate("==> Name: %s\n", m_strName.Get()); + strOutput.Concatenate(" Version: %s\n", m_strVersion.Get()); + + OTString theStringID; + GetIdentifier(theStringID); + strOutput.Concatenate("Nym (aka User) ID: %s\n", theStringID.Get()); + + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + std::string strServerID = ii->first; + long lRequestNumber = ii->second; + + // Now we can log BOTH, before and after... + strOutput.Concatenate("Request Number is %ld for server ID: %s\n", + lRequestNumber, strServerID.c_str()); + } + + for (mapOfTransNums::iterator iii = m_mapIssuedNum.begin(); iii != m_mapIssuedNum.end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + long lTransactionNumber = pDeque->at(i); + + strOutput.Concatenate("Signed for Transaction# %ld for server ID: %s\n", + lTransactionNumber, strServerID.c_str()); + } + } + } // for + for (mapOfTransNums::iterator iiii = m_mapTransNum.begin(); iiii != m_mapTransNum.end(); ++iiii) + { + std::string strServerID = (*iiii).first; + dequeOfTransNums * pDeque = (iiii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + long lTransactionNumber = pDeque->at(i); + + strOutput.Concatenate("Transaction# %ld still available for server ID: %s\n", + lTransactionNumber, strServerID.c_str()); + } + } + } // for +} + + + + +bool OTPseudonym::SavePseudonymWallet(OTString & strOutput) const +{ + OTString nymID; + GetIdentifier(nymID); + + OTASCIIArmor ascName; + + if (m_strName.Exists()) // name is in the clear in memory, and base64 in storage. + { + ascName.SetString(m_strName, false); // linebreaks == false + } + + strOutput.Concatenate("\n\n", + ascName.Get(), + nymID.Get()); + + return true; +} + + +bool OTPseudonym::SavePseudonymWallet(std::ofstream & ofs) const +{ + OTString strOutput; + + if (SavePseudonymWallet(strOutput)) + ofs << strOutput.Get(); + else + return false; + + return true; +} + + + +/* +bool OTPseudonym::SavePseudonymWallet(FILE * fl) const +{ + if (NULL != fl) + { + OTString nymID; + GetIdentifier(nymID); + + fprintf(fl, "\n\n", + m_strName.Get(), nymID.Get(), m_strNymfile.Get()); + } + else { + return false; + } + + return true; +} +*/ + +// ----------------------------------------------------- + + +// +// This function saves the public key to a file. +// +bool OTPseudonym::SavePublicKey(const OTString & strPath) const +{ + const char * szFoldername = OTLog::PubkeyFolder(); + const char * szFilename = strPath.Get(); + + OT_ASSERT(NULL != szFoldername); + OT_ASSERT(NULL != szFilename); + + // By passing in an OTString instead of OTASCIIArmor, it knows to add the bookends + // ----- BEGIN PUBLIC KEY etc. These bookends are necessary for OTASCIIArmor to later + // read the thing back up into memory again. + OTString strKey; + + if (GetPublicKey().GetPublicKey(strKey, false)) // false means "do not ESCAPE the bookends" + // Ie we'll get ----------- instead of - --------- + { + bool bStored = OTDB::StorePlainString(strKey.Get(), szFoldername, szFilename); + + if (!bStored) + { + OTLog::vError("Failure in OTPseudonym::SavePublicKey while saving to storage: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + } + else + { + OTLog::Error("Error in OTPseudonym::SavePublicKey: unable to GetPublicKey from Nym\n"); + return false; + } + + return true; +} + + +bool OTPseudonym::SavePublicKey(std::ofstream & ofs) const +{ + // By passing in an OTString instead of OTASCIIArmor, it knows to add the bookends + // ----- BEGIN PUBLIC KEY etc. These bookends are necessary for OTASCIIArmor to later + // read the thing back up into memory again. + OTString strKey; + + if (GetPublicKey().GetPublicKey(strKey, false)) // false means "do not ESCAPE the bookends" + // Ie we'll get ----------- instead of - --------- + { + strKey.WriteToFile(ofs); + } + else + { + OTLog::Error("Error in OTPseudonym::SavePublicKey: unable to GetPublicKey from Nym\n"); + return false; + } + + return true; +} + +/* +bool OTPseudonym::SavePublicKey(FILE * fl) const +{ + if (NULL != fl) + { + // By passing in an OTString instead of OTASCIIArmor, it knows to add the bookends + // ----- BEGIN PUBLIC KEY etc. These bookends are necessary for OTASCIIArmor to later + // read the thing back up into memory again. + OTString strKey; + + if (GetPublicKey().GetPublicKey(strKey, false)) // false means "do not ESCAPE the bookends" + // Ie we'll get ----------- instead of - --------- + { + strKey.WriteToFile(fl); + } + else { + OTLog::Error("Error in OTPseudonym::SavePublicKey: unable to GetPublicKey from Nym\n"); + return false; + } + } + else { + return false; + } + + return true; +} +*/ + + + + +// This version is run on the server side, and assumes only a Public Key. +// This code reads up the file, discards the bookends, and saves only the gibberish itself. +bool OTPseudonym::LoadPublicKey() +{ + // ------------------------------------ + + OTString strID; + GetIdentifier(strID); + + const char * szFoldername = OTLog::PubkeyFolder(); + const char * szFilename = strID.Get(); + + // -------------------------------------------------------------------- + if (false == OTDB::Exists(szFoldername, szFilename)) + { + // Code will call this in order to see if there is a PublicKey to be loaded. + // Therefore I don't want to log a big error here since we expect that sometimes + // the key won't be there. + // Therefore I log at level 4, the same level as I log the successful outcome. + OTLog::Output(4, "Failure in OTPseudonym::LoadPublicKey.\n"); + return false; + } + + // -------------------------------------------------------------------- + + const OTString strFoldername(szFoldername), strFilename(szFilename); + + // This loads up the ascii-armored Public Key. + // On the client side, the entire x509 is stored. + // On the server side, it's just the public key. + bool bLoadKeyFile = m_ascCert.LoadFromFile(strFoldername, strFilename); + + // If successful, I load the same file again, but this time using OpenSSL + if (bLoadKeyFile) + { + // Unlike above, where I'm merely reading a text file into a memory buffer, + // this time we are actually trying to use OpenSSL to really extract the + // public key from that same file. + OTAsymmetricKey & pubKey = (OTAsymmetricKey &)GetPublicKey(); + + bool bLoadPublicKey = pubKey.LoadPublicKey(strFoldername, strFilename); + + if (!bLoadPublicKey) + { + OTLog::vError("Although the ascii-armored file (%s%s%s) was read, LoadPublicKey " + "returned false.\n", szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + else + { + OTLog::vOutput(4, "Successfully loaded public key from file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + } + return true; + } + + OTLog::Output(2, "Failure in OTPseudonym::LoadPublicKey.\n"); + return false; +} + + + + +bool OTPseudonym::SavePseudonym() +{ + if (!m_strNymfile.GetLength()) + { + OTString nymID; + GetIdentifier(nymID); + m_strNymfile.Format("%s", nymID.Get()); + } + + OTLog::vOutput(2, "Saving nym to: %s%s%s\n", + OTLog::NymFolder(), OTLog::PathSeparator(), m_strNymfile.Get()); + + return SavePseudonym(OTLog::NymFolder(), m_strNymfile.Get()); +} + + + +bool OTPseudonym::SavePseudonym(const char * szFoldername, const char * szFilename) +{ + OT_ASSERT(NULL != szFoldername); + OT_ASSERT(NULL != szFilename); + + OTString strNym; + SavePseudonym(strNym); + + // ------------------------------------- + + bool bSaved = OTDB::StorePlainString(strNym.Get(), szFoldername, szFilename); + + if (!bSaved) + OTLog::vError("OTPseudonym::SavePseudonym: Error saving file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + + // -------------------------------------------------------------------- + + return bSaved; +} + + + +bool OTPseudonym::SavePseudonym(std::ofstream & ofs) +{ + OTString strNym; + SavePseudonym(strNym); + + ofs << strNym.Get(); + + return true; +} + + +// Save the Pseudonym to a string... +bool OTPseudonym::SavePseudonym(OTString & strNym) +{ + OTString nymID; + GetIdentifier(nymID); + + strNym.Concatenate("\n\n", "1.0"); + + strNym.Concatenate("\n\n", + m_strVersion.Get(), + nymID.Get() + ); + + // ------------------------------------- + + long lRequestNum; + + for (mapOfRequestNums::iterator ii = m_mapRequestNum.begin(); ii != m_mapRequestNum.end(); ++ii) + { + std::string strServerID = (*ii).first; + lRequestNum = (*ii).second; + + strNym.Concatenate("\n\n", + strServerID.c_str(), + lRequestNum + ); + } + + // ------------------------------------- + // When you delete a Nym, it just marks it. + // Actual deletion occurs during maintenance sweep (targeting marked nyms...) + // + if (m_bMarkForDeletion) + strNym.Concatenate("\n" + "%s\n\n", + "THIS NYM HAS BEEN MARKED FOR DELETION AT ITS OWN REQUEST"); + + // ------------------------------------- + + long lTransactionNumber = 0; + + for (mapOfTransNums::iterator iii = m_mapTransNum.begin(); iii != m_mapTransNum.end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty()) && (strServerID.size() > 0) ) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + strNym.Concatenate("\n\n", + strServerID.c_str(), + lTransactionNumber + ); + } + } + } // for + + // ------------------------------------- + + lTransactionNumber = 0; + + for (mapOfTransNums::iterator iii = m_mapIssuedNum.begin(); iii != m_mapIssuedNum.end(); ++iii) + { + std::string strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty()) && (strServerID.size() > 0) ) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + strNym.Concatenate("\n\n", + strServerID.c_str(), + lTransactionNumber + ); + } + } + } // for + + // ------------------------------------- + + if (!(m_dequeMail.empty())) + { + for (unsigned i = 0; i < m_dequeMail.size(); i++) + { + OTMessage * pMessage = m_dequeMail.at(i); + + OT_ASSERT(NULL != pMessage); + + OTString strMail(*pMessage); + + OTASCIIArmor ascMail; + + if (strMail.Exists()) + ascMail.SetString(strMail); + + if (ascMail.Exists()) + strNym.Concatenate("\n" + "%s\n\n", + ascMail.Get()); + } + } + + // ------------------------------------- + + + if (!(m_dequeOutmail.empty())) + { + for (unsigned i = 0; i < m_dequeOutmail.size(); i++) + { + OTMessage * pMessage = m_dequeOutmail.at(i); + + OT_ASSERT(NULL != pMessage); + + OTString strOutmail(*pMessage); + + OTASCIIArmor ascOutmail; + + if (strOutmail.Exists()) + ascOutmail.SetString(strOutmail); + + if (ascOutmail.Exists()) + strNym.Concatenate("\n" + "%s\n\n", + ascOutmail.Get()); + } + } + + // ------------------------------------- + + if (!(m_setOpenCronItems.empty())) + { + for (std::set::iterator ii = m_setOpenCronItems.begin(); + ii != m_setOpenCronItems.end(); ii++) + { + long lCronItemTransNum = *ii; + + strNym.Concatenate("\n\n", + lCronItemTransNum); + } + } + + // ------------------------------------- + + if (!(m_setAccounts.empty())) + { + for (std::set::iterator ii = m_setAccounts.begin(); + ii != m_setAccounts.end(); ii++) + { + std::string strAcctID = *ii; + + strNym.Concatenate("\n\n", + strAcctID.c_str()); + } + } + + // ------------------------------------- + + strNym.Concatenate("\n"); + + return true; + +} + + + +//std::set m_setOpenCronItems; // Until these Cron Items are closed out, the server-side Nym keeps a list of them handy. + +//std::set m_setAccounts; // A list of asset account IDs. Server side only (client side uses wallet; has multiple servers.) + + +/* + + Enumeration for all xml nodes which are parsed by IrrXMLReader. + + Enumeration values: + + EXN_NONE No xml node. This is usually the node if you did not read anything yet. + EXN_ELEMENT A xml element, like . + EXN_ELEMENT_END End of an xml element, like . + EXN_TEXT Text within a xml element: this is the text. . + EXN_COMMENT An xml comment like or a DTD definition. + EXN_CDATA An xml cdata section like . + EXN_UNKNOWN Unknown element. + + Definition at line 180 of file irrXML.h. + + */ +bool OTPseudonym::LoadFromString(const OTString & strNym) +{ + bool bSuccess = false; + + m_setOpenCronItems.clear(); + m_setAccounts.clear(); + + // ------------------------------------ + + OTStringXML strNymXML(strNym); + IrrXMLReader* xml = createIrrXMLReader(&strNymXML); + OT_ASSERT(NULL != xml); + + // parse the file until end reached + while(xml && xml->read()) + { + // strings for storing the data that we want to read out of the file + OTString UserNymID; + + OTString ReqNumServerID; + OTString ReqNumCurrent; + + OTString TransNumServerID; + OTString TransNumAvailable; + + switch(xml->getNodeType()) + { + case EXN_NONE: + case EXN_TEXT: + case EXN_COMMENT: + case EXN_ELEMENT_END: + case EXN_CDATA: + // in this xml file, the only text which occurs is the messageText + //messageText = xml->getNodeData(); + break; + case EXN_ELEMENT: + { + if (!strcmp("OTuser", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + UserNymID = xml->getAttributeValue("nymID"); + + //TODO: no need to set the ID again here. We already know the ID + // at this point. Better to check and compare they are the same here. + //m_nymID.SetString(UserNymID); + // + + if (UserNymID.GetLength()) + OTLog::vOutput(3, "\nLoading user, version: %s NymID:\n%s\n", m_strVersion.Get(), UserNymID.Get()); + bSuccess = true; + } + else if (!strcmp("requestNum", xml->getNodeName())) + { + ReqNumServerID = xml->getAttributeValue("serverID"); + ReqNumCurrent = xml->getAttributeValue("currentRequestNum"); + + OTLog::vOutput(3, "\nCurrent Request Number is %s for ServerID: %s\n", + ReqNumCurrent.Get(), ReqNumServerID.Get()); + + // Make sure now that I've loaded this request number, to add it to my + // internal map so that it is available for future lookups. + m_mapRequestNum[ReqNumServerID.Get()] = atol(ReqNumCurrent.Get()); + } + else if (!strcmp("transactionNum", xml->getNodeName())) + { + TransNumServerID = xml->getAttributeValue("serverID"); + TransNumAvailable = xml->getAttributeValue("transactionNum"); + + OTLog::vOutput(3, "Transaction Number %s available for ServerID: %s\n", + TransNumAvailable.Get(), TransNumServerID.Get()); + + AddTransactionNum(TransNumServerID, atol(TransNumAvailable.Get())); // This version doesn't save to disk. (Why save to disk AS WE'RE LOADING?) + } + else if (!strcmp("issuedNum", xml->getNodeName())) + { + TransNumServerID = xml->getAttributeValue("serverID"); + TransNumAvailable = xml->getAttributeValue("transactionNum"); + + OTLog::vOutput(3, "Currently liable for Transaction Number %s, for ServerID: %s\n", + TransNumAvailable.Get(), TransNumServerID.Get()); + + AddIssuedNum(TransNumServerID, atol(TransNumAvailable.Get())); // This version doesn't save to disk. (Why save to disk AS WE'RE LOADING?) + } + + else if (!strcmp("MARKED_FOR_DELETION", xml->getNodeName())) + { + m_bMarkForDeletion = true; + OTLog::vOutput(3, "This nym has been MARKED_FOR_DELETION (at some point prior.)\n"); + } + + // ------------------------------------- + + else if (!strcmp("hasOpenCronItem", xml->getNodeName())) + { + OTString strID = xml->getAttributeValue("ID"); + + if (strID.Exists()) + { + const long lNewID = atol(strID.Get()); + m_setOpenCronItems.insert(lNewID); + OTLog::vOutput(3, "This nym has an open cron item with ID: %s\n", + strID.Get()); + } + else + OTLog::vOutput(3, "This nym MISSING ID when loading open cron item record.\n"); + } + else if (!strcmp("ownsAssetAcct", xml->getNodeName())) + { + OTString strID = xml->getAttributeValue("ID"); + + if (strID.Exists()) + { + m_setAccounts.insert(strID.Get()); + OTLog::vOutput(3, "This nym has an asset account with the ID: %s\n", + strID.Get()); + } + else + OTLog::vOutput(3, "This nym MISSING asset account ID when loading nym record.\n"); + } + else if (!strcmp("mailMessage", xml->getNodeName())) + { + OTASCIIArmor armorMail; + + OTString strMessage; + + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + OTString strNodeData = xml->getNodeData(); + + // Sometimes the XML reads up the data with a prepended newline. + // This screws up my own objects which expect a consistent in/out + // So I'm checking here for that prepended newline, and removing it. + char cNewline; + if (strNodeData.Exists() && strNodeData.GetLength() > 2 && strNodeData.At(0, cNewline)) + { + if ('\n' == cNewline) + { + armorMail.Set(strNodeData.Get() + 1); // I know all this shit is ugly. I refactored this in OTContract. + } + else // unfortunately OTNym is like a "basic type" and isn't derived from OTContract. + { + armorMail.Set(strNodeData.Get()); + } + + if (armorMail.GetLength() > 2) + { + armorMail.GetString(strMessage, true); // linebreaks == true. + + if (strMessage.GetLength() > 2) + { + OTMessage * pMessage = new OTMessage; + + OT_ASSERT(NULL != pMessage); + + if (pMessage->LoadContractFromString(strMessage)) + m_dequeMail.push_back(pMessage); // takes ownership + else + delete pMessage; + } + } + } + } + } + else if (!strcmp("outmailMessage", xml->getNodeName())) + { + OTASCIIArmor armorMail; + + OTString strMessage; + + xml->read(); + + if (EXN_TEXT == xml->getNodeType()) + { + OTString strNodeData = xml->getNodeData(); + + // Sometimes the XML reads up the data with a prepended newline. + // This screws up my own objects which expect a consistent in/out + // So I'm checking here for that prepended newline, and removing it. + char cNewline; + if (strNodeData.Exists() && strNodeData.GetLength() > 2 && strNodeData.At(0, cNewline)) + { + if ('\n' == cNewline) + { + armorMail.Set(strNodeData.Get() + 1); + } + else + { + armorMail.Set(strNodeData.Get()); + } + + if (armorMail.GetLength() > 2) + { + armorMail.GetString(strMessage, true); // linebreaks == true. + + if (strMessage.GetLength() > 2) + { + OTMessage * pMessage = new OTMessage; + + OT_ASSERT(NULL != pMessage); + + if (pMessage->LoadContractFromString(strMessage)) + m_dequeOutmail.push_back(pMessage); // takes ownership + else + delete pMessage; + } + } + } + } + } + else + { + // unknown element type + OTLog::vError("Unknown element type in OTPseudonym::LoadFromString: %s\n", xml->getNodeName()); + bSuccess = false; + } + break; + } + default: + { + OTLog::vOutput(5, "Unknown XML type in OTPseudonym::LoadFromString: %s\n", xml->getNodeName()); + break; + } + } // switch + } // while + + + if (NULL != xml) + { + delete xml; + xml = NULL; + } + + return bSuccess; +} + + + + +bool OTPseudonym::LoadSignedNymfile(OTPseudonym & SIGNER_NYM) +{ + // Get the Nym's ID in string form + OTString nymID; + GetIdentifier(nymID); + + // Create an OTSignedFile object, giving it the filename (the ID) and the local directory ("nyms") + OTSignedFile theNymfile("nyms", nymID); + + if (false == theNymfile.LoadFile()) + { + OTLog::vOutput(0, "Failed Loading a signed nymfile:\n%s\n\n", nymID.Get()); + return false; + } + + // We verify: + // + // 1. That the file even exists and loads. + // 2. That the local subdir and filename match the versions inside the file. + // 3. That the signature matches for the signer nym who was passed in. + // + if ( true // Also see OTWallet.cpp where it says: //pNym->SaveSignedNymfile(*pNym); // Uncomment this if you want to generate a new nym by hand. NORMALLY LEAVE IT COMMENTED OUT!!!! IT'S DANGEROUS!!! + && theNymfile.VerifyFile() // TODO TEMP TEMPORARY RESUME (These two lines can be commented out to allow you to load a nymfile with no sig. + && theNymfile.VerifySignature(SIGNER_NYM) // These are ONLY commented-out so I can reload a bad nymfile. UNCOMMENT THESE IF YOU SEE THIS. + ) + { + OTLog::Output(2, "Loaded and verified signed nymfile. Reading from string...\n"); + + if (theNymfile.GetFilePayload().GetLength() > 0) + return LoadFromString(theNymfile.GetFilePayload()); + else + { + const long lLength = static_cast (theNymfile.GetFilePayload().GetLength()); + + OTLog::vError("Bad length (%ld) while loading nymfile:\n%s\n", lLength, nymID.Get()); + } + } + else + { + OTLog::vError("Error Verifying signed nymfile:\n%s\n\n", nymID.Get()); + } + + return false; +} + +bool OTPseudonym::SaveSignedNymfile(OTPseudonym & SIGNER_NYM) +{ + // Get the Nym's ID in string form + OTString nymID; + GetIdentifier(nymID); + + // Create an OTSignedFile object, giving it the filename (the ID) and the local directory ("nyms") + OTSignedFile theNymfile(OTLog::NymFolder(), nymID); + theNymfile.GetFilename(m_strNymfile); + + OTLog::vOutput(2, "Saving nym to: %s\n", m_strNymfile.Get()); + + // First we save this nym to a string... + // Specifically, the file payload string on the OTSignedFile object. + SavePseudonym(theNymfile.GetFilePayload()); + + // Now the OTSignedFile contains the path, the filename, AND the + // contents of the Nym itself, saved to a string inside the OTSignedFile object. + + if (theNymfile.SignContract(SIGNER_NYM) && + theNymfile.SaveContract()) + { + return theNymfile.SaveFile(); + } + + return false; +} + + +/// See if two nyms have identical lists of issued transaction numbers (#s currently signed for.) +// +bool OTPseudonym::VerifyIssuedNumbersOnNym(OTPseudonym & THE_NYM) +{ + long lTransactionNumber = 0; // Used in the loop below. + + int nNumberOfTransactionNumbers1 = 0; // *this + int nNumberOfTransactionNumbers2 = 0; // THE_NYM. + + std::string strServerID; + + // First, loop through the Nym on my side (*this), and count how many numbers total he has... + // + for (mapOfTransNums::iterator iii = GetMapIssuedNum().begin(); + iii != GetMapIssuedNum().end(); ++iii) + { + strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OTString OTstrServerID = strServerID.c_str(); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + nNumberOfTransactionNumbers1 += pDeque->size(); + } + } // for + + // Next, loop through THE_NYM, and count his numbers as well... + // But ALSO verify that each one exists on *this, so that each individual + // number is checked. + // + + for (mapOfTransNums::iterator iii = THE_NYM.GetMapIssuedNum().begin(); + iii != THE_NYM.GetMapIssuedNum().end(); ++iii) + { + strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OTString OTstrServerID = strServerID.c_str(); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + +// if () + { + nNumberOfTransactionNumbers2 ++ ; + + if (false == VerifyIssuedNum(OTstrServerID, lTransactionNumber)) + { + OTLog::vOutput(0, "OTPseudonym::VerifyIssuedNumbersOnNym: Issued transaction # %ld from THE_NYM not found on *this.\n", + lTransactionNumber); + + return false; + } + } + } + } + } // for + + // Finally, verify that the counts match... + if (nNumberOfTransactionNumbers1 != nNumberOfTransactionNumbers2) + { + OTLog::vOutput(0, "OTPseudonym::VerifyIssuedNumbersOnNym: Issued transaction # Count mismatch: %d and %d\n", + nNumberOfTransactionNumbers1, nNumberOfTransactionNumbers2); + + return false; + } + + return true; +} + + +// This is client-side. It's called by VerifyTransactionReceipt and VerifyBalanceReceipt. +// +// It's okay if some issued transaction #s in THE_NYM (the receipt's Nym) aren't found on *this, (client-side Nym) +// since the last balance agreement may have cleaned them out after they were recorded in THE_NYM +// (from the transaction statement receipt). +// +// But I should never see transaction #s APPEAR in *this that aren't in THE_NYM on receipt, since a balance agreement +// can ONLY remove numbers, not add them. So any numbers left over should still be accounted for on the +// last signed receipt (which supplied THE_NYM as that list of numbers.) +// +// Conclusion: Loop through *this, which is newer, and make sure ALL numbers appear on THE_NYM. +// No need to check the reverse, and no need to match the count. +// +bool OTPseudonym::VerifyTransactionStatementNumbersOnNym(OTPseudonym & THE_NYM) // THE_NYM is from the receipt. +{ + long lTransactionNumber = 0; // Used in the loop below. + + std::string strServerID; + + // First, loop through the Nym on my side (*this), and verify that all those #s appear on the last receipt (THE_NYM) + // + for (mapOfTransNums::iterator iii = GetMapIssuedNum().begin(); + iii != GetMapIssuedNum().end(); ++iii) + { + strServerID = (*iii).first; + dequeOfTransNums * pDeque = (iii->second); + + OTString OTstrServerID = strServerID.c_str(); + + OT_ASSERT(NULL != pDeque); + + if (!(pDeque->empty())) + { + for (unsigned i = 0; i < pDeque->size(); i++) + { + lTransactionNumber = pDeque->at(i); + + if (false == THE_NYM.VerifyIssuedNum(OTstrServerID, lTransactionNumber)) + { + OTLog::vOutput(0, "OTPseudonym::VerifyTransactionStatementNumbersOnNym: Issued transaction # %ld from *this not found on THE_NYM.\n", + lTransactionNumber); + return false; + } + } + } + } // for + + // Getting here means that, though issued numbers may have been removed from my responsibility + // in a subsequent balance agreement (since the transaction agreement was signed), I know + // for a fact that no numbers have been ADDED to my list of responsibility. + // That's the most we can verify here, since we don't know the account number that was + // used for the last balance agreement. + + + return true; +} + + + + + +// Each Nym has a public key file, as well as a nym file. Why two separate files? +// Because they are often used for different purposes and are being loaded/saved +// for their own reasons. The Nymfile contains the user ID, which is a hash of the +// public key, so the it knows how to find the right pubkey file (filename is the +// hash) and it knows how to validate the contents (by hashing them.) The Nymfile +// also contains the transaction numbers that have been issued to that nym, so +// the server might later load it up in order to verify that a specific transaction +// number is indeed on that list (and then remove it from the list.) +bool OTPseudonym::LoadNymfile(const char * szFilename/*=NULL*/) +{ + OTString strID; + GetIdentifier(strID); + + const char * szFoldername = OTLog::NymFolder(); + const char * szTheFilename = strID.Get(); + + // If no filename was passed in (user might have designated one) then we create + // the filename by appending the Nym's ID to the path. + if (NULL == szFilename) + { + m_strNymfile = szTheFilename; + } + else + { + m_strNymfile = szFilename; + } + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, m_strNymfile.Get())) + { + OTLog::vError("OTPseudonym::LoadNymfile: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), m_strNymfile.Get()); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, m_strNymfile.Get())); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTPseudonym::LoadNymfile: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), m_strNymfile.Get()); + return false; + } + // -------------------------------------------------------------------- + + OTString strRawFile = strFileContents.c_str(); + + if (strRawFile.GetLength()) + return LoadFromString(strRawFile); + + return false; +} + + +bool OTPseudonym::Loadx509CertAndPrivateKey() +{ + OTString strID(m_nymID); + + const char * szFoldername = OTLog::CertFolder(); + const char * szFilename = strID.Get(); + + OT_ASSERT(NULL != szFoldername); + OT_ASSERT(NULL != szFilename); + +// m_strCertfile.Format((char *)"%s%s%s%s%s", OTLog::Path(), OTLog::PathSeparator(), +// OTLog::CertFolder(), +// OTLog::PathSeparator(), strID.Get()); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTPseudonym::Loadx509CertAndPrivateKey: File does not exist: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + + const OTString strFoldername(szFoldername); + const OTString strFilename(szFilename); + + OT_ASSERT(strFoldername.Exists()); + OT_ASSERT(strFilename.Exists()); + + // This loads up the ascii-armored Cert from the certfile, minus the ------ bookends. + // Later we will use this to create a hash and verify against the NymID that was in the wallet. + bool bRetVal = m_ascCert.LoadFromFile(strFoldername, strFilename); + + // I load the same file again, but this time using OpenSSL functions to read the public + // key and private key (if necessary) from the same file. + if (bRetVal) + { + bool bPublic = false; + bool bPrivate = false; + + bPublic = m_pkeyPublic->LoadPublicKeyFromCertFile(strFoldername, strFilename); + + bPrivate = m_pkeyPrivate->LoadPrivateKey(strFoldername, strFilename); + +// bPrivate = true; + + if (!bPublic) + { + OTLog::vError("Although the ascii-armored file (%s%s%s) was read, LoadPublicKeyFromCert " + "returned false.\n", szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + else + { + OTLog::vOutput(2, "Successfully loaded public key from Certfile: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + } + + if (!bPrivate) + { + OTLog::vError("Although the ascii-armored file (%s%s%s) was read, LoadPrivateKey returned false.\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + else + { + OTLog::vOutput(2, "Successfully loaded private key from: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + } + + return true; + } + else + { + OTLog::vError("Failure in OTPseudonym::Loadx509CertAndPrivateKey, filename:\n%s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } +} + + + + + +// This version WILL handle the bookends: -----BEGIN CERTIFICATE------ +// It will also handle the escaped version: - -----BEGIN CERTIFICATE----- +bool OTPseudonym::SetCertificate(const OTString & strCert, bool bEscaped/*=true*/) +{ + return m_pkeyPublic->LoadPublicKeyFromCertString(strCert, bEscaped); +} + + +// This version WILL handle the bookends -----BEGIN PUBLIC KEY------ +// It will also handle the escaped version: - -----BEGIN PUBLIC KEY------ +bool OTPseudonym::SetPublicKey(const OTString & strKey, bool bEscaped/*=true*/) +{ + if (strKey.Contains("PGP PUBLIC KEY")) + { + OTASCIIArmor theArmor; + + if (theArmor.LoadFromString((OTString &)strKey, bEscaped)) + { + // This function expects that the bookends are already removed. + // The ascii-armor loading code removes them and handles the escapes also. + return m_pkeyPublic->LoadPublicKeyFromPGPKey(theArmor); + } + else { + OTLog::Output(2, "Failed extracting PGP public key from ascii-armored text.\n"); + return false; + } + } + else // the below function SetPublicKey (in the return call) expects the + // bookends to still be there, and it will handle removing them. (Unlike PGP code above.) + return m_pkeyPublic->SetPublicKey(strKey, bEscaped); +} + + + + +// This version handles the ascii-armored text WITHOUT the bookends +bool OTPseudonym::SetPublicKey(const OTASCIIArmor & strKey) +{ + return m_pkeyPublic->SetPublicKey(strKey); +} + + +// sets internal member based in ID passed in +void OTPseudonym::SetIdentifier(const OTIdentifier & theIdentifier) +{ + m_nymID = theIdentifier; +} + +// sets argument based on internal member +void OTPseudonym::GetIdentifier(OTIdentifier & theIdentifier) const +{ + theIdentifier = m_nymID; +} + +// sets internal member based in ID passed in +void OTPseudonym::SetIdentifier(const OTString & theIdentifier) +{ + m_nymID.SetString(theIdentifier); +} + +// sets argument based on internal member +void OTPseudonym::GetIdentifier(OTString & theIdentifier) const +{ + m_nymID.GetString(theIdentifier); +} + + +const OTAsymmetricKey & OTPseudonym::GetPublicKey() const +{ + return (*m_pkeyPublic); +} + +const OTAsymmetricKey & OTPseudonym::GetPrivateKey() const +{ + return (*m_pkeyPrivate); +} + + + +OTPseudonym::OTPseudonym() : m_bMarkForDeletion(false) +{ + m_pkeyPublic = new OTAsymmetricKey; + m_pkeyPrivate = new OTAsymmetricKey; + Initialize(); +} + +void OTPseudonym::Initialize() +{ + m_strVersion = "1.0"; +} + +OTPseudonym::OTPseudonym(const OTString & name, const OTString & filename, const OTString & nymID) + : m_bMarkForDeletion(false) +{ + m_pkeyPublic = new OTAsymmetricKey; + m_pkeyPrivate = new OTAsymmetricKey; + + Initialize(); + + m_strName = name; + m_strNymfile = filename; + + m_nymID.SetString(nymID); +} + +OTPseudonym::OTPseudonym(const OTIdentifier & nymID) : m_bMarkForDeletion(false) +{ + m_pkeyPublic = new OTAsymmetricKey; + m_pkeyPrivate = new OTAsymmetricKey; + + Initialize(); + + m_nymID = nymID; +} + +OTPseudonym::OTPseudonym(const OTString & strNymID) : m_bMarkForDeletion(false) +{ + m_pkeyPublic = new OTAsymmetricKey; + m_pkeyPrivate = new OTAsymmetricKey; + + Initialize(); + + m_nymID.SetString(strNymID); +} + +OTPseudonym::~OTPseudonym() +{ + delete m_pkeyPublic; + delete m_pkeyPrivate; + m_pkeyPublic = NULL; + m_pkeyPrivate = NULL; + + ReleaseTransactionNumbers(); + + ClearMail(); + ClearOutmail(); +} + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTPseudonym.h b/OTLib/OTPseudonym.h new file mode 100644 index 000000000..6a01ef277 --- /dev/null +++ b/OTLib/OTPseudonym.h @@ -0,0 +1,437 @@ +/************************************************************* + * + * OTPseudonym.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTPSEUDONYM_H__ +#define __OTPSEUDONYM_H__ + +#include + + +#include +#include +#include +#include +#include + +#include "OTString.h" +#include "OTData.h" +#include "OTIdentifier.h" + +#include "OTASCIIArmor.h" +#include "OTAsymmetricKey.h" + +/* + + I need to map transaction server ID, each for a pointer to deque of long. + + + */ + +class OTItem; +class OTTransaction; +class OTMessage; + +typedef std::deque dequeOfMail; + +typedef std::map mapOfRequestNums; + +typedef std::deque dequeOfTransNums; +typedef std::map mapOfTransNums; + +class OTPseudonym +{ +private: + bool m_bMarkForDeletion; // Default FALSE. When set to true, saves a "DELETED" flag with this Nym, + // for easy cleanup later when the server is doing some maintenance. + OTString m_strName; // Used by the wallet so the nym is easily identified by the user + // The internals, and server, prefer nymID to name. + OTString m_strNymfile; // This contains the request numbers and other user acct info. XML. + // Client-side only, since the server uses nymID for filenames + OTString m_strCertfile; // Filename for pem file that contains the x509 Certificate. ----BEGIN etc... + // Client-side only for now. + + OTString m_strVersion; // This goes with the Nymfile + + OTASCIIArmor m_ascCert; // Just the ascii-armor portion without BEGIN and END + + OTIdentifier m_nymID; // hashed public key + + OTAsymmetricKey *m_pkeyPublic; // This nym's public key + OTAsymmetricKey *m_pkeyPrivate; // This nym's private key + + dequeOfMail m_dequeMail; // Any mail messages received by this Nym. (And not yet deleted.) + dequeOfMail m_dequeOutmail; // Any mail messages sent by this Nym. (And not yet deleted.) + + mapOfRequestNums m_mapRequestNum; // Whenever this user makes a request to a transaction server + // he must use the latest request number. Each user has a request + // number for EACH transaction server he accesses. + mapOfTransNums m_mapTransNum; // Each Transaction Request must be accompanied by a fresh transaction #, + // one that has previously been issued to the Nym by the Server. This list + // is used so that I know WHICH transaction numbers I still have to USE. + + mapOfTransNums m_mapIssuedNum; // If the server has issued me (1,2,3,4,5) and I have already used 1-3, + // then (4,5) are the only remaining numbers on the ABOVE list, but the + // entire (1,2,3,4,5) are still on THIS list--each only to be removed + // when I have ACCEPTED THE RECEIPT IN MY NYMBOX FOR EACH ONE. This list + // is so I can do agreements with the server concerning which RECEIPTS I'VE ACCEPTED. + + std::set m_setOpenCronItems; // Until these Cron Items are closed out, the server-side Nym keeps a list of them handy. + + // Using strings here to avoid juggling memory crap. + std::set m_setAccounts; // A list of asset account IDs. Server side only (client side uses wallet; has multiple servers.) + +public: + + inline void MarkForDeletion() { m_bMarkForDeletion = true; } + inline bool IsMarkedForDeletion() const { return m_bMarkForDeletion; } + inline void MarkAsUndeleted() { m_bMarkForDeletion = false; } + + // Server-side. Helps the server keep track of the accounts for a certain Nym, and the cron items. + inline std::set & GetSetOpenCronItems() { return m_setOpenCronItems; } + inline std::set & GetSetAssetAccounts() { return m_setAccounts; } // stores acct IDs as std::string + + // ------------------------------------------------ + + inline OTString & GetNymName() { return m_strName; } + inline void SetNymName(const OTString & strName) { m_strName = strName; } + + OTPseudonym(); + OTPseudonym(const OTIdentifier & nymID); + OTPseudonym(const OTString & strNymID); + OTPseudonym(const OTString & name, const OTString & filename, const OTString & nymID); + virtual ~OTPseudonym(); + + void Initialize(); + void ReleaseTransactionNumbers(); + + bool VerifyPseudonym() const; + + + // use this to actually generate a new key pair and assorted nym files. + // + bool GenerateNym(); + + // --------------------------------------------- + + // Some messages require "transaction agreement" as opposed to "balance agreement." + // That is, cases where only transactions change and not balances. + // + + OTItem * GenerateTransactionStatement(const OTTransaction & theOwner); // like balance agreement + + // --------------------------------------------- + + // This version WILL handle the bookends -----BEGIN PUBLIC KEY------ + bool SetPublicKey(const OTString & strKey, bool bEscaped=true); + + // This version WILL handle the bookends: -----BEGIN CERTIFICATE------ + // It also handles the escaped version: - -----BEGIN CERTIFICATE----- + bool SetCertificate(const OTString & strCert, bool bEscaped=true); + + // This will set the public key on this Nym + // based on the public key as it appears in an + // ascii-armored string. + bool SetPublicKey(const OTASCIIArmor & strKey); + + + // The signer is whoever wanted to make sure these nym files haven't changed. + // Usually that means the server nym. Most of the time, m_nymServer will be used as signer. + bool LoadSignedNymfile(OTPseudonym & SIGNER_NYM); + bool SaveSignedNymfile(OTPseudonym & SIGNER_NYM); + + bool LoadNymfile(const char * szFilename=NULL); + bool LoadFromString(const OTString & strNym); + + bool LoadPublicKey(); + bool Loadx509CertAndPrivateKey(); + +// bool SavePseudonymWallet(FILE * fl) const; + bool SavePseudonymWallet(OTString & strOutput) const; + bool SavePseudonymWallet(std::ofstream & ofs) const; + + bool SavePublicKey(const OTString & strPath) const; +// bool SavePublicKey(FILE * fl) const; + bool SavePublicKey(std::ofstream & ofs) const; + + bool SavePseudonym(); // saves to filename m_strNymfile + bool SavePseudonym(const char * szFoldername, const char * szFilename); + bool SavePseudonym(OTString & strNym); +// bool SavePseudonym(FILE * fl); + bool SavePseudonym(std::ofstream & ofs); + + bool SetIdentifierByPubkey(); + + inline bool CompareID(const OTIdentifier & theIdentifier) const + { return (theIdentifier == m_nymID); } + + void GetIdentifier(OTIdentifier & theIdentifier) const; + void SetIdentifier(const OTIdentifier & theIdentifier); + + void GetIdentifier(OTString & theIdentifier) const; + void SetIdentifier(const OTString & theIdentifier); + + void HarvestTransactionNumbers(const OTIdentifier & theServerID, OTPseudonym & SIGNER_NYM, OTPseudonym & theOtherNym, bool bSave=true); // OtherNym is used as container for server to send us new transaction numbers + void HarvestIssuedNumbers(const OTIdentifier & theServerID, OTPseudonym & SIGNER_NYM, OTPseudonym & theOtherNym, bool bSave=false); // OtherNym is used as container for us to send list of issued numbers to the server (for balance agreement) + + void IncrementRequestNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID); // Increment the counter or create a new one for this serverID starting at 1 + void OnUpdateRequestNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long lNewRequestNumber); // if the server sends us a @getRequest + bool GetCurrentRequestNum(const OTString & strServerID, long &lReqNum); // get the current request number for the serverID + + inline mapOfTransNums & GetMapTransNum() { return m_mapTransNum; } + inline mapOfTransNums & GetMapIssuedNum() { return m_mapIssuedNum; } + + void RemoveAllNumbers(); + + bool UnRegisterAtServer(const OTString & strServerID); // Removes the request num for a specific server, if it was there before. + bool IsRegisteredAtServer(const OTString & strServerID); // You can't go using a Nym at a certain server, if it's not registered there... + + // HIGH LEVEL: + bool AddTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long lTransNum, bool bSave); // We have received a new trans num from server. Store it. + bool GetNextTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, long &lTransNum, + bool bSave=true); // Get the next available transaction number for the serverID passed. Saves by default. + bool RemoveIssuedNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum, bool bSave); // SAVE OR NOT (your choice) + + bool VerifyIssuedNum(const OTString & strServerID, const long & lTransNum); // verify user is still responsible for (signed for) a certain trans# that was previous issued to him. (i.e. it's been used, but not yet accepted receipt through inbox.) + bool VerifyTransactionNum(const OTString & strServerID, const long & lTransNum); // server verifies that nym has this TransNum available for use. + + // These two functions are for when you re-download your nym/account/inbox/outbox, and you + // need to verify it against the last signed receipt to make sure you aren't getting screwed. + bool VerifyIssuedNumbersOnNym(OTPseudonym & THE_NYM); + bool VerifyTransactionStatementNumbersOnNym(OTPseudonym & THE_NYM); + + // ------------------------------------- + // These functions are for transaction numbers that were assigned to me, + // until I accept the receipts or put stop payment onto them. + int GetIssuedNumCount(const OTIdentifier & theServerID); // count + long GetIssuedNum(const OTIdentifier & theServerID, int nIndex); // index + + bool AddIssuedNum(const OTString & strServerID, const long & lTransNum); // doesn't save + + bool RemoveIssuedNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum); // saves + bool RemoveIssuedNum(const OTString & strServerID, const long & lTransNum); // doesn't save + + // ------------------------------------- + // These functions are for transaction numbers that I still have available to use. + // + int GetTransactionNumCount(const OTIdentifier & theServerID); // count + long GetTransactionNum(const OTIdentifier & theServerID, int nIndex); // index + + bool AddTransactionNum(const OTString & strServerID, const long lTransNum); // doesn't save + + bool RemoveTransactionNum(OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum); // server removes spent number from nym file. Saves. + bool RemoveTransactionNum(const OTString & strServerID, const long & lTransNum); // doesn't save. + + // --------------------------------------------- + + // The "issued" numbers and the "transaction" numbers both use these functions + // to do the actual work (just avoiding code duplication.) + bool VerifyGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long & lTransNum); + + bool RemoveGenericNum(mapOfTransNums & THE_MAP, OTPseudonym & SIGNER_NYM, const OTString & strServerID, const long & lTransNum); // saves + bool RemoveGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long & lTransNum); // doesn't save + + bool AddGenericNum(mapOfTransNums & THE_MAP, const OTString & strServerID, const long lTransNum); // doesn't save + + int GetGenericNumCount(mapOfTransNums & THE_MAP, const OTIdentifier & theServerID); + + // ------------------------------------- + + // Whenever a Nym receives a message via his Nymbox, and then the Nymbox is processed, (which happens automatically) + // that processing will drop all mail messages into this deque for safe-keeping, after Nymbox is cleared. + // + void AddMail(OTMessage & theMessage); // a mail message is the original OTMessage from the sender, transported via Nymbox of recipient (me). + int GetMailCount(); // How many mail messages does this Nym currently store? + OTMessage * GetMailByIndex(const int nIndex); // Get a specific piece of mail, at a specific index. + bool RemoveMailByIndex(const int nIndex); // if returns false, mail index was bad (or something else must have gone seriously wrong.) + + void ClearMail(); // called by the destructor. (Not intended to erase messages from local storage.) + + // ------------------------------------- + + // Whenever a Nym sends a message, a copy is dropped into his Outmail. + // + void AddOutmail(OTMessage & theMessage); // a mail message is the original OTMessage that this Nym sent. + int GetOutmailCount(); // How many outmail messages does this Nym currently store? + OTMessage * GetOutmailByIndex(const int nIndex); // Get a specific piece of outmail, at a specific index. + bool RemoveOutmailByIndex(const int nIndex); // if returns false, outmail index was bad (or something else must have gone seriously wrong.) + + void ClearOutmail(); // called by the destructor. (Not intended to erase messages from local storage.) + + // ------------------------------------- + + const OTAsymmetricKey & GetPublicKey() const; + const OTAsymmetricKey & GetPrivateKey() const; + + void DisplayStatistics(OTString & strOutput); +}; + +#endif // __OTPSEUDONYM_H__ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTPurse.cpp b/OTLib/OTPurse.cpp new file mode 100644 index 000000000..e31292ca4 --- /dev/null +++ b/OTLib/OTPurse.cpp @@ -0,0 +1,668 @@ +/************************************************************************************ + * + * OTPurse.cpp + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + + +#include "OTStorage.h" + +#include "OTToken.h" +#include "OTPurse.h" +#include "OTPseudonym.h" +#include "OTEnvelope.h" +#include "OTASCIIArmor.h" +#include "OTLog.h" + + + +// Take all the tokens from a purse and add them to this purse. +// Don't allow duplicates. +// +bool OTPurse::Merge(OTPseudonym & theNym, OTPurse & theNewPurse) +{ + mapOfTokenPointers theMap; + + while (this->Count() > 0) + { + OTToken * pToken = this->Pop(theNym); + + OT_ASSERT(NULL != pToken); + + const OTASCIIArmor & ascTokenID = pToken->GetSpendable(); + + // I just popped a Token off of *this. Let's see if it's in my temporary map... + // If it's already there, then just delete it (duplicate). + for (mapOfTokenPointers::iterator ii = theMap.begin(); ii != theMap.end(); ++ii) + { + OTToken * pTempToken = (*ii).second; + + OT_ASSERT(NULL != pTempToken); + + const OTASCIIArmor & ascTempTokenID = pTempToken->GetSpendable(); + + // -------------------------------- + // It's already there. Delete the one that's already there. + // (That way we can add it after, whether it was there originally or not.) + if (ascTempTokenID == ascTokenID) + { + theMap.erase(ii); + delete pTempToken; + //break; // In case there are multiple duplicates, not just one. + } + } + + // Now we know there aren't any duplicates on the temporary map, let's add the token to it. + std::string theKey = ascTokenID.Get(); + theMap.insert(std::pair(theKey, pToken)); + } + + // At this point, all of the tokens on *this have been popped, and added + // to the temporary map as token pointers, with any duplicates removed. + + // ----------------------------------------------------------- + + // Basically now I just want to do the exact same thing with the other purse. + + while (theNewPurse.Count() > 0) + { + OTToken * pToken = theNewPurse.Pop(theNym); // TODO: This isn't necessarily the right nym. Need to fix purse to allow dummy nyms. + + OT_ASSERT(NULL != pToken); + + const OTASCIIArmor & ascTokenID = pToken->GetSpendable(); + + // I just popped a Token off of theNewPurse. Let's see if it's in my temporary map... + // If it's already there, then just delete it (duplicate). + for (mapOfTokenPointers::iterator ii = theMap.begin(); ii != theMap.end(); ++ii) + { + OTToken * pTempToken = (*ii).second; + + OT_ASSERT(NULL != pTempToken); + + const OTASCIIArmor & ascTempTokenID = pTempToken->GetSpendable(); + + // -------------------------------- + // It's already there. Delete the one that's already there. + // (That way we can add it after, whether it was there originally or not.) + if (ascTempTokenID == ascTokenID) + { + theMap.erase(ii); + delete pTempToken; + //break; // In case there are multiple duplicates, not just one. + } + } + + // Now we know there aren't any duplicates on the temporary map, let's add the token to it. + std::string theKey = ascTokenID.Get(); + theMap.insert(std::pair(theKey, pToken)); + } + + // ----------------------------------------------------------- + + // At this point, all of the tokens on *this AND theNewPurse have been popped, and added + // to the temporary map as token pointers, with any duplicates removed. + + // Now I just loop through that same map, and Push ALL of those tokens back onto *this. + + for (mapOfTokenPointers::iterator ii = theMap.begin(); ii != theMap.end(); ++ii) + { + OTToken * pToken = (*ii).second; + + OT_ASSERT(NULL != pToken); + + bool bPush = this->Push(theNym, *pToken); // purse makes it's own copy of the token into string form. + + if (!bPush) + OTLog::Error("Failure pushing token in OTPurse::Merge.\n"); + } + + // ----------------------------------------------------- + + // Next I clean up all the tokens out of the temporary map, since they will leak otherwise. + + while (!theMap.empty()) + { + OTToken * pToken = theMap.begin()->second; + + OT_ASSERT(NULL != pToken); + + delete pToken; + pToken = NULL; + + theMap.erase(theMap.begin()); + } + + // ----------------------------------------------------- + + return true; +} + + + +OTPurse::OTPurse(const OTPurse & thePurse) : OTContract() +{ + InitPurse(); + + m_ServerID = thePurse.GetServerID(); + m_AssetID = thePurse.GetAssetID(); +} + +// Don't use this unless you really don't have the asset type handy. +// Perhaps you know you're about to read this purse from a string and you +// know the asset type is in there anyway. So you use this constructor. +OTPurse::OTPurse(const OTIdentifier & SERVER_ID) : OTContract() +{ + InitPurse(); + + m_ServerID = SERVER_ID; +} + +OTPurse::OTPurse(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() +{ + InitPurse(); + + m_ServerID = SERVER_ID; + m_AssetID = ASSET_ID; +} + +OTPurse::OTPurse(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, const OTIdentifier & USER_ID) : OTContract() +{ + InitPurse(); + + m_ServerID = SERVER_ID; + m_AssetID = ASSET_ID; + m_UserID = USER_ID; +} + +OTPurse::~OTPurse() +{ +// Release(); + // OTContract::~OTContract is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. + +} + +void OTPurse::InitPurse() +{ + m_strContractType.Set("PURSE"); + + m_lTotalValue = 0; +} + + +void OTPurse::Release() +{ + // This sets m_lTotalValue to 0. + ReleaseTokens(); + + OTContract::Release(); +} + +/* + OTIdentifier m_UserID; // Optional + OTIdentifier m_ServerID; // Mandatory + OTIdentifier m_AssetID; // Mandatory + */ + +bool OTPurse::LoadContract() +{ + return LoadPurse(); +} + + +bool OTPurse::LoadPurse(const char * szServerID/*=NULL*/, const char * szUserID/*=NULL*/, const char * szAssetTypeID/*=NULL*/) +{ + if (!m_strFoldername.Exists()) + m_strFoldername.Set(OTLog::PurseFolder()); + // ----------------------------------------- + OTString strServerID(m_ServerID), strUserID(m_UserID), strAssetTypeID(m_AssetID); + + if (NULL != szServerID) + strServerID = szServerID; + if (NULL != szUserID) + strUserID = szUserID; + if (NULL != szAssetTypeID) + strAssetTypeID = szAssetTypeID; + // ------------------------------- + if (!m_strFilename.Exists()) + { + m_strFilename.Format("%s%s%s%s%s", strServerID.Get(), OTLog::PathSeparator(), + strUserID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); + } + + const char * szFolder1name = OTLog::PurseFolder(); // purse + const char * szFolder2name = strServerID.Get(); // purse/SERVER_ID + const char * szFolder3name = strUserID.Get(); // purse/SERVER_ID/USER_ID + const char * szFilename = strAssetTypeID.Get(); // purse/SERVER_ID/USER_ID/ASSET_TYPE_ID + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFolder1name, szFolder2name, szFolder3name, szFilename)) + { + OTLog::vError("OTPurse::LoadPurse: File does not exist: %s%s%s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), + szFolder3name, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFolder1name, szFolder2name, szFolder3name, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTPurse::LoadPurse: Error reading file: %s%s%s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), + szFolder3name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + OTString strRawFile(strFileContents.c_str()); + + return LoadContractFromString(strRawFile); +} + + + +bool OTPurse::SavePurse(const char * szServerID/*=NULL*/, const char * szUserID/*=NULL*/, const char * szAssetTypeID/*=NULL*/) +{ + if (!m_strFoldername.Exists()) + m_strFoldername.Set(OTLog::PurseFolder()); + // ----------------------------------------- + OTString strServerID(m_ServerID), strUserID(m_UserID), strAssetTypeID(m_AssetID); + + if (NULL != szServerID) + strServerID = szServerID; + if (NULL != szUserID) + strUserID = szUserID; + if (NULL != szAssetTypeID) + strAssetTypeID = szAssetTypeID; + // ------------------------------- + if (!m_strFilename.Exists()) + { + m_strFilename.Format("%s%s%s%s%s", strServerID.Get(), OTLog::PathSeparator(), + strUserID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); + } + + // -------------------------------------------------------------------- + + const char * szFolder1name = OTLog::PurseFolder(); // purse + const char * szFolder2name = strServerID.Get(); // purse/SERVER_ID + const char * szFolder3name = strUserID.Get(); // purse/SERVER_ID/USER_ID + const char * szFilename = strAssetTypeID.Get(); // purse/SERVER_ID/USER_ID/ASSET_TYPE_ID + + // -------------------------------------------------------------------- + + OTString strRawFile; + + // Save it internally to string, and then save that out to the file. + if (!SaveContract() || !SaveContract(strRawFile)) + { + OTLog::vError("Error saving Pursefile (to string):\n%s%s%s%s%s%s%s\n", szFolder1name, + OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), + szFolder3name, OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + bool bSaved = OTDB::StorePlainString(strRawFile.Get(), szFolder1name, szFolder2name, + szFolder3name, szFilename); // <=== SAVING TO DATA STORE. + if (!bSaved) + { + OTLog::vError("OTPurse::SavePurse: Error writing to file: %s%s%s%s%s%s%s\n", szFolder1name, + OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), + szFolder3name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + return true; +} + + + +int OTPurse::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + if (!strcmp("purse", xml->getNodeName())) + { + OTString strServerID, strUserID, strAssetID, strTotalValue; + + + m_strVersion = xml->getAttributeValue("version"); + strUserID = xml->getAttributeValue("userID"); + strServerID = xml->getAttributeValue("serverID"); + strAssetID = xml->getAttributeValue("assetTypeID"); + strTotalValue = xml->getAttributeValue("totalValue"); + + m_AssetID.SetString(strAssetID); + m_UserID.SetString(strUserID); + m_ServerID.SetString(strServerID); + + m_lTotalValue = 0; + + if (strTotalValue.Exists() && (atol(strTotalValue.Get()) > 0)) + m_lTotalValue = atol(strTotalValue.Get()); + + OTLog::vOutput(4, "Loaded purse...\n ServerID: %s\n UserID: %s\n Asset ID: %s\n----------\n", strServerID.Get(), + strUserID.Get(), strAssetID.Get()); + + return 1; + } + + else if (!strcmp("token", xml->getNodeName())) + { + OTASCIIArmor * pArmor = new OTASCIIArmor; + + OT_ASSERT(NULL != pArmor); + + if (!LoadEncodedTextField(xml, *pArmor) || !pArmor->Exists()) + { + OTLog::Error("Error in OTPurse::ProcessXMLNode: token field without value.\n"); + + delete pArmor; + pArmor = NULL; + + return (-1); // error condition + } + else + { + m_dequeTokens.push_front(pArmor); + } + + return 1; + } + + return 0; +} + + + +bool OTPurse::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + +void OTPurse::UpdateContents() // Before transmission or serialization, this is where the Purse saves its contents +{ + OTString SERVER_ID(m_ServerID), USER_ID(m_UserID), ASSET_TYPE_ID(m_AssetID); + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + m_lTotalValue, + USER_ID.Get(), + ASSET_TYPE_ID.Get(), SERVER_ID.Get()); + + for (int i = 0; i < Count(); i++) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_dequeTokens[i]->Get()); + } + + m_xmlUnsigned.Concatenate("\n"); + +} + +// Hypocritically (compared to Push) in the case of Pop(), we DO +// allocate a OTToken and return the pointer. The caller IS +// responsible to delete it when he's done with it. +// +// The apparent discrepancy is due to the fact that internally, +// we aren't storing the token object but an encrypted string of it. +// But this is hidden from the user of the purse, who perceives only +// that he is passing tokens in and getting them back out again. +OTToken * OTPurse::Pop(const OTPseudonym & theOwner) +{ + if (m_dequeTokens.empty()) + return NULL; + + + // Grab a copy of the pointer and remove it from the deque + OTASCIIArmor * pArmor = m_dequeTokens.front(); + m_dequeTokens.pop_front(); + +// OTLog::vError("$$$$$$$$$$$$$$ ARMORED TEXT in PURSE POP:\n--------->%s<-----------\n", pArmor->Get()); + + // Copy the token contents into an Envelope, and delete the pointer. + OTEnvelope theEnvelope(*pArmor); + delete pArmor; + pArmor = NULL; + + // Open the envelope into a string. + OTString strToken; + theEnvelope.Open(theOwner, strToken); + +// OTLog::vError("$$$$$$$$$$$$$$$ OPENED ENVELOPE TEXT in PURSE POP:\n--------->%s<-----------\n", strToken.Get()); + + // Create a new token with the same server and asset IDs as this purse. + OTToken * pToken = new OTToken(*this); + + OT_ASSERT(NULL != pToken); + + // Load the token from the string we got out of the envelope. + pToken->LoadContractFromString(strToken); + + if (pToken->GetAssetID() != m_AssetID || + pToken->GetServerID() != m_ServerID) + { + delete pToken; + pToken = NULL; + + OTLog::Error("ERROR: Token with wrong asset type in OTPurse::Pop\n"); + } + else + { + // We keep track of the purse's total value. + m_lTotalValue -= pToken->GetDenomination(); + } + + // CALLER is responsible to delete this token. + return pToken; +} + + +// Use a local variable for theToken, do NOT allocate it on the heap +// unless you are going to delete it yourself. +// Repeat: OTPurse is NOT responsible to delete it. We create our OWN internal +// variable here, new that, and add it to the stack. We do not add the one passed in. +bool OTPurse::Push(const OTPseudonym & theOwner, const OTToken & theToken) +{ + if (theToken.GetAssetID() == m_AssetID) + { + OTString strToken(theToken); + +// OTLog::vError("$$$$$$$$$$$$$$$ PUSHING token to Purse:\n---------->%s<-------------\n", strToken.Get()); + + OTEnvelope theEnvelope; + theEnvelope.Seal(theOwner, strToken); + + OTASCIIArmor * pArmor = new OTASCIIArmor(theEnvelope); +// OTLog::vError("$$$$$$$$$$$$$$$ PUSHING token to Purse in armored form:\n---------->%s<-------------\n", +// pArmor->Get()); + + m_dequeTokens.push_front(pArmor); + + // We keep track of the purse's total value. + m_lTotalValue += theToken.GetDenomination(); + + return true; + } + else { + OTString strPurseAssetType(m_AssetID), strTokenAssetType(theToken.GetAssetID()); + OTLog::vError("ERROR: Tried to push token with wrong asset type in OTPurse::Push\nPurse Asset Type:\n%s\n" + "Token Asset Type:\n%s\n", strPurseAssetType.Get(), strTokenAssetType.Get()); + + return false; + } +} + +int OTPurse::Count() const +{ + return m_dequeTokens.size(); +} + +bool OTPurse::IsEmpty() const +{ + return m_dequeTokens.empty(); +} + +void OTPurse::ReleaseTokens() +{ + OTASCIIArmor * pArmor = NULL; + + while (!m_dequeTokens.empty()) { + pArmor = m_dequeTokens.front(); + m_dequeTokens.pop_front(); + delete pArmor; + } + + m_lTotalValue = 0; +} + diff --git a/OTLib/OTPurse.h b/OTLib/OTPurse.h new file mode 100644 index 000000000..286f6e194 --- /dev/null +++ b/OTLib/OTPurse.h @@ -0,0 +1,216 @@ +/************************************************************* + * + * OTPurse.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTPURSE_H__ +#define __OTPURSE_H__ + +#include +#include +#include +#include + +#include "OTContract.h" +#include "OTToken.h" +#include "OTASCIIArmor.h" + +class OTPurse; + +// A token has no User ID, or Account ID, or even a traceable TokenID (the tokenID only becomes relevant +// after it is spent.) +// But a purse can be stuffed full of tokens, and can be saved by accountID as filename, and can have its +// contents encrypted to the public key of a specific user. +// +// I will add an optional UserID field, so it's obvious whose public key to use for opening the tokens. +// This may seem odd, but the field is entirely optional because it's not necessary for the actual operation. +// The recipient will already know to use his own private key to open the purse, and then he will immediately +// open it, redeem the coins, and store the replacements again encrypted to his own key, until he spends them +// again to someone else, when he will also know to encrypt the purse to THEIR public key, and so on. + +// The interface of this class is that of a simple stack. +// Imagine a stack of poker chips. + +typedef std::deque dequeOfTokens; +typedef std::map mapOfTokenPointers; + +class OTPurse : public OTContract +{ +protected: + virtual void UpdateContents(); // Before transmission or serialization, this is where the Purse saves its contents + + dequeOfTokens m_dequeTokens; + + OTIdentifier m_UserID; // Optional + OTIdentifier m_ServerID; // Mandatory + OTIdentifier m_AssetID; // Mandatory + + long m_lTotalValue; // Push increments this by denomination, and Pop decrements it by denomination. + +public: + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + + OTToken * Pop(const OTPseudonym & theOwner); // Caller is responsible to delete + // OTPurse::Push makes it's own copy of theToken and does NOT take ownership of the one passed in. + bool Push(const OTPseudonym & theOwner, const OTToken & theToken); + int Count() const; + bool IsEmpty() const; + + inline long GetTotalValue() const { return m_lTotalValue; } + + bool Merge(OTPseudonym & theNym, OTPurse & theNewPurse); + + OTPurse(const OTPurse & thePurse); // just for copy another purse's Server and Asset ID + OTPurse(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); // similar thing + OTPurse(const OTIdentifier & SERVER_ID); // Don't use this unless you really don't know the asset type + // (Like if you're about to read it out of a string.) + // Normally you really really want to set the asset type. + OTPurse(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, const OTIdentifier & USER_ID); // UserID optional + virtual ~OTPurse(); + + bool LoadPurse(const char * szServerID=NULL, const char * szUserID=NULL, const char * szAssetTypeID=NULL); + bool SavePurse(const char * szServerID=NULL, const char * szUserID=NULL, const char * szAssetTypeID=NULL); + + virtual bool LoadContract(); + + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + inline const OTIdentifier & GetAssetID() const { return m_AssetID; } + + void InitPurse(); + virtual void Release(); + void ReleaseTokens(); + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); +}; + + +#endif // __OTPURSE_H__ + diff --git a/OTLib/OTServerContract.cpp b/OTLib/OTServerContract.cpp new file mode 100644 index 000000000..f7074b338 --- /dev/null +++ b/OTLib/OTServerContract.cpp @@ -0,0 +1,333 @@ +/************************************************************************************ + * + * OTServerContract.cpp + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#include + + +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +#include "OTStorage.h" + +#include "OTServerContract.h" +#include "OTStringXML.h" +#include "OTLog.h" + +using namespace irr; +using namespace io; + + +OTServerContract::OTServerContract() : OTContract() +{ + m_nPort = 0; +} + +OTServerContract::OTServerContract(OTString & name, OTString & foldername, OTString & filename, OTString & strID) +: OTContract(name, foldername, filename, strID) +{ + m_nPort = 0; +} + + +OTServerContract::~OTServerContract() +{ + +} + +bool OTServerContract::GetConnectInfo(OTString & strHostname, int & nPort) +{ + if (m_strHostname.GetLength()) + { + strHostname = m_strHostname; + nPort = m_nPort; + return true; + } + return false; +} + + +bool OTServerContract::DisplayStatistics(OTString & strContents) const +{ + const OTString strID(m_ID); + + strContents.Concatenate( + " Notary Provider: %s\n" + " ServerID: %s\n" + "\n", + m_strName.Get(), + strID.Get()); + + return true; +} + + +bool OTServerContract::SaveContractWallet(OTString & strContents) const +{ + const OTString strID(m_ID); + + OTASCIIArmor ascName; + + if (m_strName.Exists()) // name is in the clear in memory, and base64 in storage. + { + ascName.SetString(m_strName, false); // linebreaks == false + } + + strContents.Concatenate("\n\n", + m_strName.Exists() ? ascName.Get() : "", + strID.Get()); + + return true; +} + + +bool OTServerContract::SaveContractWallet(std::ofstream & ofs) +{ + OTString strOutput; + + if (SaveContractWallet(strOutput)) + { + ofs << strOutput.Get(); + return true; + } + + return false; +} + + +// Serialization code for saving to the wallet. +/* +bool OTServerContract::SaveContractWallet(FILE * fl) +{ + OTString strID(m_ID); + + fprintf(fl, " " + "\n\n", m_strName.Get(), strID.Get(), m_strFilename.Get()); + + return true; +} +*/ + + +// This is the serialization code for READING FROM THE CONTRACT +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTServerContract::ProcessXMLNode(IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + + if ((nReturnVal = OTContract::ProcessXMLNode(xml))) + return nReturnVal; + + if (!strcmp("notaryProviderContract", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + OTLog::vOutput(1, "\n" + "===> Loading XML portion of server contract into memory structures...\n\n" + "Notary Server Name: %s\nContract version: %s\n----------\n", m_strName.Get(), m_strVersion.Get()); + nReturnVal = 1; + } + + else if (!strcmp("notaryServer", xml->getNodeName())) + { + m_strHostname = xml->getAttributeValue("hostname"); + m_nPort = atoi(xml->getAttributeValue("port")); + m_strURL = xml->getAttributeValue("URL"); + + OTLog::vOutput(1, "\n" + "Notary Server connection info:\n --- Hostname: %s\n --- Port: %d\n --- URL:%s\n\n", + m_strHostname.Get(), m_nPort, m_strURL.Get()); + nReturnVal = 1; + } + + return nReturnVal; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTServerContract.h b/OTLib/OTServerContract.h new file mode 100644 index 000000000..5ed1cea1d --- /dev/null +++ b/OTLib/OTServerContract.h @@ -0,0 +1,166 @@ +/************************************************************** + * + * OTServerContract.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTSERVERCONTRACT_H__ +#define __OTSERVERCONTRACT_H__ + +#include + +#include "OTContract.h" + +class OTString; + +class OTServerContract : public OTContract +{ +protected: + + OTString m_strHostname; + int m_nPort; + OTString m_strURL; + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); +public: + OTServerContract(); + OTServerContract(OTString & name, OTString & foldername, OTString & filename, OTString & strID); + + bool GetConnectInfo(OTString & strHostname, int & nPort); + + virtual ~OTServerContract(); + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(OTString & strContents) const; + virtual bool SaveContractWallet(std::ofstream & ofs); + + virtual bool DisplayStatistics(OTString & strContents) const; +}; + +#endif // __OTSERVERCONTRACT_H__ diff --git a/OTLib/OTSignature.cpp b/OTLib/OTSignature.cpp new file mode 100644 index 000000000..53cc69091 --- /dev/null +++ b/OTLib/OTSignature.cpp @@ -0,0 +1,313 @@ +/************************************************************************************ + * + * OTSignature.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include "OTStorage.h" + + +#include "OTSignature.h" + +OTSignature::OTSignature() : OTASCIIArmor() +{ + +} + +OTSignature::~OTSignature() +{ + +} + +OTSignature::OTSignature(const OTString & strValue) : OTASCIIArmor(strValue) +{ + +} + +OTSignature::OTSignature(const OTASCIIArmor & strValue) : OTASCIIArmor(strValue) +{ + +} + + +OTSignature::OTSignature(const char * szValue) : OTASCIIArmor(szValue) +{ + +} + + + + +/* + +EVP_Seal... and EVP_Open... provide public key encryption and decryption to implement digital ``envelopes''. + +The EVP_Sign... and EVP_Verify... functions implement digital signatures. + +Symmetric encryption is available with the EVP_Encrypt... functions. + +The EVP_Digest... functions provide message digests. + +The EVP_PKEY... functions provide a high level interface to asymmetric algorithms. + +Algorithms are loaded with OpenSSL_add_all_algorithms(3). + + + +int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, + const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey); +int EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt); +int EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen); + + + +OTASCIIArmor -> OTSignature + +OTPseudonym stores Identity including Cert info. + +Keys will be stored in OTASCIIArmor -> OTKey + + + + + +void do_cipher(char *pw, int operation,char * InBuf,int InLen,char * + OutBuf,int *OutBuflen) +{ + //operation: 0:DECRYPT + // 1:ENCRYPT + + + unsigned char iv[EVP_MAX_IV_LENGTH], key[EVP_MAX_KEY_LENGTH]; + const unsigned char salt[] = "thesaltgoeshere1982w"; + + // unsigned int ekeylen, net_ekeylen; + EVP_CIPHER_CTX ectx; + + EVP_BytesToKey(EVP_idea_cbc(), EVP_md5(), salt, pw, strlen(pw), 1, key, iv); + + EVP_CipherInit(&ectx, EVP_idea_cbc(), key, iv, operation); + + EVP_CipherUpdate(&ectx, OutBuf, OutBuflen, InBuf, InLen); + + EVP_CipherFinal(&ectx, OutBuf, OutBuflen); + +} +void main(void) +{ + char InBuf[512],OutBuf[512+8],OutBuf2[512+8]; + int i, OutLen; + + for ( i = 0 ; i < 8 ; i++ ) + InBuf[i] = 30+i; + + do_cipher("test",1,InBuf,8,OutBuf,&OutLen); //OutLen=8 + do_cipher("test",0,OutBuf,8,OutBuf2,&OutLen); //but now OutLen=0 +} + + +memcpy(iv, "12345678", 8); +EVP_BytesToKey(EVP_idea_cbc(), EVP_md5(), "salt", pw, strlen(pw), 1, key, iv); + +The salt value should be at least 8 bytes long - you're getting 3 +random bytes here. + +You don't need to specify an iv value as this function creates it. + +- Dale. + +*/ + + + + + + +/* Deprecated code: + SHA256_CTX context; + unsigned char md[SHA256_DIGEST_LENGTH]; + + SHA256_Init(&context); + SHA256_Update(&context, (unsigned char*)input, length); + SHA256_Final(md, &context); + + Replaced with: + */ +//TODO: stop hardcoding the digest algorithm +/* +bool OTSignature::CalculateDigest(OTData & dataInput) +{ + Release(); + + EVP_MD_CTX mdctx; + const EVP_MD *md; + const char * hashAlgorithm = "sha256"; + + unsigned int md_len, i; + unsigned char md_value[EVP_MAX_MD_SIZE]; + + if (s_bFirstTime) + { + s_bFirstTime = false; + OpenSSL_add_all_digests(); + } + + md = EVP_get_digestbyname(hashAlgorithm); + + if(!md) + { + OTLog::vError("Unknown message digest algorithm in OTSignature::CalculateDigest: %s\n", + hashAlgorithm); + return false; + } + + EVP_MD_CTX_init(&mdctx); + EVP_DigestInit_ex(&mdctx, md, NULL); + EVP_DigestUpdate(&mdctx, dataInput.GetPointer(), dataInput.GetSize()); + EVP_DigestFinal_ex(&mdctx, md_value, &md_len); + EVP_MD_CTX_cleanup(&mdctx); + + OTLog::Output(5, "Calculated digest: "); + + for (i = 0; i < md_len; i++) + OTLog::vOutput(5, "%02x", md_value[i]); + + OTLog::Output(5, "\n"); + + Assign(md_value, md_len); + + return true; +} + +*/ + + + + + + diff --git a/OTLib/OTSignature.h b/OTLib/OTSignature.h new file mode 100644 index 000000000..082ef8995 --- /dev/null +++ b/OTLib/OTSignature.h @@ -0,0 +1,149 @@ +/************************************************************************************ + * + * OTSignature.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTSIGNATURE_H__ +#define __OTSIGNATURE_H__ + +#include "OTASCIIArmor.h" + +class OTSignature : public OTASCIIArmor +{ + +public: + OTSignature(); + OTSignature(const char * szValue); + OTSignature(const OTString & strValue); + OTSignature(const OTASCIIArmor & strValue); + virtual ~OTSignature(); +}; + +#endif // __OTSIGNATURE_H__ + diff --git a/OTLib/OTSignedFile.cpp b/OTLib/OTSignedFile.cpp new file mode 100644 index 000000000..b5e16ac59 --- /dev/null +++ b/OTLib/OTSignedFile.cpp @@ -0,0 +1,372 @@ +/************************************************************************************ + * + * OTSignedFile.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + + +#include "OTSignedFile.h" +#include "OTPseudonym.h" +#include "OTLog.h" + + + +void OTSignedFile::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + m_strLocalDir.Get(), + m_strSignedFilename.Get()); + + if (m_strSignedFilePayload.Exists()) + { + OTASCIIArmor ascPayload(m_strSignedFilePayload); + m_xmlUnsigned.Concatenate("\n%s\n\n", ascPayload.Get()); + } + + m_xmlUnsigned.Concatenate("\n"); +} + + +int OTSignedFile::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("signedFile", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + + m_strPurportedLocalDir = xml->getAttributeValue("localDir"); + m_strPurportedFilename = xml->getAttributeValue("filename"); + + // --------------------- + + nReturnVal = 1; + } + + else if (!strcmp("filePayload", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strSignedFilePayload)) + { + OTLog::Error("Error in OTSignedFile::ProcessXMLNode: filePayload field without value.\n"); + return (-1); // error condition + } + + return 1; + } + + return nReturnVal; +} + + + + + +// We just loaded a certain subdirectory/filename +// This file also contains that information within it. +// This function allows me to compare the two and make sure +// the file that I loaded is what it claims to be. +// +// Make sure you also VerifySignature() whenever doing something +// like this :-) +// +// Assumes SetFilename() has been set, and that LoadFile() has just been called. +bool OTSignedFile::VerifyFile() +{ + if (m_strLocalDir.Compare(m_strPurportedLocalDir) && + m_strSignedFilename.Compare(m_strPurportedFilename)) + return true; + + return false; +} + + + + +OTSignedFile::OTSignedFile(const OTString & LOCAL_SUBDIR, const OTString & FILE_NAME) : OTContract() +{ + m_strContractType.Set("FILE"); + + SetFilename(LOCAL_SUBDIR, FILE_NAME); +} + +OTSignedFile::OTSignedFile(const char * LOCAL_SUBDIR, const OTString & FILE_NAME) : OTContract() +{ + m_strContractType.Set("FILE"); + + OTString strLocalSubdir(LOCAL_SUBDIR); + + SetFilename(strLocalSubdir, FILE_NAME); +} + +OTSignedFile::OTSignedFile(const char * LOCAL_SUBDIR, const char * FILE_NAME) : OTContract() +{ + m_strContractType.Set("FILE"); + + OTString strLocalSubdir(LOCAL_SUBDIR), strFile_Name(FILE_NAME); + + SetFilename(strLocalSubdir, strFile_Name); +} + + +// This is entirely separate from the OTContract saving methods. This is specifically +// for saving the internal file payload based on the internal file information, which +// this method assumes has already been set (using SetFilename()) +bool OTSignedFile::SaveFile() +{ + const OTString strTheFileName(m_strFilename); + const OTString strTheFolderName(m_strFoldername); + + // OTContract doesn't natively make it easy to save a contract to its own filename. + // Funny, I know, but OTContract is designed to save either to a specific filename, + // or to a string parameter, or to the internal rawfile member. It doesn't normally + // save to its own filename that was used to load it. But OTSignedFile is different... + + // This saves to a file, the name passed in as a char *. + return SaveContract(strTheFolderName.Get(), strTheFileName.Get()); +} + +// Assumes SetFilename() has already been set. +bool OTSignedFile::LoadFile() +{ +// OTLog::vOutput(0, "DEBUG LoadFile (Signed) folder: %s file: %s \n", m_strFoldername.Get(), m_strFilename.Get()); + + if (OTDB::Exists(m_strFoldername.Get(), m_strFilename.Get())) + return LoadContract(); + + return false; +} + +void OTSignedFile::SetFilename(const OTString & LOCAL_SUBDIR, const OTString & FILE_NAME) +{ + // OTSignedFile specific variables. + m_strLocalDir = LOCAL_SUBDIR; + m_strSignedFilename = FILE_NAME; + + // OTContract variables. + m_strFoldername = m_strLocalDir; + m_strFilename = m_strSignedFilename; + + /* + m_strFilename.Format("%s%s" // data_folder/ + "%s%s" // nyms/ + "%s", // 5bf9a88c.nym + OTLog::Path(), OTLog::PathSeparator(), + m_strLocalDir.Get(), OTLog::PathSeparator(), + m_strSignedFilename.Get()); + */ + // Software Path + Local Sub-directory + Filename + // + // Finished Product: "transaction/nyms/5bf9a88c.nym" +} + +OTSignedFile::OTSignedFile() : OTContract() +{ + m_strContractType.Set("FILE"); +} + + +OTSignedFile::~OTSignedFile() +{ + // No need to call release here -- it's called by the parent. +} + + +void OTSignedFile::Release() +{ + m_strSignedFilePayload.Release(); // This is the file contents we were wrapping. + // We can release this now. + +// m_strLocalDir.Release(); // We KEEP these, *not* release, because LoadContract() +// m_strSignedFilename.Release(); // calls Release(), and these are our core values. We don't + // want to lose them when the file is loaded. + + // Note: Additionally, neither does OTContract release m_strFilename here, for the SAME reason. + + m_strPurportedLocalDir.Release(); + m_strPurportedFilename.Release(); + + OTContract::Release(); + + m_strContractType.Set("FILE"); +} + + + +bool OTSignedFile::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTSignedFile.h b/OTLib/OTSignedFile.h new file mode 100644 index 000000000..0a6329bba --- /dev/null +++ b/OTLib/OTSignedFile.h @@ -0,0 +1,212 @@ +/************************************************************************************ + * + * OTSignedFile.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#ifndef __OT_SIGNED_FILE_H__ +#define __OT_SIGNED_FILE_H__ + +#include + + +#include "OTString.h" +#include "OTContract.h" + + +class OTSignedFile : public OTContract +{ +protected: + OTString m_strSignedFilePayload; // This class exists to wrap another and save it in signed form. + // The "payload" (the wrapped contents) are stored in this member. + + OTString m_strLocalDir; // The local subdirectory where the file is, such as "nyms" or "certs" + OTString m_strSignedFilename; // The file stores its own name. Later, when loading it back up, you can + // see that the name matches internally, and that the signature matches, + // therefore, no one has switched the file or meddled with its contents. + + OTString m_strPurportedLocalDir; // This is the subdirectory according to the file. + OTString m_strPurportedFilename; // This is the filename according to the file. + + // THOUGHT: What if someone switched the file for an older version of itself? Seems to me that he could + // make the server accept the file, in that case. Like maybe an account file with a higher balance? + // Similarly, what if someone erased a spent token file? Then the software would accept it as a new + // token once again. Also, the cash account would be deducted twice for the same token, which means it + // would no longer contain enough to cover all the tokens... + // Therefore it seems to me that, even with the files signed, there are still attacks possible when + // the attacker has write/erase access to the filesystem. I'd like to make it impervious even to that. + + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + +public: + + // These assume SetFilename() was already called, or at least one of the constructors that uses it. + bool LoadFile(); + bool SaveFile(); + + OTSignedFile(); + OTSignedFile(const OTString & LOCAL_SUBDIR, const OTString & FILE_NAME); + OTSignedFile(const char * LOCAL_SUBDIR, const OTString & FILE_NAME); + OTSignedFile(const char * LOCAL_SUBDIR, const char * FILE_NAME); + virtual ~OTSignedFile(); + + bool VerifyFile(); // Returns true or false, whether actual subdir/file matches purported subdir/file. + // (You should still verify the signature on it as well, if you are doing this.) + + virtual void Release(); + virtual void UpdateContents(); + + void SetFilename(const OTString & LOCAL_SUBDIR, const OTString & FILE_NAME); + + inline OTString & GetFilePayload() { return m_strSignedFilePayload; } + inline void SetFilePayload(const OTString &strArg) { m_strSignedFilePayload = strArg; } + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); +}; + +#endif // __OT_SIGNED_FILE_H__ + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTStorage.cpp b/OTLib/OTStorage.cpp new file mode 100644 index 000000000..e3f7a2217 --- /dev/null +++ b/OTLib/OTStorage.cpp @@ -0,0 +1,3076 @@ +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include + +#include +#include + +// credit:stlplus library. +#include "containers/simple_ptr.hpp" + + +#include "OTLog.h" +#include "OTStorage.h" + + + +/* + + // We want to store EXISTING OT OBJECTS (Usually signed contracts) + // These have an EXISTING OT path, such as "inbox/acct_id". + // These files are always in the form of a STRING. + // The easiest way for me to store/retrieve those strings is: + + + using namespace OTDB; + + bool bSuccessStore = StoreString(strContents, strFolder, strFilename); + bool bSuccessQuery = QueryString(strRetrieved, strFolder, strFilename); + + + // ------- + // Internal to the above functions, the default Packing/Buffer is + // used, and the default Storage type is used. But what if I want to + // CHOOSE the storage and packing? Perhaps the default (filesystem) is not + // good enough for me, and I prefer a key/value DB. + + // Storage. + // Before creating my OWN storage, let's try using the default storage object + // itself, instead of asking the API to use it for me: + + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL!=pStorage); + + bool bSuccessStore = pStorage->StoreString(strContents, strFolder, strFilename); + bool bSuccessQuery = pStorage->QueryString(strRetrieved, strFolder, strFilename); + + + + // ------- + // So if I wanted to create my OWN instance of storage, instead of using the + // default one, it would be similar: + + OTDB::Storage * pStorage = OTDB::CreateStorageContext(STORE_FILESYSTEM, PACK_MESSAGE_PACK); + OT_ASSERT(NULL!=pStorage); + + bool bSuccessInit = pStorage->Init("/path/to/data_folder", "wallet.xml"); + + if (bSuccessInit) + { + bool bSuccessStore = pStorage->StoreString(strContents, strFolder, strFilename); + bool bSuccessQuery = pStorage->QueryString(strRetrieved, strFolder, strFilename); + } + + + + // Creating like above is also how the default storage context gets instantiated + // (internally) when you first start storing and querying. + + // But Storage needs to be SET UP -- whether a database connection initiated, + // or files loaded, or sub-directories created, or a Tor connection or whatever. + // Therefore, there is an Init() call, which may have different parameters for + // each storage type. That way, all subclasses might use it differently, and + // the parameters are easily thrown into a config file later. + + // ------ + // What if it was a CouchDB database, instead of the filesystem? + // And using Google's Protocol Buffers for packing, isntead of MsgPack? + // (Note: OT doesn't actually support CouchDB yet.) But it would look like: + + Storage * pStorage = + CreateStorageContext(STORE_COUCHDB, PACK_PROTOCOL_BUFFERS); + OT_ASSERT(NULL!=pStorage); + + // This time, Init receives database connect info instead of filesystem info... + bool bSuccessInit = pStorage->Init("IP ADDRESS", "PORT", "USERNAME", "PASSWORD", "DATABASE NAME"); + + etc. + + + + // -------------------- + // So what if I want to use the default, but I want that DEFAULT to be CouchDB and Google? + // Just do this (near the beginning of the execution of the application): + + bool bInit = InitDefaultStorage(STORE_COUCHDB, PACK_PROTOCOL_BUFFERS, + "IP ADDRESS", "PORT", "USERNAME", "PASSWORD", "DB NAME"); + + if (true == bInit) + { + // Then do this as normal: + + Storage * pStorage = GetDefaultStorage(); + OT_ASSERT(NULL!=pStorage); + + bool bSuccessStore = pStorage->StoreString(strContents, strFolder, strFilename); + bool bSuccessQuery = pStorage->QueryString(strRetrieved, strFolder, strFilename); + } + + // ----------------------------------------------------------- + + + // What if you want to store an OBJECT in that location instead of a string? + // The object must be instantiated by the Storage Context... + + BitcoinAcct * pAcct = pStorage->CreateObject(STORED_OBJ_BITCOIN_ACCT); + OT_ASSERT(NULL != pAcct); + + pAcct->acct_id = "jkhsdf987345kjhf8lkjhwef987345"; + pAcct->bitcoin_acct_name = "Read-Only Label (Bitcoin Internal acct)"; + pAcct->gui_label = "Editable Label (Moneychanger)"; + + + + // ----------------------------------------------------------- + // Perhaps you want to load up a Wallet and add this BitcoinAcct to it... + + WalletData * pWalletData = + pStorage->QueryObject(STORED_OBJ_WALLET_DATA, "moneychanger", "wallet.pak"); + + if (NULL != pWalletData) // It loaded. + { + if (pWalletData->AddBitcoinAcct(*pAcct)) + bool bSuccessStore = pStorage->StoreObject(*pWalletData, "moneychanger", strFilename); + else + delete pAcct; + + delete pWalletData; + } + + // Voila! The above code creates a BitcoinAcct (data object, not the real thing) + // and then loads up the Moneychanger WalletData object, adds the BitcoinAcct to + // it, and then stores it again. + + // SIMPLE, RIGHT? + + // Through this mechanism: + // + // 1) You can store your objects using the same storage context as the rest of OT. + // 2) You can dictate a different storage context, just for yourself, or for the entire OT library as well. + // 3) You can subclass OTDB::Storage and thus invent new storage methods. + // 4) You can easily store and load objects and strings. + // 5) You can swap out the packing code (msgpack, protobuf, json, etc) with no change to any other code. + // 6) It's consistent and easy-to-use for all object types. + // 7) For generic objects, there is a Blob type, a String type, and a StringMap type. + // + // -------------------------------------------------------------- + */ + +OTDB::Storage * OTDB::details::s_pStorage= NULL; + +OTDB::mapOfFunctions * OTDB::details::pFunctionMap=NULL; // This is a pointer so I can control what order it is created in, on startup. + + +const char * OTDB::StoredObjectTypeStrings[] = +{ + "OTDBString", // Just a string. + "Blob", // Binary data of arbitrary size. + "StringMap", // A StringMap is a list of Key/Value pairs, useful for storing nearly anything. + "WalletData", // The GUI wallet's stored data + "BitcoinAcct", // The GUI wallet's stored data about a Bitcoin acct + "BitcoinServer", // The GUI wallet's stored data about a Bitcoin RPC port. + "RippleServer", // The GUI wallet's stored data about a Ripple server. + "LoomServer", // The GUI wallet's stored data about a Loom server. + "ServerInfo", // A Nym has a list of these. + "ContactNym", // This is a Nym record inside a contact of your address book. + "ContactAcct", // This is an account record inside a contact of your address book. + "Contact", // Your address book has a list of these. + "AddressBook", // Your address book. + "MarketData", // The description data for any given Market ID. + "MarketList", // A list of MarketDatas. + "BidData", // Offer details (doesn't contain private details) + "AskData", // Offer details (doesn't contain private details) + "OfferListMarket", // A list of offer details, for a specific market. + "TradeDataMarket", // Trade details (doesn't contain private data) + "TradeListMarket", // A list of trade details, for a specific market. + "OfferDataNym", // Private offer details for a particular Nym and Offer. + "OfferListNym", // A list of private offer details for a particular Nym. + "TradeDataNym", // Private trade details for a particular Nym and Trade. + "TradeListNym", // A list of private trade details for a particular Nym and Offer. + "StoredObjError" // (Should never be.) +}; + + + +namespace OTDB +{ + + + // ******************************************************************** + + // NAMESPACE CONSTRUCTOR / DESTRUCTOR + + // s_pStorage is "private" to the namespace. + // Use GetDefaultStorage() to access this variable. + // Use InitDefaultStorage() to set up this variable. + // + //Storage * ::details::s_pStorage = NULL; + // These are actually defined in the namespace (.h file). + + //mapOfFunctions * details::pFunctionMap; + + InitOTDBDetails theOTDBConstructor; // Constructor for this instance (define all namespace variables above this line.) + + InitOTDBDetails::InitOTDBDetails() // Constructor for namespace + { + OT_ASSERT (NULL == details::pFunctionMap); + + details::pFunctionMap = new mapOfFunctions; + + OT_ASSERT (NULL != details::pFunctionMap); + + mapOfFunctions & theMap = *(details::pFunctionMap); + + // Set up theMap... + +#if defined (OTDB_MESSAGE_PACK) + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_STRING)] = &StringMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_BLOB)] = &BlobMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_STRING_MAP)] = &StringMapMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_WALLET_DATA)] = &WalletDataMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_BITCOIN_ACCT)] = &BitcoinAcctMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_BITCOIN_SERVER)]= &BitcoinServerMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_RIPPLE_SERVER)] = &RippleServerMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_LOOM_SERVER)] = &LoomServerMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_SERVER_INFO)] = &ServerInfoMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_CONTACT_ACCT)] = &ContactAcctMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_CONTACT_NYM)] = &ContactNymMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_CONTACT)] = &ContactMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_ADDRESS_BOOK)] = &AddressBookMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_MARKET_DATA)] = &MarketDataMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_MARKET_LIST)] = &MarketListMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_BID_DATA)] = &BidDataMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_ASK_DATA)] = &AskDataMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_OFFER_LIST_MARKET)] = &OfferListMarketMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_TRADE_DATA_MARKET)] = &TradeDataMarketMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_TRADE_LIST_MARKET)] = &TradeListMarketMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_OFFER_DATA_NYM)] = &OfferDataNymMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_OFFER_LIST_NYM)] = &OfferListNymMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_TRADE_DATA_NYM)] = &TradeDataNymMsgpack::Instantiate; + theMap[std::make_pair(PACK_MESSAGE_PACK, STORED_OBJ_TRADE_LIST_NYM)] = &TradeListNymMsgpack::Instantiate; +#endif + +#if defined (OTDB_PROTOCOL_BUFFERS) + GOOGLE_PROTOBUF_VERIFY_VERSION; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_STRING)] = &StringPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_BLOB)] = &BlobPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_STRING_MAP)] = &StringMapPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_WALLET_DATA)] = &WalletDataPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_BITCOIN_ACCT)] = &BitcoinAcctPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_BITCOIN_SERVER)]= &BitcoinServerPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_RIPPLE_SERVER)] = &RippleServerPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_LOOM_SERVER)] = &LoomServerPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_SERVER_INFO)] = &ServerInfoPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_CONTACT_ACCT)] = &ContactAcctPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_CONTACT_NYM)] = &ContactNymPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_CONTACT)] = &ContactPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_ADDRESS_BOOK)] = &AddressBookPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_MARKET_DATA)] = &MarketDataPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_MARKET_LIST)] = &MarketListPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_BID_DATA)] = &BidDataPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_ASK_DATA)] = &AskDataPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_OFFER_LIST_MARKET)] = &OfferListMarketPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_TRADE_DATA_MARKET)] = &TradeDataMarketPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_TRADE_LIST_MARKET)] = &TradeListMarketPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_OFFER_DATA_NYM)] = &OfferDataNymPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_OFFER_LIST_NYM)] = &OfferListNymPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_TRADE_DATA_NYM)] = &TradeDataNymPB::Instantiate; + theMap[std::make_pair(PACK_PROTOCOL_BUFFERS, STORED_OBJ_TRADE_LIST_NYM)] = &TradeListNymPB::Instantiate; +#endif + + } + + InitOTDBDetails::~InitOTDBDetails() // Destructor for namespace + { + OT_ASSERT(NULL != details::pFunctionMap); + + delete details::pFunctionMap; + + details::pFunctionMap = NULL; + + // ------------------------------------------ + +#if defined (OTDB_PROTOCOL_BUFFERS) + google::protobuf::ShutdownProtobufLibrary(); +#endif + } + + // ******************************************************************** + + // INTERFACE for the Namespace (for coders to use.) + + + Storage * GetDefaultStorage() { return OTDB::details::s_pStorage; } + + + // You might normally create your own Storage object, choosing the storage type + // and the packing type, and then call Init() on that object in order to get it + // up and running. This function is the equivalent of doing all that, but with the + // DEFAULT storage object (which OT uses when none is specified.) + // + bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/, + std::string fourStr/*=""*/, std::string fiveStr/*=""*/, std::string sixStr/*=""*/) + { + // Allows you to call multiple times if you want to change the default storage. + // + if (NULL != details::s_pStorage) + { + delete details::s_pStorage; + details::s_pStorage = NULL; + } + + details::s_pStorage = Storage::Create(eStoreType, ePackType); + + if (NULL == details::s_pStorage) + return false; + + return details::s_pStorage->Init(oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr); + } + + + // %newobject Factory::createObj(); + Storage * CreateStorageContext(StorageType eStoreType, PackType ePackType/*=OTDB_DEFAULT_PACKER*/) + { + Storage * pStorage = Storage::Create(eStoreType, ePackType); + + return pStorage; // caller responsible to delete + } + + + + // %newobject Factory::createObj(); + Storable * CreateObject(StoredObjectType eType) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + return NULL; + } + + return pStorage->CreateObject(eType); + } + + + // bool bSuccess = Store(strInbox, "inbox", "lkjsdf908w345ljkvd"); + // bool bSuccess = Store(strMint, "mints", SERVER_ID, ASSET_ID); + // bool bSuccess = Store(strPurse, "purse", SERVER_ID, USER_ID, ASSET_ID); + + // BELOW FUNCTIONS use the DEFAULT Storage context. + + // ----------------------------------------- + // See if the file is there. + bool Exists(std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + return false; + } + + return pStorage->Exists(strFolder, oneStr, twoStr, threeStr); + } + + // ----------------------------------------- + // Store/Retrieve a string. + + bool StoreString(std::string strContents, std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + return false; + } + + return pStorage->StoreString(strContents, strFolder, oneStr, twoStr, threeStr); + } + + std::string QueryString(std::string strFolder, std::string oneStr/*=""*/, std::string twoStr/*=""*/, + std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + return std::string(""); + } + + return pStorage->QueryString(strFolder, oneStr, twoStr, threeStr); + } + + // ----------------------------------------- + // Store/Retrieve a plain string. + + bool StorePlainString(std::string strContents, std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + OT_ASSERT((strFolder.length() > 3) || (0 == strFolder.compare(0, 1, "."))); + + OT_ASSERT((oneStr.length() < 1) || (oneStr.length() > 3)); + + if (NULL == pStorage) + { + return false; + } + + return pStorage->StorePlainString(strContents, strFolder, oneStr, twoStr, threeStr); + } + + std::string QueryPlainString(std::string strFolder, std::string oneStr/*=""*/, std::string twoStr/*=""*/, + std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + + OT_ASSERT((strFolder.length() > 3) || (0 == strFolder.compare(0, 1, "."))); + + OT_ASSERT((oneStr.length() < 1) || (oneStr.length() > 3)); + + + + if (NULL == pStorage) + { + return std::string(""); + } + + return pStorage->QueryPlainString(strFolder, oneStr, twoStr, threeStr); + } + + // ----------------------------------------- + // Store/Retrieve an object. (Storable.) + + bool StoreObject(Storable & theContents, std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + OTLog::Error("No Default Storage object allocated in OTDB::StoreObject.\n"); + return false; + } + + return pStorage->StoreObject(theContents, strFolder, oneStr, twoStr, threeStr); + } + + // Use %newobject Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr/*=""*/, std::string twoStr/*=""*/, + std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + return NULL; + } + + return pStorage->QueryObject(theObjectType, strFolder, oneStr, twoStr, threeStr); + } + + // ----------------------------------------- + // Erase a value by location. + + bool EraseValueByKey(std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + Storage * pStorage = details::s_pStorage; + + if (NULL == pStorage) + { + OTLog::Error("No Default Storage object allocated in OTDB::EraseValueByKey.\n"); + return false; + } + + return pStorage->EraseValueByKey(strFolder, oneStr, twoStr, threeStr); + } + + // ******************************************************************** + + + + + + + + // ******************************************************************** + + // Used internally. Creates the right subclass for any stored object type, + // based on which packer is needed. + + Storable * Storable::Create(StoredObjectType eType, PackType thePackType) + { + if (NULL == details::pFunctionMap) + return NULL; + + Storable * pStorable = NULL; + + // The Pack type, plus the Stored Object type, is the Key to the map of function pointers. + InstantiateFuncKey theKey(thePackType, eType); + + // If the key works, we get the function pointer to the static Create() method for + // the appropriate object type. + + mapOfFunctions::iterator ii = details::pFunctionMap->find(theKey); + + if (details::pFunctionMap->end() == ii) + return NULL; + + InstantiateFunc * pFunc = (*ii).second; + + if (NULL != pFunc) + { + pStorable = (*pFunc)(); // Now we instantiate the object... + } + + return pStorable; // May return NULL... + } + + + + + // ******************************************************************** + + // static. OTPacker Factory. + // + OTPacker * OTPacker::Create(PackType ePackType) + { + OTPacker * pPacker = NULL; + + switch (ePackType) + { +#if defined (OTDB_MESSAGE_PACK) + case PACK_MESSAGE_PACK: + pPacker = new PackerMsgpack; OT_ASSERT(NULL != pPacker); break; +#endif +#if defined (OTDB_PROTOCOL_BUFFERS) + case PACK_PROTOCOL_BUFFERS: + pPacker = new PackerPB; OT_ASSERT(NULL != pPacker); break; +#endif + case PACK_TYPE_ERROR: + default: + break; + } + + return pPacker; // May return NULL... + } + + + PackType OTPacker::GetType() const + { + if (0) + {} +#if defined (OTDB_MESSAGE_PACK) + else if (typeid(*this) == typeid(PackerMsgpack)) + return PACK_MESSAGE_PACK; +#endif +#if defined (OTDB_PROTOCOL_BUFFERS) + else if (typeid(*this) == typeid(PackerPB)) + return PACK_PROTOCOL_BUFFERS; +#endif + else + return PACK_TYPE_ERROR; + } + + + // Basically, ALL of the Storables have to implement the IStorable interface + // (or one of its subclasses). They can override hookBeforePack(), and they + // can override onPack(). Those two methods will be where all the action is, + // for each subclass of OTPacker. + // + PackedBuffer * OTPacker::Pack(Storable& inObj) + { + IStorable * pStorable = dynamic_cast (&inObj); + + if (NULL == pStorable) // ALL Storables should implement SOME subinterface of IStorable + { + OTLog::Error("Error: IStorable dynamic_cast failed in OTPacker::Pack\n"); + return NULL; + } + + // -------------------------------- + + // This is polymorphic, so we get the right kind of buffer for the packer. + // + PackedBuffer * pBuffer = CreateBuffer(); + OT_ASSERT(NULL != pBuffer); + + // Must delete pBuffer, or return it, below this point. + // ------------------------------------- + + pStorable->hookBeforePack(); // Give the subclass a chance to prepare its data for packing... + + // This line (commented out) shows how the line below it would have looked if I had ended + // up using polymorphic templates: + // if (false == makeTStorable(*pStorable).pack(*pBuffer)) + + if (false == pStorable->onPack(*pBuffer, inObj)) + { + delete pBuffer; + return NULL; + } + + return pBuffer; + } + + // Similar to Pack, above. + // Unpack takes the contents of the PackedBuffer and unpacks them into + // the Storable. ASSUMES that the PackedBuffer is the right type for + // the Packer, usually because the Packer is the one who instantiated + // it. Also assumes that the Storable's actual object type is the + // appropriate one for the data that is sitting in that buffer. + // + bool OTPacker::Unpack(PackedBuffer& inBuf, Storable& outObj) + { + IStorable * pStorable = dynamic_cast (&outObj); + + if (NULL == pStorable) + return false; + + // -------------------------------- + // outObj is the OUTPUT OBJECT. + // If we're unable to unpack the contents of inBuf + // into outObj, return false. + // + if (false == pStorable->onUnpack(inBuf, outObj)) + { + return false; + } + + // --------------------------- + + pStorable->hookAfterUnpack(); // Give the subclass a chance to settle its data after unpacking... + + return true; + } + + + PackedBuffer * OTPacker::Pack(std::string& inObj) + { + // This is polymorphic, so we get the right kind of buffer for the packer. + // + PackedBuffer * pBuffer = CreateBuffer(); + OT_ASSERT(NULL != pBuffer); + + // Must delete pBuffer, or return it, below this point. + // ------------------------------------- + + if (false == pBuffer->PackString(inObj)) + { + delete pBuffer; + return NULL; + } + + return pBuffer; + } + + bool OTPacker::Unpack(PackedBuffer& inBuf, std::string& outObj) + { + // -------------------------------- + // outObj is the OUTPUT OBJECT. + // If we're unable to unpack the contents of inBuf + // into outObj, return false. + // + if (false == inBuf.UnpackString(outObj)) + return false; + + return true; + } + + // ******************************************************************** + + + + + + + // --------------------------------------------- + + // NOTICE!!! that when you add something to the list, it is CLONED. (Caller is still responsible to delete the argument.) + // + +#define IMPLEMENT_GET_ADD_REMOVE(scope, name) \ + \ + typedef stlplus::simple_ptr_clone PointerTo##name; \ + \ + typedef std::deque< PointerTo##name > listOf##name##s; \ + \ + size_t scope Get##name##Count() { return list_##name##s.size(); } \ + \ + name * scope Get##name(size_t nIndex) \ + { if ((nIndex >= 0) && (nIndex < list_##name##s.size())) \ + { PointerTo##name theP = list_##name##s.at(nIndex); return theP.pointer(); } return NULL; } \ + \ + bool scope Remove##name(size_t nIndex##name) \ + { if ((nIndex##name >= 0) && (nIndex##name < list_##name##s.size())) \ + { list_##name##s.erase(list_##name##s.begin() + nIndex##name); return true; } else return false; } \ + \ + bool scope Add##name(name & disownObject) \ + { PointerTo##name theP(disownObject.clone()); list_##name##s.push_back(theP); return true; } + + + + + IMPLEMENT_GET_ADD_REMOVE(WalletData::, BitcoinServer) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(WalletData::, BitcoinAcct) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(WalletData::, RippleServer) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(WalletData::, LoomServer) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(ContactNym::, ServerInfo) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(Contact::, ContactNym) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(Contact::, ContactAcct) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(AddressBook::, Contact) // No semicolon on this one! + + + IMPLEMENT_GET_ADD_REMOVE(MarketList::, MarketData) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(OfferListMarket::, BidData) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(OfferListMarket::, AskData) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(TradeListMarket::, TradeDataMarket) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(OfferListNym::, OfferDataNym) // No semicolon on this one! + + IMPLEMENT_GET_ADD_REMOVE(TradeListNym::, TradeDataNym) // No semicolon on this one! + + + + // Make sure SWIG "loses ownership" of any objects pushed onto these lists. + // (So I am safe to destruct them indiscriminately.) + // + // UPDATE: Nevertheless, no need to erase the lists (below) since they now + // store smart pointers, instead of regular pointers, so they are self-cleaning. + // + + // ---------------------------------------------- + + + + ContactNym::~ContactNym() + { + // while (GetServerInfoCount() > 0) + // RemoveServerInfo(0); + } + + // ---------------------------------------------- + + Contact::~Contact() + { + // while (GetContactNymCount() > 0) + // RemoveContactNym(0); + // + // while (GetContactAcctCount() > 0) + // RemoveContactAcct(0); + } + + // ---------------------------------------------- + + + + AddressBook::~AddressBook() + { + // while (GetContactCount() > 0) + // RemoveContact(0); + } + + // ---------------------------------------------- + + + + + + + + + + // ******************************************************************** + // + // Interface: IStorableMsgpack + // + // + // Msgpack packer. +#if defined (OTDB_MESSAGE_PACK) + + bool IStorableMsgpack::onPack(PackedBuffer& theBuffer, Storable& inObj) // buffer is OUTPUT, Storable is INPUT. + { + // check here to make sure theBuffer is the right TYPE. + BufferMsgpack * pBuffer = dynamic_cast (&theBuffer); + + if (NULL == pBuffer) // Buffer is wrong type!! + { + OTLog::Error("Buffer is wrong type in IStorableMsgpack::onPack()\n"); + return false; + } + /* + TEST(pack, BitcoinAcct) + { + msgpack::sbuffer sbuf; + myclass m(1, "msgpack"); + msgpack::pack(sbuf, m); + } + */ + bool bSuccess = PerformPack(*pBuffer); + + // msgpack::pack(pBuffer->m_buffer, *this); + // msgpack::pack(pBuffer->m_buffer, inObj); + + return bSuccess; + } + + bool IStorableMsgpack::onUnpack(PackedBuffer& theBuffer, Storable& outObj) // buffer is INPUT, Storable is OUTPUT. + { + // check here to make sure theBuffer is the right TYPE. + BufferMsgpack * pBuffer = dynamic_cast (&theBuffer); + + if (NULL == pBuffer) // Buffer is wrong type!! + { + OTLog::Error("Buffer is wrong type in IStorableMsgpack::onUnpack()\n"); + return false; + } + + // -------------------- + /* + TEST(unpack, BitcoinAcct) + { + msgpack::sbuffer sbuf; + myclass m1(1, "phraser"); + msgpack::pack(sbuf, m1); + + msgpack::zone z; + msgpack::object obj; + + msgpack::unpack_return ret = + msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); + + EXPECT_EQ(ret, msgpack::UNPACK_SUCCESS); + + myclass m2 = obj.as(); + EXPECT_EQ(m1.num, m2.num); + EXPECT_EQ(m1.str, m2.str); + } + */ + + bool bSuccess = PerformUnpack(*pBuffer); + + /* + msgpack::zone z; + msgpack::object obj; + + msgpack::unpack_return ret = msgpack::unpack(pBuffer->m_buffer.data(), + pBuffer->m_buffer.size(), NULL, &z, &obj); + + if (msgpack::UNPACK_SUCCESS == ret) + { + obj.convert(this); + // obj.convert(&outObj); + + return true; + } + */ + + return bSuccess; + } + + // ---------------------------------------------------------- + + const unsigned char * BufferMsgpack::GetData() + { + return reinterpret_cast(m_buffer.data()); + } + + size_t BufferMsgpack::GetSize() + { + return m_buffer.size(); + } + + void BufferMsgpack::SetData(const unsigned char * pData, size_t theSize) + { + unsigned int nSize = theSize; + m_buffer.write(reinterpret_cast(pData), nSize); + } + + + bool BufferMsgpack::PackString(std::string& theString) + { + StringMsgpack theWrapper(theString); + + msgpack::pack(m_buffer, theWrapper); + + return true; + } + + bool BufferMsgpack::UnpackString(std::string& theString) + { + msgpack::zone z; + msgpack::object obj; + + msgpack::unpack_return ret = + msgpack::unpack(m_buffer.data(), m_buffer.size(), NULL, &z, &obj); + + if (msgpack::UNPACK_SUCCESS == ret) + { + StringMsgpack theWrapper; + + obj.convert(&theWrapper); + + theString = theWrapper.m_string; + + return true; + } + + return false; + } + + bool BufferMsgpack::ReadFromIStream(std::istream &inStream, long lFilesize) + { + char * buf = new char[lFilesize]; + OT_ASSERT(NULL != buf); + + inStream.read(buf, lFilesize); + + if (inStream.good()) + { + m_buffer.clear(); + m_buffer.write(buf, lFilesize); + + delete [] buf; + return true; + } + + delete [] buf; + + return false; + } + + bool BufferMsgpack::WriteToOStream(std::ostream &outStream) + { + // std::string strTemp; + // strTemp.insert(0, m_buffer.data(), m_buffer.size()); + // + // outStream << strTemp << std::flush; + + if (m_buffer.size() < 1) + { + OTLog::Error("Buffer had zero (or less) length in BufferPB::WriteToOStream\n"); + return false; + } + + outStream.write(m_buffer.data(), m_buffer.size()); + + bool bSuccess = outStream.good() ? true : false; + + return bSuccess; + } + + // **************************************************************************** + + +// You might ask why I do this with the macros instead of using templates. +// Usually different reasons everytime.... Depends on the situation. +// One good reason is because template errors are unreadable :P +// The real solution isn't to use C++ templates, but to switch +// to the D language, and use D templates and mixins }:-) +// +#define OT_IMPLEMENT_MSGPACK_LIST_PACK(element_type, member_name) \ +\ + member_name.clear(); \ +\ + for (std::deque::iterator ii = list_##element_type##s.begin(); ii != list_##element_type##s.end(); ++ii) \ + { \ + PointerTo##element_type thePtr = (*ii); \ +\ + element_type##Msgpack * pObject = dynamic_cast(thePtr.pointer()); \ +\ + OT_ASSERT (NULL != pObject); \ +\ + member_name.push_back(*pObject); \ + } + // The deque acquires its own copy in the push_back (above), due to the copy constructor. + // --------------------------------------------------------------------------------------------------- +#define OT_IMPLEMENT_MSGPACK_LIST_UNPACK(element_type, member_name) \ + while (Get##element_type##Count() > 0) \ + Remove##element_type(0); \ +\ + for (std::deque::iterator ii = member_name.begin(); ii != member_name.end(); ++ii) \ + { \ + element_type##Msgpack * pNewWrapper = dynamic_cast(ii->clone()); \ + OT_ASSERT(NULL != pNewWrapper); \ +\ + PointerTo##element_type thePtr(dynamic_cast(pNewWrapper)); \ +\ + list_##element_type##s.push_back(thePtr); \ + } + // **************************************************************************** + + void ContactNymMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(ServerInfo, deque_ServerInfos) + } + + // ---------------------------------------------------- + + void ContactNymMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(ServerInfo, deque_ServerInfos) + } + // ---------------------------------------------- + + void ContactMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(ContactNym, deque_Nyms) + OT_IMPLEMENT_MSGPACK_LIST_PACK(ContactAcct, deque_Accounts) + } + + + void ContactMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(ContactNym, deque_Nyms) + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(ContactAcct, deque_Accounts) + } + + // ---------------------------------------------- + + + void AddressBookMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(Contact, deque_Contacts) + } + + void AddressBookMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(Contact, deque_Contacts) + } + + + void WalletDataMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(BitcoinServer, deque_BitcoinServers) + OT_IMPLEMENT_MSGPACK_LIST_PACK(BitcoinAcct, deque_BitcoinAccts) + OT_IMPLEMENT_MSGPACK_LIST_PACK(RippleServer, deque_RippleServers) + OT_IMPLEMENT_MSGPACK_LIST_PACK(LoomServer, deque_LoomServers) + } + + + void WalletDataMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(BitcoinServer, deque_BitcoinServers) + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(BitcoinAcct, deque_BitcoinAccts) + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(RippleServer, deque_RippleServers) + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(LoomServer, deque_LoomServers) + } + + + void MarketListMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(MarketData, deque_Markets) + } + + void MarketListMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(MarketData, deque_Markets) + } + + void OfferListMarketMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(BidData, deque_Bids) + OT_IMPLEMENT_MSGPACK_LIST_PACK(AskData, deque_Asks) + } + + void OfferListMarketMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(BidData, deque_Bids) + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(AskData, deque_Asks) + } + + void TradeListMarketMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(TradeDataMarket, deque_Trades) + } + + void TradeListMarketMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(TradeDataMarket, deque_Trades) + } + + void OfferListNymMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(OfferDataNym, deque_Offers) + } + + void OfferListNymMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(OfferDataNym, deque_Offers) + } + + void TradeListNymMsgpack::hookBeforePack() + { + OT_IMPLEMENT_MSGPACK_LIST_PACK(TradeDataNym, deque_Trades) + } + + void TradeListNymMsgpack::hookAfterUnpack() + { + OT_IMPLEMENT_MSGPACK_LIST_UNPACK(TradeDataNym, deque_Trades) + } + + + +#endif // defined (OTDB_MESSAGE_PACK) + // ******************************************************************** + + + + + + + + + + + + + // --------------- + + /* Protocol Buffers notes. + + // optional string bitcoin_id = 1; + inline bool has_bitcoin_id() const; + inline void clear_bitcoin_id(); + static const int kBitcoinIdFieldNumber = 1; + inline const ::std::string& bitcoin_id() const; + inline void set_bitcoin_id(const ::std::string& value); + inline void set_bitcoin_id(const char* value); + inline void set_bitcoin_id(const char* value, size_t size); + inline ::std::string* mutable_bitcoin_id(); + inline ::std::string* release_bitcoin_id(); + + // optional string bitcoin_name = 2; + inline bool has_bitcoin_name() const; + inline void clear_bitcoin_name(); + static const int kBitcoinNameFieldNumber = 2; + inline const ::std::string& bitcoin_name() const; + inline void set_bitcoin_name(const ::std::string& value); + inline void set_bitcoin_name(const char* value); + inline void set_bitcoin_name(const char* value, size_t size); + inline ::std::string* mutable_bitcoin_name(); + inline ::std::string* release_bitcoin_name(); + + // optional string gui_label = 3; + inline bool has_gui_label() const; + inline void clear_gui_label(); + static const int kGuiLabelFieldNumber = 3; + inline const ::std::string& gui_label() const; + inline void set_gui_label(const ::std::string& value); + inline void set_gui_label(const char* value); + inline void set_gui_label(const char* value, size_t size); + inline ::std::string* mutable_gui_label(); + inline ::std::string* release_gui_label(); + */ + /* + bool SerializeToString(string* output) const; serializes the message and stores the bytes in the given string. + (Note that the bytes are binary, not text; we only use the string class as a convenient container.) + bool ParseFromString(const string& data); parses a message from the given string. + + bool SerializeToOstream(ostream* output) const; writes the message to the given C++ ostream. + bool ParseFromIstream(istream* input); parses a message from the given C++ istream. + */ + + // This is a case for template polymorphism. + // See this article: http://accu.org/index.php/articles/471 + // + /* + template // TStorable... + class TStorable // a "template subclass" of Storable. This is like a version of java + { // interfaces, which C++ normally implements via pure virtual base classes + T const & t; // and multiple inheritance. But in this case, I need to have a consistent + public: // interface across disparate classes (in various circumstances including + TStorable(T const & obj) : t(obj) { } // here with protocol buffers) and template interfaces + bool pack(PackedBuffer& theBuffer) // allow me to do that even with classes in a different hierarchy. + { return t.onPack(theBuffer); } + }; + + template + TStorable makeTStorable( T& obj ) + { + return TStorable( obj ); + } + */ + + /* // Specialization: + template<> + void TStorable::talk() + { + t.playBongs(); + } + + // Passing and returning as parameter: + + template + void makeItTalk( TStorable t ) + { + t.talk(); + } + + template + TStorable makeTalkative( T& obj ) + { + return TStorable( obj ); + } + */ + + // Why have IStorablePB::onPack? What is this all about? + // + // Because normally, packing is done by Packer. I have a packer subclass for + // the protocol buffers library, but notice that I don't have a packer for EVERY + // SINGLE STORABLE OT OBJECT, for the protocol buffers library. So when Packer::Pack() + // is called, the subclass being activated is PackerPB, not PackerForBitcoinAccountOnPB. + // + // With MsgPack, that would be the end of it, since the MsgPack Storables all derive from + // the same base class (due to the msgPack define) and a single call handles all of them. + // But with Protocol Buffers (and probably with custom objects, which are coming next), EACH + // PB-Storable has to wrap an instance of the PB-derived serializable object generated by + // protoc. Each instance thus has a PB member of a slightly different type, and there is no + // common base class between them that will give me a reference to that member, without + // overriding some virtual function IN ALL OF THE PB-SERIALIZABLE OBJECTS so that each can + // individually pass back the reference to its unique PB-derived member. + // + // Even if there were, LET US REMEMBER that all of the various Storables (instantiated for + // various specific packers), such as BitcoinAcctPB for example, are supposed to be derived + // from a data class such as BitcoinAcct. That way, BitcoinAcct can focus on the data itself, + // regardless of packer type, and OT can deal with its data in a pure way, meanwhile the + // actual object used can be one of 5 different subclasses of that, depending on which + // packer was employed. All of those subclasses (for protocol buffers, for msgpack, for json, + // etc) must be derived from the data class, BitcoinAcct. + // + // Remember, if ALL of the protocol-buffers wrapper classes, such as BitcoinAcctPB, + // BitcoinServerPB, LoomAcctPB, LoomServerPB, etc, are all derived from some StorablePB object, + // so they can all share a virtual function and thereby return a reference to their internally- + // wrapped object, then how are all of those classes supposed to ALSO be derived from their + // DATA classes, such as BitcoinAcct, BitcoinServer, LoomAcct, LoomServer, etc?? + // + // The answer is multiple inheritance. Or INTERFACES, to be more specific. I have implemented + // Java-style interfaces as well as polymorphism-by-template to resolve these issues. + // + // The Storable (parameter to Pack) is actually the object that somehow has to + // override--or implement--the actual packing. Only it really knows. Therefore I have decided + // to add an INTERFACE, which is OPTIONAL, which makes it possible to hook and override the + // packing/unpacking, but such that things are otherwise handled in a broad stroke, without + // having to override EVERY LITTLE THING to accomplish it. + // + // Storables, as I said, will all be derived from their respective data objects, no matter + // which packer is being employed. When packing one, the framework will check to see if IStorable + // is present. It it is, then the framework will use it instead of continuing with the normal + // Pack procedure. It will also call the hook (first) so values can be copied where appropriate, + // before the actual packing occurs, or after (for unpacking.) + // + // This means, first, that few of the storables will ever actually have to override Pack() or + // Unpack(), as long as they override onPack() as necessary. AND, when onPack() IS overridden, + // it will be able to handle many different objects (via the Interface, templates, etc), instead + // of each having to provide a separate Pack() implementation for EVERY SINGLE PB object. For + // example, the IStorablePB interface handles ALL of the PB objects, without ANY of them having + // to override some special pack function. + // + // It WOULD have been possible to add this interface to Storable itself. Functions such as + // Pack(), Unpack(), hookBeforePack(), onPack(), etc could have been added there and then passed + // down to all the subclasses. But that is not as elegant, for these reasons: + // 1) Remember that BitcoinAcct is purely data-oriented, and is not a packing-related class. + // (though its subclasses are.) So the members would be out of context, except for some lame + // explanation that the subclasses use them for other purposes unrelated to this class. + // 2) EVERY SINGLE class would be forced to provide its own implementation of those functions, + // since a common base class for groups of them is already discounted, since they are derived + // from their data classes, not their packer classes. + // + // + // + // + // + // + // Interface: IStorablePB + // + // -------------------------------------------- + // Protocol Buffers packer. + // +#if defined (OTDB_PROTOCOL_BUFFERS) + + + ::google::protobuf::Message * IStorablePB::getPBMessage() // This is really only here so it can be overridden. Only subclasses of IStorablePB will actually exist. + { + return NULL; + } + + template + ::google::protobuf::Message * ProtobufSubclass::getPBMessage() + { + return (&__pb_obj); + } + + + // if (false == makeTStorable(*pStorable).pack(*pBuffer)) + //::google::protobuf::Message & IStorablePB::getPBMessage() + //{ + // return makeTStorablePB(*this).getPBMessage(); + //} + + bool IStorablePB::onPack(PackedBuffer& theBuffer, Storable& inObj) // buffer is OUTPUT. + { + // check here to make sure theBuffer is the right TYPE. + BufferPB * pBuffer = dynamic_cast (&theBuffer); + + if (NULL == pBuffer) // Buffer is wrong type!! + return false; + + ::google::protobuf::Message * pMessage = getPBMessage(); + + if (NULL == pMessage) + return false; + + if (false == pMessage->SerializeToString(&(pBuffer->m_buffer))) + return false; + + return true; + } + + bool IStorablePB::onUnpack(PackedBuffer& theBuffer, Storable& outObj) // buffer is INPUT. + { + // check here to make sure theBuffer is the right TYPE. + BufferPB * pBuffer = dynamic_cast (&theBuffer); + + if (NULL == pBuffer) // Buffer is wrong type!! + return false; + + ::google::protobuf::Message * pMessage = getPBMessage(); + + if (NULL == pMessage) + return false; + + if (false == pMessage->ParseFromString(pBuffer->m_buffer)) + return false; + + return true; + } + + + + /* + bool SerializeToString(string* output) const;: + Serializes the message and stores the bytes in the given string. Note that the bytes are binary, + not text; we only use the string class as a convenient container. + + bool ParseFromString(const string& data);: + parses a message from the given string. + */ + bool BufferPB::PackString(std::string& theString) + { + StringPB theWrapper; + + ::google::protobuf::Message * pMessage = theWrapper.getPBMessage(); + + if (NULL == pMessage) + return false; + + // ------------ + + String_InternalPB * pBuffer = dynamic_cast (pMessage); + + if (NULL == pBuffer) // Buffer is wrong type!! + return false; + + // ------------ + + pBuffer->set_value(theString); + + if (false == pBuffer->SerializeToString(&m_buffer)) + return false; + + return true; + } + + bool BufferPB::UnpackString(std::string& theString) + { + StringPB theWrapper; + + ::google::protobuf::Message * pMessage = theWrapper.getPBMessage(); + + if (NULL == pMessage) + return false; + + // ------------ + + String_InternalPB * pBuffer = dynamic_cast (pMessage); + + if (NULL == pBuffer) // Buffer is wrong type!! + return false; + + // ------------ + + if (false == pBuffer->ParseFromString(m_buffer)) + return false; + + // ------------ + + theString = pBuffer->value(); + + return true; + } + + + bool BufferPB::ReadFromIStream(std::istream& inStream, long lFilesize) + { + //bool ParseFromIstream(istream * input) + char * buf = new char[lFilesize]; + OT_ASSERT(NULL != buf); + + inStream.read(buf, lFilesize); + + if (inStream.good()) + { + m_buffer.assign(buf, lFilesize); + delete [] buf; + return true; + } + + delete [] buf; + + return false; + + //m_buffer.ParseFromIstream(&inStream); + } + + bool BufferPB::WriteToOStream(std::ostream &outStream) + { + // bool SerializeToOstream(ostream * output) const + + if (m_buffer.length() > 0) + { + outStream.write(m_buffer.c_str(), m_buffer.length()); + return outStream.good() ? true : false; + } + else + { + OTLog::Error("Buffer had zero length in BufferPB::WriteToOStream\n"); + } + + + return false; + //m_buffer.SerializeToOstream(&outStream); + } + + const unsigned char * BufferPB::GetData() + { + return reinterpret_cast(m_buffer.c_str()); + } + + size_t BufferPB::GetSize() + { + return m_buffer.size(); + } + + void BufferPB::SetData(const unsigned char * pData, size_t theSize) + { + m_buffer.assign(reinterpret_cast(pData), theSize); + } + + + + + // !! All of these have to provide implementations for the hookBeforePack and hookAfterUnpack methods. + // In .cpp file: + /* + void SUBCLASS_HERE::hookBeforePack() + { + __pb_obj.set_PROPERTY_NAME_GOES_HERE(PROPERTY_NAME_GOES_HERE); + } + void SUBCLASS_HERE::hookAfterUnpack() + { + PROPERTY_NAME_GOES_HERE = __pb_obj.PROPERTY_NAME_GOES_HERE(); + } + */ + // + + +#define OT_IMPLEMENT_PB_LIST_PACK(pb_name, element_type) \ + __pb_obj.clear_##pb_name(); \ + for (std::deque::iterator ii = list_##element_type##s.begin(); ii != list_##element_type##s.end(); ++ii) \ + { \ + PointerTo##element_type thePtr = (*ii); \ + element_type##PB * pObject = dynamic_cast(thePtr.pointer()); \ + OT_ASSERT (NULL != pObject); \ + ::google::protobuf::Message * pMessage = pObject->getPBMessage(); \ + OT_ASSERT (NULL != pMessage); \ + element_type##_InternalPB * pInternal = dynamic_cast(pMessage); \ + OT_ASSERT (NULL != pInternal); \ + element_type##_InternalPB * pNewInternal = __pb_obj.add_##pb_name(); \ + OT_ASSERT (NULL != pNewInternal); \ + pObject->hookBeforePack(); \ + pNewInternal->CopyFrom(*pInternal); \ + } + // --------------------------------------------------------------------- + +#define OT_IMPLEMENT_PB_LIST_UNPACK(pb_name, element_type, ELEMENT_ENUM) \ + while (Get##element_type##Count() > 0) \ + Remove##element_type(0); \ + for (int i = 0; i < __pb_obj.pb_name##_size(); i++) \ + { \ + const element_type##_InternalPB & theInternal = __pb_obj.pb_name(i); \ + element_type##PB * pNewWrapper = dynamic_cast(Storable::Create(ELEMENT_ENUM, PACK_PROTOCOL_BUFFERS)); \ + OT_ASSERT(NULL != pNewWrapper); \ + ::google::protobuf::Message * pMessage = pNewWrapper->getPBMessage(); \ + OT_ASSERT (NULL != pMessage); \ + element_type##_InternalPB * pInternal = dynamic_cast< element_type##_InternalPB *>(pMessage); \ + OT_ASSERT (NULL != pInternal); \ + pInternal->CopyFrom(theInternal); \ + pNewWrapper->hookAfterUnpack(); \ + PointerTo##element_type thePtr(dynamic_cast< element_type *>(pNewWrapper)); \ + list_##element_type##s.push_back(thePtr); \ + } + // --------------------------------------------------------------------- + + template<> + void WalletDataPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(bitcoin_server, BitcoinServer) + OT_IMPLEMENT_PB_LIST_PACK(bitcoin_acct, BitcoinAcct) + OT_IMPLEMENT_PB_LIST_PACK(ripple_server, RippleServer) + OT_IMPLEMENT_PB_LIST_PACK(loom_server, LoomServer) + } + + template<> + void WalletDataPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(bitcoin_server, BitcoinServer, STORED_OBJ_BITCOIN_SERVER) + OT_IMPLEMENT_PB_LIST_UNPACK(bitcoin_acct, BitcoinAcct, STORED_OBJ_BITCOIN_ACCT) + OT_IMPLEMENT_PB_LIST_UNPACK(ripple_server, RippleServer, STORED_OBJ_RIPPLE_SERVER) + OT_IMPLEMENT_PB_LIST_UNPACK(loom_server, LoomServer, STORED_OBJ_LOOM_SERVER) + } + // --------------------------------------------- + + template<> + void StringMapPB::hookBeforePack() + { + __pb_obj.clear_node(); // "node" is the repeated field of Key/Values. + + // Loop through all the key/value pairs in the map, and add them to __pb_obj.node. + // + for (std::map::iterator ii = the_map.begin(); ii != the_map.end(); ++ii) + { + KeyValue_InternalPB * pNode = __pb_obj.add_node(); + pNode->set_key((*ii).first); + pNode->set_value((*ii).second); + } + } + + template<> + void StringMapPB::hookAfterUnpack() + { + // the_map = __pb_obj.the_map(); + + the_map.clear(); + + for (int i = 0; i < __pb_obj.node_size(); i++) + { + const KeyValue_InternalPB & theNode = __pb_obj.node(i); + + the_map.insert ( std::pair(theNode.key(), theNode.value()) ); + } + } + // --------------------------------------------- + + + template<> + void StringPB::hookBeforePack() + { + __pb_obj.set_value(m_string); + // The way StringPB is used, this function will never actually get called. + // (But if you used it like the others, it would work, since this function is here.) + } + template<> + void StringPB::hookAfterUnpack() + { + m_string = __pb_obj.value(); + // The way StringPB is used, this function will never actually get called. + // (But if you used it like the others, it would work, since this function is here.) + } + // --------------------------------------------- + + template<> + void BlobPB::hookBeforePack() + { + if (m_memBuffer.size() > 0) + __pb_obj.set_value(m_memBuffer.data(), m_memBuffer.size()); + } + template<> + void BlobPB::hookAfterUnpack() + { + if (__pb_obj.has_value()) + { + std::string strTemp = __pb_obj.value(); + m_memBuffer.assign(strTemp.begin(), strTemp.end()); + } + } + // --------------------------------------------- + + template<> + void ContactPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_contact_id(contact_id); + __pb_obj.set_email(email); + __pb_obj.set_public_key(public_key); + __pb_obj.set_memo(memo); + // -------------------------------- + OT_IMPLEMENT_PB_LIST_PACK(nyms, ContactNym) + OT_IMPLEMENT_PB_LIST_PACK(accounts, ContactAcct) + } + + template<> + void ContactPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + contact_id = __pb_obj.contact_id(); + email = __pb_obj.email(); + public_key = __pb_obj.public_key(); + memo = __pb_obj.memo(); + + // --------------------------------- + + OT_IMPLEMENT_PB_LIST_UNPACK(nyms, ContactNym, STORED_OBJ_CONTACT_NYM) + OT_IMPLEMENT_PB_LIST_UNPACK(accounts, ContactAcct, STORED_OBJ_CONTACT_ACCT) + } + // --------------------------------------------- + + + + template<> + void ContactNymPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_nym_id(nym_id); + __pb_obj.set_nym_type(nym_type); + __pb_obj.set_public_key(public_key); + __pb_obj.set_memo(memo); + + // ---------------------------------------------------- + + OT_IMPLEMENT_PB_LIST_PACK(servers, ServerInfo) + } + + template<> + void ContactNymPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + nym_id = __pb_obj.nym_id(); + nym_type = __pb_obj.nym_type(); + public_key = __pb_obj.public_key(); + memo = __pb_obj.memo(); + + // ---------------------------------------------------- + + OT_IMPLEMENT_PB_LIST_UNPACK(servers, ServerInfo, STORED_OBJ_SERVER_INFO) + } + // --------------------------------------------- + + template<> + void AddressBookPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(contacts, Contact) + } + + template<> + void AddressBookPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(contacts, Contact, STORED_OBJ_CONTACT) + } + // --------------------------------------------- + + template<> + void ContactAcctPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_server_id(server_id); + __pb_obj.set_server_type(server_type); + __pb_obj.set_asset_type_id(asset_type_id); + __pb_obj.set_acct_id(acct_id); + __pb_obj.set_nym_id(nym_id); + __pb_obj.set_memo(memo); + __pb_obj.set_public_key(public_key); + } + template<> + void ContactAcctPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + server_id = __pb_obj.server_id(); + server_type = __pb_obj.server_type(); + asset_type_id = __pb_obj.asset_type_id(); + acct_id = __pb_obj.acct_id(); + nym_id = __pb_obj.nym_id(); + memo = __pb_obj.memo(); + public_key = __pb_obj.public_key(); + } + // --------------------------------------------- + + template<> + void ServerInfoPB::hookBeforePack() + { + __pb_obj.set_server_id(server_id); + __pb_obj.set_server_type(server_type); + } + template<> + void ServerInfoPB::hookAfterUnpack() + { + server_id = __pb_obj.server_id(); + server_type = __pb_obj.server_type(); + } + // --------------------------------------------- + + template<> + void BitcoinAcctPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_acct_id(acct_id); + __pb_obj.set_server_id(server_id); + __pb_obj.set_bitcoin_acct_name(bitcoin_acct_name); + } + template<> + void BitcoinAcctPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + acct_id = __pb_obj.acct_id(); + server_id = __pb_obj.server_id(); + bitcoin_acct_name = __pb_obj.bitcoin_acct_name(); + } + // --------------------------------------------- + + template<> + void BitcoinServerPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_server_id(server_id); + __pb_obj.set_server_type(server_type); + __pb_obj.set_server_host(server_host); + __pb_obj.set_server_port(server_port); + __pb_obj.set_bitcoin_username(bitcoin_username); + __pb_obj.set_bitcoin_password(bitcoin_password); + } + template<> + void BitcoinServerPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + server_id = __pb_obj.server_id(); + server_type = __pb_obj.server_type(); + server_host = __pb_obj.server_host(); + server_port = __pb_obj.server_port(); + bitcoin_username = __pb_obj.bitcoin_username(); + bitcoin_password = __pb_obj.bitcoin_password(); + } + // --------------------------------------------- + + template<> + void RippleServerPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_server_id(server_id); + __pb_obj.set_server_type(server_type); + __pb_obj.set_server_host(server_host); + __pb_obj.set_server_port(server_port); + __pb_obj.set_ripple_username(ripple_username); + __pb_obj.set_ripple_password(ripple_password); + __pb_obj.set_namefield_id(namefield_id); + __pb_obj.set_passfield_id(passfield_id); + } + template<> + void RippleServerPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + server_id = __pb_obj.server_id(); + server_type = __pb_obj.server_type(); + server_host = __pb_obj.server_host(); + server_port = __pb_obj.server_port(); + ripple_username = __pb_obj.ripple_username(); + ripple_password = __pb_obj.ripple_password(); + namefield_id = __pb_obj.namefield_id(); + passfield_id = __pb_obj.passfield_id(); + } + // --------------------------------------------- + + template<> + void LoomServerPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_server_id(server_id); + __pb_obj.set_server_type(server_type); + __pb_obj.set_server_host(server_host); + __pb_obj.set_server_port(server_port); + __pb_obj.set_loom_username(loom_username); + __pb_obj.set_namefield_id(namefield_id); + } + template<> + void LoomServerPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + server_id = __pb_obj.server_id(); + server_type = __pb_obj.server_type(); + server_host = __pb_obj.server_host(); + server_port = __pb_obj.server_port(); + loom_username = __pb_obj.loom_username(); + namefield_id = __pb_obj.namefield_id(); + } + // --------------------------------------------- + + template<> + void MarketDataPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_server_id(server_id); + __pb_obj.set_market_id(market_id); + __pb_obj.set_asset_type_id(asset_type_id); + __pb_obj.set_currency_type_id(currency_type_id); + __pb_obj.set_scale(scale); + __pb_obj.set_total_assets(total_assets); + __pb_obj.set_number_bids(number_bids); + __pb_obj.set_number_asks(number_asks); + __pb_obj.set_last_sale_price(last_sale_price); + __pb_obj.set_current_bid(current_bid); + __pb_obj.set_current_ask(current_ask); + __pb_obj.set_volume_trades(volume_trades); + __pb_obj.set_volume_assets(volume_assets); + __pb_obj.set_volume_currency(volume_currency); + __pb_obj.set_recent_highest_bid(recent_highest_bid); + __pb_obj.set_recent_lowest_ask(recent_lowest_ask); + } + + template<> + void MarketDataPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + server_id = __pb_obj.server_id(); + market_id = __pb_obj.market_id(); + asset_type_id = __pb_obj.asset_type_id(); + currency_type_id = __pb_obj.currency_type_id(); + scale = __pb_obj.scale(); + total_assets = __pb_obj.total_assets(); + number_bids = __pb_obj.number_bids(); + number_asks = __pb_obj.number_asks(); + last_sale_price = __pb_obj.last_sale_price(); + current_bid = __pb_obj.current_bid(); + current_ask = __pb_obj.current_ask(); + volume_trades = __pb_obj.volume_trades(); + volume_assets = __pb_obj.volume_assets(); + volume_currency = __pb_obj.volume_currency(); + recent_highest_bid = __pb_obj.recent_highest_bid(); + recent_lowest_ask = __pb_obj.recent_lowest_ask(); + } + // --------------------------------------------- + + template<> + void MarketListPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(market_data, MarketData) + } + + template<> + void MarketListPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(market_data, MarketData, STORED_OBJ_MARKET_DATA) + } + + // --------------------------------------------- + + template<> + void BidDataPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_transaction_id(transaction_id); + __pb_obj.set_price_per_scale(price_per_scale); + __pb_obj.set_available_assets(available_assets); + __pb_obj.set_minimum_increment(minimum_increment); + } + + template<> + void BidDataPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + transaction_id = __pb_obj.transaction_id(); + price_per_scale = __pb_obj.price_per_scale(); + available_assets = __pb_obj.available_assets(); + minimum_increment = __pb_obj.minimum_increment(); + } + // --------------------------------------------- + + + template<> + void AskDataPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_transaction_id(transaction_id); + __pb_obj.set_price_per_scale(price_per_scale); + __pb_obj.set_available_assets(available_assets); + __pb_obj.set_minimum_increment(minimum_increment); + } + + template<> + void AskDataPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + transaction_id = __pb_obj.transaction_id(); + price_per_scale = __pb_obj.price_per_scale(); + available_assets = __pb_obj.available_assets(); + minimum_increment = __pb_obj.minimum_increment(); + } + // --------------------------------------------- + + template<> + void OfferListMarketPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(bids, BidData) + OT_IMPLEMENT_PB_LIST_PACK(asks, AskData) + } + + template<> + void OfferListMarketPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(bids, BidData, STORED_OBJ_BID_DATA) + OT_IMPLEMENT_PB_LIST_UNPACK(asks, AskData, STORED_OBJ_ASK_DATA) + } + + // --------------------------------------------- + + template<> + void TradeDataMarketPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_transaction_id(transaction_id); + __pb_obj.set_date(date); + __pb_obj.set_price(price); + __pb_obj.set_amount_sold(amount_sold); + } + + template<> + void TradeDataMarketPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + transaction_id = __pb_obj.transaction_id(); + date = __pb_obj.date(); + price = __pb_obj.price(); + amount_sold = __pb_obj.amount_sold(); + } + // --------------------------------------------- + + template<> + void TradeListMarketPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(trades, TradeDataMarket) + } + + template<> + void TradeListMarketPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(trades, TradeDataMarket, STORED_OBJ_TRADE_DATA_MARKET) + } + + // --------------------------------------------- + + template<> + void OfferDataNymPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_valid_from(valid_from); + __pb_obj.set_valid_to(valid_to); + __pb_obj.set_server_id(server_id); + __pb_obj.set_asset_type_id(asset_type_id); + __pb_obj.set_asset_acct_id(asset_acct_id); + __pb_obj.set_currency_type_id(currency_type_id); + __pb_obj.set_currency_acct_id(currency_acct_id); + __pb_obj.set_selling(selling); + __pb_obj.set_scale(scale); + __pb_obj.set_price_per_scale(price_per_scale); + __pb_obj.set_transaction_id(transaction_id); + __pb_obj.set_total_assets(total_assets); + __pb_obj.set_finished_so_far(finished_so_far); + __pb_obj.set_minimum_increment(minimum_increment); + __pb_obj.set_stop_sign(stop_sign); + __pb_obj.set_stop_price(stop_price); + } + + template<> + void OfferDataNymPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + valid_from = __pb_obj.valid_from(); + valid_to = __pb_obj.valid_to(); + server_id = __pb_obj.server_id(); + asset_type_id = __pb_obj.asset_type_id(); + asset_acct_id = __pb_obj.asset_acct_id(); + currency_type_id = __pb_obj.currency_type_id(); + currency_acct_id = __pb_obj.currency_acct_id(); + selling = __pb_obj.selling(); + scale = __pb_obj.scale(); + price_per_scale = __pb_obj.price_per_scale(); + transaction_id = __pb_obj.transaction_id(); + total_assets = __pb_obj.total_assets(); + finished_so_far = __pb_obj.finished_so_far(); + minimum_increment = __pb_obj.minimum_increment(); + stop_sign = __pb_obj.stop_sign(); + stop_price = __pb_obj.stop_price(); + } + // --------------------------------------------- + + template<> + void OfferListNymPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(offers, OfferDataNym) + } + + template<> + void OfferListNymPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(offers, OfferDataNym, STORED_OBJ_OFFER_DATA_NYM) + } + + // --------------------------------------------- + + template<> + void TradeDataNymPB::hookBeforePack() + { + __pb_obj.set_gui_label(gui_label); + __pb_obj.set_transaction_id(transaction_id); + __pb_obj.set_completed_count(completed_count); + __pb_obj.set_date(date); + __pb_obj.set_price(price); + __pb_obj.set_amount_sold(amount_sold); + } + + template<> + void TradeDataNymPB::hookAfterUnpack() + { + gui_label = __pb_obj.gui_label(); + transaction_id = __pb_obj.transaction_id(); + completed_count = __pb_obj.completed_count(); + date = __pb_obj.date(); + price = __pb_obj.price(); + amount_sold = __pb_obj.amount_sold(); + } + // --------------------------------------------- + + template<> + void TradeListNymPB::hookBeforePack() + { + OT_IMPLEMENT_PB_LIST_PACK(trades, TradeDataNym) + } + + template<> + void TradeListNymPB::hookAfterUnpack() + { + OT_IMPLEMENT_PB_LIST_UNPACK(trades, TradeDataNym, STORED_OBJ_TRADE_DATA_NYM) + } + + // --------------------------------------------- + + +#endif // defined (OTDB_PROTOCOL_BUFFERS) + // ******************************************************************** + + + + + + + + + + // ******************************************************************** + // + // STORAGE :: GetPacker + // + // Use this to access the OTPacker, throughout duration of this Storage object. + // If it doesn't exist yet, this function will create it on the first call. (The + // parameter allows you the choose what type will be created, other than default. + // You probably won't use it. But if you do, you'll only call it once per instance + // of Storage.) + // + OTPacker * Storage::GetPacker(PackType ePackType/*=OTDB_DEFAULT_PACKER*/) + { + // Normally if you use Create(), the packer is created at that time. + // However, in the future, coders using the API may create subclasses of + // Storage through SWIG, which Create could not anticipate. This mechanism + // makes sure that in those cases, the packer still gets set (on the first + // Get() call), and the coder using the API still has the ability to choose + // what type of packer will be used. + // + if (NULL == m_pPacker) + { + m_pPacker = OTPacker::Create(ePackType); + } + + return m_pPacker; // May return NULL. + } + + // (SetPacker(), from .h file) + // This is called once, in the factory. + // void Storage::SetPacker(OTPacker & thePacker) { OT_ASSERT(NULL == m_pPacker); m_pPacker = &thePacker; } + + + // + // Factory for Storable objects... + // + Storable * Storage::CreateObject(StoredObjectType eType) + { + OTPacker * pPacker = GetPacker(); + + if (NULL == pPacker) + return NULL; + + Storable * pStorable = Storable::Create(eType, pPacker->GetType()); + + return pStorable; // May return NULL. + } + + // Factory for the Storage context itself. + // + Storage * Storage::Create(StorageType eStorageType, PackType ePackType) + { + Storage * pStore = NULL; + + switch (eStorageType) + { + case STORE_FILESYSTEM: + pStore = StorageFS::Instantiate(); OT_ASSERT(NULL != pStore); break; + // case STORE_COUCH_DB: + // pStore = new StorageCouchDB; OT_ASSERT(NULL != pStore); break; + default: + break; + } + + // IF we successfully created the storage context, now let's + // try to create the packer that goes with it. + // (They are created together and linked until death.) + + if (NULL != pStore) + { + OTPacker * pPacker = OTPacker::Create(ePackType); + + if (NULL == pPacker) + { + // For whatever reason, we failed. Memory issues or whatever. + delete pStore; + return NULL; + } + + // Now they're married. + pStore->SetPacker(*pPacker); + } + + return pStore; // Possible to return NULL. + } + + + // ---------------------------------------------- + + StorageType Storage::GetType() const + { + // If I find the type, then I return it. Otherwise I ASSUME + // that the coder using the API has subclassed Storage, and + // that this is a custom Storage type invented by the API user. + + if (typeid(*this) == typeid(StorageFS)) + return STORE_FILESYSTEM; + // else if (typeid(*this) == typeid(StorageCouchDB)) + // return STORE_COUCH_DB; + // Etc. + // + else + return STORE_TYPE_SUBCLASS; // The Java coder using API must have subclassed Storage himself. + } + + + // ---------------------------------------------------------------------- + + bool Storage::StoreString(std::string strContents, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + OTPacker * pPacker = GetPacker(); + + if (NULL == pPacker) + return false; + // --------------------------- + + PackedBuffer * pBuffer = pPacker->Pack(strContents); + + if (NULL == pBuffer) + return false; + // --------------------------- + + bool bSuccess = onStorePackedBuffer(*pBuffer, strFolder, oneStr, twoStr, threeStr); + + // Don't want any leaks here, do we? + delete pBuffer; + + return bSuccess; + } + + std::string Storage::QueryString(std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string theString(""); + + // ------------------------------ + + OTPacker * pPacker = GetPacker(); + + if (NULL == pPacker) + return theString; + + // --------------------------- + + PackedBuffer * pBuffer = pPacker->CreateBuffer(); + + if (NULL == pBuffer) + return theString; + + // Below this point, responsible for pBuffer. + // --------------------------- + + bool bSuccess = onQueryPackedBuffer(*pBuffer, strFolder, oneStr, twoStr, threeStr); + + if (!bSuccess) + { + delete pBuffer; + + return theString; + } + + // --------------------------- + + // We got the packed buffer back from the query! + // Now let's unpack it and return the Storable object. + + bool bUnpacked = pPacker->Unpack(*pBuffer, theString); + + if (!bUnpacked) + { + delete pBuffer; + theString = ""; + return theString; + } + + // --------------------------- + + // Success :-) + + // Don't want any leaks here, do we? + delete pBuffer; + + return theString; + } + + // ---------------------------------------------------------------------- + + // For when you want NO PACKING. + + bool Storage::StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + return onStorePlainString(strContents, strFolder, oneStr, twoStr, threeStr); + } + + std::string Storage::QueryPlainString(std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string theString(""); + + if (!onQueryPlainString(theString, strFolder, oneStr, twoStr, threeStr)) + theString = ""; + + return theString; + } + + // ---------------------------------------------------------------------- + + + + bool Storage::StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + OTPacker * pPacker = GetPacker(); + + if (NULL == pPacker) + { + OTLog::Error("No packer allocated in Storage::StoreObject\n"); + return false; + } + // --------------------------- + PackedBuffer * pBuffer = pPacker->Pack(theContents); + + if (NULL == pBuffer) + { + OTLog::Error("Packing failed in Storage::StoreObject\n"); + return false; + } + // --------------------------- + bool bSuccess = onStorePackedBuffer(*pBuffer, strFolder, oneStr, twoStr, threeStr); + + if (false == bSuccess) + { + OTLog::Error("Storing failed in Storage::StoreObject (calling onStorePackedBuffer) \n"); + return false; + } + + // Don't want any leaks here, do we? + delete pBuffer; + + return bSuccess; + } + + + + // Use %newobject Storage::Query(); + // + Storable * Storage::QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + OTPacker * pPacker = GetPacker(); + + if (NULL == pPacker) + return NULL; + + // --------------------------- + PackedBuffer * pBuffer = pPacker->CreateBuffer(); + + if (NULL == pBuffer) + return NULL; + + // Below this point, responsible for pBuffer. + // --------------------------- + Storable * pStorable = CreateObject(theObjectType); + + if (NULL == pStorable) + { + delete pBuffer; + return NULL; + } + + // Below this point, responsible for pBuffer AND pStorable. + // --------------------------- + bool bSuccess = onQueryPackedBuffer(*pBuffer, strFolder, oneStr, twoStr, threeStr); + + if (!bSuccess) + { + delete pBuffer; + delete pStorable; + + return NULL; + } + // --------------------------- + + // We got the packed buffer back from the query! + // Now let's unpack it and return the Storable object. + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pStorable); + + if (!bUnpacked) + { + delete pBuffer; + delete pStorable; + + return NULL; + } + + // --------------------------- + + // Success :-) + + // Don't want any leaks here, do we? + delete pBuffer; + + return pStorable; // caller is responsible to delete. + } + + + + bool Storage::EraseValueByKey(std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + bool bSuccess = onEraseValueByKey(strFolder, oneStr, twoStr, threeStr); + + if (false == bSuccess) + OTLog::Error("Failed trying to erase a value, in Storage::EraseValueByKey (while calling onEraseValueByKey) \n"); + + return bSuccess; + } + + + // ***************************************************************************** + + // STORAGE FS (OTDB::StorageFS is the filesystem version of OTDB::Storage.) + + + // ConfirmOrCreateFolder() + // Used for making sure that certain necessary folders actually exist. (Creates them otherwise.) + // + // If you pass in "spent", then this function will make sure that "/spent" actually exists, + // or create it. WARNING: If what you want to pass is "spent/sub-folder-to-spent" then make SURE + // you call it with "spent" FIRST, so you are sure THAT folder has been created, otherwise the + // folder creation will definitely fail on the sub-folder call (if the primary folder wasn't + // already there, that is.) + // + bool StorageFS::ConfirmOrCreateFolder(const char * szFolderName, struct stat * pst/*=NULL*/) + { + OT_ASSERT(NULL != szFolderName); + + // DIRECTORY IS PRESENT? + struct stat st; + + if (NULL == pst) + pst = &st; + + OTString strPath; + strPath.Format("%s%s%s", GetFullPath(), PathSeparator(), szFolderName); + +// OTLog::vError("DEBUG Full path, separate, and szFolderName, all together: %s \n", strPath.Get()); + + bool bDirIsPresent = (0 == stat(strPath.Get(), pst)); + + // ---------------------------------------------------------------------------- + + // IF NO, CREATE IT + if (!bDirIsPresent) + { +#ifdef _WIN32 + if (_mkdir(strPath.Get()) == -1) +#else + if (mkdir(strPath.Get(), 0700) == -1) +#endif + { + OTLog::vError("StorageFS::ConfirmOrCreateFolder: Unable to create %s.\n", + strPath.Get()); + return false; + } + + // Now we have created it, so let's check again... + bDirIsPresent = (0 == stat(strPath.Get(), pst)); + + if (bDirIsPresent) + OTLog::vOutput(0, "Created folder: %s\n", strPath.Get()); + } + + // ---------------------------------------------------------------------------- + + // At this point if the folder still doesn't exist, nothing we can do. We + // already tried to create the folder, and SUCCEEDED, and then STILL failed + // to find it (if this is still false.) + if (!bDirIsPresent) + { + OTLog::vError("StorageFS::ConfirmOrCreateFolder: Unable to find newly-created folder: %s\n", + strPath.Get()); + return false; + } + + return true; + } + + // Returns true or false whether a specific file exists. + // Adds the main path prior to checking. + bool StorageFS::ConfirmFile(const char * szFileName, struct stat * pst/*=NULL*/) + { + OT_ASSERT(NULL != szFileName); + + struct stat st; + + // FILE IS PRESENT? + if (NULL == pst) + pst = &st; + + OTString strPath; + strPath.Format("%s%s%s", GetFullPath(), PathSeparator(), szFileName); + + return (0 == stat(strPath.Get(), pst)); + } + + /* + - Based on the input, constructs the full path and returns it in strOutput. + - Also returns true/false based on whether the path actually exists. + - If some failure occurs along the way, the path returned will not be the + full path, but the path where the failure occurred. + - This function will also try to create all the folders leading up to the + file itself. + + New return values: + + -1 -- Error + 0 -- File not found + 1 -- File found. + + */ + long StorageFS::ConstructAndConfirmPath(std::string & strOutput, + const std::string& strFolder, const std::string& oneStr/*=""*/, + const std::string& twoStr/*=""*/, const std::string& threeStr/*=""*/) + { + struct stat st; + +// OTLog::vError("DEBUG StorageFS::ConstructAndConfirmPath: m_strFullPath is %s and %s \n", m_strFullPath.c_str(), GetFullPath()); + +// OTLog::vOutput(0, "DEBUG STORAGEFS 1: %s and %s \n", strFolder.c_str(), oneStr.c_str()); + + if (strFolder.length() < 1) + { + // Must at least have a folder name and a file name. + OTLog::Error("Folder has a zero length, unable to construct path.\n"); + + return -1; + } + + // ----------------------------------------------------------------- + + bool bConfirmed = false; + + if (oneStr.length() < 1) // strFolder is the Filename. + { + strOutput = strFolder.c_str(); + bConfirmed = ConfirmFile(strFolder.c_str(), &st); + } + else // There are more strings in the name after the folder... + { + strOutput = strFolder.c_str(); + bool bConfirmMAINFolder = ConfirmOrCreateFolder(strFolder.c_str()); + + if (!bConfirmMAINFolder) + { + OTLog::vError("Unable to confirm or create folder: %s\n", strFolder.c_str()); + return -1; + } + + // ----------------------------------------------------------------- + + OTString strOnePath; + strOnePath.Format("%s%s%s", strFolder.c_str(), PathSeparator(), + oneStr.c_str()); + + // oneStr is the FILENAME. There are no other strings. + // + if (twoStr.length() < 1) + { + strOutput = strOnePath.Get(); + bConfirmed = ConfirmFile(strOnePath.Get(), &st); + } + else // There are more strings. + { + strOutput = strOnePath.Get(); + bool bConfirmFirstFolder = ConfirmOrCreateFolder(strOnePath.Get()); + + if (!bConfirmFirstFolder) + { + OTLog::vError("Unable to confirm or create folder: %s\n", strOnePath.Get()); + return -1; + } + // ------------------- + + OTString strTwoPath; + strTwoPath.Format("%s%s%s", strOnePath.Get(), PathSeparator(), + twoStr.c_str()); + + // twoStr is the FILENAME. There's no other strings. + if (threeStr.length() < 1) + { + strOutput = strTwoPath.Get(); + bConfirmed = ConfirmFile(strTwoPath.Get(), &st); + } + else // There is one more string... + { + strOutput = strTwoPath.Get(); + bool bConfirmSecondFolder = ConfirmOrCreateFolder(strTwoPath.Get()); + + if (!bConfirmSecondFolder) + { + OTLog::vError("Unable to confirm or create folder: %s\n", strTwoPath.Get()); + return -1; + } + // ------------------- + + OTString strThreePath; + strThreePath.Format("%s%s%s", strTwoPath.Get(), PathSeparator(), + threeStr.c_str()); + + strOutput = strThreePath.Get(); + bConfirmed = ConfirmFile(strThreePath.Get(), &st); // This may fail, that's okay. + } + } + } + // ------------------------ + + OTString strFinalPath; + strFinalPath.Format("%s%s%s", GetFullPath(), PathSeparator(), strOutput.c_str()); + + strOutput = strFinalPath.Get(); + + return bConfirmed ? static_cast(st.st_size) : 0; + } + + + + // ----------------------------------------- + // Store/Retrieve an object. (Storable.) + + bool StorageFS::onStorePackedBuffer(PackedBuffer & theBuffer, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + if (-1 == ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr)) + { + OTLog::vError("StorageFS::onStorePackedBuffer: Error writing to %s.\n", strOutput.c_str()); + return false; + } + + // TODO: Should check here to see if there is a .lock file for the target... + + // TODO: If not, next I should actually create a .lock file for myself right here.. + + + // SAVE to the file here + std::ofstream ofs(strOutput.c_str(), std::ios::binary); + + if (ofs.fail()) + { + OTLog::vError("Error opening file in StorageFS::onStorePackedBuffer: %s\n", + strOutput.c_str()); + return false; + } + + ofs.clear(); + + bool bSuccess = theBuffer.WriteToOStream(ofs); + + ofs.close(); + + // TODO: Remove the .lock file. + + return bSuccess; + } + + + bool StorageFS::onQueryPackedBuffer(PackedBuffer & theBuffer, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + long lRet = ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr); + + if (-1 == lRet) + { + OTLog::vError("StorageFS::onQueryPackedBuffer: Error with %s.\n", strOutput.c_str()); + return false; + } + else if (0 == lRet) + { + OTLog::vError("StorageFS::onQueryPackedBuffer: Failure reading from %s: file does not exist.\n", strOutput.c_str()); + return false; + } + + // ------------------------------- + + // READ from the file here + + std::ifstream fin(strOutput.c_str(), std::ios::binary); + + if (!fin.is_open()) + { + OTLog::vError("Error opening file in StorageFS::onQueryPackedBuffer: %s\n", strOutput.c_str()); + return false; + } + // ------------------------- + + bool bSuccess = theBuffer.ReadFromIStream(fin, lRet); + + fin.close(); + + return bSuccess; + } + + + + // ----------------------------------------- + // Store/Retrieve a plain string, (without any packing.) + + + bool StorageFS::onStorePlainString(std::string & theBuffer, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + if (-1 == ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr)) + { + OTLog::vError("StorageFS::onStorePlainString: Error writing to %s.\n", strOutput.c_str()); + return false; + } + + // TODO: Should check here to see if there is a .lock file for the target... + + // TODO: If not, next I should actually create a .lock file for myself right here.. + + // ---------------------------------------------- + + // SAVE to the file here. + // + // Here's where the serialization code would be changed to CouchDB or whatever. + // In a key/value database, szFilename is the "key" and strFinal.Get() is the "value". + // + std::ofstream ofs(strOutput.c_str(), std::ios::binary); + + if (ofs.fail()) + { + OTLog::vError("Error opening file in StorageFS::onStorePlainString: %s\n", + strOutput.c_str()); + return false; + } + + ofs.clear(); + + ofs << theBuffer.c_str(); + + bool bSuccess = ofs.good() ? true : false; + + ofs.close(); + + // ------------------------------------ + + // TODO: Remove the .lock file. + + return bSuccess; + } + + + bool StorageFS::onQueryPlainString(std::string & theBuffer, std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + long lRet = ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr); + + if (-1 == lRet) + { + OTLog::vError("StorageFS::onQueryPlainString: Error with %s.\n", strOutput.c_str()); + return false; + } + else if (0 == lRet) + { + OTLog::vError("StorageFS::onQueryPlainString: Failure reading from %s: file does not exist.\n", strOutput.c_str()); + return false; + } + + // ------------------------------- + + // Open the file here + + std::ifstream fin(strOutput.c_str(), std::ios::binary); + + if (!fin.is_open()) + { + OTLog::vError("Error opening file in StorageFS::onQueryPlainString: %s\n", strOutput.c_str()); + return false; + } + // ------------------------- + + // Read from the file as a plain string. + + std::stringstream buffer; + buffer << fin.rdbuf(); + + bool bSuccess = fin.good(); + + if (bSuccess) + theBuffer = buffer.str(); // here's the actual output of this function. + else + { + theBuffer = ""; + return false; + } + + bSuccess = (theBuffer.length() > 0); + + fin.close(); + + return bSuccess; + } + + + // ----------------------------------------------------------------- + + + + // ----------------------------------------- + // Erase a value by location. + // + bool StorageFS::onEraseValueByKey(std::string strFolder, + std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + if ((-1) == ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr)) + { + OTLog::vError("StorageFS::onEraseValueByKey: Failed trying to erase: %s.\n", strOutput.c_str()); + return false; + } + + // TODO: Should check here to see if there is a .lock file for the target... + + // TODO: If not, next I should actually create a .lock file for myself right here.. + + // ---------------------------------------------- + + bool bSuccess = false; + + // ERASE the file here. + // + // Here's where the serialization code would be changed to CouchDB or whatever. + // In a key/value database, strOutput is the "key", and we're erasing the value that's stored + // at the location denoted by that key. + // + + if ( remove( strOutput.c_str() ) != 0 ) + { + OTLog::vError("Error erasing file in StorageFS::onEraseValueByKey: %s\n", + strOutput.c_str()); + bSuccess = false; + } + else + bSuccess = true; + + // ------------------------------------ + + // TODO: Remove the .lock file. + + return bSuccess; + } + + + + // ---------------------------------------------- + // Constructor for Filesystem storage context. + // + StorageFS::StorageFS() : Storage(), m_strFullPath(""), m_strWalletFile("") + { + + } + + StorageFS::~StorageFS() + { + + } + + + // ---------------------------------------------- + // + // oneStr == Full path to data_folder + // twoStr == Wallet.xml filename + // + // (Three,Four,Five,Six are UNUSED in StorageFS.) + // + bool StorageFS::Init(std::string oneStr/*=""*/, std::string twoStr/*=""*/, std::string threeStr/*=""*/, + std::string fourStr/*=""*/, std::string fiveStr/*=""*/, std::string sixStr/*=""*/) + { + // This is where I verify the directory path exists, and the wallet file within. + + if ((oneStr.length() < 1) || (twoStr.length() < 1)) + { + OTLog::vError("Expected a data_folder path, and a wallet filename, but got this: %s%s%s\n" + "Make sure to call LoadWallet.\n", + oneStr.c_str(), PathSeparator(), twoStr.c_str()); + return false; + } + // -------------------------------- + + OTString strPATH_OUTPUT; + OTLog::TransformFilePath(oneStr.c_str(), strPATH_OUTPUT); + + bool bMainFolder = OTLog::ConfirmExactPath(strPATH_OUTPUT.Get()); + + if (!bMainFolder) + { + OTLog::vError("Unable to locate data_folder: %s\n", strPATH_OUTPUT.Get()); + return false; + } + // -------------------------------- + // By this point, data_folder was successfully located. + + OTString strWalletFile; + strWalletFile.Format("%s%s%s", strPATH_OUTPUT.Get(), PathSeparator(), twoStr.c_str()); + + bool bWalletFile = OTLog::ConfirmExactPath(strWalletFile.Get()); + + if (!bWalletFile) + { + OTLog::vError("Unable to locate wallet: %s\n", strWalletFile.Get()); +// return false; // Let the caller make this decision when he calls LoadWallet(); + } + // ----------------------------------- + + m_strFullPath = strPATH_OUTPUT.Get(); + +// OTLog::vError("DEBUG StorageFS::Init: m_strFullPath is %s and %s \n", m_strFullPath.c_str(), GetFullPath()); + + m_strWalletFile = twoStr; + + return true; + } + + + // ----------------------------------------- + // See if the file is there. + + bool StorageFS::Exists(std::string strFolder, std::string oneStr/*=""*/, + std::string twoStr/*=""*/, std::string threeStr/*=""*/) + { + std::string strOutput; + + return (ConstructAndConfirmPath(strOutput, strFolder, oneStr, twoStr, threeStr) > 0) ? + true : false; + } + + + // ******************************************************************** + + +} // namespace OTDB + + + + + + + + diff --git a/OTLib/OTStorage.h b/OTLib/OTStorage.h new file mode 100644 index 000000000..6e7a484cf --- /dev/null +++ b/OTLib/OTStorage.h @@ -0,0 +1,2232 @@ +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#ifndef __OT_STORAGE_H__ +#define __OT_STORAGE_H__ + +#include + +#include +#include +#include +#include +#include + +// credit:stlplus library. +#include "containers/simple_ptr.hpp" + +// Use Win or Posix +// IF I need this while porting, then uncomment it. +#ifdef _WIN32 +#include +//#else +//#ifndef POSIX +//#warning POSIX will be used (but you did not define it) +//#endif +//#include +#endif + + +extern "C" +{ + +#ifdef _WIN32 +#include +#include +#else +#include +#endif +} + +#include "OTData.h" + +#include "OTLog.h" + + + +// Which storage mechanism are we building? +// (Option is for both...) +// + +#ifndef _WIN32 // Until I get it working on Windows. +#define OTDB_MESSAGE_PACK 1 +#endif + +#define OTDB_PROTOCOL_BUFFERS 1 +//#define OTDB_JSON_PACKING 1 // coming soon. + + + +//#define OTDB_DEFAULT_PACKER PACK_MESSAGE_PACK +#define OTDB_DEFAULT_PACKER OTDB::PACK_PROTOCOL_BUFFERS + +#define OTDB_DEFAULT_STORAGE OTDB::STORE_FILESYSTEM + + +// ---------------------------------------------------- +// JAVA-STYLE INTERFACES. +// +// I'm doing some crazy stuff in this file. +// What you see below is a set of preprocessor definitions that +// allow me to use "Java-Style Interfaces" here in C++. +// +// It turns out that Storable needed a normal class hierarchy, AND Java- +// style interfaces, to do everything I wanted it to do. +// +// I will probably create a more general-purpose header file for OT +// and these sorts of #defines will probably end up there long-term. +// Much of OT might be separable out into a more general-purpose utility +// lib, which I will get to whenever it is more important than anything else. +// +#define Interface class + +#define DeclareInterface(name) Interface name { \ +public: \ +virtual ~name() {} + +#define DeclareBasedInterface(name, base) class name : public base { \ +public: \ +virtual ~name() {} + +#define EndInterface }; + +#define implements public +// ---------------------------------------------------- + + + + + +// ---------------------------------------------------- + +namespace OTDB +{ + + // ENUMS: PackType, StorageType, and StoredObjectType. + + // --------------------------------------------------- + // Currently supporting MsgPack and Protocol Buffers. + // + enum PackType // PACKING TYPE + { + PACK_MESSAGE_PACK = 0, // Using MessagePack as packer. + PACK_PROTOCOL_BUFFERS, // Using Google Protocol Buffers as packer. + PACK_TYPE_ERROR // (Should never be.) + }; + + // ------------------------------ + // Currently supporting filesystem, with subclasses possible via API. + // + enum StorageType // STORAGE TYPE + { + STORE_FILESYSTEM = 0, // Filesystem +// STORE_COUCH_DB, // Couch DB (not yet supported) + STORE_TYPE_SUBCLASS // (Subclass provided by API client via SWIG.) + }; + + // ------------------------------------- + // + // STORED OBJECT TYPES... + // + extern const char * StoredObjectTypeStrings[]; + + enum StoredObjectType + { + STORED_OBJ_STRING=0, // Just a string. + STORED_OBJ_BLOB, // Used for storing binary data. Bytes of arbitrary length. + STORED_OBJ_STRING_MAP, // A StringMap is a list of Key/Value pairs, useful for storing nearly anything. + STORED_OBJ_WALLET_DATA, // The GUI wallet's stored data + STORED_OBJ_BITCOIN_ACCT, // The GUI wallet's stored data about a Bitcoin acct + STORED_OBJ_BITCOIN_SERVER, // The GUI wallet's stored data about a Bitcoin RPC port. + STORED_OBJ_RIPPLE_SERVER, // The GUI wallet's stored data about a Ripple server. + STORED_OBJ_LOOM_SERVER, // The GUI wallet's stored data about a Loom server. + STORED_OBJ_SERVER_INFO, // A Nym has a list of these. + STORED_OBJ_CONTACT_NYM, // This is a Nym record inside a contact of your address book. + STORED_OBJ_CONTACT_ACCT, // This is an account record inside a contact of your address book. + STORED_OBJ_CONTACT, // Your address book has a list of these. + STORED_OBJ_ADDRESS_BOOK, // Your address book. + STORED_OBJ_MARKET_DATA, // The description data for any given Market ID. + STORED_OBJ_MARKET_LIST, // A list of MarketDatas. + STORED_OBJ_BID_DATA, // Offer details (doesn't contain private details) + STORED_OBJ_ASK_DATA, // Offer details (doesn't contain private details) + STORED_OBJ_OFFER_LIST_MARKET, // A list of offer details, for a specific market. + STORED_OBJ_TRADE_DATA_MARKET, // Trade details (doesn't contain private data) + STORED_OBJ_TRADE_LIST_MARKET, // A list of trade details, for a specific market. + STORED_OBJ_OFFER_DATA_NYM, // Private offer details for a particular Nym and Offer. + STORED_OBJ_OFFER_LIST_NYM, // A list of private offer details for a particular Nym. + STORED_OBJ_TRADE_DATA_NYM, // Private trade details for a particular Nym and Trade. + STORED_OBJ_TRADE_LIST_NYM, // A list of private trade details for a particular Nym and Offer. + STORED_OBJ_ERROR // (Should never be.) + }; + + // ******************************************************************** + + // OTDB NAMESPACE "CONSTRUCTOR" + // + class InitOTDBDetails + { + public: + InitOTDBDetails(); // See implementation of this in CPP file for namespace construction. + ~InitOTDBDetails(); // Ditto. + }; + // ------------------------------- + + + + // ABSTRACT BASE CLASSES + // + class Storable; // A storable object + class OTPacker; // A packer (Could be MsgPack, or Google Protocol Buffers, or a json lib...) + class Storage; // A storage context (database, filesystem, cloud, etc. Swappable.) + class PackedBuffer; // A buffer for containing a PACKED STORABLE. (On its way to/from storage.) + + // As far as the USERS of the Storage API are concerned, the above classes are nearly everything. + // (In addition to the "Pure Data" classes such as ContactNym, BitcoinAcct, etc.) + // Behind the scenes, in OTStorage, there is the IStorable interface, with its progeny, the various + // subclasses based on specific packers, such as ContactNymMsgpack, or WalletDataProtobuf. But these + // are hidden, and are not seen outside of OTStorage in its actual USE. + + // ------------------------------------------------ + // + // OTDB Namespace internal typedefs + // + // In short: + // - InstantiateFunc (function pointer type.) + // - InstantiateFuncKey (based on Pack Type and Stored Object Type.) + // - mapOfFunctions (type: map of InstantiateFuncs, indexed by InstantiateFuncKeys.) + // + // Resulting in: pFunctionMap (Instance of mapOfFunctions, created in the OTDB constructor.) + // + typedef Storable * (InstantiateFunc)(); // Each storable has one of these as a static method. + typedef std::pair InstantiateFuncKey; // Those methods are stored as function pointers here, and they are + // indexed by Pack Type and Stored Object Type. So if you know "LoomAcct" and + // "protocol buffers", those form the KEY for looking up the LoomAcctPB instantiator. + typedef std::map mapOfFunctions; //...basically implementing my own vtable, eh? + + + + // ******************************************************************** + + // OTDB Namespace PRIVATE MEMBERS + // this "details" naming is a common C++ idiom for "private" in a namespace. + // + namespace details + { + extern OTDB::Storage * s_pStorage; + + extern OTDB::mapOfFunctions * pFunctionMap; // This is a pointer so I can control what order it is created in, on startup. + } + + + + + // ---------------------------------------------------- + + // All of the class hierarchy under Storable is based on OT data design. (Not packing and such implementation details.) + // So when we need to add custom behavior that's common to groups of the final subclasses, + // we use **Interfaces** to do it. + + // ===> That way, the Storable hierarchy can focus on DATA, (and form the external interface for OTStorage.) + // ===> while the IStorable hierarchy focuses on PACKING. (and is hidden INSIDE OTStorage.) + // ===> (Things are more elegant this way.) + + // + // + // Interface: IStorable + // + // Each specific Packer library (MsgPack, Protobuf, etc) must provide an interface + // derived from IStorable (They're all listed somewhere below.) + // + DeclareInterface(IStorable) + virtual bool onPack(PackedBuffer& theBuffer, Storable& inObj) = 0; // buffer is output, inObj is input. + virtual bool onUnpack(PackedBuffer& theBuffer, Storable& outObj) = 0; // buffer is input, outObj is output. + // ------------------------------------------ + virtual void hookBeforePack() {} // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack() {} // This is called just after unpacking a storable. (Opportunity to copy values...) + EndInterface + + + + + // ******************************************************************** + // + // use this without a semicolon: + // +#define DEFINE_OT_DYNAMIC_CAST(CLASS_NAME) \ + virtual CLASS_NAME * clone () const { OT_ASSERT(false); std::cout << "********* THIS SHOULD NEVER HAPPEN!!!!! *****************" << std::endl; return NULL; } \ + static CLASS_NAME * ot_dynamic_cast( Storable *pObject) { return dynamic_cast(pObject); } +// static const CLASS_NAME * ot_dynamic_cast(const Storable *pObject) { return dynamic_cast(pObject); } + + // ------------------- + // + // STORABLE + // + // Abstract base class for OT serializable object types. + // + class Storable + { + friend class Storage; // for instantiation of storable objects by their storage context. + + protected: + Storable() { m_Type = "Storable"; } + + std::string m_Type; + public: + virtual ~Storable() {} + + // %ignore spam(unsigned short); API users don't need this function, it's for internal purposes. + static Storable * Create(StoredObjectType eType, PackType thePackType); + + DEFINE_OT_DYNAMIC_CAST(Storable) + }; + + + + // ******************************************************************** + + // PACKED BUFFER (for storing PACKED DATA) + // + // %ignore these classes (I think) + // + + class PackedBuffer + { + protected: + PackedBuffer() { } // Only subclasses of this should be instantiated. + public: + virtual ~PackedBuffer() {} + + virtual bool PackString(std::string& theString)=0; + virtual bool UnpackString(std::string& theString)=0; + + virtual bool ReadFromIStream(std::istream &inStream, long lFilesize)=0; + virtual bool WriteToOStream(std::ostream &outStream)=0; + + virtual const unsigned char * GetData()=0; + virtual size_t GetSize()=0; + + virtual void SetData(const unsigned char * pData, size_t theSize)=0; + }; + + // -------------------------------- + // + // SUBCLASSES (the actual declarations are at the bottom of this file.) + // + // typedef PackedBufferSubclass BufferMsgpack; + // typedef PackedBufferSubclass BufferPB; + // + // Coming soon: + // typedef PackedBufferSubclass BufferJSON; + // + // They're all based on this template: + // +#define DECLARE_PACKED_BUFFER_SUBCLASS(theNewType, thePackerType, theInterfaceType, theInternalType) \ +class theNewType : public PackedBuffer \ +{ \ + friend class thePackerType; \ + friend Interface theInterfaceType; \ + theInternalType m_buffer; \ +public: \ + theNewType() : PackedBuffer() {} \ + virtual ~theNewType() {} \ + virtual bool PackString(std::string& theString); \ + virtual bool UnpackString(std::string& theString); \ + virtual bool ReadFromIStream(std::istream &inStream, long lFilesize); \ + virtual bool WriteToOStream(std::ostream &outStream); \ + virtual const unsigned char * GetData(); \ + virtual size_t GetSize(); \ + virtual void SetData(const unsigned char * pData, size_t theSize); \ + theInternalType & GetBuffer() { return m_buffer; } \ +} + + // ******************************************************************** + + + + + + + + + + // ******************************************************************** + + // PACKER (now OTPacker since MsgPack also has a "Packer" in a #define). + // + // abstract base class for a packer + // + + // %ignore spam(unsigned short); (probably for all packers.) + class OTPacker + { + protected: + OTPacker() { } // To instantiate: OTPacker * pPacker = OTPacker::Create(OTDB_DEFAULT_PACKER); + + public: + virtual ~OTPacker() {} + + static OTPacker * Create(PackType ePackType); // Factory. + + PackType GetType() const; + + PackedBuffer * Pack(Storable& inObj); + bool Unpack(PackedBuffer& inBuf, Storable& outObj); + + PackedBuffer * Pack(std::string& inObj); + bool Unpack(PackedBuffer& inBuf, std::string& outObj); + + virtual PackedBuffer * CreateBuffer()=0; + }; + + + // ---------------------------------------------------- + // For declaring subclasses of OTPacker. + + template + class PackerSubclass : public OTPacker + { + public: + PackerSubclass() : OTPacker() {} + virtual ~PackerSubclass() {} + + virtual PackedBuffer * CreateBuffer() { return new theBufferType; } + + // You don't see onPack and onUnpack here because they are on IStorable. + }; + + // To use: + // typedef PackerSubclass theType; + // + // ---------------------------------------------------- + + // SUBCLASSES: + // + // (Actual declarations are at the bottom of the file.) + // + // typedef PackerSubclass PackerMsgpack; + // typedef PackerSubclass PackerPB; + // + // Coming soon: + // typedef PackerSubclass PackerJSON; + // + // ******************************************************************** + + + + + + + + + // ******************************************************************** + // + // STORAGE -- abstract base class + // + // + class Storage + { + private: + OTPacker * m_pPacker; + + protected: + Storage() : m_pPacker(NULL) {} + + Storage(const Storage & rhs) : m_pPacker(NULL) { } // We don't want to copy the pointer. Let it create its own. + + // This is called once, in the factory. + void SetPacker(OTPacker & thePacker) { OT_ASSERT(NULL == m_pPacker); m_pPacker = &thePacker; } + + // ******************************************************** + // OVERRIDABLES + // + // If you wish to MAKE YOUR OWN subclass of Storage (to provide your own storage system) + // then just subclass OTDB::Storage, and override the below methods. For an example of how + // it's done, see StorageFS (filesystem), which is included below and in OTStorage.cpp. + // + // NOTE: This should be possible even in other languages! I'm using SWIG directors, meaning + // that you can make a Java subclass of OTDB::Storage, or a Python subclass, etc. This isn't + // possible with the other classes in OTStorage (yet), which must be subclassed in C++. But + // for this class, it is. + // + virtual bool onStorePackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onQueryPackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onStorePlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onQueryPlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onEraseValueByKey(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + // ------------------------------------- + + public: + // Use GetPacker() to access the Packer, throughout duration of this Storage object. + // If it doesn't exist yet, this function will create it on the first call. (The + // parameter allows you the choose what type will be created, other than default.) + // + // This way, whenever using an OT Storage, you KNOW the packer is always the right + // one, and that you don't have to fiddle with it at all. You can also therefore use + // it for creating instances of various Storables and PackedBuffers, and knowing + // that the right types will be instantiated automatically, with the buffer being + // the appropriate subclass for the packer. + // + OTPacker * GetPacker(PackType ePackType = OTDB_DEFAULT_PACKER); + + + virtual bool Init(std::string oneStr="", std::string twoStr="", std::string threeStr="", + std::string fourStr="", std::string fiveStr="", std::string sixStr="")=0; + + // ----------------------------------------- + // See if the file is there. + virtual bool Exists(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr="")=0; + + // ******************************************************** + + virtual ~Storage() { if (NULL != m_pPacker) delete m_pPacker; m_pPacker = NULL; } + + // ----------------------------------------- + // Store/Retrieve a string. + + bool StoreString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + bool StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryPlainString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Store/Retrieve an object. (Storable.) + + bool StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // Use %newobject OTDB::Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Erase any value based on its location. + + bool EraseValueByKey(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // -------------------------- + // Note: + // Make sure to use: %newobject Factory::createObj(); IN OTAPI.i file! + // + // That way, Java garbage cleanup will handle object after this. + // (Instead of leaking because it thinks C++ will clean it up.) + // + // Factory for Storable objects. %newobject Factory::createObj(); + Storable * CreateObject(StoredObjectType eType); + + // -------------------------- + + // Factory for Storage itself. %ignore this in OTAPI.i (It's accessed through + // a namespace-level function, whereas this is for internal purposes.) + // + static Storage * Create(StorageType eStorageType, PackType ePackType); // FACTORY + + StorageType GetType() const; + }; + + + // ******************************************************************** + // + // OTDB Namespace PUBLIC INTERFACE + // + // + + bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, + std::string oneStr="", std::string twoStr="", std::string threeStr="", + std::string fourStr="", std::string fiveStr="", std::string sixStr=""); + + // Default Storage instance: + Storage * GetDefaultStorage(); + + // %newobject Factory::createObj(); + Storage * CreateStorageContext(StorageType eStoreType, PackType ePackType=OTDB_DEFAULT_PACKER); + + Storable * CreateObject(StoredObjectType eType); + + // bool bSuccess = OTDB::StoreString(strInbox, "inbox", "lkjsdf908w345ljkvd"); + // bool bSuccess = OTDB::StoreString(strMint, "mints", SERVER_ID, ASSET_ID); + // bool bSuccess = OTDB::StoreString(strPurse, "purse", SERVER_ID, USER_ID, ASSET_ID); + + // BELOW FUNCTIONS use the DEFAULT Storage context for the OTDB Namespace + + // -------- + // See if the file is there. + // + bool Exists(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // -------- + // Store/Retrieve a string. + // + bool StoreString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + bool StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryPlainString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // -------- + // Store/Retrieve an object. (Storable.) + // + bool StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // Use %newobject OTDB::Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Erase any value based on its location. + + bool EraseValueByKey(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // ******************************************************************** + /* + typedef template + T * OT_DYNAMIC_CAST(Storable * pObject) + { + return dynamic_cast(pObject); + } + template + const T * OT_DYNAMIC_CONST_CAST(const Storable * pObject) + { + return dynamic_cast(pObject); + } + */ + + + + +#define DECLARE_GET_ADD_REMOVE(name) \ +protected: \ + std::deque< stlplus::simple_ptr_clone > list_##name##s; \ +public: \ + size_t Get##name##Count(); \ + name * Get##name(size_t nIndex); \ + bool Remove##name(size_t nIndex##name); \ + bool Add##name(name & disownObject) + + + + // Serialized types... + // + // Here the entire hierarchy focuses on the OT data itself. + // Later, subclasses are made providing the final implementation, + // based on the packer type. (Same for buffers.) + + class OTDBString : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + OTDBString() : Storable() { m_Type = "OTDBString"; } + OTDBString(const std::string& rhs) : Storable(), m_string(rhs) { m_Type = "OTDBString"; } // This is an abstract base class...so will this call ever actually happen? + + public: + virtual ~OTDBString() { } + + std::string m_string; + + DEFINE_OT_DYNAMIC_CAST(OTDBString) + }; + + // ------------------------------------------------ + + + class Blob : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + Blob() : Storable() { m_Type = "Blob"; } + + public: + virtual ~Blob() { } + + std::vector m_memBuffer; // Where the actual binary data is stored, before packing. + + DEFINE_OT_DYNAMIC_CAST(Blob) + }; + + // ------------------------------------------------ + + + // The most useful generic data object... a map of strings, key/value pairs. + // + class StringMap : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + StringMap() : Storable() { m_Type = "StringMap"; } + + public: + virtual ~StringMap() { } + + std::map the_map; // all strings, key/value pairs. + + void SetValue(const std::string& strKey, const std::string& strValue) + { the_map[strKey] = strValue; } + + std::string GetValue(const std::string& strKey) + { std::string ret_val(""); std::map::iterator ii = the_map.find(strKey); + if (ii != the_map.end()) ret_val = (*ii).second; return ret_val; } + + DEFINE_OT_DYNAMIC_CAST(StringMap) + }; + + // ------------------------------------------------ + + class Displayable : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + Displayable() : Storable() { m_Type = "Displayable"; } + + public: + virtual ~Displayable() { } + + std::string gui_label; // The label that appears in the GUI + + DEFINE_OT_DYNAMIC_CAST(Displayable) + }; + + // ************************************************* + + class MarketData : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + MarketData() : Displayable(), + scale("0"), total_assets("0"), number_bids("0"), last_sale_price("0"), + current_bid("0"), current_ask("0"), + volume_trades("0"), volume_assets("0"), volume_currency("0"), + recent_highest_bid("0"), recent_lowest_ask("0") + { m_Type = "MarketData"; } + + public: + virtual ~MarketData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_id; + std::string market_id; + + std::string asset_type_id; + std::string currency_type_id; + + std::string scale; // the Market scale. (A trade in any particular asset is measured in X units of SCALE.) + // IOW, if the scale is 5000 on the gold market, that means "3 units" is 15000 gold + + std::string total_assets; // total amount of assets available on market for purchase. + + std::string number_bids; // number of bids that are currently on the market. + std::string number_asks; // number of asks that are currently on the market. + + std::string last_sale_price; // The price at which the most recent trade occurred on this market. + std::string current_bid; // The highest bid currently on the market. + std::string current_ask; // The lowest ask price currently available on the market. + + std::string volume_trades; // 24-hour period, number of trades. + + std::string volume_assets; // 24-hour volume, amount of assets traded. + std::string volume_currency; // 24-hour volume, amount of currency paid for assets traded. + + std::string recent_highest_bid; // in a 24hour period, the highest bid to hit the market. + std::string recent_lowest_ask; // in a 24hour period, the lowest ask to hit the market. + + DEFINE_OT_DYNAMIC_CAST(MarketData) + }; + + // ------------------------------------------------------ + + class MarketList : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + MarketList() : Storable() { m_Type = "MarketList"; } + + public: + virtual ~MarketList() {} + + DECLARE_GET_ADD_REMOVE(MarketData); + + DEFINE_OT_DYNAMIC_CAST(MarketList) + }; + + + // ****************************************************** + + class OfferDataMarket : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferDataMarket() : Displayable(), + transaction_id("0"), price_per_scale("1"), available_assets("0"), minimum_increment("1") + { m_Type = "OfferDataMarket"; } + + public: + virtual ~OfferDataMarket() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; + std::string price_per_scale; + +// uint64_t total_assets; +// uint64_t finished_so_far; + std::string available_assets; + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + std::string minimum_increment; + + DEFINE_OT_DYNAMIC_CAST(OfferDataMarket) + }; + + // ------------------------------------------------------ + + class BidData : public OfferDataMarket + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BidData() : OfferDataMarket() + { m_Type = "BidData"; } + + public: + virtual ~BidData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using OfferDataMarket::transaction_id; + using OfferDataMarket::price_per_scale; + using OfferDataMarket::available_assets; + using OfferDataMarket::minimum_increment; + + DEFINE_OT_DYNAMIC_CAST(BidData) + }; + + // ------------------------------------------------------ + + class AskData : public OfferDataMarket + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + AskData() : OfferDataMarket() + { m_Type = "AskData"; } + + public: + virtual ~AskData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using OfferDataMarket::transaction_id; + using OfferDataMarket::price_per_scale; + using OfferDataMarket::available_assets; + using OfferDataMarket::minimum_increment; + + DEFINE_OT_DYNAMIC_CAST(AskData) + }; + + // ------------------------------------------------------ + + class OfferListMarket : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferListMarket() : Storable() { m_Type = "OfferListMarket"; } + + public: + virtual ~OfferListMarket() {} + + DECLARE_GET_ADD_REMOVE(BidData); + DECLARE_GET_ADD_REMOVE(AskData); + + DEFINE_OT_DYNAMIC_CAST(OfferListMarket) + }; + + // ****************************************************** + + class TradeDataMarket : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeDataMarket() : Displayable(), + transaction_id("0"), date("0"), + price("0"), amount_sold("0") + { m_Type = "TradeDataMarket"; } + + public: + virtual ~TradeDataMarket() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; // (transaction number for this trade.) + std::string date; // (The date of this trade's execution) + std::string price; // (The price this trade executed at.) + std::string amount_sold; // (Amount of asset sold for that price.) + + DEFINE_OT_DYNAMIC_CAST(TradeDataMarket) + }; + + // ------------------------------------------------------ + + class TradeListMarket : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeListMarket() : Storable() { m_Type = "TradeListMarket"; } + + public: + virtual ~TradeListMarket() {} + + DECLARE_GET_ADD_REMOVE(TradeDataMarket); + + DEFINE_OT_DYNAMIC_CAST(TradeListMarket) + }; + + // ****************************************************** + + class OfferDataNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferDataNym() : Displayable(), + valid_from("0"), valid_to("0"), + selling(false), scale("1"), price_per_scale("1"), + transaction_id("0"), + total_assets("1"), finished_so_far("0"), + minimum_increment("1"), stop_price("0") + { m_Type = "OfferDataNym"; } + + public: + virtual ~OfferDataNym() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string valid_from; + std::string valid_to; + + std::string server_id; + std::string asset_type_id; // the asset type on offer. + std::string asset_acct_id; // the account where the asset is. + std::string currency_type_id; // the currency being used to purchase the asset. + std::string currency_acct_id; // the account where currency is. + + bool selling; // true for ask, false for bid. + + std::string scale; // 1oz market? 100oz market? 10,000oz market? This determines size and granularity. + std::string price_per_scale; + + std::string transaction_id; + + std::string total_assets; + std::string finished_so_far; + + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + std::string minimum_increment; + + std::string stop_sign; // If this is a stop order, this will contain '<' or '>'. + std::string stop_price; // The price at which the stop order activates (less than X or greater than X, based on sign.) + + DEFINE_OT_DYNAMIC_CAST(OfferDataNym) + }; + + // ------------------------------------------------------ + + class OfferListNym : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferListNym() : Storable() { m_Type = "OfferListNym"; } + + public: + virtual ~OfferListNym() {} + + DECLARE_GET_ADD_REMOVE(OfferDataNym); + + DEFINE_OT_DYNAMIC_CAST(OfferListNym) + }; + + // ****************************************************** + + class TradeDataNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeDataNym() : Displayable(), + transaction_id("0"), + completed_count("0"), date("0"), + price("0"), amount_sold("0") + { m_Type = "TradeDataNym"; } + + public: + virtual ~TradeDataNym() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; // (transaction number for this trade.) + + std::string completed_count; // (How many trades have processed for the associated offer? We keep count for each trade.) + std::string date; // (The date of this trade's execution) + std::string price; // (The price this trade executed at.) + std::string amount_sold; // (Amount of asset sold for that price.) + + DEFINE_OT_DYNAMIC_CAST(TradeDataNym) + }; + + // ------------------------------------------------------ + + class TradeListNym : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeListNym() : Storable() { m_Type = "TradeListNym"; } + + public: + virtual ~TradeListNym() {} + + DECLARE_GET_ADD_REMOVE(TradeDataNym); + + DEFINE_OT_DYNAMIC_CAST(TradeListNym) + }; + + // ************************************************* + + // ACCOUNT (GUI local storage about my own accounts, in my wallet.) + + class Acct : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Acct() : Displayable() { m_Type = "Acct"; } + + public: + virtual ~Acct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string acct_id; + std::string server_id; + + DEFINE_OT_DYNAMIC_CAST(Acct) + }; + + // ---------------------------- + + class BitcoinAcct : public Acct + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BitcoinAcct() : Acct() { m_Type = "BitcoinAcct"; } + + public: + virtual ~BitcoinAcct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using Acct::acct_id; + using Acct::server_id; + + std::string bitcoin_acct_name; + + DEFINE_OT_DYNAMIC_CAST(BitcoinAcct) + }; + + // ************************************************** + + // SERVER (GUI local storage about servers.) + + class ServerInfo : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ServerInfo() : Displayable() { m_Type = "ServerInfo"; } + + public: + virtual ~ServerInfo() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_id; + std::string server_type; + + DEFINE_OT_DYNAMIC_CAST(ServerInfo) + }; + + // ---------------------------- + + class Server : public ServerInfo + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Server() : ServerInfo() { m_Type = "Server"; } + + public: + virtual ~Server() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + std::string server_host; + std::string server_port; + + DEFINE_OT_DYNAMIC_CAST(Server) + }; + + // ---------------------------- + + class BitcoinServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BitcoinServer() : Server() { m_Type = "BitcoinServer"; } + + public: + virtual ~BitcoinServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string bitcoin_username; + std::string bitcoin_password; + + DEFINE_OT_DYNAMIC_CAST(BitcoinServer) + }; + + // ---------------------------- + + class RippleServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + RippleServer() : Server() { m_Type = "RippleServer"; } + + public: + virtual ~RippleServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string ripple_username; + std::string ripple_password; + + std::string namefield_id; + std::string passfield_id; + + DEFINE_OT_DYNAMIC_CAST(RippleServer) + }; + + // ---------------------------- + + class LoomServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + LoomServer() : Server() { m_Type = "LoomServer"; } + + public: + virtual ~LoomServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string loom_username; + + std::string namefield_id; + + DEFINE_OT_DYNAMIC_CAST(LoomServer) + }; + + // ---------------------------- + + class ContactNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ContactNym() : Displayable() { m_Type = "ContactNym"; } + + public: + virtual ~ContactNym(); + + using Displayable::gui_label; // The label that appears in the GUI + + std::string nym_type; + std::string nym_id; + std::string public_key; + std::string memo; + + DECLARE_GET_ADD_REMOVE(ServerInfo); + + DEFINE_OT_DYNAMIC_CAST(ContactNym) + }; + + + // ------------------------------------------------ + + class WalletData : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + WalletData() : Storable() { m_Type = "WalletData"; } + + public: + virtual ~WalletData() { std::cout << "WalletData destructor" << std::endl; } + + // List of Bitcoin servers + // List of Bitcoin accounts + // Loom, etc. + + DECLARE_GET_ADD_REMOVE(BitcoinServer); + DECLARE_GET_ADD_REMOVE(BitcoinAcct); + + DECLARE_GET_ADD_REMOVE(RippleServer); + DECLARE_GET_ADD_REMOVE(LoomServer); + + DEFINE_OT_DYNAMIC_CAST(WalletData) + }; + + // ---------------------------- + + class ContactAcct : public Displayable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ContactAcct() : Displayable() { m_Type = "ContactAcct"; } + + public: + virtual ~ContactAcct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_type; + std::string server_id; + std::string asset_type_id; + std::string acct_id; + std::string nym_id; + std::string memo; + std::string public_key; + + DEFINE_OT_DYNAMIC_CAST(ContactAcct) + }; + + // ---------------------------- + + + class Contact : public Displayable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Contact() : Displayable() { m_Type = "Contact"; } + + public: + virtual ~Contact(); + + using Displayable::gui_label; // The label that appears in the GUI + + std::string contact_id; + std::string email; + std::string memo; + std::string public_key; + + DECLARE_GET_ADD_REMOVE(ContactNym); + DECLARE_GET_ADD_REMOVE(ContactAcct); + + DEFINE_OT_DYNAMIC_CAST(Contact) + }; + + // ---------------------------- + + class AddressBook : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + AddressBook() : Storable() { m_Type = "AddressBook"; } + + public: + virtual ~AddressBook(); + + DECLARE_GET_ADD_REMOVE(Contact); + + DEFINE_OT_DYNAMIC_CAST(AddressBook) + }; +} // Namespace OTDB + +// ******************************************************************** + + + + + + + + + +// ******************************************************************************************* +// +// StorageFS -- FILE-SYSTEM Storage Context +// +// +namespace OTDB +{ + // -------------------------------------------------------------------------- + // + // StorageFS means "Storage on Filesystem." + // + // This is the first subclass of OTDB::Storage -- but it won't be the last! + // + class StorageFS : public Storage + { + std::string m_strFullPath; + std::string m_strWalletFile; + + protected: + StorageFS();// You have to use the factory to instantiate (so it can create the Packer also.) + // But from there, however you Init, Store, Query, etc is entirely up to you. + + long ConstructAndConfirmPath(std::string & strOutput, + const std::string& strFolder, const std::string& oneStr="", + const std::string& twoStr="", const std::string& threeStr=""); + + // ********************************************************** + + // If you wish to make your own subclass of OTDB::Storage, then use StorageFS as an example. + // The below 6 methods are the only overrides you need to copy. + // + virtual bool onStorePackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + virtual bool onQueryPackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + virtual bool onStorePlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + virtual bool onQueryPlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + virtual bool onEraseValueByKey(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------------------- + + public: + virtual bool Init(std::string oneStr="", std::string twoStr="", std::string threeStr="", + std::string fourStr="", std::string fiveStr="", std::string sixStr=""); + + // ----------------------------------------- + // See if the file is there. + virtual bool Exists(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // ********************************************************** + + static StorageFS * Instantiate() { return new StorageFS; } + + virtual ~StorageFS(); + + // ----------------------------------------- + // lower level calls. + + bool ConfirmOrCreateFolder(const char * szFolderName, struct stat *pst=NULL); // local to data_folder + bool ConfirmFile(const char * szFileName, struct stat *pst=NULL); // local to data_folder + + const char * GetFullPath() { return m_strFullPath.c_str(); } // path to data_folder + const char * GetWalletFile() { return m_strWalletFile.c_str(); } // wallet filename + + const char * PathSeparator() { return OTLog::PathSeparator(); } // using OTLog for now. + + /* + IN BASE CLASS: + + // ----------------------------------------- + // Store/Retrieve a string. + + bool StoreString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + bool StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryPlainString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Store/Retrieve an object. (Storable.) + + bool StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // Use %newobject OTDB::Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + */ + }; + + // Other storage subclasses may go here, for storing in SQL lite, + // or couchDB, mongoDB, distributed DB, etc... + + // class StorageCouchDB + // class CloudMagic + // class SQL-LITE + // + // Etc. + + // Also, coders using the API should be able to subclass Storage in their own language via SWIG. + +} // namespace OTDB +// ******************************************************************************************* + + + + + + +// IStorable-derived types... +// +// +// BELOW are the SUBCLASSES of the storable objects that actually get INSTANTIATED, +// based on WHICH PACKER is being used. + +// If you are adding a new DATA OBJECT, then you probably want to add lines below +// for EACH of the different packer types (MsgPack, Protocol Buffers, JSON, etc.) +// + +#define OT_USING_ISTORABLE_HOOKS \ + using IStorable::hookBeforePack; \ + using IStorable::hookAfterUnpack + + + + + + + +// ******************************************************************************************* + +// JSON will be the next packer that I add + +#if defined (OTDB_JSON_PACKING) +//#include "JSON - LIBRARY . h" // coming soon. +#endif // defined (OTDB_JSON_PACKING) +// ******************************************************************************************* + + + + + + + +// ******************************************************************************************* +#if defined (OTDB_MESSAGE_PACK) +#include +// +// To declare MsgPack-packed OT objects (IStorableMsgpack): +/* + OT_MSGPACK_BEGIN(BitcoinAcctMsgpack, BitcoinAcct) + MSGPACK_DEFINE(acct_id, server_id, bitcoin_acct_name, gui_label); + OT_MSGPACK_END; + */ +// Where BitcoinAcctMsgpack is the new class being declared (for that packer), +// BitcoinAcct is the OT Data object that it serializes, and where bitcoin_address, +// bitcoin_acct_name, and gui_label are being used as examples for the data members +// being serialized. +// +// DON'T use a semicolon after the first macro. (OT_MSGPACK_BEGIN.) +// But DO put semicolons after the MSGPACK_DEFINE and OT_MSGPACK_END macros. +// +// The idea is that the data members themselves (in the above example, +// bitcoin_address, bitcoin_acct_name, and gui_label) are actually implemented +// by BitcoinAcct (the base), and any other packer library could similarly +// be subclassing that base as we are here with BitcoinAcctMsgPack. +// +// To cap it all off, MsgPack-specific functionality (which we may also need +// in 30 other MsgPack classes like BitcoinServerMsgpack, LoomAcctMsgpack, +// etc) can be added to all of the msgPack objects via the IStorableMsgpack +// interface, even though they all have different base classes (oriented around +// their data, and not their packing.) +// + + +// ---------------------------------------------- +#define OT_MSGPACK_BEGIN(theType, theBaseType, theObjectType) \ +class theType : public theBaseType, implements IStorableMsgpack \ +{ \ +protected: \ + std::string m_Type; \ +public: \ + static Storable * Instantiate() { return dynamic_cast(new theType); } \ +\ + theType() : theBaseType(), IStorableMsgpack() { m_Type = StoredObjectTypeStrings[static_cast(theObjectType)]; m_Type += "Msgpack"; \ + } \ +\ + theType(const theType & rhs) : theBaseType(), IStorableMsgpack() { m_Type = StoredObjectTypeStrings[static_cast(theObjectType)]; m_Type += "Msgpack"; \ + (const_cast(rhs)).CopyToObject(const_cast(*this)); } \ +\ + void CopyToObject(theType & theNewStorable) const { \ + OTPacker * pPacker = OTPacker::Create(PACK_MESSAGE_PACK); \ + OT_ASSERT(NULL != pPacker); PackedBuffer * pBuffer = pPacker->Pack(const_cast(*this)); \ + OT_ASSERT(NULL != pBuffer); \ + OT_ASSERT(pPacker->Unpack(*pBuffer, theNewStorable)); delete pPacker; delete pBuffer; } \ +\ + theType & operator=(const theType & rhs) { \ + const_cast(rhs).CopyToObject(const_cast(*this)); \ + return *this; } \ +\ + virtual theBaseType *clone(void) const { \ + return dynamic_cast(do_clone()); } \ +\ + IStorable * do_clone(void) const { Storable * pNewStorable = Storable::Create(theObjectType, PACK_MESSAGE_PACK); \ + OT_ASSERT(NULL != pNewStorable); (const_cast(*this)).CopyToObject(dynamic_cast(*pNewStorable)); \ + return dynamic_cast(pNewStorable); } \ +\ +virtual ~theType() { } \ + virtual bool PerformPack(BufferMsgpack& theBuffer) { msgpack::pack(theBuffer.GetBuffer(), *this); return true; } \ + virtual bool PerformUnpack(BufferMsgpack& theBuffer) { msgpack::zone z; msgpack::object obj; msgpack::unpack_return ret = \ + msgpack::unpack(theBuffer.GetBuffer().data(), theBuffer.GetBuffer().size(), NULL, &z, &obj); if (msgpack::UNPACK_SUCCESS == ret) \ + { obj.convert(const_cast(this)); return true; } return false; } + +#define OT_MSGPACK_END } + +// ----- Next go these: +// OT_USING_ISTORABLE_HOOKS; +// MSGPACK_DEFINE(gui_label, server_id, server_type, asset_type_id, acct_id, nym_id, memo, public_key); + +// ----- Sometimes looks more like this: +// virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) +// virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) +// std::deque deque_BitcoinServers; +// std::deque deque_BitcoinAccts; +// MSGPACK_DEFINE(deque_BitcoinServers, deque_BitcoinAccts); + +// ----------------------------------------------------------- +// This part is commented out. Why? Because I think it's unnecessary. Operator= is not inherited. +// That means when I copy these objects, only the WalletDataMsgpack data members are being copied, +// not the + +// Deprecated: +// !!!!! This bottom part MUST be directly before the OT_MSGPACK_END!!!!!!!!! +// Notice I declare an op=, so the compiler won't define a default one. Why? +// Because the default one will call the base class op= as well, and copy over the +// pointer lists that are in the data portion. (I don't want that.) I want to only copy +// the basic members and the deques, NOT the pointers. So I declare op= and do so. +// NO semicolon after this one... +/* + #define OT_MSGPACK_BEGIN_SWAP(theType) \ + public: \ + theType & operator=(theType rhs) { \ + this->swap(rhs); \ + return *this; \ + } \ + void swap (theType & rhs) { + + // semicolon after this one. + #define OT_MSGPACK_SWAP_MEMBER(theMember) \ + std::swap(theMember, rhs.theMember) + + */ +// +// You put the actual assignments in like this: +// OT_MSGPACK_SWAP_MEMBER(theMember); +// OT_MSGPACK_SWAP_MEMBER(theMember); +// OT_MSGPACK_SWAP_MEMBER(theMember); + + +// Finishing with this, and semicolon after. +//#define OT_MSGPACK_END } } + + + +// ---------------------------------------------- + + +namespace OTDB +{ + class BufferMsgpack; + + // Interface: IStorableMsgpack + // + DeclareBasedInterface(IStorableMsgpack, IStorable) + virtual bool onPack(PackedBuffer& theBuffer, Storable& inObj); + virtual bool onUnpack(PackedBuffer& theBuffer, Storable& outObj); + virtual bool PerformPack(BufferMsgpack& theBuffer) = 0; + virtual bool PerformUnpack(BufferMsgpack& theBuffer) = 0; + OT_USING_ISTORABLE_HOOKS; + EndInterface + + + // --------------------------------- + // BUFFER for MsgPack. + // + // typedef PackedBufferSubclass BufferMsgpack; + DECLARE_PACKED_BUFFER_SUBCLASS(BufferMsgpack, PackerSubclass, IStorableMsgpack, msgpack::sbuffer); + + // --------------- + // Msgpack packer. + // + typedef PackerSubclass PackerMsgpack; + + // ------------------------------------------------------- + + + // Do NOT use a semicolon after the first macro. (OT_MSGPACK_BEGIN.) + // DO put a semicolon after the MSGPACK_DEFINE macro. + // DO put a semicolon after the OT_MSGPACK_END macro. + + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(BlobMsgpack, Blob, STORED_OBJ_BLOB) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(m_memBuffer); +// OT_MSGPACK_BEGIN_SWAP(BlobMsgpack) +// OT_MSGPACK_SWAP_MEMBER(m_memBuffer); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(StringMsgpack, OTDBString, STORED_OBJ_STRING) + StringMsgpack(const std::string& rhs) : OTDBString(rhs), IStorableMsgpack() { } + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(m_string); +// OT_MSGPACK_BEGIN_SWAP(StringMsgpack) +// OT_MSGPACK_SWAP_MEMBER(m_string); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(StringMapMsgpack, StringMap, STORED_OBJ_STRING_MAP) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(the_map); +// OT_MSGPACK_BEGIN_SWAP(StringMapMsgpack) +// OT_MSGPACK_SWAP_MEMBER(the_map); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(ServerInfoMsgpack, ServerInfo, STORED_OBJ_SERVER_INFO) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, server_type); +// OT_MSGPACK_BEGIN_SWAP(ServerInfoMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(server_type); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(BitcoinAcctMsgpack, BitcoinAcct, STORED_OBJ_BITCOIN_ACCT) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, acct_id, server_id, bitcoin_acct_name); +// OT_MSGPACK_BEGIN_SWAP(BitcoinAcctMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(acct_id); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(bitcoin_acct_name); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(BitcoinServerMsgpack, BitcoinServer, STORED_OBJ_BITCOIN_SERVER) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, server_type, server_host, server_port, bitcoin_username, bitcoin_password); +// OT_MSGPACK_BEGIN_SWAP(BitcoinServerMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(server_type); +// OT_MSGPACK_SWAP_MEMBER(server_host); +// OT_MSGPACK_SWAP_MEMBER(server_port); +// OT_MSGPACK_SWAP_MEMBER(bitcoin_username); +// OT_MSGPACK_SWAP_MEMBER(bitcoin_password); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(RippleServerMsgpack, RippleServer, STORED_OBJ_RIPPLE_SERVER) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, server_type, server_host, server_port, ripple_username, ripple_password, namefield_id, passfield_id); +// OT_MSGPACK_BEGIN_SWAP(RippleServerMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(server_type); +// OT_MSGPACK_SWAP_MEMBER(server_host); +// OT_MSGPACK_SWAP_MEMBER(server_port); +// OT_MSGPACK_SWAP_MEMBER(ripple_username); +// OT_MSGPACK_SWAP_MEMBER(ripple_password); +// OT_MSGPACK_SWAP_MEMBER(namefield_id); +// OT_MSGPACK_SWAP_MEMBER(passfield_id); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(LoomServerMsgpack, LoomServer, STORED_OBJ_LOOM_SERVER) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, server_type, server_host, server_port, loom_username, namefield_id); +// OT_MSGPACK_BEGIN_SWAP(LoomServerMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(server_type); +// OT_MSGPACK_SWAP_MEMBER(server_host); +// OT_MSGPACK_SWAP_MEMBER(server_port); +// OT_MSGPACK_SWAP_MEMBER(loom_username); +// OT_MSGPACK_SWAP_MEMBER(namefield_id); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(ContactAcctMsgpack, ContactAcct, STORED_OBJ_CONTACT_ACCT) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, server_type, asset_type_id, acct_id, nym_id, memo, public_key); +// OT_MSGPACK_BEGIN_SWAP(ContactAcctMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(server_id); +// OT_MSGPACK_SWAP_MEMBER(server_type); +// OT_MSGPACK_SWAP_MEMBER(asset_type_id); +// OT_MSGPACK_SWAP_MEMBER(acct_id); +// OT_MSGPACK_SWAP_MEMBER(nym_id); +// OT_MSGPACK_SWAP_MEMBER(memo); +// OT_MSGPACK_SWAP_MEMBER(public_key); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(ContactNymMsgpack, ContactNym, STORED_OBJ_CONTACT_NYM) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_ServerInfos; + MSGPACK_DEFINE(gui_label, nym_id, nym_type, public_key, memo, deque_ServerInfos); +// OT_MSGPACK_BEGIN_SWAP(ContactNymMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(nym_id); +// OT_MSGPACK_SWAP_MEMBER(nym_type); +// OT_MSGPACK_SWAP_MEMBER(public_key); +// OT_MSGPACK_SWAP_MEMBER(memo); +// OT_MSGPACK_SWAP_MEMBER(deque_ServerInfos); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(ContactMsgpack, Contact, STORED_OBJ_CONTACT) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Nyms; + std::deque deque_Accounts; + MSGPACK_DEFINE(gui_label, contact_id, email, public_key, memo, deque_Nyms, deque_Accounts); +// OT_MSGPACK_BEGIN_SWAP(ContactMsgpack) +// OT_MSGPACK_SWAP_MEMBER(gui_label); +// OT_MSGPACK_SWAP_MEMBER(contact_id); +// OT_MSGPACK_SWAP_MEMBER(email); +// OT_MSGPACK_SWAP_MEMBER(public_key); +// OT_MSGPACK_SWAP_MEMBER(memo); +// OT_MSGPACK_SWAP_MEMBER(deque_Nyms); +// OT_MSGPACK_SWAP_MEMBER(deque_Accounts); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(AddressBookMsgpack, AddressBook, STORED_OBJ_ADDRESS_BOOK) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Contacts; + MSGPACK_DEFINE(deque_Contacts); +// OT_MSGPACK_BEGIN_SWAP(AddressBookMsgpack) +// OT_MSGPACK_SWAP_MEMBER(deque_Contacts); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(WalletDataMsgpack, WalletData, STORED_OBJ_WALLET_DATA) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_BitcoinServers; + std::deque deque_BitcoinAccts; + std::deque deque_RippleServers; + std::deque deque_LoomServers; + MSGPACK_DEFINE(deque_BitcoinServers, deque_BitcoinAccts, deque_RippleServers, deque_LoomServers); +// OT_MSGPACK_BEGIN_SWAP(WalletDataMsgpack) +// OT_MSGPACK_SWAP_MEMBER(deque_BitcoinServers); +// OT_MSGPACK_SWAP_MEMBER(deque_BitcoinAccts); +// OT_MSGPACK_SWAP_MEMBER(deque_RippleServers); +// OT_MSGPACK_SWAP_MEMBER(deque_LoomServers); + OT_MSGPACK_END; + // ------------------------------------------------------- + + // You might ask, why did I code the "copy and swap" idiom above, and then comment it out? + // Because I'm now storing smart pointers instead of regular pointers, in the lists of the + // objects above. Therefore I'm not so worried about the copy constructor, operator=, etc. + // The deques will copy over exactly, and the lists will copy the smart pointers, so I don't + // have to worry about the lists double-deleting anymore. + + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(MarketDataMsgpack, MarketData, STORED_OBJ_MARKET_DATA) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, server_id, market_id, asset_type_id, currency_type_id, + scale, total_assets, number_bids, number_asks, + last_sale_price, current_bid, current_ask, + volume_trades, volume_assets, volume_currency, + recent_highest_bid, recent_lowest_ask); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(MarketListMsgpack, MarketList, STORED_OBJ_MARKET_LIST) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Markets; + MSGPACK_DEFINE(deque_Markets); + OT_MSGPACK_END; + // ------------------------------------------------------- + + OT_MSGPACK_BEGIN(BidDataMsgpack, BidData, STORED_OBJ_BID_DATA) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, transaction_id, price_per_scale, available_assets, minimum_increment); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(AskDataMsgpack, AskData, STORED_OBJ_ASK_DATA) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, transaction_id, price_per_scale, available_assets, minimum_increment); + OT_MSGPACK_END; + // ------------------------------------------------------- + + OT_MSGPACK_BEGIN(OfferListMarketMsgpack, OfferListMarket, STORED_OBJ_OFFER_LIST_MARKET) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Bids; + std::deque deque_Asks; + MSGPACK_DEFINE(deque_Bids, deque_Asks); + OT_MSGPACK_END; + // ------------------------------------------------------- + + OT_MSGPACK_BEGIN(TradeDataMarketMsgpack, TradeDataMarket, STORED_OBJ_TRADE_DATA_MARKET) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, transaction_id, date, price, amount_sold); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(TradeListMarketMsgpack, TradeListMarket, STORED_OBJ_TRADE_LIST_MARKET) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Trades; + MSGPACK_DEFINE(deque_Trades); + OT_MSGPACK_END; + // ------------------------------------------------------- + + OT_MSGPACK_BEGIN(OfferDataNymMsgpack, OfferDataNym, STORED_OBJ_OFFER_DATA_NYM) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, valid_from, valid_to, server_id, + asset_type_id, asset_acct_id, + currency_type_id, currency_acct_id, + selling, scale, price_per_scale, transaction_id, + total_assets, finished_so_far, minimum_increment, + stop_sign, stop_price); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(OfferListNymMsgpack, OfferListNym, STORED_OBJ_OFFER_LIST_NYM) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Offers; + MSGPACK_DEFINE(deque_Offers); + OT_MSGPACK_END; + // ------------------------------------------------------- + + OT_MSGPACK_BEGIN(TradeDataNymMsgpack, TradeDataNym, STORED_OBJ_TRADE_DATA_NYM) + OT_USING_ISTORABLE_HOOKS; + MSGPACK_DEFINE(gui_label, transaction_id, completed_count, date, + price, amount_sold); + OT_MSGPACK_END; + // ------------------------------------------------------- + OT_MSGPACK_BEGIN(TradeListNymMsgpack, TradeListNym, STORED_OBJ_TRADE_LIST_NYM) + virtual void hookBeforePack(); // This is called just before packing a storable. (Opportunity to copy values...) + virtual void hookAfterUnpack(); // This is called just after unpacking a storable. (Opportunity to copy values...) + std::deque deque_Trades; + MSGPACK_DEFINE(deque_Trades); + OT_MSGPACK_END; + // ------------------------------------------------------- + +} // namespace OTDB + +#endif // defined (OTDB_MESSAGE_PACK) +// ******************************************************************************************* + + + + + + + + + + + + +// ******************************************************************************************* + +#if defined(OTDB_PROTOCOL_BUFFERS) +#include "Generics.pb.h" +#include "Markets.pb.h" +#include "Bitcoin.pb.h" +#include "Moneychanger.pb.h" +// To make subclasses of the various data objects (for Protocol Buffers): +// +// typedef ProtobufSubclass theType; +// +// Also, REMEMBER for each object type declared, to add the hooks to the CPP file. +// (Instructions are below.) +// +// ---------------------------------------------------- +/* + REPLACING OT_PROTOBUF_DECLARE() WITH A TEMPLATE FOR NOW... + + #define OT_PROTOBUF_DECLARE(theType, theBaseType, theInternalType) \ + class theType : public theBaseType, implements IStorablePB \ + { \ +private: \ + theInternalType __pb_obj; \ + protected: \ + theType() : theBaseType() { } \ + public: \ + ::google::protobuf::Message & getPBMessage() { return dynamic_cast<::google::protobuf::Message>(__pb_obj); } \ + static Storable * Instantiate() { return dynamic_cast(new theType()); } \ + virtual ~theType() { } \ + virtual void hookBeforePack(); \ + virtual void hookAfterUnpack(); \ + } + // OT_PROTOBUF_DECLARE(BitcoinAcctPB, BitcoinAcct, BitcoinAcct_InternalPB); + // OT_PROTOBUF_DECLARE(BitcoinServerPB, BitcoinServer, BitcoinServer_InternalPB); + + + + #define DECLARE_PACKED_BUFFER_SUBCLASS(theNewType, thePackerType, theInterfaceType, theInternalType) \ + class theNewType : public PackedBuffer \ + { \ + friend class thePackerType; \ + friend Interface theInterfaceType; \ + theInternalType m_buffer; \ + \ + public: \ + theNewType() : PackedBuffer() {} \ + virtual ~theNewType(); \ + virtual bool PackString(std::string& theString); \ + virtual bool UnpackString(std::string& theString); \ + virtual bool ReadFromIStream(std::istream &inStream, long lFilesize); \ + virtual bool WriteToOStream(std::ostream &outStream); \ + } + */ + + + + +namespace OTDB +{ + + // Interface: IStorablePB + // + DeclareBasedInterface(IStorablePB, IStorable) + virtual ::google::protobuf::Message * getPBMessage(); + virtual bool onPack(PackedBuffer& theBuffer, Storable& inObj); + virtual bool onUnpack(PackedBuffer& theBuffer, Storable& outObj); + OT_USING_ISTORABLE_HOOKS; + EndInterface + + // ---------------------------------------------------- + // BUFFER for Protocol Buffers. + // Google's protocol buffers serializes to std::strings and streams. How conveeeeeenient. + // + //typedef PackedBufferSubclass BufferPB; + DECLARE_PACKED_BUFFER_SUBCLASS(BufferPB, PackerSubclass, IStorablePB, std::string); + + // --------------- + // Protocol Buffers packer. + // + typedef PackerSubclass PackerPB; + + // ---------------------------------------------------- + // Used for subclassing IStorablePB: + // + template + class ProtobufSubclass : public theBaseType, implements IStorablePB + { + private: + theInternalType __pb_obj; + std::string m_Type; + public: + static Storable * Instantiate() + { return dynamic_cast(new ProtobufSubclass); } + + ProtobufSubclass() : theBaseType(), IStorablePB() { m_Type = StoredObjectTypeStrings[static_cast(theObjectType)]; m_Type += "PB"; + /*std::cout << m_Type.c_str() << " -- Constructor" << std::endl;*/ } + + ProtobufSubclass(const ProtobufSubclass & rhs) : theBaseType(), IStorablePB() + { m_Type = StoredObjectTypeStrings[static_cast(theObjectType)]; m_Type += "PB"; + /*std::cout << m_Type.c_str() << " -- Copy Constructor" << std::endl; */ rhs.CopyToObject(*this); } + + ProtobufSubclass & + operator= (const ProtobufSubclass & rhs) + { rhs.CopyToObject(*this); return *this; } + + void CopyToObject(ProtobufSubclass & theNewStorable) const + { OTPacker * pPacker = OTPacker::Create(PACK_PROTOCOL_BUFFERS); + const OTDB::Storable * pIntermediate = dynamic_cast(this); + OT_ASSERT(NULL != pPacker); PackedBuffer * pBuffer = pPacker->Pack(*(const_cast(pIntermediate))); OT_ASSERT(NULL != pBuffer); + OT_ASSERT(pPacker->Unpack(*pBuffer, theNewStorable)); delete pPacker; delete pBuffer; } + + virtual ::google::protobuf::Message * getPBMessage(); + +// IStorable * clone(void) const +// {return dynamic_cast(new ProtobufSubclass(*this));} + + virtual theBaseType * clone(void) const + { /*std::cout << "Cloning a " << m_Type.c_str() << std::endl;*/ return dynamic_cast(do_clone()); } + + IStorable * do_clone(void) const + { Storable * pNewStorable = Storable::Create(theObjectType, PACK_PROTOCOL_BUFFERS); + OT_ASSERT(NULL != pNewStorable); CopyToObject(*(dynamic_cast< ProtobufSubclass * > (pNewStorable))); return dynamic_cast(pNewStorable);} + + virtual ~ProtobufSubclass() { } + OT_USING_ISTORABLE_HOOKS; + virtual void hookBeforePack(); // <=== Implement this if you subclass. + virtual void hookAfterUnpack(); // <=== Implement this if you subclass. + }; + + +#define DECLARE_PROTOBUF_SUBCLASS(theBaseType, theInternalType, theNewType, theObjectType) \ + template<> void ProtobufSubclass::hookBeforePack(); \ + template<> void ProtobufSubclass::hookAfterUnpack(); \ + typedef ProtobufSubclass theNewType + + // --------------------------------------------- + // THE ACTUAL SUBCLASSES: + + DECLARE_PROTOBUF_SUBCLASS(OTDBString, String_InternalPB, StringPB, STORED_OBJ_STRING); + DECLARE_PROTOBUF_SUBCLASS(Blob, Blob_InternalPB, BlobPB, STORED_OBJ_BLOB); + DECLARE_PROTOBUF_SUBCLASS(StringMap, StringMap_InternalPB, StringMapPB, STORED_OBJ_STRING_MAP); + DECLARE_PROTOBUF_SUBCLASS(BitcoinAcct, BitcoinAcct_InternalPB, BitcoinAcctPB, STORED_OBJ_BITCOIN_ACCT); + DECLARE_PROTOBUF_SUBCLASS(BitcoinServer,BitcoinServer_InternalPB, BitcoinServerPB, STORED_OBJ_BITCOIN_SERVER); + DECLARE_PROTOBUF_SUBCLASS(RippleServer, RippleServer_InternalPB, RippleServerPB, STORED_OBJ_RIPPLE_SERVER); + DECLARE_PROTOBUF_SUBCLASS(LoomServer, LoomServer_InternalPB, LoomServerPB, STORED_OBJ_LOOM_SERVER); + DECLARE_PROTOBUF_SUBCLASS(ServerInfo, ServerInfo_InternalPB, ServerInfoPB, STORED_OBJ_SERVER_INFO); + DECLARE_PROTOBUF_SUBCLASS(ContactAcct, ContactAcct_InternalPB, ContactAcctPB, STORED_OBJ_CONTACT_ACCT); + DECLARE_PROTOBUF_SUBCLASS(ContactNym, ContactNym_InternalPB, ContactNymPB, STORED_OBJ_CONTACT_NYM); + DECLARE_PROTOBUF_SUBCLASS(Contact, Contact_InternalPB, ContactPB, STORED_OBJ_CONTACT); + DECLARE_PROTOBUF_SUBCLASS(AddressBook, AddressBook_InternalPB, AddressBookPB, STORED_OBJ_ADDRESS_BOOK); + DECLARE_PROTOBUF_SUBCLASS(WalletData, WalletData_InternalPB, WalletDataPB, STORED_OBJ_WALLET_DATA); + DECLARE_PROTOBUF_SUBCLASS(MarketData, MarketData_InternalPB, MarketDataPB, STORED_OBJ_MARKET_DATA); + DECLARE_PROTOBUF_SUBCLASS(MarketList, MarketList_InternalPB, MarketListPB, STORED_OBJ_MARKET_LIST); + + DECLARE_PROTOBUF_SUBCLASS(BidData, OfferDataMarket_InternalPB, BidDataPB, STORED_OBJ_BID_DATA); + DECLARE_PROTOBUF_SUBCLASS(AskData, OfferDataMarket_InternalPB, AskDataPB, STORED_OBJ_ASK_DATA); + DECLARE_PROTOBUF_SUBCLASS(OfferListMarket, OfferListMarket_InternalPB, OfferListMarketPB, STORED_OBJ_OFFER_LIST_MARKET); + DECLARE_PROTOBUF_SUBCLASS(TradeDataMarket, TradeDataMarket_InternalPB, TradeDataMarketPB, STORED_OBJ_TRADE_DATA_MARKET); + DECLARE_PROTOBUF_SUBCLASS(TradeListMarket, TradeListMarket_InternalPB, TradeListMarketPB, STORED_OBJ_TRADE_LIST_MARKET); + DECLARE_PROTOBUF_SUBCLASS(OfferDataNym, OfferDataNym_InternalPB, OfferDataNymPB, STORED_OBJ_OFFER_DATA_NYM); + DECLARE_PROTOBUF_SUBCLASS(OfferListNym, OfferListNym_InternalPB, OfferListNymPB, STORED_OBJ_OFFER_LIST_NYM); + DECLARE_PROTOBUF_SUBCLASS(TradeDataNym, TradeDataNym_InternalPB, TradeDataNymPB, STORED_OBJ_TRADE_DATA_NYM); + DECLARE_PROTOBUF_SUBCLASS(TradeListNym, TradeListNym_InternalPB, TradeListNymPB, STORED_OBJ_TRADE_LIST_NYM); + + typedef OfferDataMarket_InternalPB BidData_InternalPB; + typedef OfferDataMarket_InternalPB AskData_InternalPB; + + // !! ALL OF THESE have to provide implementations for hookBeforePack() and hookAfterUnpack(). + // In .cpp file: + /* + void SUBCLASS_HERE::hookBeforePack() + { + __pb_obj.set_PROPERTY_NAME_GOES_HERE(PROPERTY_NAME_GOES_HERE); + } + void SUBCLASS_HERE::hookAfterUnpack() + { + PROPERTY_NAME_GOES_HERE = __pb_obj.PROPERTY_NAME_GOES_HERE(); + } + */ + + + +} // namespace OTDB + +#endif // defined(OTDB_PROTOCOL_BUFFERS) +// ******************************************************************************************* + + + + + + + + + +#endif // __OT_STORAGE_H__ + + + + + + + + + + + diff --git a/OTLib/OTString.cpp b/OTLib/OTString.cpp new file mode 100644 index 000000000..33f1124a1 --- /dev/null +++ b/OTLib/OTString.cpp @@ -0,0 +1,1109 @@ +/************************************************************************************ + * + * OTString.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#include +#include +#include // The C one +#include +#include + +#include // The C++ one +#include // The C++ one + +#include +#include + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTIdentifier.h" +#include "OTContract.h" +#include "OTPseudonym.h" +#include "OTLog.h" + + + +// TODO Make sure I follow this advice. + +/* + + +It is not wise to use the ANSI standard strcpy function because of the possibility of +unchecked buffer overflows. The better strncpy function has the problem that it does not +properly terminate the string. The following strlcpy and strlcat functions are simple +implementations that manage the problems of their original ANSI ancestors. + +// #include + +size_t strlcpy(char *d, const char *s, size_t bufsize) +{ + size_t len; + size_t ret; + + if (!d || !s) return 0; + len = strlen(s); + ret = len; + if (bufsize <= 0) return 0; + if (len >= bufsize) len = bufsize-1; + memcpy(d, s, len); + d[len] = 0; + + return ret; +} + +size_t strlcat(char *d, const char *s, size_t bufsize) +{ + size_t len1; + size_t len2; + size_t ret; + + if (!d || !s || bufsize <= 0) return 0; + + len1 = strlen(d); + len2 = strlen(s); + ret = len1 + len2; + if (len1+len2 >= bufsize) + { + len2 = bufsize - (len1+1); + } + if (len2 > 0) + { + memcpy(d+len1, s, len2); + d[len1+len2] = 0; + } + return ret; +} + + + */ + + + + + +// ------ I cannot vouch for these top four functions, I wrote them so long ago. +// ------ But they can't hurt and I don't think they're being used anyway so I left them in for now. +// +bool OTString::operator >(const OTString &s2) const +{ + if(s2.m_lLength == 0) { + return(true); + } + if(m_lLength == 0) { + return(false); + } + if(strcmp(m_strBuffer, s2.m_strBuffer) <= 0) { + return(false); + } + return(true); +} + +bool OTString::operator <(const OTString &s2) const +{ + if(m_lLength == 0) { + return(true); + } + if(s2.m_lLength == 0) { + return(false); + } + if(strcmp(m_strBuffer, s2.m_strBuffer) >= 0) { + return(false); + } + return(true); +} + +bool OTString::operator <=(const OTString &s2) const +{ + if(m_lLength == 0) { + return(true); + } + if(s2.m_lLength == 0) { + return(false); + } + if(strcmp(m_strBuffer, s2.m_strBuffer) > 0) { + return(false); + } + return(true); +} + +bool OTString::operator >=(const OTString &s2) const +{ + if(s2.m_lLength == 0) { + return(true); + } + if(m_lLength == 0) { + return(false); + } + if(strcmp(m_strBuffer, s2.m_strBuffer) < 0) { + return(false); + } + return(true); +} + + +void fwrite_string(std::ostream & ofs, const char *str) +{ + char * pchar; + + pchar = (char *)str; + + if(str) + while(*pchar) { + if(*pchar != '\r') + ofs << *pchar; + pchar++; + } +} + +/* +void fwrite_string(FILE *fl, const char *str) +{ + char * pchar; + + pchar = (char *)str; + + if(str) + while(*pchar) { + if(*pchar != '\r') + fputc(*pchar, fl); + pchar++; + } +} +*/ + + +// ***** Construction -- Destruction ***** ------------------------------ +OTString::~OTString() +{ + Release(); +} + +void OTString::Initialize() +{ + m_lLength = 0; + m_lPosition = 0; + m_strBuffer = NULL; +} + + +OTString::OTString() : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); +} + +// This constructor gets the string version of the ID passed in, +// and sets that string on this object. (For when you need a string +// version of an ID.) +OTString::OTString(const OTIdentifier & theValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + + if (theValue.GetSize() > 0) + theValue.GetString(*this); +} + +OTString::OTString(const OTContract & theValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + + ((OTContract &)theValue).SaveContract(*this); +} + + + +// This version base64-DECODES the ascii-armored string passed in, +// and then sets the decoded plaintext string onto this object. +OTString::OTString(const OTASCIIArmor & strValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + + if (strValue.Exists()) + strValue.GetString(*this); +} + +// This version base64-DECODES the ascii-armored signature that's passed in, +// and then sets the decoded plaintext signature onto this object. +// You would only do this when the signature, decoded, is normally in ASII +// form. Actually, that is regularly NOT the case--signatures are usually in +// binary form. +// But Lucre signatures, as used in this library, ARE in text form, so I +// provided this constructor to easily base64-decode them to prepare for +// loading into a bio and then a Lucre object. +OTString::OTString(const OTSignature & strValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + + if (strValue.Exists()) + strValue.GetString(*this); +} + + +OTString::OTString(OTPseudonym & theValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + + theValue.SavePseudonym(*this); +} + +OTString::OTString(const OTString & strValue) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + LowLevelSetStr(strValue); +} + +OTString::OTString(const char * new_string) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + LowLevelSet(new_string, 0); +} + +OTString::OTString(const char * new_string, size_t sizeLength) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + LowLevelSet(new_string, sizeLength); +} + +OTString::OTString(const std::string& new_string) : m_lLength(0), m_lPosition(0), m_strBuffer(NULL) +{ +// Initialize(); + LowLevelSet(new_string.c_str(), new_string.length()); +} + +void OTString::Release(void) +{ + if (NULL != m_strBuffer) + { + // for security purposes. + memset(m_strBuffer, 0, m_lLength); + delete [] m_strBuffer; + } + m_strBuffer = NULL; + m_lPosition = 0; + m_lLength = 0; +} + +#ifndef linux +size_t strnlen(const char *s, size_t max) +{ + register const char *p; + for(p = s; *p && max--; ++p); + return(p - s); +} +#endif + + + +// If 10 is passed in, then 11 will be allocated, +// then the data is copied, and then the result[10] (11th element) +// is set to 0. This way the original 10-length string is untouched. +// +char *str_dup2(const char *str, uint32_t length) +{ + char * str_new = new char [length + 1]; // CREATE EXTRA BYTE OF SPACE FOR \0 (NOT PART OF LENGTH) + + OT_ASSERT(NULL != str_new); + +#ifdef _WIN32 + strncpy_s(str_new, length+1, str, length); +#else + strncpy(str_new, str, length); +#endif + + // INITIALIZE EXTRA BYTE OF SPACE + // + // If length is 10, then buffer is created with 11 elements, + // indexed from 0 (first element) through 10 (11th element). + // + // Therefore str_new[length==10] is the 11th element, which was + // the extra one created on our buffer, to store the \0 null terminator. + // + // This way I know I'm never cutting off data that was in the string itself. + // Rather, I am only setting to 0 an EXTRA byte that I created myself, AFTER + // the string's length itself. + // + str_new[length] = '\0'; + + return str_new; +} + +void OTString::LowLevelSetStr(const OTString & strBuf) +{ + OT_ASSERT(NULL == m_strBuffer); // otherwise memory leak. + + if (strBuf.Exists()) + { + m_lLength = (MAX_STRING_LENGTH > strBuf.m_lLength) ? + strBuf.m_lLength + : + (MAX_STRING_LENGTH-1); + + m_strBuffer = str_dup2(strBuf.m_strBuffer, m_lLength); + } +} + + +void OTString::LowLevelSet(const char * new_string, uint32_t nEnforcedMaxLength) +{ + OT_ASSERT(NULL == m_strBuffer); // otherwise memory leak. + + if (NULL != new_string) + { + uint32_t nLength = (nEnforcedMaxLength > 0) ? + strnlen(new_string, nEnforcedMaxLength) + : + strnlen(new_string, MAX_STRING_LENGTH-1); + + // don't bother allocating memory for a 0 length string. + if (0 == nLength) + return; + + m_strBuffer = str_dup2(new_string, nLength); + + if (NULL != m_strBuffer) + m_lLength = nLength; + else + m_lLength = 0; + } +} + + +OTString& OTString::operator=(OTString rhs) +{ + this->swap(rhs); + return *this; +} + +void OTString::swap(OTString & rhs) +{ + std::swap(m_lLength, rhs.m_lLength); + std::swap(m_lPosition, rhs.m_lPosition); + std::swap(m_strBuffer, rhs.m_strBuffer); +} + +bool OTString::At(uint32_t lIndex, char &c) +{ + if (lIndex < m_lLength) + { + c = m_strBuffer[lIndex]; + return true; + } + else + return false; +} + +bool OTString::Exists(void) const +{ + return (NULL != m_strBuffer) ? true : false; +} + +uint32_t OTString::GetLength(void) const +{ + return m_lLength; +} + +const char * OTString::Get(void) const +{ + return (NULL != m_strBuffer) ? const_cast(m_strBuffer) : ""; +} + + + +// new_string MUST be at least nEnforcedMaxLength in size if nEnforcedMaxLength is passed in at all. +// That's because this function forces the null terminator at that length of the string minus 1. + +void OTString::Set(const char * new_string, uint32_t nEnforcedMaxLength/*=0*/) +{ + Release(); + + if (NULL == new_string) + return; + + LowLevelSet(new_string, nEnforcedMaxLength); +} + + +void OTString::Set(const OTString & strBuf) +{ + Release(); + + LowLevelSetStr(strBuf); +} + + +/* +OTString& OTString::operator=(const char * new_string) +{ + OTString strTemp(new_string); + + this->swap(strTemp); + return *this; +} +*/ + +/* +OTString& OTString::operator=(const std::string & strValue) +{ + OTString strTemp(strValue.c_str()); + + this->swap(strTemp); + return *this; +} +*/ + + +// +bool OTString::operator ==(const OTString &s2) const +{ + // If they are not the same length, return false + if (m_lLength != s2.m_lLength) { + return(false); + } + + // At this point we know they are at least the same length. + // Next--are they both 0? If they are both 0, return true + if (m_lLength == 0 && s2.m_lLength == 0) { + return(true); + } + + // At this point we have 2 identical-length strings. + // Now we call strcmp and convert it to true or false. + if (strcmp(m_strBuffer, s2.m_strBuffer) == 0) { // TODO security: use a replacement for strcmp. + return(true); + } + return(false); +} + + +// ***** Operations ***** ------------------------------ + +// Compare is simple. True if they match, False if they don't match. +bool OTString::Compare(const char * strCompare) const +{ + if (NULL == m_strBuffer || NULL == strCompare) { + return false; + } + + char * s1 = m_strBuffer; + char * s2 = (char*)strCompare; + + for( ; *s1 && *s2; s1++, s2++) + if(*s1 != *s2) + return false; + + if(*s1 != *s2) + return false; + + return true; +} + +bool OTString::Compare(const OTString& strCompare) const +{ + if (NULL == m_strBuffer || !strCompare.Exists()) { + return false; + } + + char * s1 = m_strBuffer; + const char * s2 = strCompare.Get(); + + for( ; *s1 && *s1 != ' '; s1++, s2++) + if(*s1 != *s2) + return false; + + return true; +} + + +// Contains is like compare. True if the substring is there, false if not. +// I was going to return the position but then I realized I never needed it. +// Should be easy to modify if the need arises. +bool OTString::Contains(const char * strCompare) const +{ + if (NULL == m_strBuffer || NULL == strCompare) + { + return false; + } + + if (strstr(m_strBuffer, strCompare)) + return true; + + return false; +} + +bool OTString::Contains(const OTString& strCompare) const +{ + if (NULL == m_strBuffer || !strCompare.Exists()) + { + return false; + } + + if (strstr(m_strBuffer, strCompare.Get())) + return true; + + return false; +} + + + + + + +void OTString::OTfgets(std::istream & ifs) +{ + // _WIN32 + static char * buffer = NULL; + + if (NULL == buffer) + { + buffer = new char[MAX_STRING_LENGTH]; // This only happens once. Static var. + OT_ASSERT(NULL != buffer); + } + + buffer[0] = '\0'; + // _end _WIN32 + + if (ifs.getline(buffer, MAX_STRING_LENGTH-1)) // delimiter defaults to '\n' + { + buffer[strlen(buffer)] = '\0'; + + Set(buffer); + } +} + +/* +void OTString::OTfgets(FILE * fl) +{ + // _WIN32 + static char * buffer = NULL; + + if (NULL == buffer) + { + buffer = new char[MAX_STRING_LENGTH]; // This only happens once. Static var. + } + + buffer[0] = '\0'; + // _end _WIN32 + + + if (fgets(buffer, MAX_STRING_LENGTH-1, fl)) + { + buffer[strlen(buffer)-1] = '\0'; + + Set(buffer); + } +} +*/ + +void OTString::ConvertToLowerCase() +{ + if (m_strBuffer == NULL) { + return; + } + + for(char * s1 = m_strBuffer; *s1; s1++) + *s1 = tolower(*s1); +} + +void OTString::ConvertToUpperCase() +{ + if (m_strBuffer == NULL) { + return; + } + + for(char * s1 = m_strBuffer; *s1; s1++) + *s1 = toupper(*s1); +} + +void OTString::Truncate(uint32_t lAt) +{ + OTString strTruncated; + + strTruncated.Set(this->Get(), lAt); + + this->Set(strTruncated); +} + + +/* + char *str_dup2(const char *str, int length) + { + char *str_new; + + str_new = new char [length + 1]; + + strncpy(str_new, str, length); + + str_new[length] = 0; + + return str_new; + } + */ + + + + +void OTString::Format(const char *arg, ...) +{ + va_list args; + + // _WIN32 + static char * new_string = NULL; + + if (NULL == new_string) + { + new_string = new char[MAX_STRING_LENGTH]; // This only happens once -- static var. + + OT_ASSERT(NULL != new_string); + } + + new_string[0] = '\0'; + // _end _WIN32 + + va_start(args, arg); + +#ifdef _WIN32 + vsprintf_s(new_string, MAX_STRING_LENGTH, arg, args); +#else +// vsprintf(new_string, arg, args); + vsnprintf(new_string, MAX_STRING_LENGTH, arg, args); +#endif + + va_end(args); + + Set(new_string); +} + + +// append a string at the end of the current buffer. +void OTString::Concatenate(const OTString & strBuf) +{ + // _WIN32 + static char * new_string = NULL; + + if (NULL == new_string) + { + new_string = new char[MAX_STRING_LENGTH]; // This only happens once. Static var. + + OT_ASSERT(NULL != new_string); + } + + new_string[0] = '\0'; + // _end _WIN32 + + if (Exists()) +#ifdef _WIN32 + { + const char * pBuf = strBuf.Get(); + sprintf_s(new_string, MAX_STRING_LENGTH, "%s%s", m_strBuffer, pBuf); + } +#else + snprintf(new_string, MAX_STRING_LENGTH, "%s%s", m_strBuffer, strBuf.Get()); +#endif + else +#ifdef _WIN32 + { + const char * pBuf = strBuf.Get(); + strcpy_s(new_string, MAX_STRING_LENGTH, pBuf); + } +#else + strlcpy(new_string, strBuf.Get(), MAX_STRING_LENGTH); +#endif + + Set(new_string); +} + +// append a string at the end of the current buffer. +void OTString::Concatenate(const char *arg, ...) +{ + va_list args; + + // _WIN32 + static char * new_string = NULL; + + if (NULL == new_string) + { + new_string = new char[MAX_STRING_LENGTH]; // only happens once. static var. + + OT_ASSERT(NULL != new_string); + } + + new_string[0] = '\0'; + // _end _WIN32 + + // _WIN32 + static char * arg_string = NULL; + + if (NULL == arg_string) + { + arg_string = new char[MAX_STRING_LENGTH]; // only happens once. static var. + + OT_ASSERT(NULL != arg_string); + } + + arg_string[0] = '\0'; + // _end _WIN32 + + va_start(args, arg); + + +#ifdef _WIN32 + vsprintf_s(arg_string, MAX_STRING_LENGTH, arg, args); +#else +// vsprintf(arg_string, arg, args); + vsnprintf(arg_string, MAX_STRING_LENGTH, arg, args); +#endif + + va_end(args); + + if (Exists()) +#ifdef _WIN32 + sprintf_s(new_string, MAX_STRING_LENGTH, "%s%s", m_strBuffer, arg_string); +#else + snprintf(new_string, MAX_STRING_LENGTH, "%s%s", m_strBuffer, arg_string); +#endif // _WIN32 + else +#ifdef _WIN32 + strcpy_s(new_string, MAX_STRING_LENGTH, arg_string); +#else + strlcpy(new_string, arg_string, MAX_STRING_LENGTH); +#endif // _WIN32 + + + Set(new_string); +} + +// append a string at the end of the current buffer. +/* +void OTString::Concatenate(const char *arg_string) +{ + char new_string[MAX_STRING_LENGTH]; + + if (Exists()) + snprintf(new_string, MAX_STRING_LENGTH, "%s%s", m_strBuffer, arg_string); + else + strlcpy(new_string, arg_string, MAX_STRING_LENGTH); + + Set(new_string); +} + */ + + + + +void OTString::WriteToFile(std::ostream & ofs) const +{ + fwrite_string(ofs, m_strBuffer); +} + +/* +void OTString::WriteToFile(FILE * fl) const +{ + if (fl != NULL) + fwrite_string(fl, m_strBuffer); +} +*/ + +// ***** Implementation ***** ------------------------------ + + + +// Checks if s2 is the first word in s1. +// s1 ends at the first space character. +// len_cmp("load wallet.xml", "load") returns true +// used for USER INPUT ONLY. And it's sloppy. +bool len_cmp(const char *s1, const char *s2) +{ + for( ; *s1 && *s2 && *s1 != ' '; s1++, s2++) + if(toupper(*s1) != toupper(*s2)) + return false; + + // bug: as long as it's a partial match while the loop continues, + // this function will for example return true even if the user entered + // "c" when the command was "continue" + return true; +} + + +char *str_dup1(const char *str) +{ + char * str_new = new char [strlen(str) + 1]; + + OT_ASSERT(NULL != str_new); + +#ifdef _WIN32 + strcpy_s(str_new, strlen(str), str); +#else + strlcpy(str_new, str, strlen(str)); +#endif + + return str_new; +} + +// true == there are more lines to read. +// false == this is the last line. Like EOF. +bool OTString::sgets(char * szBuffer, unsigned nBufSize) +{ + if (NULL == szBuffer) + { + return false; + } + + if (m_lPosition >= m_lLength) + return false; + + uint32_t lIndex = 0; + char * pChar = (char *)(m_strBuffer + m_lPosition); + + // while *pChar isn't at the end of the source string, + // and lIndex hasn't reached the end of the destination buffer, + while ( 0 != *pChar && lIndex < (nBufSize-1)) // the -1 leaves room for a forced null terminator. + { + // If the current character isn't a newline, then copy it... + if ( '\n' != *pChar ) + { + szBuffer[lIndex] = *pChar; + lIndex++; // increment the buffer + m_lPosition++; // increment the string's internal memory of where it stopped. + pChar++; // increment this for convenience (could calcuate from position) + } + + // Until we reach a newline... + else { + szBuffer[lIndex] = 0; // destination buffer, this is the end of the line for him. + m_lPosition++; // This still moves past the newline, so the next call will get the next + // string. + //lIndex does NOT increment here because we reach the end of this string. + //neither does pChar. These local variables go away since we are returning. + + if (0 == *(pChar+1)) + return false; + else + return true; // there was more to read, but we stopped at the newline. + } + + } + + // Need to add the NULL terminator. + szBuffer[lIndex] = 0; + + // We reached the end of the string. + // EOF. So we return false to tell the caller not to bother calling again. + if (0 == *pChar) + { + return false; + } + + // Obviously if *pChar isn't at the end, then there was more to read, + // but the buffer was full, so we return true. + return true; +} + +char OTString::sgetc(void) +{ + char answer; + + if (m_lPosition >= m_lLength) + return EOF; + + answer = (char)(*(m_strBuffer + m_lPosition)); + + ++m_lPosition; + + return answer; +} + +void OTString::sungetc(void) +{ + --m_lPosition; + + if(m_lPosition < 0) + m_lPosition = 0; +} + +void OTString::reset(void) +{ + m_lPosition = 0; +} + + + + /* + + // As of now, do not use this. + // We have XML to do these things. + char *fread_string(FILE *fl) + { + char buf[MAX_STRING_LENGTH]; + char * pAlloc; + char * pBufLast; + + for(pBufLast = buf; pBufLast < &(buf[MAX_STRING_LENGTH - 2]);) + { + switch(*pBufLast = getc(fl)) { + default: + pBufLast++; + break; + + case EOF: + perror("fread_string: EOF"); + exit(1); + break; + + case '\n': + while(pBufLast > buf && isspace(*(pBufLast - 1))) + pBufLast--; + *pBufLast++ = '\n'; + *pBufLast++ = '\r'; + break; + + case '~': + getc(fl); + if(pBufLast == buf) + { + pAlloc = new char[1]; + *pAlloc = '\0'; + } + else { + *pBufLast++ = '\0'; + pAlloc = new char[pBufLast - buf]; + memcpy(pAlloc, buf, pBufLast - buf); + } + return pAlloc; + } + } + + perror("fread_string: string too long"); + exit(1); + return(0); + } + */ + + diff --git a/OTLib/OTString.h b/OTLib/OTString.h new file mode 100644 index 000000000..65f44ff1f --- /dev/null +++ b/OTLib/OTString.h @@ -0,0 +1,384 @@ +/************************************************************************************ + * + * OTString.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __STRING_H__ +#define __STRING_H__ + +// #include "whatever.h" -- all necessary #includes go here. +// Be sure to use 'extern "C" { }' as a wrapper for straight 'C' headers. + + +#include +#include +#include + +#include + +#include + +extern "C" { +#include +} + +#include +#include +#include + +//#ifdef _WIN32 +//#define MAX_STRING_LENGTH 631072 +//#else +#define MAX_STRING_LENGTH 1262144 +//#endif // _WIN32 + + +// If you've already strlen'd the string, +// you can pass the length to str_hsh or str_dup +// and save it the trouble. +char *str_dup1(const char *str); +char *str_dup2(const char *str, uint32_t length); +int len_cmp(char *s1, char *s2); + + +template +inline std::string to_string (const T& t) +{ + std::stringstream ss; + ss << t; + return ss.str(); +} + + +// ======================================================================= +/* + * strlcpy and strlcat + * + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +inline size_t strlcpy(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) + { + while (--n != 0) + { + if ((*d++ = *s++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) + { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} +/* + * Appends src to string dst of size siz (unlike strncat, siz is the + * full size of dst, not space left). At most siz-1 characters + * will be copied. Always NUL terminates (unless siz <= strlen(dst)). + * Returns strlen(src) + MIN(siz, strlen(initial dst)). + * If retval >= siz, truncation occurred. + */ +inline size_t strlcat(char *dst, const char *src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') + { + if (n != 1) + { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return(dlen + (s - src)); /* count does not include NUL */ +} +// (End of the Todd Miller code.) +// ======================================================================= + + + + +class OTIdentifier; +class OTContract; +class OTASCIIArmor; +class OTSignature; +class OTPseudonym; +class OTPayload; + +class OTString +{ + // Construction -- Destruction +public: + OTString(); + OTString(const OTString & strValue); + OTString(const OTASCIIArmor & strValue); + OTString(const OTSignature & strValue); + OTString(const OTContract & theValue); + OTString(const OTIdentifier & theValue); + OTString(OTPseudonym & theValue); + OTString(const char * new_string); + OTString(const char * new_string, size_t sizeLength); + OTString(const std::string & new_string); + + virtual ~OTString(); + + void Initialize(); + + OTString& operator=(OTString rhs); +// OTString& operator=(const char * new_string); +// OTString& operator=(const std::string & strValue); + + void swap(OTString & rhs); + + bool operator >(const OTString &s2) const; + bool operator <(const OTString &s2) const; + bool operator <=(const OTString &s2) const; + bool operator >=(const OTString &s2) const; + bool operator ==(const OTString &s2) const; + + // Attributes +public: + + // Implementation +private: + // You better have called Initialize() or Release() before you dare call this. + void LowLevelSetStr(const OTString & strBuf); + + // Only call this right after calling Initialize() or Release(). + // Also, this function ASSUMES the new_string pointer is good. + void LowLevelSet(const char * new_string, uint32_t nEnforcedMaxLength); + + // Operations +public: + bool At(uint32_t lIndex, char &c); + + bool Exists(void) const; + + uint32_t GetLength(void) const; + + bool Compare(const char * strCompare) const; + bool Compare(const OTString& strCompare) const; + + bool Contains(const char * strCompare) const; + bool Contains(const OTString& strCompare) const; + + const char * Get(void) const; + + // ---------------------------- + void Set(const char * new_string, uint32_t nEnforcedMaxLength=0); + + // new_string MUST be at least nEnforcedMaxLength in size if nEnforcedMaxLength is passed in at all. + // That's because this function forces the null terminator at that length of the string minus 1. + void Set(const OTString & strBuf); + // ---------------------------- + +// void Concatenate(const char *arg); + void Concatenate(const char *arg, ...); + void Concatenate(const OTString & strBuf); + + void Truncate(uint32_t lAt); + + void Format(const char *arg, ...); + + void ConvertToLowerCase(); + void ConvertToUpperCase(); + + void OTfgets(std::istream & ofs); +// void OTfgets(FILE * fl); + + // true == there are more lines to read. + // false == this is the last line. Like EOF. + bool sgets(char * szBuffer, unsigned nBufSize); + + char sgetc(void); + void sungetc(void); + void reset(void); + + void WriteToFile(std::ostream & ofs) const; +// void WriteToFile(FILE * fl = NULL) const; + + virtual void Release(void); + + // Internal properties +protected: + uint32_t m_lLength; + uint32_t m_lPosition; + char * m_strBuffer; +}; + +bool operator >(const OTString& s1, const OTString& s2); +bool operator <(const OTString& s1, const OTString& s2); +bool operator >=(const OTString &s1, const OTString& s2); +bool operator <=(const OTString &s1, const OTString& s2); + +#endif // __STRING_H__ diff --git a/OTLib/OTStringXML.cpp b/OTLib/OTStringXML.cpp new file mode 100644 index 000000000..df5ea062d --- /dev/null +++ b/OTLib/OTStringXML.cpp @@ -0,0 +1,225 @@ +/************************************************************************************ + * + * OTStringXML.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include "OTString.h" +#include "OTStringXML.h" + +OTStringXML::OTStringXML() : OTString(), irr::io::IFileReadCallBack() +{ + +} + +OTStringXML::OTStringXML(const OTString & strValue) : OTString(strValue), irr::io::IFileReadCallBack() +{ + +} + +OTStringXML::OTStringXML(const OTStringXML & strValue) : OTString(strValue), irr::io::IFileReadCallBack(strValue) +{ + +} + + +/* + Derived& Derived::operator= (Derived const& d) + { + ← make sure self-assignment is benign + Base::operator= (d); + ← do the rest of your assignment operator here... + ...do the rest of your assignment operator here... + return *this; + } + */ +OTStringXML& OTStringXML::operator=(const OTString & rhs) +{ + if ((&rhs) != (&(dynamic_cast(*this)))) + { + this->OTString::operator=(rhs); // no need to cast here since same type. +// irr::io::IFileReadCallBack::operator=(rhs); // rhs is not derived from irr::io::IFileReadCallBack like *this is. + } + return *this; +} + +OTStringXML& OTStringXML::operator=(const OTStringXML & rhs) +{ + if ((&rhs) != this) + { + this->OTString::operator=(dynamic_cast(rhs)); + irr::io::IFileReadCallBack::operator=(rhs); + } + return *this; +} + +OTStringXML::~OTStringXML() +{ + // Base class destructor is called automatically. + // (And that calls Release().) +} + +int OTStringXML::read(void* buffer, unsigned sizeToRead) +{ + if (buffer && sizeToRead && Exists()) + { + char * pBuf = (char *) buffer; + + int nBytesToCopy = (sizeToRead > GetLength() ? GetLength() : sizeToRead); + int i; + for (i = 0; i < nBytesToCopy; i++) { + pBuf[i] = sgetc(); + } + return i; + } + else + { + return 0; + } + +} + +int OTStringXML::getSize() +{ + return GetLength(); +} + + + + + + + + + + + + + + + diff --git a/OTLib/OTStringXML.h b/OTLib/OTStringXML.h new file mode 100644 index 000000000..aa0850cd8 --- /dev/null +++ b/OTLib/OTStringXML.h @@ -0,0 +1,182 @@ +/************************************************************************************ + * + * OTStringXML.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTSTRING_XML_H__ +#define __OTSTRING_XML_H__ + + +#include "irrxml/irrXML.h" + +#include "OTString.h" + + +class OTStringXML : public OTString, public irr::io::IFileReadCallBack +{ +public: + OTStringXML(); + OTStringXML(const OTString & strValue); + OTStringXML(const OTStringXML & strValue); + virtual ~OTStringXML(); + + OTStringXML& operator=(const OTString & rhs); + OTStringXML& operator=(const OTStringXML & rhs); + + using OTString::swap; + + int read(void* buffer, unsigned sizeToRead); + int getSize(); +}; + +#endif // __OTSTRING_XML_H__ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTToken.cpp b/OTLib/OTToken.cpp new file mode 100644 index 000000000..4558b93ba --- /dev/null +++ b/OTLib/OTToken.cpp @@ -0,0 +1,1174 @@ + +/************************************************************************************ + * + * OTToken.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +extern "C" +{ + +#ifdef _WIN32 +#include +#include +#else +#include +#endif +} + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + + +#include "OTToken.h" +#include "OTEnvelope.h" +#include "OTMint.h" +#include "OTPseudonym.h" +#include "OTPurse.h" +#include "OTLog.h" + + + +#include "Lucre/bank.h" // Lucre + + +// The current implementation for withdrawals (using Lucre) requires only a single proto-token +// to be sent, signed, and returned. Only the ID of the token is blinded. +// +// But this library supports sending up to N proto-tokens. Even though only 1 is required, this +// lib supports sending 5 or 100 or 1000, if other protocols (such as Cham) are later added. + +//todo: make this configurable. Or configured in the contract. +// Then the server can be configured with the contract parameters that it is willing to accept. +// Each server operator may have different standards about the contracts they are willing to +// process, and the prices for notarizing each. +// +// You may want to set it up as 1 out of 100 +// or 1 out of 500 +// or 1 out of 5 +// Basically this number determines how many blinded prototokens must be sent to the +// server in order for the server to accept the withdrawal request and sign one of them. +// (more prototokens == more resource cost, but more security.) +const int OTToken::nMinimumPrototokenCount = 1; + +// Lucre, in fact, only sends a single blinded token, and the bank signs it blind and returns it. +// With Chaum, the bank had to open some of the proto-tokens to verify the amount was correct, etc. +// +// But with Lucre, only the ID is blinded. The bank can already see the amount--it's not blinded. So +// there's no need to verify it. The client can send an ill-formed token if he wishes, but only hurts +// himself. +// +// Problem is, the bank can still falsely refuse a coin. So I have wrapped Lucre in my own protocol +// which includes signed receipts from the bank. Also, since the bank must store the spent tokens +// (at least until they expire) then the bank can be asked to produce the deposit receipt which +// has the customer's signature on it who deposited that cash, if it indeed has already been spent. + + +void OTToken::InitToken() +{ + m_State = blankToken; + m_nTokenCount = 0; + m_nChosenIndex = 0; + m_lDenomination = 0; + + m_bSavePrivateKeys = false; + + m_nSeries = 0; + + m_strContractType.Set("CASH"); +} + +OTToken::OTToken() : OTInstrument() +{ + InitToken(); +} + +OTToken::OTToken(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTInstrument(SERVER_ID, ASSET_ID) +{ + InitToken(); + + // m_ServerID and m_AssetTypeID are now in the parent class (OTInstrument) + // So they are initialized there now. +} + +OTToken::OTToken(const OTPurse & thePurse) : OTInstrument() +{ + InitToken(); + + // These are in the parent class, OTInstrument. + // I set them here because the "Purse" argument only exists + // in this subclass constructor, not the base. + m_ServerID = thePurse.GetServerID(); + m_AssetTypeID = thePurse.GetAssetID(); +} + +void OTToken::Release() +{ + m_Signature.Release(); + m_ascSpendable.Release(); + + m_State = blankToken; + m_nTokenCount = 0; + m_nChosenIndex = 0; + m_lDenomination = 0; + + m_bSavePrivateKeys = false; + + m_nSeries = 0; + + m_strContractType.Set("CASH"); + + // ------------------------- + + ReleasePrototokens(); + + OTInstrument::Release(); // since I've overridden the base class, I call it now... +} + +OTToken::~OTToken() +{ + // OTContract::~OTContract is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. +} + + + +// TODO: save the private request tokens to the wallet here... +bool OTToken::SaveContractWallet(std::ofstream & ofs) +{ + // mapOfPrototokens m_mapPrivate; // The elements are accessed [0..N]. mapPublic[2] corresponds to map_Private[2], etc. + + return true; +} + + +// Note: ALL failures will return true, even if the token has NOT already been +// spent, and the failure was actually due to a directory creation error. Why, +// you might ask? Because no matter WHAT is causing the failure, any return of +// false is a signal that the token is SAFE TO ACCEPT AS TENDER. If there was a +// temporary file system error, someone could suddenly deposit the same token +// over and over again and this method would return "false" (Token is "not already +// spent.") +// +// We simply cannot risk that, so false is not returned unless execution reaches +// the very bottom of this method. Every other error acts as if the token is +// no good, for security reasons. If the token really IS good, the user can submit +// it again later and it will work. +// +bool OTToken::IsTokenAlreadySpent(OTString & theCleartextToken) +{ + OTString strAssetID(GetAssetID()); + + // ---------------------------------------------------------------------------- + + // Calculate the filename (a hash of the Lucre cleartext token ID) + OTIdentifier theTokenHash; + theTokenHash.CalculateDigest(theCleartextToken); + + // Grab the new hash into a string (for use as a filename) + OTString strTokenHash(theTokenHash); + + // ---------------------------------------------------------------------------- + + OTString strAssetFolder; + strAssetFolder.Format("%s.%d", strAssetID.Get(), GetSeries()); + + bool bTokenIsPresent = OTDB::Exists(OTLog::SpentFolder(), strAssetFolder.Get(), strTokenHash.Get()); + + // -------------------------------------------------------------------- + + if (bTokenIsPresent) + { + OTLog::vOutput(0, "\nOTToken::IsTokenAlreadySpent: Token was already spent: %s%s%s%s%s\n", + OTLog::SpentFolder(), OTLog::PathSeparator(), strAssetFolder.Get(), + OTLog::PathSeparator(), strTokenHash.Get()); + return true; // all errors must return true in this function. + // But this is not an error. Token really WAS already + } // spent, and this true is for real. The others are just + // for security reasons because of this one. + + // This is the ideal case: the token was NOT already spent, it was good, + // so we can return false and the depositor can be credited appropriately. + // IsTokenAlreadySpent? NO-it was NOT already spent. You can only POSSIBLY + // get a false out of this method if you actually reached the bottom (here.) + return false; +} + + + +bool OTToken::RecordTokenAsSpent(OTString & theCleartextToken) +{ + OTString strAssetID(GetAssetID()); + + // ---------------------------------------------------------------------------- + + // Calculate the filename (a hash of the Lucre cleartext token ID) + OTIdentifier theTokenHash; + theTokenHash.CalculateDigest(theCleartextToken); + + // Grab the new hash into a string (for use as a filename) + OTString strTokenHash(theTokenHash); + + OTString strAssetFolder; + strAssetFolder.Format("%s.%d", strAssetID.Get(), GetSeries()); + + // -------------------------------------------------------------------- + // See if the spent token file ALREADY EXISTS... + bool bTokenIsPresent = OTDB::Exists(OTLog::SpentFolder(), strAssetFolder.Get(), strTokenHash.Get()); + + // If so, we're trying to record a token that was already recorded... + if (bTokenIsPresent) + { + OTLog::vError("OTToken::RecordTokenAsSpent: Trying to record token as spent," + " but it was already recorded: %s%s%s%s%s\n", + OTLog::SpentFolder(), OTLog::PathSeparator(), strAssetFolder.Get(), + OTLog::PathSeparator(), strTokenHash.Get()); + return false; + } + + // ---------------------------------------------------------------------- + + // FINISHED: + + // We actually save the token itself into the file, which is named based + // on a hash of the Lucre data. + // The success of that operation is also now the success of this one. + + OTString strToken; + SaveContract(strToken); + + bool bSaved = OTDB::StorePlainString(strToken.Get(), OTLog::SpentFolder(), + strAssetFolder.Get(), strTokenHash.Get()); + if (!bSaved) + { + OTLog::vError("OTToken::RecordTokenAsSpent: Error saving file: %s%s%s%s%s\n", + OTLog::SpentFolder(), OTLog::PathSeparator(), strAssetFolder.Get(), + OTLog::PathSeparator(), strTokenHash.Get()); + } + + return bSaved; +} + + + +bool OTToken::ReassignOwnership(const OTPseudonym & oldOwner, const OTPseudonym & newOwner) +{ + bool bSuccess = false; + + // load the bank and coin info into the bios + // The Mint private info is encrypted in m_ascPrivate. So I need to extract that + // first before I can use it. + OTEnvelope theEnvelope(m_ascSpendable); + + OTString theString; + // Decrypt the Envelope into strContents + if (!theEnvelope.Open(oldOwner, theString)) + bSuccess = false; + else + { + bSuccess = true; + } + + if (bSuccess) + { + OTEnvelope theNewEnvelope; + bSuccess = theNewEnvelope.Seal(newOwner, theString); + + if (bSuccess) + bSuccess = theNewEnvelope.GetAsciiArmoredData(m_ascSpendable); + } + + return bSuccess; +} + +bool OTToken::GetSpendableString(OTPseudonym & theOwner, OTString & theString) const +{ + // load the bank and coin info into the bios + // The Mint private info is encrypted in m_ascPrivate. So I need to extract that + // first before I can use it. + OTEnvelope theEnvelope(m_ascSpendable); + + // Decrypt the Envelope into strContents + if (!theEnvelope.Open(theOwner, theString)) + return false; + else { + return true; + } + +} + + +void OTToken::UpdateContents() +{ + if (m_State == OTToken::spendableToken) + m_strContractType.Set("CASH"); + + OTString ASSET_TYPE_ID(m_AssetTypeID), SERVER_ID(m_ServerID); + + OTString strState; + switch (m_State) { + case OTToken::blankToken: + strState.Set("blankToken"); + break; + case OTToken::protoToken: + strState.Set("protoToken"); + break; + case OTToken::signedToken: + strState.Set("signedToken"); + break; + case OTToken::spendableToken: + strState.Set("spendableToken"); + break; + case OTToken::verifiedToken: + strState.Set("verifiedToken"); + break; + default: + strState.Set("errorToken"); + break; + } + + long lFrom = m_VALID_FROM, lTo = m_VALID_TO; + + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), strState.Get(), GetDenomination(), + ASSET_TYPE_ID.Get(), + SERVER_ID.Get(), + m_nSeries, lFrom, lTo ); + + // signed tokens, as well as spendable tokens, both carry a TokenID + // (The spendable token contains the unblinded version.) + if (OTToken::signedToken == m_State || + OTToken::spendableToken == m_State) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascSpendable.Get()); + } + + // Only signedTokens carry the signature, which is discarded in spendable tokens. + // (Because it is not used past the unblinding stage anyway, and because it could + // be used to track the token.) + if (OTToken::signedToken == m_State) + { + m_xmlUnsigned.Concatenate("\n%s\n\n", m_Signature.Get()); + } + + if ((OTToken::protoToken == m_State || + OTToken::signedToken == m_State) && m_nTokenCount) + { + m_xmlUnsigned.Concatenate("\n\n", m_nTokenCount, m_nChosenIndex); + + OTASCIIArmor * pPrototoken = NULL; + for (mapOfPrototokens::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT(NULL != pPrototoken); + + m_xmlUnsigned.Concatenate("\n%s\n\n", pPrototoken->Get()); + } + m_xmlUnsigned.Concatenate("\n\n"); + } + + if (m_bSavePrivateKeys) + { + m_bSavePrivateKeys = false; // set it back to false; + + m_xmlUnsigned.Concatenate("\n\n"); + + OTASCIIArmor * pPrototoken = NULL; + for (mapOfPrototokens::iterator ii = m_mapPrivate.begin(); ii != m_mapPrivate.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT(NULL != pPrototoken); + + m_xmlUnsigned.Concatenate("\n%s\n\n", pPrototoken->Get()); + } + m_xmlUnsigned.Concatenate("\n\n"); + } + + m_xmlUnsigned.Concatenate("\n"); +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTToken::ProcessXMLNode(IrrXMLReader*& xml) +{ + static int nPublicTokenCount = 0; + static int nPrivateTokenCount = 0; + + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + //if (nReturnVal = OTContract::ProcessXMLNode(xml)) + // return nReturnVal; + + if (!strcmp("token", xml->getNodeName())) + { + OTString strState; + + m_strVersion = xml->getAttributeValue("version"); + strState = xml->getAttributeValue("state"); + + m_nSeries = atoi(xml->getAttributeValue("series")); + m_VALID_FROM = atol(xml->getAttributeValue("validFrom")); + m_VALID_TO = atol(xml->getAttributeValue("validTo")); + + SetDenomination(atol(xml->getAttributeValue("denomination"))); + + if (strState.Compare("blankToken")) + m_State = OTToken::blankToken; + else if (strState.Compare("protoToken")) + m_State = OTToken::protoToken; + else if (strState.Compare("signedToken")) + m_State = OTToken::signedToken; + else if (strState.Compare("spendableToken")) + m_State = OTToken::spendableToken; + else if (strState.Compare("verifiedToken")) + m_State = OTToken::verifiedToken; + else + m_State = OTToken::errorToken; + + if (m_State == OTToken::spendableToken) + m_strContractType.Set("CASH"); + + OTString strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strServerID(xml->getAttributeValue("serverID")); + + m_AssetTypeID.SetString(strAssetTypeID); + m_ServerID.SetString(strServerID); + + OTLog::vOutput(4, + // "\n===> Loading XML for token into memory structures..." + "\n\nToken State: %s\n Denomination: %ld\n" + " AssetTypeID: %s\nServerID: %s\n", + strState.Get(), GetDenomination(), strAssetTypeID.Get(), strServerID.Get()); + + nReturnVal = 1; + } + + else if (!strcmp("tokenID", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascSpendable)) + { + OTLog::Error("Error in OTToken::ProcessXMLNode: token ID without value.\n"); + return (-1); // error condition + } + + return 1; + } + + else if (!strcmp("tokenSignature", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_Signature)) + { + OTLog::Error("Error in OTToken::ProcessXMLNode: token Signature without value.\n"); + return (-1); // error condition + } + + return 1; + } + + else if (!strcmp("protopurse", xml->getNodeName())) + { // TODO for security, if the count here doesn't match what's loaded up, that should be part of + // what is verified in each token when it's verified.. + m_nTokenCount = atoi(xml->getAttributeValue("count")); + m_nChosenIndex = atoi(xml->getAttributeValue("chosenIndex")); + + nPublicTokenCount = 0; + + return 1; + } + + else if (!strcmp("prototoken", xml->getNodeName())) + { + OTASCIIArmor * pArmoredPrototoken = new OTASCIIArmor; + + OT_ASSERT(NULL != pArmoredPrototoken); + + if (!LoadEncodedTextField(xml, *pArmoredPrototoken) || !pArmoredPrototoken->Exists()) + { + OTLog::Error("Error in OTToken::ProcessXMLNode: prototoken field without value.\n"); + + delete pArmoredPrototoken; + pArmoredPrototoken = NULL; + + return (-1); // error condition + } + else + { + m_mapPublic[nPublicTokenCount] = pArmoredPrototoken; + nPublicTokenCount++; + } + + return 1; + } + + else if (!strcmp("privateProtopurse", xml->getNodeName())) + { + nPrivateTokenCount = 0; + + return 1; + } + + else if (!strcmp("privatePrototoken", xml->getNodeName())) + { + OTASCIIArmor * pArmoredPrototoken = new OTASCIIArmor; + + OT_ASSERT(NULL != pArmoredPrototoken); + + if (!LoadEncodedTextField(xml, *pArmoredPrototoken) || !pArmoredPrototoken->Exists()) + { + OTLog::Error("Error in OTToken::ProcessXMLNode: privatePrototoken field without value.\n"); + + delete pArmoredPrototoken; + pArmoredPrototoken = NULL; + + return (-1); // error condition + } + else + { + m_mapPrivate[nPrivateTokenCount] = pArmoredPrototoken; + nPrivateTokenCount++; + + OTLog::vOutput(4, "Loaded prototoken and adding to m_mapPrivate at index: %d\n", nPrivateTokenCount-1); + } + + return 1; + } + + return nReturnVal; +} + + + + +/* + + enum tokenState { + blankToken, + protoToken, + signedToken, + spendableToken, + verifiedToken, + errorToken + }; + + */ + +bool OTToken::GetPrototoken(OTASCIIArmor & ascPrototoken, int nTokenIndex) +{ + + // out of bounds. For a count 10 element array, index 10 is out of bounds. + // thus if attempted index is equal or larger to the count, out of bounds. + if (nTokenIndex >= m_nTokenCount) + { + return false; + } +// OTLog::vError("DEBUG OTToken::GetPrototoken. nTokenIndex is %d. m_nTokenCount is %d\n------------------------\n", +// nTokenIndex, m_nTokenCount); + + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTASCIIArmor * pPrototoken = NULL; + + for (mapOfPrototokens::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT(NULL != pPrototoken); + + const bool bSuccess = (nTokenIndex == (*ii).first); + +// OTLog::vError("DEBUG OTToken::GetPrototoken ABOUT TO ENTER, index: %d\n", nTokenIndex); + + if (bSuccess) + { + ascPrototoken.Set(*pPrototoken); +// OTLog::vError("DEBUG OTToken::GetPrototoken INNER SANCTUM\n PROTOKEN:" +// "\n-----------%s-----------\n", ascPrototoken.Get()); + return true; + } + } + return false; +} + +bool OTToken::GetPrivatePrototoken(OTASCIIArmor & ascPrototoken, int nTokenIndex) +{ + // out of bounds. For a count 10 element array, index 10 is out of bounds. + // thus if attempted index is equal or larger to the count, out of bounds. + if (nTokenIndex >= m_nTokenCount) + { + return false; + } + + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTASCIIArmor * pPrototoken = NULL; + + for (mapOfPrototokens::iterator ii = m_mapPrivate.begin(); ii != m_mapPrivate.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT(NULL != pPrototoken); + + const bool bSuccess = (nTokenIndex == (*ii).first); + + if (bSuccess) + { + ascPrototoken.Set(*pPrototoken); + return true; + } + } + return false; +} + + + + +// Lucre step 2 (client generates coin request) +// nDenomination must be one of the denominations supported by the mint. +// sets m_nTokenCount and populates the maps with prototokens (in ASCII-armored format.) +bool OTToken::GenerateTokenRequest(const OTPseudonym & theNym, OTMint & theMint, + long lDenomination, int nTokenCount/*=OTToken::nMinimumPrototokenCount*/) +{ + // OTLog::vError("%s \n", argv[0]); + + if (OTToken::blankToken != m_State) + { + OTLog::Error("Blank token expected in OTToken::GenerateTokenRequest\n"); + return false; + } + + // We are supposed to set these values here. + // The server actually sets them again, for security reasons. + // But we should still set them since server may choose to reject the request. + SetSeriesAndExpiration(theMint.GetSeries(), theMint.GetValidFrom(), theMint.GetValidTo()); + + SetDumper(stderr); + + BIO *bioBank = BIO_new(BIO_s_mem()); // Input. We must supply the bank's public lucre info + BIO *bioCoin = BIO_new(BIO_s_mem()); // These two are output. We must write these bios, after + BIO *bioPublicCoin = BIO_new(BIO_s_mem()); // the operation, back into some form we can use + + // This version base64-DECODES the ascii-armored string passed in, + // and then sets the decoded plaintext string onto the string. + //OTString::OTString(const OTASCIIArmor & strValue) + OTASCIIArmor ascPublicMint; + + theMint.GetPublic(ascPublicMint, lDenomination); + +// OTLog::vError("DEBUG: OTToken public asc: \n%s\n", ascPublicMint.Get()); + + + OTString strPublicMint(ascPublicMint); + +// OTLog::vError("DEBUG: OTToken public str: \n%s\n", strPublicMint.Get()); + + + // Get the bank's public key (now decoded in strPublicMint) + // and put it into bioBank so we can use it with Lucre. + BIO_puts(bioBank, strPublicMint.Get()); + + // Instantiate a PublicBank (Lucre) object. + // We will use it to generate all the prototokens in the loop below. + PublicBank bank; + bank.ReadBIO(bioBank); + + Release(); + + const int nFinalTokenCount = (nTokenCount < OTToken::nMinimumPrototokenCount) ? + OTToken::nMinimumPrototokenCount : nTokenCount; + + // Token count is actually 1 (always) with Lucre, although this lib has potential to work with + // multiple proto-tokens, you can see this loop as though it always executes just once. + for (int i = 0; i < nFinalTokenCount; i++) + { + CoinRequest req(bank); + + // write the private coin request to BIO + req.WriteBIO(bioCoin); + + // write the public coin request to BIO + ((PublicCoinRequest *)&req)->WriteBIO(bioPublicCoin); + + // Convert the two bios to our format + char privateCoinBuffer[4096], publicCoinBuffer[4096]; // todo stop hardcoding these string lengths + int privatecoinLen = BIO_read(bioCoin, privateCoinBuffer, 4000); // cutting it a little short on purpose, with the buffer. Just makes me feel more comfortable for some reason. + int publiccoinLen = BIO_read(bioPublicCoin, publicCoinBuffer, 4000); + + if (privatecoinLen && publiccoinLen) + { + // With this, we have the Lucre public and private bank info converted to OTStrings + OTString strPublicCoin; strPublicCoin.Set(publicCoinBuffer, publiccoinLen); + OTString strPrivateCoin; strPrivateCoin.Set(privateCoinBuffer, privatecoinLen); + + OTASCIIArmor * pArmoredPublic = new OTASCIIArmor(strPublicCoin); + OTASCIIArmor * pArmoredPrivate = new OTASCIIArmor(); + + OT_ASSERT_MSG(((NULL != pArmoredPublic) && (NULL != pArmoredPrivate)), "ERROR: Unable to allocate memory in OTToken::GenerateTokenRequest\n"); + + // Change the state. It's no longer a blank token, but a prototoken. + m_State = OTToken::protoToken; + + // Seal the private coin info up into an encrypted Envelope + // and set it onto pArmoredPrivate (which was just added to our internal map, above.) + OTEnvelope theEnvelope; + theEnvelope.Seal(theNym, strPrivateCoin); // Todo check the return values on these two functions + theEnvelope.GetAsciiArmoredData(*pArmoredPrivate); + + m_mapPublic[i] = pArmoredPublic; + m_mapPrivate[i] = pArmoredPrivate; + + m_nTokenCount = nFinalTokenCount; + SetDenomination(lDenomination); + } + else { + // Error condition + } + + // Free the Private and Public coins and allocate them fresh, for the next iteration of the loop. + BIO_free_all(bioCoin); + BIO_free_all(bioPublicCoin); + + bioCoin = BIO_new(BIO_s_mem()); + bioPublicCoin = BIO_new(BIO_s_mem()); + } + + + // Cleanup openssl resources. + BIO_free_all(bioBank); + BIO_free_all(bioCoin); + BIO_free_all(bioPublicCoin); + + return true; +} + + +void OTToken::ReleasePrototokens() +{ + OTASCIIArmor * pPrototoken = NULL; + + for (mapOfPrototokens::iterator ii = m_mapPublic.begin(); ii != m_mapPublic.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT_MSG(NULL != pPrototoken, "NULL OTASCIIArmor pointer in OTToken::ReleasePrototokens."); + + delete pPrototoken; + pPrototoken = NULL; + } + + pPrototoken = NULL; + + for (mapOfPrototokens::iterator ii = m_mapPrivate.begin(); ii != m_mapPrivate.end(); ++ii) + { + pPrototoken = (*ii).second; + + OT_ASSERT_MSG(NULL != pPrototoken, "NULL OTASCIIArmor pointer in OTToken::ReleasePrototokens."); + + delete pPrototoken; + pPrototoken = NULL; + } + + m_mapPublic.clear(); + m_mapPrivate.clear(); + m_nTokenCount = 0; +} + + + + + +inline bool OTToken::ChooseIndex(const int nIndex) +{ + if (nIndex > (m_nTokenCount-1) || nIndex < 0) + return false; + else + { + m_nChosenIndex = nIndex; + return true; + } +} + + + +// The Mint has signed the token, and is sending it back to the client. +// (we're near Lucre step 3 with this function) +void OTToken::SetSignature(const OTASCIIArmor & theSignature, int nTokenIndex) +{ + // The server sets the signature, and then sends the token back to the + // client. We release all these prototokens before doing so, because there's + // no point in sending them all back to the client again, who already has them anyway. + // This is important because otherwise I wouldn't release, because the client + // still has to look up the private coin in order to unblind. But we're not + // on the client if we're signing -- we're on the server -- who doesn't have + // those private coins anyway. + ReleasePrototokens(); + + // We now officially have the bank's signature on this token. + m_Signature.Set(theSignature); + +// OTLog::vError("DEBUG OTToken::SetSignature. nTokenIndex is %d.\nm_Signature is:\n%s\n" +// "-------------------------------------\n", +// nTokenIndex, m_Signature.Get()); + + // We have to flag which index was signed by the mint, so that + // the client knows which private coin to use for unblinding. + // (Once the coin is unblinded, it will be ready to spend.) + ChooseIndex(nTokenIndex); + + m_State = OTToken::signedToken; +} + +bool OTToken::GetSignature(OTASCIIArmor & theSignature) const +{ + theSignature = m_Signature; + + return true; +} + + + +// Lucre step 4: client unblinds token -- now it's ready for use. +bool OTToken::ProcessToken(const OTPseudonym & theNym, OTMint & theMint, OTToken & theRequest) +{ +// OTLog::vError("%s \n", + bool bReturnValue = false; + + // When the Mint has signed a token and sent it back to the client, + // the client must unblind the token and set it as spendable. Thus, + // this function is only performed on tokens in the signedToken state. + if (OTToken::signedToken != m_State) + { + OTLog::Error("Signed token expected in OTToken::ProcessToken\n"); + return false; + } + + // Lucre + SetDumper(stderr); + BIO *bioBank = BIO_new(BIO_s_mem()); // input + BIO *bioSignature = BIO_new(BIO_s_mem()); // input + BIO *bioPrivateRequest = BIO_new(BIO_s_mem()); // input + BIO *bioCoin = BIO_new(BIO_s_mem()); // output + + // Get the bank's public key (decoded into strPublicMint) + // and put it into bioBank so we can use it with Lucre. + OTASCIIArmor ascPublicMint; + theMint.GetPublic(ascPublicMint, GetDenomination()); + OTString strPublicMint(ascPublicMint); + BIO_puts(bioBank, strPublicMint.Get()); + + // Get the existing signature into a bio. +// OTLog::vError("DEBUGGING, m_Signature: -------------%s--------------\n", m_Signature.Get()); + OTString strSignature(m_Signature); + BIO_puts(bioSignature, strSignature.Get()); + + // I need the Private coin request also. (Only the client has this private coin request data.) + OTASCIIArmor thePrototoken; // The server sets m_nChosenIndex when it signs the token. + bool bFoundToken = theRequest.GetPrivatePrototoken(thePrototoken, m_nChosenIndex); + + if (bFoundToken) + { +// OTLog::vError("THE PRIVATE REQUEST ARMORED CONTENTS:\n------------------>%s<-----------------------\n", +// thePrototoken.Get()); + + // Decrypt the prototoken + OTString strPrototoken; + OTEnvelope theEnvelope(thePrototoken); + theEnvelope.Open(theNym, strPrototoken); // todo check return value. + +// OTLog::vError("THE PRIVATE REQUEST CONTENTS:\n------------------>%s<-----------------------\n", +// strPrototoken.Get()); + + // copy strPrototoken to a BIO + BIO_puts(bioPrivateRequest, strPrototoken.Get()); + + // ------- Okay, the BIOs are all loaded.... let's process... + + PublicBank bank(bioBank); + CoinRequest req(bioPrivateRequest); + + // TODO make sure I'm not leaking memory with these ReadNumbers + // Probably need to be calling some free function for each one. + + // Apparently reading the request id here and then just discarding it... + ReadNumber(bioSignature,"request="); + + // Versus the signature data, which is read into bnSignature apparently. + BIGNUM * bnSignature = ReadNumber(bioSignature,"signature="); + DumpNumber("signature=", bnSignature); + + // Produce the final unblinded token in Coin coin, and write it to bioCoin... + Coin coin; // Coin Request, processes into Coin, with Bank and Signature passed in. + req.ProcessResponse(&coin, bank, bnSignature); // Notice still apparently "request" info is discarded. + coin.WriteBIO(bioCoin); + + // convert bioCoin to a C-style string... + char CoinBuffer[1024]; // todo stop hardcoding these string lengths + int coinLen = BIO_read(bioCoin, CoinBuffer, 1000); // cutting it a little short on purpose, with the buffer. Just makes me feel more comfortable for some reason. + + if (coinLen) + { + // ...to OTString... + OTString strCoin; + strCoin.Set(CoinBuffer, coinLen); + +// OTLog::vError("Processing token...\n%s\n", strCoin.Get()); + + // ...to Envelope stored in m_ascSpendable (encrypted and base64-encoded) + OTEnvelope theEnvelope; + theEnvelope.Seal(theNym, strCoin); // Todo check the return values on these two functions + theEnvelope.GetAsciiArmoredData(m_ascSpendable); // Here's the final product. + +// OTLog::vError("NEW SPENDABLE token...\n--------->%s<----------------\n", m_ascSpendable.Get()); + + // Now the coin is encrypted from here on out, and otherwise ready-to-spend. + m_State = OTToken::spendableToken; + bReturnValue = true; + + // Lastly, we free the signature data, which is no longer needed, and which could be + // otherwise used to trace the token. (Which we don't want.) + m_Signature.Release(); + } + + } + // Todo log error here if the private prototoken is not found. (Very strange if so!!) + // else {} + + // Cleanup openssl resources. + BIO_free_all(bioBank); + BIO_free_all(bioSignature); + BIO_free_all(bioPrivateRequest); + BIO_free_all(bioCoin); + + return bReturnValue; +} + + + + +// **** VERIFY THE TOKEN WHEN REDEEMED AT THE SERVER +// Lucre step 5: token verifies when it is redeemed by merchant. +// IMPORTANT: while stored on the client side, the tokens are +// encrypted to the client side nym. But when he redeems them to +// the server, he re-encrypts them first to the SERVER's public nym. +// So by the time it comes to verify, we are opening this envelope +// with the Server's Nym. +bool OTToken::VerifyToken(OTPseudonym & theNotary, OTMint & theMint) +{ + //OTLog::vError("%s \n",argv[0]); + SetDumper(stderr); + + if (OTToken::spendableToken != m_State) + { + OTLog::Error("Expected spendable token in OTToken::VerifyToken\n"); + return false; + } + + // load the bank and coin info into the bios + // The Mint private info is encrypted in m_ascPrivate. So I need to extract that + // first before I can use it. + OTEnvelope theEnvelope(m_ascSpendable); + + OTString strContents; // output from opening the envelope. + // Decrypt the Envelope into strContents + if (!theEnvelope.Open(theNotary, strContents)) + return false; // todo log error, etc. + + // Verify that the series is correct... + // (Otherwise, someone passed us the wrong Mint and the + // thing won't verify anyway, since we'd have the wrong keys.) + if (m_nSeries != theMint.GetSeries() || + // Someone might, however, in a clever attack, choose to leave + // the series intact, but change the expiration dates, so that the + // mint keys continue to work properly for this token, but then + // when we check the date, it APPEARS good, when really the dates + // were altered! To prevent this, we explicitly verify the series + // information on the token against the same info on the mint, + // BEFORE checking the date. + m_VALID_FROM != theMint.GetValidFrom() || + m_VALID_TO != theMint.GetValidTo()) + { + OTLog::vOutput(0, "Token series information doesn't match Mint series information!\n"); + return false; + } + + // Verify whether token has expired...expiration date is validated here. + // We know the series is correct or the key wouldn't verify below... and + // we know that the dates are correct because we compared them against the + // mint of that series above. So now we just make sure that the CURRENT date + // and time is within the range described on the token. + if (!VerifyCurrentDate()) + { + OTLog::Output(0, "Token is expired!\n"); + return false; + } + + // pass the cleartext Lucre spendable coin data to the Mint to be verified. + if (theMint.VerifyToken(theNotary, strContents, GetDenomination())) // Here's the boolean output: coin is verified! + { + OTLog::Output(0, "Token verified!\n"); + return true; + } + else { + OTLog::Output(0, "Bad coin!\n"); + return false; + } +} + + + + + + + + diff --git a/OTLib/OTToken.h b/OTLib/OTToken.h new file mode 100644 index 000000000..805faff77 --- /dev/null +++ b/OTLib/OTToken.h @@ -0,0 +1,378 @@ +/************************************************************************************ + * + * OTToken.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_TOKEN_H__ +#define __OT_TOKEN_H__ + +#include +#include +#include +#include + +#include "OTContract.h" +#include "OTInstrument.h" +#include "OTASCIIArmor.h" +#include "OTSignature.h" + +class OTString; +class OTIdentifier; +class OTMint; +class OTPurse; +class OTPseudonym; + +typedef std::map mapOfPrototokens; + + +/* + + Here's a rough sketch of the protocol: + + Client requests Mint for withdrawal of 100 ithica work hours. + +1) Client blinds and sends N tokens to the server, each worth 100 hours. Client retains the keys. +2) Server responds with a single index, the one the server has chosen for signing. +3) Client replies with 99 keys. +4) Server unblinds 99 tokens (or some randomly-chosen % of those) and verifies them. + He signs the last one and returns it. +5) Client receives signed token, unblinds it, stores it for later. +6) When token is redeemed, it has already been unblinded. So Server simply verifies it. + + LAST NAGGING QUESTION: Should the server sign the other 99 tokens before unblinding them and verifying? + In fact, what is it verifying at all?? Certainly not the amount, which is not even in + the Lucre token. If all it does is verify its signature, then why sign it just to + verify it? Why exactly am I sending 99 tokens? What is the server unblinding them + to look for?? Just to make sure all the IDs are random? That they aren't spent + already? + I think that's it. The client has assurance he chose his own random IDs, the server + verifies they are random and not spent already, and the ID portion is the only part + that has to be randomized. + + UPDATE: + Ben Laurie has confirmed that the Chaumian 99 token requirement does not exist with Lucre. All I have to + do is send a single blinded token. The server signs it and sends it back, and the client unblinds it. Only the + ID itself is blinded -- the server can clearly see the amount and only the Mint key for that denomination will work. + */ + +// This class implements the Lucre coins. +// +class OTToken : public OTInstrument +{ +public: + enum tokenState { + blankToken, + protoToken, + signedToken, + spendableToken, + verifiedToken, + errorToken + }; + + // Wallet must submit at least N prototokens per withdrawal request, for the server to notarize it. + // One server might require at least 5 prototokens per withdrawal. Another might require 100 because it + // needs more security. Another 1000. These provide more security but they also cost more in terms of + // resources to process all those prototokens. + static const int nMinimumPrototokenCount; + +protected: + OTASCIIArmor m_ascSpendable; // This is the final, signed, unblinded token ID, ready to be spent. + // (But still in envelope form, encrypted and ascii-armored.) + OTASCIIArmor m_Signature; // This is the Mint's signature on the blinded prototoken. + + long m_lDenomination;// The actual value of the token is between issuer and trader. + // The token must have a denomination so we know which Mint Key to verify it with. + + // --------------- Prototoken stuff below here..... + + mapOfPrototokens m_mapPublic; // in protoToken state, this object stores N prototokens in order to fulfill the protocol + mapOfPrototokens m_mapPrivate; // The elements are accessed [0..N]. mapPublic[2] corresponds to map_Private[2], etc. + + int m_nTokenCount; // Official token count is stored here for serialization, etc. The maps' size should match. + int m_nChosenIndex; // When the client submits N prototokens, the server randomly chooses one to sign. + // (The server opens the other (N-1) prototokens to verify the amount is correct and + // that the IDs are random enough.) + + // ----------------------------------------------------------- + // Expiration dates are necessary because otherwise the spent token database must be stored + // forever. This may be useful in some applications, but in most, a 1-year or 1-month expiration + // date will be perfectly fine, especially with auto-exchanges performed by the wallet. Suddenly + // it becomes much more feasible a proposition to effectively run a token server, without having + // to hold those spent tokens forever. + // + // EXPIRATION DATES are in the parent: + // + // time_t m_VALID_FROM; // (In the parent) + // time_t m_VALID_TO; // (In the parent) + // + // Tokens (and Mints) also have a SERIES: + // + int m_nSeries; + + + tokenState m_State; + + + bool m_bSavePrivateKeys; // Determines whether it serializes private keys 1 time (yes if true) + + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + void InitToken(); + + bool ChooseIndex(const int nIndex); + +public: + + OTToken(); + OTToken(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTToken(const OTPurse & thePurse); + virtual ~OTToken(); + + virtual void Release(); + void ReleasePrototokens(); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the token saves its contents + + // Will save the private keys on next serialization (not just public keys) + // (SignContract sets m_bSavePrivateKeys back to false again.) + inline void SetSavePrivateKeys() { m_bSavePrivateKeys = true; } + + // When you send a token to the server, you must decrypt it from your own key, + // and re-encrypt it to the server key, before sending. Use this function to do so. + // In the case of exporting a token from a purse, you could create a dummy Nym, embed + // it inside the purse, and then reassign ownership of each token to that token as you + // push them into that purse. + // From there, you can hand someone the purse, and password-protect it, if you like. + // + bool ReassignOwnership(const OTPseudonym & oldOwner, const OTPseudonym & newOwner); + + inline const OTASCIIArmor & GetSpendable() const { return m_ascSpendable; } + inline void SetSpendable(const OTASCIIArmor & theArmor) { m_ascSpendable.Set(theArmor); } + + bool GetSpendableString(OTPseudonym & theOwner, OTString & theString) const; + + inline OTToken::tokenState GetState() const { return m_State; } + + // ------------------------------------------------------------------------ + + // Lucre step 1 (in OTMint) Generate New Mint + + // Lucre Step 2: Generate Coin Request + // nDenomination MUST be one that the Mint supports. + // let nTokenCount default to 1, since that's how Lucre works. + bool GenerateTokenRequest(const OTPseudonym & theNym, OTMint & theMint, + long lDenomination, int nTokenCount=nMinimumPrototokenCount); + + // Lucre Step 3: Mint signs token (in OTMint) + inline int GetSeries() const { return m_nSeries; } + inline void SetSeriesAndExpiration // (Called by the mint when signing.) + (int nSeries, time_t VALID_FROM, time_t VALID_TO) + { m_nSeries = nSeries; m_VALID_FROM = VALID_FROM; m_VALID_TO = VALID_TO; } + + // Lucre step 4: client unblinds token -- now it's ready for use. + bool ProcessToken(const OTPseudonym & theNym, OTMint & theMint, OTToken & theRequest); + + // Lucre step 5: token verifies when it is redeemed by merchant. + // Now including spent token database! + bool VerifyToken(OTPseudonym & theNotary, OTMint & theMint); + bool IsTokenAlreadySpent(OTString & theCleartextToken); // Spent Token Database + bool RecordTokenAsSpent(OTString & theCleartextToken); // Spent Token Database + + + // ------------------------------------------------------------------------ + + void SetSignature(const OTASCIIArmor & theSignature, int nTokenIndex); + bool GetSignature(OTASCIIArmor & theSignature) const; + + // The actual denomination of the token is determined by whether or not it verifies + // when the server uses the private verify info for THAT denomination. So if you set + // the denomination here wrong, all that does is cause the server to try to verify it + // with the wrong key. If the proto-token was generated for a different denomination, + // then it cannot verify. + // So this value is only here to help you make sure to ask the Mint to use the right + // key when verifying the token. And this only works because we have a specific set of + // denominations for each digital asset, each with its own key pair in the Mint. + inline long GetDenomination() const { return m_lDenomination; } + inline void SetDenomination(long lVal) { m_lDenomination = lVal; } + + // These are not actually necessary for Lucre itself, which only needs + // to send a single blinded proto-token. Index is always 0, and Count is + // always 1. But this does mean OTToken supports digital cash schemes that + // involve multiple prototokens -- even though Lucre is not one of those. + bool GetPrototoken(OTASCIIArmor & ascPrototoken, int nTokenIndex); + bool GetPrivatePrototoken(OTASCIIArmor & ascPrototoken, int nTokenIndex); + + virtual bool SaveContractWallet(std::ofstream & ofs); +// virtual bool SaveContractWallet(FILE * fl); +}; + + + +typedef std::deque dequeOfTokenPtrs; + + + +#endif // __OT_TOKEN_H__ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTTrackable.cpp b/OTLib/OTTrackable.cpp new file mode 100644 index 000000000..cfcc17b5e --- /dev/null +++ b/OTLib/OTTrackable.cpp @@ -0,0 +1,224 @@ +/************************************************************************************ + * + * OTTrackable.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + + +#include "OTStorage.h" + + +#include "OTTrackable.h" + +// This class is like OTInstrument except with identifying info (such as transaction number) added. + + + +OTTrackable::OTTrackable() : + OTInstrument() +{ + InitTrackable(); +} + + + + +OTTrackable::OTTrackable(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTInstrument(SERVER_ID, ASSET_ID) +{ + InitTrackable(); +} + +OTTrackable::OTTrackable(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & ACCT_ID, const OTIdentifier & USER_ID) : + OTInstrument(SERVER_ID, ASSET_ID) +{ + InitTrackable(); + + SetSenderAcctID(ACCT_ID); + SetSenderUserID(USER_ID); +} + +OTTrackable::~OTTrackable() +{ + // OTInstrument::~OTInstrument is called here automatically, and it calls Release() already. + // So I don't need to call Release() here again, since it's already called by the parent. + +} + +void OTTrackable::InitTrackable() +{ + m_strContractType.Set("TRACKABLE"); // Should never happen in practice. A child class will overwrite it. + + m_lTransactionNum = 0; + +} + + +void OTTrackable::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + m_SENDER_ACCT_ID.Release(); + m_SENDER_USER_ID.Release(); + + OTInstrument::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything for myself. + InitTrackable(); +} + + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTTrackable::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + return 1; +} + + +void OTTrackable::UpdateContents() +{ + +} + + +bool OTTrackable::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} diff --git a/OTLib/OTTrackable.h b/OTLib/OTTrackable.h new file mode 100644 index 000000000..a65081e61 --- /dev/null +++ b/OTLib/OTTrackable.h @@ -0,0 +1,207 @@ +/************************************************************************************ + * + * OTTrackable.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OT_TRACKABLE_H__ +#define __OT_TRACKABLE_H__ + +#include "OTIdentifier.h" + +#include "OTInstrument.h" + + +// OTTrackable is very similar to OTInstrument. +// The difference is, it may have identifying info on it: +// TRANSACTION NUMBER, SENDER USER ID (NYM ID), AND SENDER ACCOUNT ID. + + + +class OTTrackable : public OTInstrument +{ +protected: + long m_lTransactionNum; + + OTIdentifier m_SENDER_ACCT_ID; // The asset account the instrument is drawn on. + OTIdentifier m_SENDER_USER_ID; // This ID must match the user ID on that asset account, + // AND must verify the instrument's signature with that user's key. + + // -------------------------------------------------------------------------- + + inline void SetSenderAcctID(const OTIdentifier & ACCT_ID) { m_SENDER_ACCT_ID = ACCT_ID; } + inline void SetSenderUserID(const OTIdentifier & USER_ID) { m_SENDER_USER_ID = USER_ID; } + +public: + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline void SetTransactionNum(long lTransactionNum) { m_lTransactionNum = lTransactionNum; } + + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + + // ----------------------------------------------------------------- + // From OTInstrument (parent class of OTCronItem, parent class of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + */ + + OTTrackable(); + OTTrackable(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTTrackable(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & ACCT_ID, const OTIdentifier & USER_ID); + virtual ~OTTrackable(); + + + void InitTrackable(); + + virtual void Release(); + + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); + }; + + + +#endif // __OT_TRACKABLE_H__ diff --git a/OTLib/OTTrade.cpp b/OTLib/OTTrade.cpp new file mode 100644 index 000000000..3ac73efe1 --- /dev/null +++ b/OTLib/OTTrade.cpp @@ -0,0 +1,1299 @@ +/************************************************************************************ + * + * OTTrade.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTCron.h" +#include "OTTrade.h" +#include "OTOffer.h" +#include "OTMarket.h" +#include "OTLog.h" + + + +#ifndef TRADE_PROCESS_INTERVAL + +#define TRADE_PROCESS_INTERVAL 10 // 10 seconds + +#endif + + +// This class is like: you are placing an order to do a trade. +// Your order will continue processing until it is complete. +// PART of that process is putting an offer on the market. See OTOffer for that. +// +// Trades are like cron items, they can expire, they can have rules. +// +// An OTTrade is derived from OTCronItem. OTCron has a list of those items. + + + + + +// ------------------------------------------------------------- + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTTrade::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + int nReturnVal = 0; + + // Here we call the parent class first. + // If the node is found there, or there is some error, + // then we just return either way. But if it comes back + // as '0', then nothing happened, and we'll continue executing. + // + // -- Note you can choose not to call the parent if + // you don't want to use any of those xml tags. + // As I do below, in the case of OTAccount. + if (0 != (nReturnVal = OTCronItem::ProcessXMLNode(xml))) + return nReturnVal; + + + if (!strcmp("trade", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + m_nTradesAlreadyDone= atoi( xml->getAttributeValue("completedNoTrades")); + + SetTransactionNum( atol(xml->getAttributeValue("transactionNum")) ); + SetCreationDate( atoi(xml->getAttributeValue("creationDate"))); + SetValidFrom( atoi(xml->getAttributeValue("validFrom"))); + SetValidTo( atoi(xml->getAttributeValue("validTo"))); + + // --------------------- + + OTString strActivated(xml->getAttributeValue("hasActivated")); + + if (strActivated.Compare("true")) + m_bHasTradeActivated = true; + else + m_bHasTradeActivated = false; + + + // --------------------- + + const OTString strServerID(xml->getAttributeValue("serverID")), + strUserID(xml->getAttributeValue("userID")), + strAssetTypeID(xml->getAttributeValue("assetTypeID")), + strAssetAcctID(xml->getAttributeValue("assetAcctID")), + strCurrencyTypeID(xml->getAttributeValue("currencyTypeID")), + strCurrencyAcctID(xml->getAttributeValue("currencyAcctID")); + + const OTIdentifier SERVER_ID(strServerID), USER_ID(strUserID), + ASSET_TYPE_ID(strAssetTypeID), ASSET_ACCT_ID(strAssetAcctID), + CURRENCY_TYPE_ID(strCurrencyTypeID), CURRENCY_ACCT_ID(strCurrencyAcctID); + + SetServerID(SERVER_ID); + SetSenderUserID(USER_ID); + SetAssetID(ASSET_TYPE_ID); + SetSenderAcctID(ASSET_ACCT_ID); + SetCurrencyID(CURRENCY_TYPE_ID); + SetCurrencyAcctID(CURRENCY_ACCT_ID); + + // --------------------- + + OTLog::vOutput(3, "\n\nTrade. Transaction Number: %ld Completed # of Trades: %d\n", + m_lTransactionNum, m_nTradesAlreadyDone); + + OTLog::vOutput(1, + " Creation Date: %d Valid From: %d\n Valid To: %d\n" + " assetTypeID: %s\n assetAcctID: %s\n" + " ServerID: %s\n UserID: %s\n " + " currencyTypeID: %s\n currencyAcctID: %s\n ", + GetCreationDate(), GetValidFrom(), GetValidTo(), + strAssetTypeID.Get(), strAssetAcctID.Get(), + strServerID.Get(), strUserID.Get(), + strCurrencyTypeID.Get(), strCurrencyAcctID.Get()); + + nReturnVal = 1; + } + + if (!strcmp("stopOrder", xml->getNodeName())) + { + OTString strSign(xml->getAttributeValue("sign")); + + if (strSign.Compare("0")) + { + m_cStopSign = 0; // Zero means it isn't a stop order. So why is the tag in the file? + OTLog::vError("Strange: Stop order tag found in trade, but sign character set to 0.\n" + "(Zero means: NOT a stop order.)\n", strSign.Get()); + return (-1); + } + else if (strSign.Compare("<")) + m_cStopSign = '<'; + else if (strSign.Compare(">")) + m_cStopSign = '>'; + else + { + m_cStopSign = 0; + OTLog::vError("Unexpected or nonexistent value in stop order sign: %s\n", strSign.Get()); + return (-1); + } + // --------------------- + + // Now we know the sign is properly formed, let's grab the price value. + + m_lStopPrice = atol(xml->getAttributeValue("price")); + + // --------------------- + + OTString strActivated(xml->getAttributeValue("hasActivated")); + + if (strActivated.Compare("true")) + m_bHasStopActivated = true; + else + m_bHasStopActivated = false; + + // --------------------- + + OTLog::vOutput(3, + "\n\nStop order -- %s when price %s %s: %ld.\n", + (m_bHasStopActivated ? "Already activated" : "Will activate"), + (m_bHasStopActivated ? "was" : "reaches"), + (('<' == m_cStopSign) ? "LESS THAN" : "GREATER THAN"), + m_lStopPrice); + + nReturnVal = 1; + } + + else if (!strcmp("offer", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_strOffer)) + { + OTLog::Error("Error in OTTrade::ProcessXMLNode: offer field without value.\n"); + return (-1); // error condition + } + + nReturnVal = 1; + } + + return nReturnVal; +} + + +void OTTrade::UpdateContents() +{ + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", "1.0"); + + // ------------------------------------------------------------- + + const OTString SERVER_ID(GetServerID()), USER_ID(GetSenderUserID()), + ASSET_TYPE_ID(GetAssetID()), ASSET_ACCT_ID(GetSenderAcctID()), + CURRENCY_TYPE_ID(GetCurrencyID()), CURRENCY_ACCT_ID(GetCurrencyAcctID()); + + m_xmlUnsigned.Concatenate("\n\n", + m_strVersion.Get(), + (m_bHasTradeActivated ? "true" : "false"), + SERVER_ID.Get(), + ASSET_TYPE_ID.Get(), + ASSET_ACCT_ID.Get(), + CURRENCY_TYPE_ID.Get(), + CURRENCY_ACCT_ID.Get(), + USER_ID.Get(), + m_nTradesAlreadyDone, + m_lTransactionNum, + GetCreationDate(), + GetValidFrom(), GetValidTo() ); + + // ------------------------------------------------------------- + + // There are "closing" transaction numbers, used to CLOSE a transaction. + // Often where Cron items are involved such as this payment plan, or in baskets, + // where many asset accounts are involved and require receipts to be closed out. + + for (int i = 0; i < GetCountClosingNumbers(); i++) + { + long lClosingNumber = GetClosingTransactionNoAt(i); + OT_ASSERT(lClosingNumber > 0); + + m_xmlUnsigned.Concatenate("\n\n", + lClosingNumber); + + } + + // ------------------------------------------------------------- + + if (('<' == m_cStopSign) || ('>' == m_cStopSign)) + { + m_xmlUnsigned.Concatenate("\n\n", + (m_bHasStopActivated ? "true" : "false"), + m_cStopSign, + m_lStopPrice); + } + + // ------------------------------------------------------------- + + if (m_strOffer.Exists()) + { + OTASCIIArmor ascOffer(m_strOffer); + m_xmlUnsigned.Concatenate("\n%s\n\n", ascOffer.Get()); + } + + // ------------------------------------------------------------- + + m_xmlUnsigned.Concatenate("\n"); +} + + + +// The trade stores a copy of the Offer in string form. +// This function verifies that offer against the trade, +// and also verifies the signature on the offer. +// +// The Nym's ID is compared to theOffer's SenderUserID, and then the Signature is checked +// on the offer. It also compares the server ID, asset and currency IDs, transaction #, etc +// between this trade and the offer, in order to fully verify the offer's authenticity. +// +bool OTTrade::VerifyOffer(OTOffer & theOffer) +{ + // At this point, I have a working, loaded, model of the Offer. + // Let's verify the thing. + + if (GetTransactionNum() != theOffer.GetTransactionNum()) + { + OTLog::Error("While verifying offer, failed matching transaction number.\n"); + return false; + } + else if (GetServerID() != theOffer.GetServerID()) + { + OTLog::Error("While verifying offer, failed matching Server ID.\n"); + return false; + } + else if (GetAssetID() != theOffer.GetAssetID()) + { + OTLog::Error("While verifying offer, failed matching asset type ID.\n"); + return false; + } + else if (GetCurrencyID() != theOffer.GetCurrencyID()) + { + OTLog::Error("While verifying offer, failed matching currency type ID.\n"); + return false; + } + + // the Offer validates properly for this Trade. + return true; +} + + +// Assuming the offer is ON the market, this will get the pointer to that offer. +// Otherwise it will try to add it to the market. +// Otherwise it will fail. (Perhaps it's a stop order, and not ready to activate yet.) +// +OTOffer * OTTrade::GetOffer(OTIdentifier * pOFFER_MARKET_ID/*=NULL*/, OTMarket ** ppMarket/*=NULL*/) +{ + OT_ASSERT(NULL != GetCron()); + + // See if the offer has already been instantiated onto a market... + if (NULL != m_pOffer) + { + m_pOffer->SetTrade(*this); // Probably don't need this line. I'll remove it someday while optimizing. + // In fact since it should already be set, having this here would basically + // hide it from me if the memory was ever walked on from a bug somewhere. + + // It loaded. Let's get the Market ID off of it so we can locate the market. + const OTIdentifier OFFER_MARKET_ID(*m_pOffer); + + if (NULL != ppMarket) + { + OTMarket * pMarket = GetCron()->GetMarket(OFFER_MARKET_ID); + + // Sometimes the caller function would like a copy of this market pointer, when available. + // So I pass it back to him here, if he wants. That way he doesn't have to do this work again + // to look it up. + if (NULL != pMarket) + *ppMarket = pMarket; // <================= + else + OTLog::Error("OTTrade::GetOffer: m_pOffer already exists, yet unable to find the market it's supposed to be on.\n"); + + } + + if (NULL != pOFFER_MARKET_ID) + { + // Sometimes the caller function would like a copy of this ID. So I + // give the option to pass in a pointer so I can give it here. + pOFFER_MARKET_ID->Assign(OFFER_MARKET_ID); + } + + return m_pOffer; + } // if m_pOffer ALREADY EXISTS. + + // else (BELOW) m_pOffer IS NULL, and thus it didn't exist yet... + // -------------------------------------------------- + + if (!m_strOffer.Exists()) + { + OTLog::Error("OTTrade::GetOffer called with empty m_strOffer.\n"); + return NULL; + } + + // -------------------------------------------------- + + OTOffer * pOffer = new OTOffer(); + OT_ASSERT(NULL != pOffer); + + // Trying to load the offer from the trader's original signed request + // (So I can use it to lookup the Market ID, so I can see the offer is + // already there on the market.) + if (!pOffer->LoadContractFromString(m_strOffer)) + { + OTLog::Error("Error loading offer from string in OTTrade::GetOffer\n"); + delete pOffer; pOffer = NULL; + return NULL; + } + + // No need to do any additional security verification here on the Offer, + // since the Offer is already heavily verified in OTServer::NotarizeMarketOffer(). + // So as long as you feel safe about the Trade, then you can feel safe about + // the Offer already, with no further checks. + // *Also remember we saved a copy of the original in the cron folder. + + // It loaded. Let's get the Market ID off of it so we can locate the market. + OTIdentifier OFFER_MARKET_ID(*pOffer); + + if (NULL != pOFFER_MARKET_ID) + { + // Sometimes the caller function would like a copy of this ID. So I + // give the option to pass in a pointer so I can give it here. + pOFFER_MARKET_ID->Assign(OFFER_MARKET_ID); + } + + // --------------------------------------------------------------- + // Previously if a user tried to use a market that didn't exist, I'd just return failure. + // But now we will create any market that doesn't already exist. + // (Remember, the server operator could just erase the market folder--it wouldn't + // affect anyone's balances!) Update: he probably couldn't just wipe the markets folder, + // actually, without making it impossible for certain Nyms to get rid of certain issued #s. + // +// OTMarket * pMarket = m_pCron->GetMarket(OFFER_MARKET_ID); + OTMarket * pMarket = GetCron()->GetOrCreateMarket(GetAssetID(), GetCurrencyID(), pOffer->GetScale()); + + // Couldn't find (or create) the market. + if (NULL == pMarket) + { + OTLog::Output(3, "Unable to find or create market within requested parameters in OTTrade::GetOffer."); + delete pOffer; pOffer = NULL; + return NULL; + } + + // If the caller passed in the address of a market pointer (optional) + if (NULL != ppMarket) + { + // Sometimes the caller function would like a copy of this market pointer, when available. + // So I pass it back to him here, if he wants. That way he doesn't have to do this work again + // to look it up. + *ppMarket = pMarket; + } + + // -------------------------------------------------- + + // At this point, I have heap-allocated the offer, used it to get the Market ID, and successfully + // used that to get a pointer to the market matching that ID. + // + // Let's see if the offer is ALREADY allocated and on this market! + // If so, delete the one I just allocated. If not, add it to the market. + OTOffer * pMarketOffer = pMarket->GetOffer(pOffer->GetTransactionNum()); + + // The Offer is already on the Market. + // NOTE: It may just start out this way, without ever being added. + // How is that possible? Because maybe it was in the market file when we first loaded up, + // and had been added on some previous run of the software. So since we started running, + // the pMarket->AddOffer() code below has literally never run for that offer. Instead we + // first find it here, and thus return the pointer before getting any farther. + // + // IN ALL CASES, we make sure to call m_pOffer->SetTrade() so that it has a pointer BACK to + // this Trade object! (When actually processing the offer, the market will need the account + // numbers and Nym IDs... which are stored here on the trade.) + if (NULL != pMarketOffer) + { + m_pOffer = pMarketOffer; + + // Since the Offer already exists on the market, no need anymore for the + // one we allocated above (to get the market ID.) So we delete it now. + delete pOffer; + pOffer = NULL; + + m_pOffer->SetTrade(*this); + + return m_pOffer; + } + + // ************************************************************************ + + // Okay so the offer ISN'T already on the market. If it's not a stop order, let's ADD the one we + // allocated to the market now! (Stop orders are activated through their own logic, which is below + // this, in the else block.) + // + if (!IsStopOrder()) + { + if (m_bHasTradeActivated) + { + // Error -- how has the trade already activated, yet not on the market and null in my pointer? + OTLog::Error("How has the trade already activated, yet not on the market and null in my pointer?\n"); + } + else if (!pMarket->AddOffer(*pOffer, true)) // Since we're actually adding an offer to the market (not just + { // loading from disk) the we actually want to save the market. bSaveFile=true. + + // Error adding the offer to the market! + OTLog::Error("Error adding the offer to the market! (Even though supposedly the right market.)\n"); + } + else + { + // SUCCESS! + m_pOffer = pOffer; + + m_bHasTradeActivated = true; + + // The Trade (stored on Cron) has a copy of the Original Offer, with the User's signature on it. + // A copy of that original Trade object (itself with the user's signature) is already stored in + // the cron folder (by transaction number.) This happens when the Trade is FIRST added to cron, + // so it's already safe before we even get here. + // + // So thus I am FREE to release the signatures on the offer, and sign with the server instead. + // The server-signed offer will be stored by the OTMarket. + m_pOffer->ReleaseSignatures(); + m_pOffer->SignContract(*(GetCron()->GetServerNym())); + m_pOffer->SaveContract(); + + pMarket->SaveMarket(); + + // Now when the market loads next time, it can verify this offer using the server's signature, + // instead of having to load the user. Because the server has verified it and added it, and now + // signs it, vouching for it. + + + // The Trade itself (all its other variables) are now allowed to change, since its signatures + // are also released and it is now server-signed. (With a copy stored of the original.) + + m_pOffer->SetTrade(*this); + + return m_pOffer; + } + } + // ----------------------------------------------------------------- + // It's a stop order, and not activated yet. + // Should we activate it now? + // + else if (IsStopOrder() && !m_bHasStopActivated) + { + long lRelevantPrice = 0; + + // If the stop order is trying to sell something, then it cares about the highest bidder. + if (pOffer->IsAsk()) + lRelevantPrice = pMarket->GetHighestBidPrice(); + else // But if the stop order is trying to buy something, then it cares about the lowest ask price. + lRelevantPrice = pMarket->GetLowestAskPrice(); + + // It's a stop order that hasn't activated yet. SHOULD IT ACTIVATE NOW? + if ((IsGreaterThan() && (lRelevantPrice > GetStopPrice())) || + (IsLessThan() && (lRelevantPrice < GetStopPrice()))) + { + // Activate the stop order! + if (!pMarket->AddOffer(*pOffer, true)) // Since we're actually adding an offer to the market (not just + { // loading from disk) the we actually want to save the market. bSaveFile=true. + // Error adding the offer to the market! + OTLog::Error("Error adding the stop order to the market! (Even though supposedly the right market.)\n"); + } + else + { + // SUCCESS! + m_pOffer = pOffer; + + m_bHasStopActivated = true; + m_bHasTradeActivated = true; + + // The Trade (stored on Cron) has a copy of the Original Offer, with the User's signature on it. + // A copy of that original Trade object (itself with the user's signature) is already stored in + // the cron folder (by transaction number.) This happens when the Trade is FIRST added to cron, + // so it's already safe before we even get here. + // + // So thus I am FREE to release the signatures on the offer, and sign with the server instead. + // The server-signed offer will be stored by the OTMarket. + m_pOffer->ReleaseSignatures(); + m_pOffer->SignContract(*(GetCron()->GetServerNym())); + m_pOffer->SaveContract(); + + pMarket->SaveMarket(); + + // Now when the market loads next time, it can verify this offer using the server's signature, + // instead of having to load the user. Because the server has verified it and added it, and now + // signs it, vouching for it. + + + // The Trade itself (all its other variables) are now allowed to change, since its signatures + // are also released and it is now server-signed. (With a copy stored of the original.) + + + m_pOffer->SetTrade(*this); + + return m_pOffer; + } + } + } + + delete pOffer; + pOffer = NULL; + + return NULL; +} + + +// Cron only removes an item when that item REQUESTS to be removed (by setting the flag.) +// Once this happens, Cron has full permission to remove it. Thus, this hook is forceful. It +// is cron saying, YOU ARE BEING REMOVED. Period. So cleanup whatever you have to clean up. +// +// In this case, it removes the corresponding offer from the market. +// +void OTTrade::onRemovalFromCron() +{ + OTCron * pCron = GetCron(); + + OT_ASSERT(NULL != pCron); + + // If I don't already have an offer on the market, then I will have trouble figuring out + // my SCALE, which is stored on the Offer. Therefore I will instantiate an offer (since I + // store the original internally) and I will look up the scale. + // + + long lScale = 1; // todo stop hardcoding. + long lTransactionNum = 0; + + if (NULL == m_pOffer) + { + if (!m_strOffer.Exists()) + { + OTLog::Error("OTTrade::onRemovalFromCron called with NULL m_pOffer and empty m_strOffer.\n"); + return; + } + + OTOffer * pOffer = NULL; + OTCleanup theOfferAngel; + + // --------------------------- + + pOffer = new OTOffer(); + OT_ASSERT(NULL != pOffer); + theOfferAngel.SetCleanupTarget(*pOffer); + + // -------------------------------------------------- + + // Trying to load the offer from the trader's original signed request + // (So I can use it to lookup the Market ID, so I can see if the offer is + // already there on the market.) + if (!pOffer->LoadContractFromString(m_strOffer)) + { + OTLog::Error("Error loading offer from string in OTTrade::onRemovalFromCron\n"); + return; + } + + lScale = pOffer->GetScale(); + lTransactionNum = pOffer->GetTransactionNum(); + } + else + { + lScale = m_pOffer->GetScale(); + lTransactionNum = m_pOffer->GetTransactionNum(); + } + + // ----------------------------------------------------------- + + OTMarket * pMarket = pCron->GetOrCreateMarket(GetAssetID(), GetCurrencyID(), lScale); + + // Couldn't find (or create) the market. + // + if (NULL == pMarket) + { + OTLog::Error("Unable to find market within requested parameters in OTTrade::onRemovalFromCron.\n"); + return; + } + + // ----------------------------------------------------------- + // + // Let's see if the offer is ALREADY allocated and on this market! + // + OTOffer * pMarketOffer = pMarket->GetOffer(lTransactionNum); + + // The Offer is already on the Market. + // + if (NULL != pMarketOffer) + { + m_pOffer = pMarketOffer; + + m_pOffer->SetTrade(*this); + } + + // ----------------------------------------------------------- + + pMarket->RemoveOffer(lTransactionNum); + + // ----------------------------------------------------------- +} + + + + +long OTTrade::GetAssetAcctClosingNum() const +{ + return (GetCountClosingNumbers() > 0) ? GetClosingTransactionNoAt(0) : 0; // todo stop hardcoding. +} + +long OTTrade::GetCurrencyAcctClosingNum() const +{ + return (GetCountClosingNumbers() > 1) ? GetClosingTransactionNoAt(1) : 0; // todo stop hardcoding. +} + + +/// See if theNym has rights to remove this item from Cron. +/// +bool OTTrade::CanRemoveItemFromCron(OTPseudonym & theNym) +{ + // I don't call the parent class' version of this function, in the case of OTTrade, + // since it would just be redundant. + + // --------------------------------------------------------------------------------------- + // You don't just go willy-nilly and remove a cron item from a market unless you check first + // and make sure the Nym who requested it actually has said trans# (and 2 related closing #s) + // signed out to him on his last receipt... + // + if (false == theNym.CompareID(GetSenderUserID())) + { + OTLog::Output(5, "OTTrade::CanRemoveItem: theNym is not the originator of this CronItem. " + "(He could be a recipient though, so this is normal.)\n"); + return false; + } + + // By this point, that means theNym is DEFINITELY the originator (sender)... + else if (this->GetCountClosingNumbers() < 2) + { + OTLog::vOutput(0, "OTTrade::CanRemoveItem Weird: Sender tried to remove a market trade; expected at " + "least 2 closing numbers to be available--that weren't. (Found %d).\n", this->GetCountClosingNumbers()); + return false; + } + // ------------------------------------------ + // + const OTString strServerID(GetServerID()); + + if (false == theNym.VerifyIssuedNum(strServerID, this->GetAssetAcctClosingNum())) + { + OTLog::Output(0, "OTTrade::CanRemoveItemFromCron: Closing number didn't verify for asset account.\n"); + return false; + } + + if (false == theNym.VerifyIssuedNum(strServerID, this->GetCurrencyAcctClosingNum())) + { + OTLog::Output(0, "OTTrade::CanRemoveItemFromCron: Closing number didn't verify for currency account.\n"); + return false; + } + + // By this point, we KNOW theNym is the sender, and we KNOW there are the proper number of transaction + // numbers available to close. We also know that this cron item really was on the cron object, since + // that is where it was looked up from, when this function got called! So I'm pretty sure, at this point, + // to authorize removal, as long as the transaction num is still issued to theNym (this check here.) + // + return theNym.VerifyIssuedNum(strServerID, this->GetOpeningNum()); + + // Normally this will be all we need to check. The originator will have the transaction + // number signed-out to him still, if he is trying to close it. BUT--in some cases, someone + // who is NOT the originator can cancel. Like in a payment plan, the sender is also the depositor, + // who would normally be the person cancelling the plan. But technically, the RECIPIENT should + // also have the ability to cancel that payment plan. BUT: the transaction number isn't signed + // out to the RECIPIENT... In THAT case, the below VerifyIssuedNum() won't work! In those cases, + // expect that the special code will be in the subclasses override of this function. (OTPaymentPlan::CanRemoveItem() etc) + + // P.S. If you override this function, MAKE SURE to call the parent (OTCronItem::CanRemoveItem) first, + // for the VerifyIssuedNum call above. Only if that fails, do you need to dig deeper... +} + + + + +// This is called by OTCronItem::HookRemovalFromCron +// (After calling this method, HookRemovalFromCron then calls onRemovalFromCron.) +// +void OTTrade::onFinalReceipt(OTCronItem & theOrigCronItem, const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover) +{ + OTCron * pCron = GetCron(); + OT_ASSERT(NULL != pCron); + + OTPseudonym * pServerNym = pCron->GetServerNym(); + OT_ASSERT(NULL != pServerNym); + + // ----------------------------------------------------------------- + + // First, we are closing the transaction number ITSELF, of this cron item, + // as an active issued number on the originating nym. (Changing it to CLOSED.) + // + // Second, we're verifying the CLOSING number, and using it as the closing number + // on the FINAL RECEIPT (with that receipt being "InReferenceTo" this->GetTransactionNum()) + // + const long lOpeningNumber = theOrigCronItem.GetTransactionNum(); + // --------------------------------------------------------------------------- + const long lClosingAssetNumber = (theOrigCronItem.GetCountClosingNumbers() > 0) ? theOrigCronItem.GetClosingTransactionNoAt(0) : 0; + const long lClosingCurrencyNumber = (theOrigCronItem.GetCountClosingNumbers() > 1) ? theOrigCronItem.GetClosingTransactionNoAt(1) : 0; + // --------------------------------------------------------------------- + const OTString strServerID(GetServerID()); + + // The marketReceipt ITEM's NOTE contains the UPDATED TRADE. + // And the **UPDATED OFFER** is stored on the ATTACHMENT on the **ITEM.** + // + // BUT!!! This is not a marketReceipt Item, is it? ***This is a finalReceipt ITEM!*** + // I'm reversing pstrNote and pstrAttachment for finalReceipt, with the intention of + // eventually reversing them for marketReceipt as well. (Making them all in line with paymentReceipt.) + // + // WHY? Because I want a standard convention: + // 1. ORIGINAL (user-signed) Cron Items are always stored "in reference to" on cron receipts in the Inbox (an OTTransaction). + // 2. The UPDATED VERSION of that same cron item (a trade or payment plan) is stored in the ATTACHMENT on the OTItem member. + // 3. ADDITIONAL INFORMATION is stored in the NOTE field of the OTItem member. + // + // Unfortunately, marketReceipt doesn't adhere to this convention, as it stores the Updated Cron Item (the trade) in + // the note instead of the attachment, and it stores the updated Offer (the additional info) in the attachment instead + // of the note. + // Perhaps this is for the best -- it will certainly kick out any accidental confusions between marketReceipt and finalReceipt! + // todo: switch marketReceipt over to be like finalReceipt as described in this paragraph. + // + // Once everything is consistent on the above convention -- starting here and now with finalReceipt -- then we will ALWAYS + // be able to count on a Cron Item being in the Transaction Item's Attachment! We can load it using the existing factory class, + // without regard to type, KNOWING it's a cron item every time. + // todo: convert marketReceipt to do the same. + + // ------------------------------------------------- + // The finalReceipt Item's ATTACHMENT contains the UPDATED Cron Item. + // (With the SERVER's signature on it!) + // + OTString strUpdatedCronItem(*this); OTString * pstrAttachment = &strUpdatedCronItem; // the Updated TRADE. + OTString strUpdatedOffer; OTString * pstrNote = NULL; // the updated Offer (if available.) + + if (m_pOffer) + { + m_pOffer->SaveContract(strUpdatedOffer); + pstrNote = &strUpdatedOffer; + } + + const OTString strOrigCronItem(theOrigCronItem); + + bool bDroppedReceiptAssetAcct = false; + bool bDroppedReceiptCurrencyAcct = false; + + // ----------------------------------------------------------------- + // The OPENING transaction number must still be signed-out. + // It is this act of placing the final receipt, which then finally closes the opening number. + // The closing number, by contrast, is not closed out until the final Receipt is ACCEPTED + // (which happens in a "process inbox" transaction.) + // + if ((lOpeningNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lOpeningNumber)) + { + // The Nym (server side) stores a list of all opening and closing cron #s. + // So when the number is released from the Nym, we also take it off that list. + // + std::set & theIDSet = theOriginator.GetSetOpenCronItems(); + theIDSet.erase(lOpeningNumber); + + theOriginator.RemoveIssuedNum(*pServerNym, strServerID, lOpeningNumber, false); //bSave=false + theOriginator.SaveSignedNymfile(*pServerNym); // forcing a save here, since multiple things have changed. + + if (false == this->DropFinalReceiptToNymbox(GetSenderUserID(), + lNewTransactionNumber, + strOrigCronItem, + pstrNote, + pstrAttachment)) + { + OTLog::Error("OTTrade::onFinalReceipt: Failure dropping receipt into nymbox.\n"); + } + } + else + { + OTLog::Error("OTTrade::onFinalReceipt: Problem verifying Opening Number when calling VerifyIssuedNum(lOpeningNumber)\n"); + } + + // *************************************************************************************** + // ASSET ACCT + if ((lClosingAssetNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lClosingAssetNumber) + ) + { + bDroppedReceiptAssetAcct = this->DropFinalReceiptToInbox(GetSenderUserID(), + GetSenderAcctID(), + lNewTransactionNumber, + lClosingAssetNumber, // The closing transaction number to put on the receipt. + strOrigCronItem, + pstrNote, + pstrAttachment); + } + else + { + OTLog::Error("OTTrade::onFinalReceipt: Failed verifying lClosingAssetNumber=theOrigCronItem.GetClosingTransactionNoAt(0)>0 && " + "theOriginator.VerifyTransactionNum(lClosingAssetNumber)\n"); + } + // *************************************************************************************** + // CURRENCY ACCT + if ((lClosingCurrencyNumber > 0) && + theOriginator.VerifyIssuedNum(strServerID, lClosingCurrencyNumber) + ) + { + bDroppedReceiptCurrencyAcct = this->DropFinalReceiptToInbox(GetSenderUserID(), + GetCurrencyAcctID(), + lNewTransactionNumber, + lClosingCurrencyNumber, // closing transaction number for the receipt. + strOrigCronItem, + pstrNote, + pstrAttachment); + } + else + { + OTLog::Error("OTTrade::onFinalReceipt: Failed verifying lClosingCurrencyNumber=theOrigCronItem.GetClosingTransactionNoAt(1)>0 " + "&& theOriginator.VerifyTransactionNum(lClosingCurrencyNumber)\n"); + } + // *************************************************************************************** + + + // the RemoveIssued call means the original transaction# (to find this cron item on cron) is now CLOSED. + // But the Transaction itself is still OPEN. How? Because the CLOSING number is still signed out. + // The closing number is also USED, since the NotarizePaymentPlan or NotarizeMarketOffer call, but it + // remains ISSUED, until the final receipt itself is accepted during a process inbox. + // +// if (bDroppedReceiptAssetAcct || bDroppedReceiptCurrencyAcct) // ASSET ACCOUNT and CURRENCY ACCOUNT +// { + // This part below doesn't happen until you ACCEPT the finalReceipt (when processing your inbox.) + // +// if (bDroppedReceiptAssetAcct) +// theOriginator.RemoveIssuedNum(strServerID, lClosingAssetNumber, true); //bSave=false +// else if (bDroppedReceiptCurrencyAcct) +// theOriginator.RemoveIssuedNum(strServerID, lClosingCurrencyNumber, true); //bSave=false +// } +// else +// { +// OTLog::Error("OTTrade::onFinalReceipt: Failure dropping receipt into asset or currency inbox.\n"); +// } + + // QUESTION: Won't there be Cron Items that have no asset account at all? + // In which case, there'd be no need to drop a final receipt, but I don't think + // that's the case, since you have to use a transaction number to get onto cron + // in the first place. + // ----------------------------------------------------------------- +} + + + +// OTCron calls this regularly, which is my chance to expire, etc. +// Return True if I should stay on the Cron list for more processing. +// Return False if I should be removed and deleted. +bool OTTrade::ProcessCron() +{ + // ----------------------------------------------------------------- + // Right now Cron is called 10 times per second. + // I'm going to slow down all trades so they are once every GetProcessInterval() + if (GetLastProcessDate() > 0) + { + // (Default ProcessInterval is 1 second, but Trades will use 10 seconds, + // and Payment Plans will use an hour or day.) + if ((GetCurrentTime() - GetLastProcessDate()) <= GetProcessInterval()) + return true; + } + // Keep a record of the last time this was processed. + // (NOT saved to storage, only used while the software is running.) + // (Thus no need to release signatures, sign contract, save contract, etc.) + SetLastProcessDate(GetCurrentTime()); + // ----------------------------------------------------------------- + + + // PAST END DATE? -------------------------------- + // First call the parent's version (which this overrides) so it has + // a chance to check its stuff. Currently it checks IsExpired(). + if (false == OTCronItem::ProcessCron()) + return false; // It's expired or flagged for removal--remove it from Cron. + + // You might ask, why not check here if this trade is flagged for removal? + // Supposedly the answer is, because it's only below that I have the market pointer, + // and am able to remove the corresponding trade from the market. + // Therefore I am adding a hook for "onRemoval" so that Objects such as OTTrade ALWAYS + // have the opportunity to perform such cleanup, without having to juggle such logic. + + // REACHED START DATE? -------------------------------- + // Okay, so it's not expired. But might not have reached START DATE yet... + if (!VerifyCurrentDate()) + return true; // The Trade is not yet valid, so we return. BUT, we return + // true, so it will stay on Cron until it BECOMES valid. + + // TRADE-specific stuff below. -------------------------------- + + bool bStayOnMarket = true; // by default stay on the market (until some rule expires me.) + + OTIdentifier OFFER_MARKET_ID; + OTMarket * pMarket = NULL; + + // If the Offer is already active on a market, then I already have a pointer to + // it. This function returns that pointer. If NULL, it tries to find the offer on + // the market and then sets the pointer and returns. If it can't find it, IT TRIES + // TO ADD IT TO THE MARKET and sets the pointer and returns it. + OTOffer * pOffer = GetOffer(&OFFER_MARKET_ID, &pMarket); // Both of these parameters are optional. + + + // In this case, the offer is NOT on the market. + // Perhaps it wasn't ready to activate yet. + if (NULL == pOffer) + { + // The offer SHOULD HAVE been on the market, since we're within the valid range, + // and GetOffer adds it when it's not already there. + OTLog::Error("OTTrade::ProcessCron: Offer SHOULD have been on Market. I might ASSERT this.\n"); // comment this out + // Actually! If it's a Stop Order, then it WOULD be within the valid range, yet would + // not yet have activated. So I don't want to log some big error every time a stop order + // checks its prices. + } + else if (NULL == pMarket) + { + //todo. (This will already leave a log above in GetOffer somewhere.) + OTLog::Error("OTTrade::ProcessCron: Market was NULL.\n"); // comment this out + } + else // If a valid pointer was returned, that means the offer is on the market. + { + // Make sure it hasn't already been flagged by someone else... + if (this->IsFlaggedForRemoval()) // This is checked above in OTCronItem::ProcessCron(). + bStayOnMarket = false; // I'm leaving the check here in case the flag was set since then + else + { // Process it! <=================== + OTLog::vOutput(0, "Processing a trade...\n"); + bStayOnMarket = pMarket->ProcessTrade(*this, *pOffer); + // No need to save the Trade or Offer, since they will + // be saved inside this call if they are changed. + } + } + + // Return True if I should stay on the Cron list for more processing. + // Return False if I should be removed and deleted. + return bStayOnMarket; // defaults true, so if false, that means someone is removing it for a reason. +} + + +/* +X OTIdentifier m_CURRENCY_TYPE_ID; // GOLD (Asset) is trading for DOLLARS (Currency). +X OTIdentifier m_CURRENCY_ACCT_ID; // My Dollar account, used for paying for my Gold (say) trades. + +X long m_lStopPrice; // The price limit that activates the STOP order. +X char m_cStopSign; // Value is 0, or '<', or '>'. + +X time_t m_CREATION_DATE; // The date, in seconds, when the trade was authorized. +X int m_nTradesAlreadyDone; // How many trades have already processed through this order? We keep track. +*/ + +// This is called by the client side. First you call MakeOffer() to set up the Offer, +// then you call IssueTrade() and pass the Offer into it here. +bool OTTrade::IssueTrade(OTOffer & theOffer, char cStopSign/*=0*/, long lStopPrice/*=0*/) +{ + // Make sure the Stop Sign is within parameters (0, '<', or '>') + if ((cStopSign == 0 ) || + (cStopSign == '<') || + (cStopSign == '>')) + m_cStopSign = cStopSign; + else + { + OTLog::vError("Bad data in Stop Sign while issuing trade: %c\n", cStopSign); + return false; + } + + // Make sure, if this IS a Stop order, that the price is within parameters and set. + if ((m_cStopSign == '<') || + (m_cStopSign == '>')) + { + if (0 >= lStopPrice) + { + OTLog::Error("Expected Stop Price for trade.\n"); + return false; + } + + m_lStopPrice = lStopPrice; + } + + m_nTradesAlreadyDone = 0; + + SetCreationDate(time(NULL)); // This time is set to TODAY NOW (OTCronItem) + + // ------------------------------------------------------------------------ + + // Validate the Server ID, Asset Type ID, Currency Type ID, and Date Range. + if ((GetServerID() != theOffer.GetServerID()) || + (GetCurrencyID() != theOffer.GetCurrencyID()) || + (GetAssetID() != theOffer.GetAssetID()) || + + (theOffer.GetValidFrom() < 0) || + (theOffer.GetValidTo() < theOffer.GetValidFrom()) ) + { + return false; + } + +// m_CURRENCY_TYPE_ID // This is already set in the constructors of this and the offer. (And compared.) +// m_CURRENCY_ACCT_ID // This is already set in the constructor of this. + + // Set the (now validated) date range as per the Offer. + SetValidFrom(theOffer.GetValidFrom()); + SetValidTo(theOffer.GetValidTo()); + + // Get the transaction number from the Offer. + SetTransactionNum(theOffer.GetTransactionNum()); + + // Save a copy of the offer, in XML form, here on this Trade. + OTString strOffer(theOffer); + m_strOffer.Set(strOffer); + + return true; +} + + +OTTrade::OTTrade() : OTCronItem(), m_pOffer(NULL), + m_bHasTradeActivated(false), + m_lStopPrice(0), + m_cStopSign(0), + m_bHasStopActivated(false), + m_nTradesAlreadyDone(0) +{ +// m_pOffer = NULL; // NOT responsible to clean this up. Just keeping the pointer for convenience. + // You might ask, "but what if it goes bad?" Actually only THIS object should ever decide that. + // Only the Trade object decides when to add or remove an offer from any market. + + InitTrade(); +} + +OTTrade::OTTrade(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : + OTCronItem(SERVER_ID, ASSET_ID), m_pOffer(NULL), + m_bHasTradeActivated(false), + m_lStopPrice(0), + m_cStopSign(0), + m_bHasStopActivated(false), + m_nTradesAlreadyDone(0) +{ +// m_pOffer = NULL; // NOT responsible to clean this up. Just keeping the pointer for convenience. + // You might ask, "but what if it goes bad?" Actually only THIS object should ever decide that. + // Only the Trade object decides when to add or remove an offer from any market. + + InitTrade(); +} + + +OTTrade::OTTrade(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, const OTIdentifier & ASSET_ACCT_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & CURRENCY_ID, const OTIdentifier & CURRENCY_ACCT_ID) : + OTCronItem(SERVER_ID, ASSET_ID, ASSET_ACCT_ID, USER_ID), m_pOffer(NULL), + m_bHasTradeActivated(false), + m_lStopPrice(0), + m_cStopSign(0), + m_bHasStopActivated(false), + m_nTradesAlreadyDone(0) +{ +// m_pOffer = NULL; // NOT responsible to clean this up. Just keeping the pointer for convenience. + // You might ask, "but what if it goes bad?" Actually only THIS object should ever decide that. + // Only the Trade object decides when to add or remove an offer from any market. + + InitTrade(); + + SetCurrencyID(CURRENCY_ID); + SetCurrencyAcctID(CURRENCY_ACCT_ID); +} + +OTTrade::~OTTrade() +{ + // no need to call Release(), the framework will call it. +} + + +// This CAN have values that are reset +void OTTrade::InitTrade() +{ + // initialization here. Sometimes also called during cleanup to zero values. + m_strContractType = "TRADE"; + + SetProcessInterval(TRADE_PROCESS_INTERVAL); // Trades default to processing every 10 seconds. + // (vs 1 second for Cron items and 1 hour for payment plans) + + m_nTradesAlreadyDone= 0; + + m_cStopSign = 0; // IS THIS a STOP order? Value is 0, or '<', or '>'. + m_lStopPrice = 0; // The price limit that activates the STOP order. + m_bHasStopActivated = false;// Once the Stop Order activates, it puts the order on the market. + // I'll put a "HasOrderOnMarket()" bool method that answers this for u. + m_bHasTradeActivated = false;// I want to keep track of general activations as well, not just stop orders. +} + +// the framework will call this at the right time. +void OTTrade::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + m_CURRENCY_TYPE_ID.Release(); + m_CURRENCY_ACCT_ID.Release(); + + m_strOffer.Release(); + + OTCronItem::Release(); // since I've overridden the base class, I call it now... + + // Then I call this to re-initialize everything + // (Only cause it's convenient...) + InitTrade(); +} + + + + +bool OTTrade::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + diff --git a/OTLib/OTTrade.h b/OTLib/OTTrade.h new file mode 100644 index 000000000..1de03debb --- /dev/null +++ b/OTLib/OTTrade.h @@ -0,0 +1,310 @@ +/************************************************************************************ + * + * OTTrade.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +// An OTTrade is derived from OTCronItem. OTCron has a list of items, +// which may be trades or agreements or who knows what next. +// + +#ifndef __OTTRADE_H__ +#define __OTTRADE_H__ + +//#include // already included in parent somewhere. + +#include "OTString.h" +#include "OTCronItem.h" +#include "OTOffer.h" + +class OTIdentifier; + + + +/* + OTTrade + + Standing Order (for Trades) MUST STORE: + + X 1) Transaction ID // It took a transaction number to create this trade. We record it here and use it to uniquely identify the trade, like any other transaction. + X 4) CURRENCY TYPE ID (Currency type ID of whatever I’m trying to buy or sell WITH. Dollars? Euro?) + X 5) Account ID SENDER (for above currency type. This is the account where I make my payments from, to satisfy the trades.) + X 6) Valid date range. (Start. Expressed as an absolute date.) + X 7) Valid date range. ( End. Expressed as an absolute date.) + + X 2) Creation date. + X 3) INTEGER: Number of trades that have processed through this order. + + X 8) STOP ORDER — SIGN (NULL if not a stop order — otherwise GREATER THAN or LESS THAN…) + X 9) STOP ORDER — PRICE (…AT X PRICE, POST THE OFFER TO THE MARKET.) + + Cron for these orders must check expiration dates and stop order prices. + + ——————————————————————————————— + */ + +class OTPseudonym; + + +class OTTrade : public OTCronItem +{ +private: + OTIdentifier m_CURRENCY_TYPE_ID; // GOLD (Asset) is trading for DOLLARS (Currency). + OTIdentifier m_CURRENCY_ACCT_ID; // My Dollar account, used for paying for my Gold (say) trades. + + OTOffer * m_pOffer; // The pointer to the Offer (NOT responsible for cleaning this up!!! + // The offer is owned by the market and I only keep a pointer here for convenience. + + bool m_bHasTradeActivated; // Has the offer yet been first added to a market? + + long m_lStopPrice; // The price limit that activates the STOP order. + char m_cStopSign; // Value is 0, or '<', or '>'. + bool m_bHasStopActivated; // If the Stop Order has already activated, I need to know that. + + int m_nTradesAlreadyDone; // How many trades have already processed through this order? We keep track. + + OTString m_strOffer; // The market offer associated with this trade. + +protected: + virtual void onFinalReceipt(OTCronItem & theOrigCronItem, const long & lNewTransactionNumber, + OTPseudonym & theOriginator, + OTPseudonym * pRemover); + virtual void onRemovalFromCron(); + +public: + bool VerifyOffer(OTOffer & theOffer); + + bool IssueTrade(OTOffer & theOffer, char cStopSign=0, long lStopPrice=0); + + // The Trade always stores the original, signed version of its Offer. + // This method allows you to grab a copy of it. + inline bool GetOfferString(OTString & strOffer) + { strOffer.Set(m_strOffer); return m_strOffer.Exists() ? true : false; } + + inline bool IsStopOrder() const { if ((m_cStopSign == '<') || (m_cStopSign == '>')) return true; return false; } + + inline const long & GetStopPrice() const { return m_lStopPrice; } + + inline bool IsGreaterThan() const { if ((m_cStopSign == '>')) return true; return false; } + inline bool IsLessThan() const { if ((m_cStopSign == '<')) return true; return false; } + + // optionally returns the offer's market ID and a pointer to the market. + OTOffer * GetOffer(OTIdentifier * pOFFER_MARKET_ID=NULL, OTMarket ** ppMarket=NULL); + + // -------------------------------------------------------------------------- + + inline const OTIdentifier & GetCurrencyID() const { return m_CURRENCY_TYPE_ID; } + inline void SetCurrencyID(const OTIdentifier & CURRENCY_ID) { m_CURRENCY_TYPE_ID = CURRENCY_ID; } + + inline const OTIdentifier & GetCurrencyAcctID() const { return m_CURRENCY_ACCT_ID; } + inline void SetCurrencyAcctID(const OTIdentifier & CURRENCY_ACCT_ID) { m_CURRENCY_ACCT_ID = CURRENCY_ACCT_ID; } + + // -------------------------------------------------------------------------- + + inline void IncrementTradesAlreadyDone() { m_nTradesAlreadyDone++; } + + inline int GetCompletedCount() { return m_nTradesAlreadyDone; } + + // -------------------------------------------------------------------------- + + long GetAssetAcctClosingNum() const; + long GetCurrencyAcctClosingNum() const; + + // From OTCronItem (parent class of this) + /* + inline void SetCronPointer(OTCron & theCron) { m_pCron = &theCron; } + + inline void SetCreationDate(const time_t & CREATION_DATE) { m_CREATION_DATE = CREATION_DATE; } + inline const time_t & GetCreationDate() const { return m_CREATION_DATE; } + */ + // Return True if should stay on OTCron's list for more processing. + // Return False if expired or otherwise should be removed. + virtual bool ProcessCron(); // OTCron calls this regularly, which is my chance to expire, etc. + virtual bool CanRemoveItemFromCron(OTPseudonym & theNym); + + // -------------------------------------------------------------------------- + + // From OTTrackable (parent class of OTCronItem, parent class of this) + /* + inline long GetTransactionNum() const { return m_lTransactionNum; } + inline void SetTransactionNum(long lTransactionNum) { m_lTransactionNum = lTransactionNum; } + + inline const OTIdentifier & GetSenderAcctID() { return m_SENDER_ACCT_ID; } + inline const OTIdentifier & GetSenderUserID() { return m_SENDER_USER_ID; } + inline void SetSenderAcctID(const OTIdentifier & ACCT_ID) { m_SENDER_ACCT_ID = ACCT_ID; } + inline void SetSenderUserID(const OTIdentifier & USER_ID) { m_SENDER_USER_ID = USER_ID; } + */ + + // -------------------------------------------------------------------------- + + // From OTInstrument (parent class of OTTrackable, parent class of OTCronItem, parent class of this) + /* + OTInstrument(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID) : OTContract() + + inline const OTIdentifier & GetAssetID() const { return m_AssetTypeID; } + inline const OTIdentifier & GetServerID() const { return m_ServerID; } + + inline void SetAssetID(const OTIdentifier & ASSET_ID) { m_AssetTypeID = ASSET_ID; } + inline void SetServerID(const OTIdentifier & SERVER_ID) { m_ServerID = SERVER_ID; } + + inline time_t GetValidFrom() const { return m_VALID_FROM; } + inline time_t GetValidTo() const { return m_VALID_TO; } + + inline void SetValidFrom(time_t TIME_FROM) { m_VALID_FROM = TIME_FROM; } + inline void SetValidTo(time_t TIME_TO) { m_VALID_TO = TIME_TO; } + + bool VerifyCurrentDate(); // Verify the current date against the VALID FROM / TO dates. + */ + + + //---------------------------------------------------------------------- + + OTTrade(); + OTTrade(const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID); + OTTrade(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, const OTIdentifier & ASSET_ACCT_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & CURRENCY_ID, const OTIdentifier & CURRENCY_ACCT_ID); + virtual ~OTTrade(); + + void InitTrade(); + + virtual void Release(); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the ledger saves its contents + + virtual bool SaveContractWallet(std::ofstream & ofs); + + +}; + + +#endif // __OTTRADE_H__ diff --git a/OTLib/OTTransaction.cpp b/OTLib/OTTransaction.cpp new file mode 100644 index 000000000..84d7444ef --- /dev/null +++ b/OTLib/OTTransaction.cpp @@ -0,0 +1,3467 @@ +/************************************************************************************ + * + * OTTransaction.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + + +#include +#include +#include +#include +#include +#include +#include + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + +#include "OTStorage.h" + + +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTAccount.h" +#include "OTPayload.h" +#include "OTMessage.h" +#include "OTStringXML.h" + +#include "OTCheque.h" +#include "OTItem.h" +#include "OTLedger.h" +#include "OTPaymentPlan.h" +#include "OTTransactionType.h" +#include "OTTransaction.h" +#include "OTLog.h" + + + +const char * OTTransaction::_TypeStrings[] = +{ + "blank", // freshly issued, not used yet // comes from server, stored on Nym. + "message", // in nymbox, message from one user to another. + "pending", // Pending transfer, in the inbox/outbox. + // -------------------------------------------------------------------------------------- + "transferReceipt", // the server drops this into your inbox, when someone accepts your transfer. + // -------------------------------------------------------------------------------------- + "chequeReceipt", // the server drops this into your inbox, when someone cashes your cheque. + "marketReceipt", // server drops this into inbox periodically, if you have an offer on the market. + "paymentReceipt", // the server drops this into people's inboxes, periodically, if they have payment plans. + // -------------------------------------------------------------------------------------- + "finalReceipt", // the server drops this into your inbox(es), when a CronItem expires or is canceled. + "basketReceipt", // the server drops this into your inboxes, when a basket exchange is processed. + // -------------------------------------------------------------------------------------- + "processNymbox", // process nymbox transaction // comes from client + "atProcessNymbox", // process nymbox reply // comes from server + "processInbox", // process inbox transaction // comes from client + "atProcessInbox", // process inbox reply // comes from server + // -------------------------------------------------------------------------------------- + "transfer", // or "spend". This transaction is a transfer from one account to another + "atTransfer", // reply from the server regarding a transfer request + // -------------------------------------------------------------------------------------- + "deposit", // this transaction is a deposit of bearer tokens (from client) + "atDeposit", // reply from the server regarding a deposit request + // -------------------------------------------------------------------------------------- + "withdrawal", // this transaction is a withdrawal of bearer tokens + "atWithdrawal", // reply from the server regarding a withdrawal request + // -------------------------------------------------------------------------------------- + "marketOffer", // this transaction is a market offer + "atMarketOffer", // reply from the server regarding a market offer + // -------------------------------------------------------------------------------------- + "paymentPlan", // this transaction is a payment plan + "atPaymentPlan", // reply from the server regarding a payment plan + // -------------------------------------------------------------------------------------- + "cancelCronItem", // this transaction is a cancellation of a cron item (payment plan etc) + "atCancelCronItem", // reply from the server regarding said cancellation. + // -------------------------------------------------------------------------------------- + "exchangeBasket", // this transaction is an exchange in/out of a basket currency. + "atExchangeBasket", // reply from the server regarding said exchange. + // -------------------------------------------------------------------------------------- + "error_state" +}; + + + + + +// --------------------------------------------------------- +// Used in balance agreement, part of the inbox report. +long OTTransaction::GetClosingNum() const +{ + return m_lClosingTransactionNo; +} + + +void OTTransaction::SetClosingNum(const long lClosingNum) +{ + m_lClosingTransactionNo = lClosingNum; +} +// --------------------------------------------------------- + + + + + + + +// Client-side. +// +// This transaction actually was saved as a transaction receipt (filename: nymID.success) +// and now, for whatever reason, I want to verify the receipt against the local data (the Nym). +// +// Let's say the Nym has the numbers 9 and 10. He signs a receipt to that effect. Until a new +// receipt is signed, they should STILL be 9 and 10! Therefore I should be able to load up +// the last receipt, pass it the Nym, and verify this. +// +// But what if the last receipt is a balance receipt, instead of a transaction receipt? Let's +// say I grab the Nym and he has only a 9! And though this transaction receipt shows a 9 +// and 10, there is a newer balance receipt that shows only a 9? That means even when +// verifying a transaction receipt, I need to also load the last balance receipt and (for +// transaction numbers, anyway) use whichever one is newer. +// +// From there, it's simple: Make sure they match. +// I should do this when I already have the last receipt and I just grabbed a copy of the Nym. +// +// BUT!! I can't load the last balance receipt, since I don't have the account number. +// So let's say #10 disappears, as the last balance receipt would show (but which I can't see.) +// That means THE_NYM will show that 10 is missing, even though *this shows that #10 is still +// on the list. Is that bad? +// +// New transaction numbers can only be issued to my signed-out list of responsibility in the +// case where I SIGNED for each number using a transaction agreement. +// Whereas transaction numbers can only be REMOVED via a balance agreement (processInbox.) +// (NOTE: or they can be removed from an expired or canceled cron item -- aka finalReceipt.) +// Therefore, at most, I will see that a number has disappeared, NOT that one was added. +// +// Conclusion: as long as numbers only DISAPPEAR, and are not ADDED, then this verify is good. +// But in VerifyBalanceReceipt (next function down) I will need to load the transaction receipt +// and use it for verifying issued numbers, in cases where that receipt is newer than the balance +// receipt. (Because in that case, numbers may have been ADDED..) +// +bool OTTransaction::VerifyTransactionReceipt(OTPseudonym & SERVER_NYM, // For verifying a signature. + OTPseudonym & THE_NYM) +{ + // ------------------------------------ + + // LOAD "AT TRANSACTION STATEMENT" (ITEM) + + OTItem * pBalanceItem = NULL; + + OTItem * pResponseBalanceItem = GetItem(OTItem::atTransactionStatement); + + if (NULL == pResponseBalanceItem) + { + // error, return. + OTLog::Output(0, "No atTransactionStatement item found on receipt (strange.)\n"); + return false; + } + else if (OTItem::acknowledgement != pResponseBalanceItem->GetStatus()) + { + // error, return. + OTLog::Output(0, "Error: atTransactionStatement found on receipt, but not a successful one.\n"); + return false; + } + else if (!pResponseBalanceItem->VerifySignature(SERVER_NYM)) + { + OTLog::Output(0, "Unable to verify signature on atTransactionStatement item in OTTransaction::VerifyTransactionReceipt.\n"); + return false; + } + + // ------------------------------------ + + // LOAD "TRANSACTION STATEMENT" (ITEM) + + OTString strBalanceItem; + pResponseBalanceItem->GetReferenceString(strBalanceItem); + + if (!strBalanceItem.Exists()) + { + // error, return. + OTLog::Output(0, "No transactionStatement item found as 'in ref to' string on a receipt containing atTransactionStatement item.\n"); + return false; + } + + pBalanceItem = OTItem::CreateItemFromString(strBalanceItem, + GetPurportedServerID(), + pResponseBalanceItem->GetReferenceToNum()); + + if (NULL == pBalanceItem) + { + OTLog::Output(0, "Unable to load transactionStatement item from string (from a receipt containing an atTransactionStatement item.)\n"); + return false; + } + else if (pBalanceItem->GetType() != OTItem::transactionStatement) + { + OTLog::Output(0, "Wrong type on pBalanceItem (expected OTItem::transactionStatement)\n"); + return false; + } + else if (!pBalanceItem->VerifySignature(THE_NYM)) + { + OTLog::Output(0, "Unable to verify signature on transactionStatement item in OTTransaction::VerifyTransactionReceipt.\n"); + return false; + } + + // --------------------------------------------------------- + + // LOAD MESSAGE NYM (THE LIST OF ISSUED NUMBERS ACCORDING TO THE RECEIPT.) + + OTPseudonym theMessageNym; + OTString strMessageNym; // Okay now we have the transaction numbers in this MessageNym string. + + pBalanceItem->GetAttachment(strMessageNym); + + if (!strMessageNym.Exists() || !theMessageNym.LoadFromString(strMessageNym)) + { + OTLog::Output(0, "Unable to load message nym in OTTransaction::VerifyTransactionReceipt.\n"); + return false; + } + + // ------------------------------------ + + // VERIFY THE LIST OF ISSUED (SIGNED FOR) TRANSACTION NUMBERS ON THE NYM AGAINST THE RECEIPT. + + // It's okay if some transaction #s in theMessageNym (the receipt) aren't found on THE_NYM, (client-side) + // since the last balance agreement may have cleaned them out after they were recorded in + // theMessageNym (from the transaction statement receipt). + // + // But I should never see transaction #s APPEAR in THE_NYM that aren't in theMessageNym, + // since a balance agreement (or a finalReceipt) can ONLY remove numbers, not add them. + // + // + if (!THE_NYM.VerifyTransactionStatementNumbersOnNym(theMessageNym)) + { + OTLog::Output(0, "Unable to verify issued numbers on last signed receipt with numbers on THE_NYM in OTTransaction::VerifyTransactionReceipt.\n"); + return false; + } + + // ------------------------------------------------------- + + return true; +} + + + + +// static +bool OTTransaction::VerifyTransactionReceipt(OTPseudonym & SERVER_NYM, + OTPseudonym & THE_NYM, + OTIdentifier & SERVER_ID) +{ + OTIdentifier USER_ID(THE_NYM), SERVER_USER_ID(SERVER_NYM); + const OTString strServerID(SERVER_ID), strReceiptID(USER_ID); + + OTString strFilename; strFilename.Format("%s.success", strReceiptID.Get()); + + const char * szFolder1name = OTLog::ReceiptFolder(); // receipts + const char * szFolder2name = strServerID.Get(); // receipts/SERVER_ID + const char * szFilename = strFilename.Get(); // receipts/SERVER_ID/USER_ID.success + + if (false == OTDB::Exists(szFolder1name, szFolder2name, szFilename)) + { + OTLog::Output(1, "Receipt file doesn't exist in OTTransaction::VerifyTransactionReceipt.\n"); + return false; + } + + // ---------------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFolder1name, szFolder2name, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTTransaction::VerifyTransactionReceipt: Error reading file: %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + OTString strTransaction(strFileContents.c_str()); + + OTTransactionType * pContents = OTTransactionType::TransactionFactory(strTransaction); + OTCleanup theAngel(pContents); + + if ((NULL == pContents) || (false == pContents->VerifySignature(SERVER_NYM))) + { + OTLog::vError("OTTransaction::VerifyTransactionReceipt: Unable to load or verify transaction statement:" + " %s%s%s%s%s\n", + szFolder1name, // receipts + OTLog::PathSeparator(), + szFolder2name, // receipts/SERVER_ID + OTLog::PathSeparator(), + szFilename); // receipts/SERVER_ID/USER_ID.success + return false; + } + + // At this point, pContents is successfully loaded and verified, containing the last transaction receipt. + OTTransaction * pTrans = dynamic_cast(pContents); + + if (NULL != pTrans) + return pTrans->VerifyTransactionReceipt(SERVER_NYM, THE_NYM); + else + OTLog::Error("OTTransaction::VerifyTransactionReceipt: Error... dynamic_cast failed.\n"); + + return false; +} + + + +// static +bool OTTransaction::VerifyBalanceReceipt(OTPseudonym & SERVER_NYM, + OTPseudonym & THE_NYM, + OTIdentifier & SERVER_ID, + OTIdentifier & ACCT_ID) +{ + OTIdentifier USER_ID(THE_NYM), SERVER_USER_ID(SERVER_NYM); + OTString strServerID(SERVER_ID), strReceiptID(ACCT_ID); + + // ----------------------------------- + + // Load the last successful BALANCE STATEMENT... + + OTTransaction tranOut(SERVER_USER_ID, ACCT_ID, SERVER_ID); + + OTString strFilename; strFilename.Format("%s.success", strReceiptID.Get()); + + const char * szFolder1name = OTLog::ReceiptFolder(); // receipts + const char * szFolder2name = strServerID.Get(); // receipts/SERVER_ID + const char * szFilename = strFilename.Get(); // receipts/SERVER_ID/ACCT_ID.success + + if (false == OTDB::Exists(szFolder1name, szFolder2name, szFilename)) + { + OTLog::Output(1, "Receipt file doesn't exist in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ---------------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFolder1name, szFolder2name, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Error reading file: %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + OTString strTransaction(strFileContents.c_str()); + + if (!tranOut.LoadContractFromString(strTransaction)) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Unable to load balance statement:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + else if (!tranOut.VerifySignature(SERVER_NYM)) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Unable to verify signature on balance statement:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + + // At this point, tranOut is successfully loaded and verified, containing the last balance receipt. + + return tranOut.VerifyBalanceReceipt(SERVER_NYM, THE_NYM); +} + + + +// Client-side +// +// This transaction actually was saved as a balance receipt (filename: accountID.success) +// and now, for whatever reason, I want to verify the receipt against the local data (the Nym, +// the inbox, the outbox, and the account balance). +// +// Let's say the Nym has the numbers 9 and 10. He signs a receipt to that effect. Until a new +// receipt is signed, they should STILL be 9 and 10! Therefore I should be able to load up +// the last receipt, pass it the Nym, and verify this. +// +// But what if the last receipt is a transaction receipt, instead of a balance receipt? Let's +// say I grab the Nym and he has 9, 10, and 15! And though this balance receipt shows 9 and 10, +// there is a newer one that shows 9, 10, and 15? That means even when verifying a balance +// receipt, I need to also load the last transaction receipt and for transaction numbers, use +// whichever one is newer. +// +// When downloading the inbox, the outbox, the account, or the nym, if there is a receipt, I +// should compare what I've downloaded with the last receipt. Because if there's a discrepancy, +// then I don't want to USE that inbox/outbox/account/nym to sign a NEW receipt, causing me +// to sign agreement to invalid data! Instead, I want a red flag to go up, and the receipt +// automatically saved to a disputes folder, etc. +// +bool OTTransaction::VerifyBalanceReceipt(OTPseudonym & SERVER_NYM, // For verifying a signature. + OTPseudonym & THE_NYM) // transaction numbers issued according to nym must match this. + //OTLedger & THE_INBOX, // All inbox items on *this must also be found in THE_INBOX. All new items (on THE_INBOX only) must be accounted for in the balance. + //OTLedger & THE_OUTBOX, // All inbox items that changed balance (cheque, market, payment) must be found on the list of issued numbers. + //const OTAccount & THE_ACCOUNT) // All outbox items must match, and the account balance must be accounted for as described. +{ // These are now loaded within this function, so no need to pass them in. + // Load the other receipt (see above) if necessary. + + // Compare the inbox I just downloaded with what my last signed receipt SAYS it should say. + // Let's say the inbox has transaction 9 in it -- well, my last signed receipt better show + // that 9 was in my inbox then, too. But what if 9 was on a cheque, and it only recently hit? + // Well it won't be in my old inbox, but it WILL still be signed for as an open transaction. + + // Since this involves verifying the outbox, inbox, AND account, this function should only + // be called after all three have been downloaded, not after each one. + // Basically the outbox should RARELY change, the inbox is EXPECTED to change, and the account + // is EXPECTED to change, BUT ONLY in cases where the inbox justifies it! + // + // -- Verify the transaction numbers on the nym match those exactly on the newest transaction or balance receipt. (this) + // -- Make sure outbox is the same. + // -- Loop through all items in the inbox, AND in the inbox according to the receipt, and total the + // values of both. I might have 9 and 10 issued in the last receipt, with #9 in the inbox, + // showing 50 clams and a balance of 93. But now I downloaded an inbox showing #9 AND #10, + // with values of 50 and 4, and a balance of 89. + // The new inbox is still valid, and the new account balance is still valid, because the + // new number that appeared was issued to me and signed out, and because the last receipt's + // balance of 93 with 50 clams worth of receipts, matches up to the new account/inbox + // balance of 89 with 54 clams worth of receipts. + // The two totals still match! That's what we're checking for. + // + // Not JUST that actually, but that, if #10 is NOT found in the old one, THEN the amount (4) + // must be the DIFFERENCE between the balances (counting all new transactions like #10.) + // Meaning, the difference between the two balances MUST be made up EXACTLY by the transactions + // that are found now, that were not previously found, minus the total of the transactions + // from before that are no longer there, but are also no longer on my issued list and thus don't matter. + // + // Wow ! OTItem::VerifyBalanceStatement will have useful code but it doesn't encapsulate all this + // new functionality, since this version must assume differences are there, and STILL verify things + // by comparing details about those differences, whereas that version only serves to make sure + // everything still matches. + // --------------------------------------------------- + + // -- Verify nym transactions match. (issued.) + // -- Verify outbox matches. + // -- Loop through all items on receipt. If outbox item, should match exactly. + // -- But for inbox items, total up: the amount of the total of the items from the receipt, + // for all those that would actually change the balance (chequeReceipt, marketReceipt, paymentReceipt, basketReceipt.) + // These should ALL be found in the current version of the inbox. (They can only be removed by balance agreement, + // which would update THIS RECEIPT to remove them...) + // -- That was the receipt. Now loop through the above inbox items and do the reverse: for each item in the NEW inbox, + // add up the total of those that would change the balance, for receipts found on the new but not the old, and account for that exactly as a difference in balance. + /* + + Example. + + -- Oldest signed receipt shows a balance of 115 clams. + But then, cheque #78 hits my inbox and though I haven't yet accepted the receipt, I still need to do a transaction, like a 5 clam withdrawal, or whatever, + and somehow I end up doing a balance agreement. That results in the below signed receipt: + + --- Old receipt shows inbox/account/nym as: + Currently signed out: 8, 9, 10, and 15 + Balance of 100 clams (Last signed balance before this was for 115 clams above) + Inbox items: + #78 cheque receipt (#8) for 15 clams. (The missing money is already reflected in the above balance. BUT!! #8 must still be signed out for this to verify. Here I must sign to acknowledge the receipt is in my inbox, but I still have option to accept or dispute the receipt. Until then, server keeps it around since it has my signature on it and proves the current balance.) + #82 incoming transfer for 50 clams (A new balance agreement occurs during acceptance of this. And the number doesn't belong to me. So, irrelevant here.) + #10 transfer receipt for some old transfer (does NOT change balance, which already happened in the past, BUT!! #10 must still be signed out for this to verify.) + + My nym ISSUED list should not change unless I have a new transaction agreement, therefore I expect the list to match every time. + My outbox should also match. Thus, only my account balance and inbox might change. (On the server side, which I'll see when I dl + new versions of them and compare against my last receipt i.e. this function.) + How? NOT via transfer receipt, since I would sign a new balance agreement whenever that would actually impact my balance. + But it could happen with a *** chequeReceipt, a paymentReceipt, marketReceipt, or basketReceipt. *** + Those mean, my balance has changed. + In those cases, my account balance WOULD be different, but there had better be matching receipts in the inbox! + + --- New inbox/account/nym shows: + Currently signed out: 8, 9, 10, and 15 + Balance of 89 clams + Inbox items: + #78 cheque receipt (#8) for 15 clams. + #82 incoming transfer for 50 clams (A new balance agreement occurs during acceptance. So this type has no affect on balance here.) + #10 transfer receipt for some old transfer (does NOT change balance, which already happened in the past) + #96 cheque receipt for 7 clams (cheque #9) + #97 marketReceipt for 4 clams (marketOffer #15) + #99 incoming transfer for 2000 clams (Accepting it will require a new balance agreement.) + + --------------------------------- + + How do I interpret all this data? + -- Transaction numbers signed out had better match. (If #s issued had changed, I would have signed for it already.) + + Next loop through the inbox from the old receipt: + -- #78, cheque receipt, had better be there in the new inbox, since removing it requires a balance agreement, meaning it would already be off the receipt that I'm verifying... Since it's here in inbox, should therefore also be in the last receipt. + -- #82, incoming transfer from old receipt, had better be also on the new inbox, since I could only accept or reject it with a balance agreement, which I'm comparing the inbox to now. + -- #10 had also better be there in the new inbox for the same reason: if I had accepted this transfer receipt, then my last balance receipt would reflect that. + -- THEREFORE: ALL items from old receipt must be found inside new inbox! + + Next, loop through the new version of the inbox: + -- #78, though found in the new inbox, wouldn't necessarily be expected to be found in the last receipt, since someone may have cashed my cheque since the receipt was made. + -- #82, though found in the new inbox, wouldn't necessarily be expected to be found in the last receipt, since someone may have sent me the transfer since receipt was made. + -- #10 in new inbox, same thing: Someone may have recently accepted my transfer, and thus #10 only would have popped in since the last agreement. (It was there before, but I couldn't EXPECT that in every case.) + -- #96 and #97 represent balance CHANGES totalling -11 clams. They must correspond to a change in balance. + -- #96 is a cheque receipt.. it has changed the balance and I must account for that. But #78 is ALSO a cheque receipt, so why am I not accounting for ITs total (instead just assuming it's accounted for already in the prior balance, like 78?) Because it's NEW and wasn't on the old receipt like 78 is! + -- Due to the reasoning explained on the above line, ANY chequeReceipt, paymentReceipt, marketReceipt, or basketReceipt + found on the new version of the inbox but NOT on the old one from the receipt, must be accounted for against the balance. + -- #99 is an incoming transfer, but it will not change the balance until that transfer is accepted with a new balance agreement sometime in the future. + */ + + + OTIdentifier USER_ID(THE_NYM), SERVER_USER_ID(SERVER_NYM); + + const OTString strServerID(GetRealServerID()), strReceiptID(USER_ID); + +// if (USER_ID != GetUserID()) +// { +// OTLog::Error("*** OTIdentifier USER_ID(OTPseudonym THE_NYM) doesn't match OTTransactionType::GetUserID() in OTTransaction::VerifyBalanceReceipt\n"); +// return false; +// } + + // ----------------------------------- + + // Load the last TRANSACTION STATEMENT as well... + + OTString strFilename; strFilename.Format("%s.success", strReceiptID.Get()); + + const char * szFolder1name = OTLog::ReceiptFolder(); // receipts + const char * szFolder2name = strServerID.Get(); // receipts/SERVER_ID + const char * szFilename = strFilename.Get(); // receipts/SERVER_ID/USER_ID.success + + if (false == OTDB::Exists(szFolder1name, szFolder2name, szFilename)) + { + OTLog::vOutput(1, "Receipt file doesn't exist in OTTransaction::VerifyBalanceReceipt:\n %s\n", szFilename); + return false; + } + + // ---------------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFolder1name, szFolder2name, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Error reading transaction statement:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + + OTString strTransaction(strFileContents.c_str()); + +// OTTransaction tranOut(SERVER_USER_ID, USER_ID, GetRealServerID()); + OTTransactionType * pContents = OTTransactionType::TransactionFactory(strTransaction); + OTCleanup theAngel(pContents); + + if (NULL == pContents) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Unable to load transaction statement:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + else if (!pContents->VerifySignature(SERVER_NYM)) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Unable to verify signature on transaction statement:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + + // At this point, pContents is successfully loaded and verified, containing the last transaction receipt. + OTTransaction * pTrans = dynamic_cast(pContents); + + if (NULL == pTrans) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: Was expecting an OTTransaction to be stored in the transaction statement at:\n %s%s%s%s%s\n", + szFolder1name, OTLog::PathSeparator(), szFolder2name, OTLog::PathSeparator(), szFilename); + return false; + } + + OTTransaction & tranOut = *pTrans; + + // I ONLY need this transaction statement if it's newer than the balance statement. + // Otherwise, I don't use it at all. But if it's newer, then I use it instead of the current + // balance statement (only for verifying the list of issued numbers, not for anything else.) + + // And in the case where that happens, I ONLY expect to see new numbers added, NOT removed. + // But again, ONLY if the transaction statement is MORE RECENT. Otherwise it may have extra + // numbers alright: ones that were already removed and I don't want to re-sign responsibility for! + + + // CHECK IF IT'S NEWER AND SET A POINTER BASED ON THIS. + + OTTransaction * pTranWithIssuedList = this; // the transaction that actually has the issued list we'll be using. (Might be balance receipt or transaction receipt, whichever is newer) + OTItem * pItemWithIssuedList = NULL; // the item from that transaction that actually has the issued list we'll be using. + + OTItem * pResponseTransactionItem = NULL; // only if it's new than balance receipt does this get set, to: tranOut.GetItem(OTItem::atTransactionStatement); + OTItem * pTransactionItem = NULL; + + + if (tranOut.GetDateSigned() > this->GetDateSigned()) // it's newer. + { + pTranWithIssuedList = &tranOut; + + // GET THE "AT TRANSACTION STATEMENT" ITEM + pResponseTransactionItem = tranOut.GetItem(OTItem::atTransactionStatement); + + if (NULL == pResponseTransactionItem) + { + // error, return. + OTLog::Output(0, "No atTransactionStatement item found on receipt (strange.)\n"); + return false; + } + else if (OTItem::acknowledgement != pResponseTransactionItem->GetStatus()) + { + // error, return. + OTLog::Output(0, "Error: atTransactionStatement found on receipt, but not a successful one.\n"); + return false; + } + else if (!pResponseTransactionItem->VerifySignature(SERVER_NYM)) + { + OTLog::Output(0, "Unable to verify signature on atTransactionStatement item in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ------------------------------------ + + // LOAD "TRANSACTION STATEMENT" (ITEM) from within the above item we got. + + OTString strBalanceItem; + pResponseTransactionItem->GetReferenceString(strBalanceItem); + + if (!strBalanceItem.Exists()) + { + // error, return. + OTLog::Output(0, "No transactionStatement item found as 'in ref to' string on a receipt containing atTransactionStatement item.\n"); + return false; + } + + pTransactionItem = OTItem::CreateItemFromString(strBalanceItem, GetRealServerID(), pResponseTransactionItem->GetReferenceToNum()); + + if (NULL == pTransactionItem) + { + OTLog::Output(0, "Unable to load transactionStatement item from string (from a receipt containing an atTransactionStatement item.)\n"); + return false; + } + else if (pTransactionItem->GetType() != OTItem::transactionStatement) + { + OTLog::Output(0, "Wrong type on pTransactionItem (expected OTItem::transactionStatement)\n"); + return false; + } + else if (!pTransactionItem->VerifySignature(THE_NYM)) + { + OTLog::Output(0, "Unable to verify signature on transactionStatement item in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + pItemWithIssuedList = pTransactionItem; + } + + // Now use pTranWithIssuedList and pItemWithIssuedList for checking issued numbers. + // (Even though I'll continue to use *this for all other data being verified.) + + // ------------------------------------------------------- + + // LOAD THE ACCOUNT + + + OTAccount THE_ACCOUNT(USER_ID, GetRealAccountID(), GetRealServerID()); + + if (!THE_ACCOUNT.LoadContract() || !THE_ACCOUNT.VerifyAccount(THE_NYM)) + { + // error, return. + OTLog::Output(0, "Failed loading or verifying account in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + else if (THE_ACCOUNT.GetPurportedServerID() != GetPurportedServerID()) // the account, inbox, and outbox all have the same Server ID. But does it match *this receipt? + { + // error, return. + OTLog::Output(0, "Account, inbox or outbox server ID fails to match receipt server ID.\n"); + return false; + } + else if (THE_ACCOUNT.GetPurportedAccountID() != GetPurportedAccountID()) // Same as above except for account ID instead of server ID. + { + // error, return. + OTLog::Output(0, "Account ID fails to match receipt account ID.\n"); + return false; + } + + // ----------------------------------------------------- + + // LOAD INBOX AND OUTBOX + + OTLedger * pInbox = THE_ACCOUNT.LoadInbox(THE_NYM); + OTLedger * pOutbox = THE_ACCOUNT.LoadOutbox(THE_NYM); + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if ((NULL == pInbox) || (NULL == pOutbox)) + { + // error, return. + OTLog::Output(0, "Inbox or outbox was NULL after THE_ACCOUNT.Load in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ------------------------------------ + + // LOAD "AT BALANCE STATEMENT" (ITEM) + + OTItem * pResponseBalanceItem = this->GetItem(OTItem::atBalanceStatement); + + if (NULL == pResponseBalanceItem) + { + // error, return. + OTLog::Output(0, "No atBalanceStatement item found on receipt (strange.)\n"); + return false; + } + else if (OTItem::acknowledgement != pResponseBalanceItem->GetStatus()) + { + // error, return. + OTLog::Output(0, "Error: atBalanceStatement found on receipt, but not a successful one.\n"); + return false; + } + else if (!pResponseBalanceItem->VerifySignature(SERVER_NYM)) + { + OTLog::Output(0, "Unable to verify signature on atBalanceStatement item in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ------------------------------------ + + // LOAD "BALANCE STATEMENT" (ITEM) + + OTItem * pBalanceItem = NULL; + + OTString strBalanceItem; + pResponseBalanceItem->GetReferenceString(strBalanceItem); + + if (!strBalanceItem.Exists()) + { + // error, return. + OTLog::Output(0, "No balanceStatement item found as 'in ref to' string on a receipt containing atBalanceStatement item.\n"); + return false; + } + + pBalanceItem = OTItem::CreateItemFromString(strBalanceItem, GetRealServerID(), pResponseBalanceItem->GetReferenceToNum()); + + if (NULL == pBalanceItem) + { + OTLog::Output(0, "Unable to load balanceStatement item from string (from a receipt containing an atBalanceStatement item.)\n"); + return false; + } + else if (pBalanceItem->GetType() != OTItem::balanceStatement) + { + OTLog::Output(0, "Wrong type on pBalanceItem (expected OTItem::balanceStatement)\n"); + return false; + } + else if (!pBalanceItem->VerifySignature(THE_NYM)) + { + OTLog::Output(0, "Unable to verify signature on balanceStatement item in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + + // --------------------------------------------------------- + + // LOAD MESSAGE NYM (THE LIST OF ISSUED NUMBERS ACCORDING TO THE RECEIPT.) + + OTPseudonym theMessageNym; + OTString strMessageNym; // Okay now we have the transaction numbers in this MessageNym string. + + // + if ((NULL != pTransactionItem) && (tranOut.GetDateSigned() > this->GetDateSigned())) // transaction statement is newer than (this) balance statement. + pItemWithIssuedList = pTransactionItem; // already set above, but I'm re-stating here for clarity, since the else is now possible... + else + pItemWithIssuedList = pBalanceItem; // Hereafter we can use pItemWithIssuedList to verify issued transaction numbers (and NOTHING ELSE.) + + // ------------ + + pItemWithIssuedList->GetAttachment(strMessageNym); // Like right here, for example. + + if (!strMessageNym.Exists() || !theMessageNym.LoadFromString(strMessageNym)) + { + OTLog::Output(0, "Unable to load message nym in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ------------------------------------ + + // Finally everything is loaded and verified! + // I have the Nym and Server Nym + // I have the account, inbox, and outbox + // I have the original balance statement, AND the server's reply to it (a successful one) + // + // Repeating a note from above: + // -- Verify nym transactions match. (The issued / signed-for ones.) + // -- Verify outbox matches. + // -- Loop through all items on receipt. If outbox item, should match exactly. + // -- But for inbox items, total up: the amount of the total of the items from the receipt, + // for all those that would actually change the balance (chequeReceipt, marketReceipt, paymentReceipt.) + // These should ALL be found in the current version of the inbox. (They can only be removed by balance agreement which would update THIS RECEIPT to remove them...) + // -- That was the receipt. Now loop through the latest inbox items and do the reverse: for each item in the NEW inbox, + // add up the total of those that would change the balance, for receipts found on the new but not the old, and account for that exactly as a difference in balance. + // Also make sure each receipt in the inbox (new or old) is an issued transaction number, signed out to THE_NYM. + + + // VERIFY THE LIST OF ISSUED (SIGNED FOR) TRANSACTION NUMBERS ON THE NYM AGAINST THE RECEIPT. + // The Nym should match whatever is on the newest receipt (determined just above.) + // + // NOTE: I used to VerifyIssuedNumbersOnNym -- but that won't work. Why? Because let's say I signed a balance agreement with #s 9, 10, and 11. + // That's my last receipt. Now let's say, using a DIFFERENT ASSET ACCOUNT, I do a withdrawal, burning #9. Now my balance agreement says 10, 11 for + // that other account, which correctly matches the server. Now when the FIRST ACCOUNT verifies his (formerly valid) receipt, 9 is missing from his nym, + // which doesn't match the receipt! Of course that's because there's a newer balance receipt -- BUT ON A DIFFERENT ASSET ACCOUNT. + // + // VerifyTransactionStatement (vs VerifyBalanceStatement, where we are now) gets around this whole problem with VerifyTransactionStatementNumbersOnNym, + // which only verifies that every issued number found on THE_NYM (client-side) is definitely also found in the receipt (theMessageNym). It does NOT do the reverse. + // In other words, it does NOT make sure that every Trans# on theMessageNym (last receipt) is also found on THE_NYM (current client-side nym.) Numbers may + // have been cleared since that receipt was signed, due to a balance agreement FROM A DIFFERENT ASSET ACCOUNT. This is okay since numbers have not been ADDED + // to your list of responsibility (which is the danger.) In order to ADD a number to your list, a transaction statement would have to be signed, since new + // transaction numbers can only be received through the Nymbox. Since this function (VerifyBalanceReceipt) uses the transactionStatement for verifying issued + // numbers in cases where it is newer than the balanceStatement, then if a new number was added, it will be on the receipt already. + // +// if (!THE_NYM.VerifyIssuedNumbersOnNym(theMessageNym)) // Explained above. Balance Statements from other accts might be newer, and have burned #s already. Thus I + if (!THE_NYM.VerifyTransactionStatementNumbersOnNym(theMessageNym)) // Can't expect a # on the receipt to still be available, though I MUST verify that every number on current Nym IS on the receipt (just not the other way around.) + { + OTLog::Output(0, "Unable to verify issued numbers on last signed receipt with numbers on THE_NYM in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + + // ------------------------------------------------------- + + // LOOP THROUGH THE BALANCE STATEMENT ITEMS (INBOX AND OUTBOX) TO GATHER SOME DATA... + + int nInboxItemCount = 0, nOutboxItemCount = 0; + + +// OTLog::vError("BEFORE LOOP nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + + const char * szInbox = "Inbox"; + const char * szOutbox = "Outbox"; + + const char * pszLedgerType = NULL; + + long lReceiptBalanceChange = 0; // For measuring the amount of the total of items in the inbox that have changed the balance (like cheque receipts) + + // Notice here, I'm back to using pBalanceItem instead of pItemWithIssuedList, since this is the inbox/outbox section... + OTLog::vOutput(1, "Number of inbox/outbox items on the balance statement: %d\n", pBalanceItem->GetItemCount()); + + + // TODO: Note: If the balance item shows a FINAL RECEIPT present, then ALL the co-related cron receipts in + // the ACTUAL INBOX must ALSO be present on the balance item, just as the final receipt is present. IT cannot + // be there unless THEY are also there! (The WHOLE PURPOSE of the final receipt is to MAKE SURE that all its + // related paymentReceipts/marketReceipts have been CLOSED OUT.) + // + + for (int i=0; i < pBalanceItem->GetItemCount(); i++) + { + // for outbox calculations. (It's the only case where GetReceiptAmount() is wrong and needs -1 multiplication.) + long lReceiptAmountMultiplier = 1; + + OTItem * pSubItem = pBalanceItem->GetItem(i); + + OT_ASSERT(NULL != pSubItem); + + OTLedger * pLedger = NULL; + + // todo remove this debug switch block. + /* + switch (pSubItem->GetType()) + { + case OTItem::chequeReceipt: + OTLog::Error("Subitem type is: chequeReceipt\n"); + break; + case OTItem::marketReceipt: + OTLog::Error("Subitem type is: marketReceipt\n"); + break; + case OTItem::paymentReceipt: + OTLog::Error("Subitem type is: paymentReceipt\n"); + break; + case OTItem::transferReceipt: + OTLog::Error("Subitem type is: transferReceipt\n"); + break; + case OTItem::transfer: + OTLog::Error("Subitem type is: transfer\n"); + break; + default: + { + OTLog::Error("Subitem type is: fucked up\n"); + break; + } + continue; + } + */ + + switch (pSubItem->GetType()) + { + // ------------------------------------------------------ + case OTItem::chequeReceipt: + case OTItem::marketReceipt: + case OTItem::paymentReceipt: + case OTItem::basketReceipt: + + lReceiptBalanceChange += pSubItem->GetAmount(); + +// OTLog::vError("RECEIPT: lReceiptBalanceChange: %ld pSubItem->GetAmount() %ld\n", +// lReceiptBalanceChange, pSubItem->GetAmount()); + + // DROPS THROUGH HERE... + case OTItem::transferReceipt: + case OTItem::finalReceipt: + + nInboxItemCount++; +// OTLog::vError("RECEIPT: nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + pLedger = pInbox; + pszLedgerType = szInbox; + + // DROPS THROUGH HERE... + case OTItem::transfer: + + break; // we'll handle this in the next switch. + // ------------------------------------------------------ + + default: + { + OTString strItemType; + pSubItem->GetTypeString(strItemType); + OTLog::vOutput(3, "OTTransaction::VerifyBalanceReceipt: Ignoring %s item " + "in balance statement while verifying it against inbox.\n", strItemType.Get()); + } + continue; + } + + // ------------------------------------- + + switch (pSubItem->GetType()) + { + case OTItem::transfer: + + if (pSubItem->GetAmount() < 0) // it's an outbox item + { + lReceiptAmountMultiplier = -1; // transfers out always reduce your balance. + nOutboxItemCount++; + +// OTLog::vError("GetAmount() negative, OUTBOX ITEM: nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + + pLedger = pOutbox; + pszLedgerType = szOutbox; + } + else + { + lReceiptAmountMultiplier = 1; // transfers in always increase your balance. + nInboxItemCount++; + pLedger = pInbox; + pszLedgerType = szInbox; + +// OTLog::vError("GetAmount() POSITIVE, INBOX ITEM: nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + + } + break; + + case OTItem::finalReceipt: // will have a 0 receipt amount. + case OTItem::transferReceipt: + case OTItem::chequeReceipt: + case OTItem::marketReceipt: // will already be negative or positive based on whichever is appropriate. + case OTItem::paymentReceipt:// will already be negative or positive based on whichever is appropriate. + case OTItem::basketReceipt: // will already be negative or positive based on whichever is appropriate. + lReceiptAmountMultiplier = 1; + break; + default: + continue; // This will never happen, due to the first continue above in the first switch. + } + + // ------------------------------------------------------------------ + + OTTransaction * pTransaction = NULL; + + long lTempTransactionNum = 0; // Used for the below block. + long lTempReferenceToNum = 0; // Used for the below block. + + // What's going on here? In the original balance statement, ONLY IN CASES OF OUTOING TRANSFER, + // the user has put transaction # "1" in his outbox, in anticipation that + // the server, upon success, will actually put a real pending transfer into his outbox, and + // issue a number for it (like "34"). + if ((pOutbox == pLedger) && // Thus it's understood that whenever the balanceStatement + // has a "1" in the outbox, I should find a corresponding "34" (or whatever # the + (pSubItem->GetTransactionNum() == 1) && // server chose) as the GetNewOutboxTransNum member on the atBalanceStatement. + // Now here, when verifying the receipt, this allows me to verify the + (pResponseBalanceItem->GetNewOutboxTransNum() > 0)) // outbox request '1' against the actual '34' that resulted. + { + lTempTransactionNum = pResponseBalanceItem->GetNewOutboxTransNum(); + pTransaction = pLedger->GetTransaction(lTempTransactionNum); + + OTLog::Output(3, "OTTransaction::VerifyBalanceReceipt: (This iteration, I'm handling an item listed as '1' in the outbox.)\n"); + } + else // --------------------------------------------------------------- + { // THE ABOVE IS THE *UNUSUAL* CASE, WHEREAS THIS IS THE NORMAL CASE: + // + // Make sure that the transaction number of each sub-item is found + // on the appropriate ledger (inbox or outbox). + + lTempTransactionNum = pSubItem->GetTransactionNum(); + pTransaction = pLedger->GetTransaction(lTempTransactionNum); + } + + if (NULL != pTransaction) + lTempReferenceToNum = pTransaction->GetReferenceToNum(); + + // ------------------------------------------------------------------ + + bool bSwitchedBoxes = false; // In the event that an outbox pending transforms into an inbox transferReceipt, I set this true. + + // Let's say I sign a balance receipt showing a 100 clam pending transfer, sitting in my outbox. + // That means someday when I VERIFY that receipt, the 100 clam pending better still be in that + // outbox, or verification will fail. BUT WAIT -- if the receipient accepts the transfer, then it + // will disappear out of my outbox, and show up in my inbox as a transferReceipt. So when I go to + // verify my balance receipt, I have to expect that any outbox item might be missing, but if that is + // the case, there had better be a matching transferReceipt in the inbox. (That wouldn't disappear + // unless I processed my inbox, and signed a new balance agreement to get rid of it, so I know it + // has to be there in the inbox if the pending wasn't in the outbox. (If the receipt is any good.) + // + // Therefore the code has to specifically allow for this case, for outbox items... + if ((NULL == pTransaction) && (pOutbox == pLedger)) + { + OTLog::Output(4, "OTTransaction::VerifyBalanceReceipt: Outbox pending found as inbox transferReceipt. (Normal.)\n"); + + // We didn't find the transaction that was expected to be in the outbox. (A pending.) + // Therefore maybe it is now a transfer receipt in the Inbox. We allow for this case. + + pTransaction = pInbox->GetTransferReceipt(pSubItem->GetReferenceToNum()); + + if (NULL != pTransaction) + { + lTempTransactionNum = pTransaction->GetTransactionNum(); + lTempReferenceToNum = pSubItem->GetReferenceToNum(); + + lReceiptAmountMultiplier = 1; + + nInboxItemCount++; + nOutboxItemCount--; + +// OTLog::vError("PENDING->TransferReceipt. nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + + pLedger = pInbox; + pszLedgerType = szInbox; + + bSwitchedBoxes = true; // We need to know this in one place below. + } + + /* + Pending: + Outbox: 1901, referencing 1884 + Inbox: 1901, referencing 1884 + + + transfer receipt: + Trans 1902, referencing 1884 (That's just the display, however. Really 1902 refs 781, which refs 1884.) + + + The pending in the outbox REFERENCES the right number. + + The transfer receipt includes (ref string) an acceptPending that references the right number. + + So for pending in outbox, when failure, get ReferenceNum(), and use that to find item in Inbox using GetTransferReceipt(). + */ + } + + // STILL not found?? + if (NULL == pTransaction) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Expected %s transaction (%ld) " + "not found. (Amount %ld.)\n", + pszLedgerType, lTempTransactionNum, pSubItem->GetAmount()); + return false; + } + + // subItem is from the balance statement, and pTransaction is from the inbox/outbox + if (pSubItem->GetReferenceToNum() != lTempReferenceToNum) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) mismatch Reference Num: %ld, expected %ld\n", + pszLedgerType, lTempTransactionNum, pSubItem->GetReferenceToNum(), + lTempReferenceToNum); + return false; + } + + long lTransactionAmount = pTransaction->GetReceiptAmount(); + lTransactionAmount *= lReceiptAmountMultiplier; + + if (pSubItem->GetAmount() != lTransactionAmount) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) " + "amounts don't match: Report says %ld, but expected %ld. Trans recpt amt: %ld, (pBalanceItem->GetAmount() == %ld.)\n", + pszLedgerType, lTempTransactionNum, + pSubItem->GetAmount(), lTransactionAmount, pTransaction->GetReceiptAmount(), + pBalanceItem->GetAmount()); + return false; + } + + if ( + (pSubItem->GetType() == OTItem::transfer) && + ( + ((bSwitchedBoxes == true) && (pTransaction->GetType() != OTTransaction::transferReceipt)) + || + ((pLedger == pOutbox) && (pTransaction->GetType() != OTTransaction::pending)) + || + ((pLedger == pInbox) && (pTransaction->GetType() != OTTransaction::pending) && + (pTransaction->GetType() != OTTransaction::transferReceipt)) + ) + ) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type.\n", + pszLedgerType, lTempTransactionNum); + return false; + } + + if ((pSubItem->GetType() == OTItem::chequeReceipt) && + (pTransaction->GetType() != OTTransaction::chequeReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type.\n", + pszLedgerType, lTempTransactionNum); + return false; + } + + if ((pSubItem->GetType() == OTItem::marketReceipt) && + (pTransaction->GetType() != OTTransaction::marketReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type.\n", + pszLedgerType, lTempTransactionNum); + return false; + } + + if ((pSubItem->GetType() == OTItem::paymentReceipt) && + (pTransaction->GetType() != OTTransaction::paymentReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type.\n", + pszLedgerType, lTempTransactionNum); + return false; + } + + if ((pSubItem->GetType() == OTItem::transferReceipt) && + (pTransaction->GetType() != OTTransaction::transferReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type.\n", + pszLedgerType, lTempTransactionNum); + return false; + } + + if ((pSubItem->GetType() == OTItem::basketReceipt) && + // ------------------------------------------------------- + ((pTransaction->GetType() != OTTransaction::basketReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type or closing num (%ld).\n", + pszLedgerType, lTempTransactionNum, pSubItem->GetClosingNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::finalReceipt) && + // ------------------------------------------------------- + ((pTransaction->GetType() != OTTransaction::finalReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: %s transaction (%ld) wrong type or closing num (%ld).\n", + pszLedgerType, lTempTransactionNum, pSubItem->GetClosingNum()); + return false; + } + } + + // By this point, I have an accurate count of the inbox items, and outbox items, represented + // by *this receipt. + // I also know that I found each item from the receipt on the new inbox or outbox (as I should have) + // But do I have to verify that the items are all signed for. I'll do that below since this list + // is a subset of that one (supposedly.) + + //----------------------------------------------------------------- + + +// OTLog::vError("BEFORE COUNT MATCH. nInboxItemCount: %d nOutboxItemCount: %d\n", nInboxItemCount, nOutboxItemCount); + + if (nOutboxItemCount != pOutbox->GetTransactionCount()) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Outbox mismatch in expected transaction count.\n" + " --- THE_INBOX count: %d --- THE_OUTBOX count: %d\n" + "--- nInboxItemCount: %d --- nOutboxItemCount: %d\n\n", + pInbox->GetTransactionCount(), pOutbox->GetTransactionCount(), + nInboxItemCount, nOutboxItemCount); + + return false; + } + + // (Notice I don't check inbox item count here, since that actually CAN change.) + + //----------------------------------------------------------------- + + // LOOP THROUGH LATEST INBOX AND GATHER DATA / VALIDATE AGAINST LAST RECEIPT. + + long lInboxBalanceChange = 0; // Change in the account balance we'd expect, based on TOTAL receipts in the inbox. + long lInboxSupposedDifference = 0; // Change in the account balance we'd expect, based on the NEW receipts in the inbox. + + for (int i=0; i < pInbox->GetTransactionCount(); i++) + { + OTTransaction * pTransaction = pInbox->GetTransactionByIndex(i); + + OT_ASSERT(NULL != pTransaction); + + // ----------------------------------------------- + + switch (pTransaction->GetType()) + { + case OTTransaction::chequeReceipt: + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + case OTTransaction::basketReceipt: + + lInboxBalanceChange += pTransaction->GetReceiptAmount(); // Here I total ALL relevant receipts. + +// OTLog::vError("ON INBOX: lInboxBalanceChange: %ld pTransaction->GetReceiptAmount(): %ld\n", // temp remove debugging todo +// lInboxBalanceChange, pTransaction->GetReceiptAmount()); + + case OTTransaction::finalReceipt: // finalReceipt has no amount. + case OTTransaction::pending: // pending has an amount, but it already came out of the account and thus isn't figured here. + case OTTransaction::transferReceipt: // transferReceipt has an amount, but it already came out of account and thus isn't figured in here. + break; + default: + { + OTLog::vOutput(4, "OTTransaction::VerifyBalanceReceipt: Ignoring %s item " + "in inbox while verifying it against balance receipt.\n", pTransaction->GetTypeString()); + } + continue; + } + + // ----------------------------------------------- + // + // This "for" loop is in the process of iterating the LATEST INBOX... + // ...For each receipt in that inbox, we try and look up a record of the exact same receipt in + // the INBOX REPORT (present in the balance agreement from the LAST SIGNED TRANSACTION RECEIPT.) + // + // It may or may not be found... + + OTItem * pSubItem = pBalanceItem->GetItemByTransactionNum(pTransaction->GetTransactionNum()); + + OTItem * pFinalReceiptItem = NULL; + + // --------------------------------------------------------------------- + // + // The above loop already verified that all items in the receipt's inbox were found in the new inbox. + // + // But THIS item, though found in the new inbox, WAS NOT FOUND in the OLD inbox (on the receipt.) + // That means it needs to be accounted for against the account balance! + // + if (NULL == pSubItem) + { + switch (pTransaction->GetType()) + { + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + // + // New thought: if this transaction is from cron (paymentReceipt or marketReceipt), AND THIS BEING A NEW ITEM + // that IS in the latest inbox (but was NOT there before, in the receipt), THEN the finalReceipt for THIS + // transaction had BETTER NOT BE in the old inbox from my last receipt!! + // + // Logic: Because the whole point of the finalReceipt is to prevent any NEW marketReceipts from popping in, + // once it is present! It's like a "red flag" or a "filing date" -- once it is triggered, IT IS THE FINAL RECEIPT. + // No other receipts can appear that reference the same transaction number! + // + // THEREFORE: If the FINAL RECEIPT is ALREADY in my last signed receipt, then WHY IN HELL are NEW marketReceipts or + // paymentReceipts going into the latest inbox ?? + // + // That is why I verify here that, IF THIS IS A CRON TRANSACTION (payment, market), then the finalReceipt + // should NOT be present in the inbox report from the last receipt! + // + + pFinalReceiptItem = pBalanceItem->GetFinalReceiptItemByReferenceNum(pTransaction->GetReferenceToNum()); + + // If it was FOUND... (bad) + // + if (NULL != pFinalReceiptItem) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Malicious server? A new cronReceipt has appeared, " + "even though its corresponding \nfinalReceipt was already present in the LAST SIGNED RECEIPT. " + "In reference to: %ld\n", pTransaction->GetReferenceToNum()); + return false; + } + // else drop-through, since marketReceipts and paymentReceipts DO affect the balance... + + case OTTransaction::chequeReceipt: // Every one of these, we have to add up the total and reconcile against the latest balance. + case OTTransaction::basketReceipt: + + lInboxSupposedDifference += pTransaction->GetReceiptAmount(); // Here I only total the NEW receipts (not found in old receipt inbox but found in current inbox.) + +// OTLog::vError("NOT ON RECEIPT: lInboxSupposedDifference: %ld pTransaction->GetReceiptAmount(): %ld\n", // temp remove debugging todo +// lInboxSupposedDifference, pTransaction->GetReceiptAmount()); + + case OTTransaction::finalReceipt: // This has no value. 0 amount. + case OTTransaction::pending: // pending has value, why aren't we adding it? Because it hasn't changed the balance yet. + case OTTransaction::transferReceipt: // transferReceipt has an amount, but it already came out of the account and thus isn't figured in here. + break; + + default: + break; // this should never happen due to above switch. + } + } + // --------------------------------------------------------------------- + // + else // If the transaction from the inbox WAS found as an item on the old receipt, let's verify the two against each other... + { + // subItem is from the balance statement, and pTransaction is from the inbox + if (pSubItem->GetReferenceToNum() != pTransaction->GetReferenceToNum()) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) mismatch Reference Num: %ld, expected %ld\n", + pSubItem->GetTransactionNum(), pSubItem->GetReferenceToNum(), + pTransaction->GetReferenceToNum()); + return false; + } + + // We're looping through the inbox here, so no multiplier is needed for the amount + // (that was only for outbox items.) + if (pSubItem->GetAmount() != (pTransaction->GetReceiptAmount() )) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) " + "amounts don't match: %ld, expected %ld. (pBalanceItem->GetAmount() == %ld.)\n", + pSubItem->GetTransactionNum(), + pSubItem->GetAmount(), pTransaction->GetReceiptAmount(), + pBalanceItem->GetAmount()); + return false; + } + + if ((pSubItem->GetType() == OTItem::transfer) && + (pTransaction->GetType() != OTTransaction::pending)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::chequeReceipt) && + (pTransaction->GetType() != OTTransaction::chequeReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::marketReceipt) && + (pTransaction->GetType() != OTTransaction::marketReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::paymentReceipt) && + (pTransaction->GetType() != OTTransaction::paymentReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::transferReceipt) && + (pTransaction->GetType() != OTTransaction::transferReceipt)) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::basketReceipt) && + // --------------------------------------------------------- + ((pTransaction->GetType() != OTTransaction::basketReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type, or mismatched closing num.\n", + pSubItem->GetTransactionNum()); + return false; + } + + if ((pSubItem->GetType() == OTItem::finalReceipt) && + // --------------------------------------------------------- + ((pTransaction->GetType() != OTTransaction::finalReceipt) || + (pSubItem->GetClosingNum() != pTransaction->GetClosingNum())) + ) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) wrong type, or mismatched closing num.\n", + pSubItem->GetTransactionNum()); + return false; + } + + } // else pSubItem WAS found on the old receipt + + // --------------- + // Next I need to find out the transaction number that I ORIGINALLY used, that's somehow associated with the receipt + // I found in my inbox, by looking up the number from within the receipt... + // + OTString strRespTo; + long lIssuedNum = 0; // The number that must STILL be signed out to me, in order for this receipt not be warrant disputing. + OTTransaction * pFinalReceiptTransaction = NULL; + + switch (pTransaction->GetType()) + { + case OTTransaction::transferReceipt: // a transfer receipt is in reference to some guy's acceptPending + + pTransaction->GetReferenceString(strRespTo); + + if (!strRespTo.Exists()) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox transaction (%ld) refers to another (%ld) but the ref string is missing.\n", + pTransaction->GetTransactionNum(), pTransaction->GetReferenceToNum()); + return false; + } + else + { + OTItem * pOriginalItem = OTItem::CreateItemFromString(strRespTo, GetRealServerID(), pTransaction->GetReferenceToNum()); + OTCleanup theAngel(pOriginalItem); + + // This item was attached as the "in reference to" item. Perhaps Bob sent it to me. + // Since that item was initiated by him, HIS would be the account ID on it, not mine. + // So I DON'T want to create it with my account ID on it. I use above special function to instantiate it. + // + if (NULL == pOriginalItem) + { + OTLog::vError("Error loading original transaction item from string in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + else + { + if ((OTItem::request == pOriginalItem->GetStatus()) + && + (OTItem::acceptPending == pOriginalItem->GetType())) + { + lIssuedNum = pOriginalItem->GetReferenceToNum(); // <========= The whole reason we did all this crap. + } + else + { + const int nOriginalType = pOriginalItem->GetType(); + OTLog::vError( "Unrecognized item type (%d) OTTransaction::VerifyBalanceReceipt (expected acceptPending request).\n", + nOriginalType); + return false; + } + } + } // if strRespTo.Exists() + break; + + // ANY cron-related receipts should go here... + // + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: // a payment receipt #92 is IN REFERENCE TO my payment plan #13, + // which I am still signed out for... UNTIL the final receipt appears. + // Once a final receipt appears that is "in reference to" the same number as a marketReceipt (or paymentReceipt) + // then the paymentReceipt #92 is now IN REFERENCE TO my payment plan #13, WHICH IS CLOSED FOR NEW PAYMENTS, BUT + // THE PAYMENT RECEIPT ITSELF IS STILL VALID UNTIL THE "closing transaction num" ON THAT FINAL RECEIPT IS CLOSED. + // + // Therefore I first need to see if the final receipt is PRESENT in the inbox, so I can then determine + // which number should be expected to be found on my ISSUED list of transaction numbers. + // + pFinalReceiptTransaction = pInbox->GetFinalReceipt(pTransaction->GetReferenceToNum()); + + if (NULL != pFinalReceiptTransaction) // FINAL RECEIPT WAS FOUND + lIssuedNum = pFinalReceiptTransaction->GetClosingNum(); // <=============== + else // NOT found... + lIssuedNum = pTransaction->GetReferenceToNum(); // <=============== + + // If marketReceipt #15 is IN REFERENCE TO original market offer #10, + // then the "ISSUED NUM" that is still open on my "signed out" list is #10. + // + // UNLESS!! Unless a final receipt is present in reference to this same number, in which + // case the CLOSING TRANSACTION NUMBER stored on that final receipt will become my ISSUED NUM + // for the purposes of this code. (Because the original number IS closed, but the marketReceipt is + // also still valid until the FINAL RECEIPT is closed.) + // + + break; + + // ---------------------------------------------------------------------- + + // basketReceipt always expects the issued num to be its "closing num". The "reference to" is instead + // expected to contain the basketExchange ID (Trans# of the original request to exchange, which is already closed.) + // + // Final Receipt expects that its "in reference to" is already closed (that's why the final receipt even exists...) + // Its own GetClosingNum() now contains the only valid possible transaction number for this receipt (and for any related + // to it in this same inbox, which share the same "in reference to" number... + + case OTTransaction::finalReceipt: + case OTTransaction::basketReceipt: + + lIssuedNum = pTransaction->GetClosingNum(); + + break; + + // ---------------------------------------------------------------------- + + // But a cheque receipt is in reference to some asshole's cheque deposit, + // which only then CONTAINS my signed cheque (with my # on it) + case OTTransaction::chequeReceipt: + + pTransaction->GetReferenceString(strRespTo); + + if (!strRespTo.Exists()) + { + OTLog::vOutput(0, "OTTransaction::VerifyBalanceReceipt: Inbox " + "transaction (%ld) refers to another (%ld) but the ref string is missing.\n", + pTransaction->GetTransactionNum(), pTransaction->GetReferenceToNum()); + return false; + } + else + { + OTItem * pOriginalItem = OTItem::CreateItemFromString(strRespTo, GetRealServerID(), pTransaction->GetReferenceToNum()); + OTCleanup theAngel(pOriginalItem); + + // This item was attached as the "in reference to" item. Perhaps Bob sent it to me. + // Since that item was initiated by him, HIS would be the account ID on it, not mine. + // So I DON'T want to create it with my account ID on it. I use above special function to instantiate it. + // + if (NULL == pOriginalItem) + { + OTLog::vError("Error loading original transaction item from string in OTTransaction::VerifyBalanceReceipt.\n"); + return false; + } + else + { + if ((OTItem::request == pOriginalItem->GetStatus()) + && + (OTItem::depositCheque == pOriginalItem->GetType())) + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pOriginalItem->GetAttachment(strCheque); + + OTCheque theCheque; // allocated on the stack :-) + + if (false == ((strCheque.GetLength() > 2) && + theCheque.LoadContractFromString(strCheque))) + { + OTLog::vError("ERROR loading cheque from string in OTTransaction::VerifyBalanceReceipt:\n%s\n", + strCheque.Get()); + return false; + } + else + lIssuedNum = theCheque.GetTransactionNum(); // <========= The whole reason we did all this crap. + } + else + { + const int nOriginalType = pOriginalItem->GetType(); + OTLog::vError( "Unrecognized item type (%d) OTTransaction::VerifyBalanceReceipt (expected depositCheque request).\n", + nOriginalType); + return false; + } + } + } // if strRespTo.Exists() + break; + default: + continue; // Below this point (inside the loop) is ONLY for receipts that somehow represent a transaction number that's still issued / signed out to me. + } + // ----------------------------------------------- + + // Whether pSubItem is NULL or not, pTransaction DEFINITELY exists either way, in the newest inbox. + // Therefore, let's verify whether I'm even responsible for that transaction number... (Just because I signed + // the instrument at some point in the past does NOT mean that I'm still responsible for the transaction number + // that's listed on the instrument. Maybe I already used it up a long time ago...) + // + if (!theMessageNym.VerifyIssuedNum(strServerID, lIssuedNum)) + { + OTLog::vError("Error verifying if transaction num in inbox (%ld) was actually signed out (%ld), in OTTransaction::VerifyBalanceReceipt.\n", + pTransaction->GetTransactionNum(), lIssuedNum); + return false; + } + + // NOTE: the above check to VerifyIssuedNum... in the case of basketReceipts and finalReceipts, lIssuedNum is the CLOSING num + // (this is already done.) + // With marketReceipts and paymentReceipts, they check for the existence of a FINAL receipt, and if it's there, they use its CLOSING + // NUM. Otherwise they use the "in reference to" num. With final receipts it uses its CLOSING NUM, since the original is + // presumed closed. + + } // for + + // BY THIS POINT, I have lReceiptBalanceChange with the total change in the receipt, and + // lInboxBalanceChange with the total change in the new inbox. The difference between the two + // is the difference I should expect also in the account balances! That amount should also + // be equal to lInboxSupposedDifference, which is the total of JUST the inbox receipts that + // I DIDN'T find in the old receipt (they were ONLY in the new inbox.) + // + // I have looped through all inbox items, and I know they were either found in the receipt's inbox record + // (and verified), or their amounts were added to lInboxSupposedDifference as appropriate. + // + // I also verified, for each inbox item, IF IT TAKES MONEY, THEN IT MUST HAVE A TRANSACTION NUMBER + // SIGNED OUT TO ME... Otherwise I could dispute it. The last code above verifies this. + // + // All that's left is to make sure the balance is right... + // + // -------------------------------------------------- + + // VERIFY ACCOUNT BALANCE (RECONCILING WITH NEW INBOX RECEIPTS) + + // lReceiptBalanceChange -- The balance of all the inbox items on the receipt (at least, the items that change the balance.) + // lInboxBalanceChange -- The balance of all the inbox items in the inbox (at least, the items that change the balance.) + // lInboxSupposedDifference -- The balance of all the inbox items in the inbox that were NOT found in the receipt (that change balance.) + // lAbsoluteDifference -- The absolute difference between the inbox balance and the receipt balance. (Always positive.) + // lAbsoluteDifference -- The balance of all the inbox items (including new items) minus the old ones that were on the receipt. + + // (Helping me to visualize lInboxBalanceChange and lReceiptBalanceChange) + // ACTUAL SIMPLE ADD/SUBTRACT ADD/ABS + // -5 -100 difference == 95 (-5 + -100 == -105) 105 + // 5 100 difference == 95 ( 5 + 100 == 105) 105 + // -5 100 difference == 105 (-5 + 100 == 95) 95 + // 5 -100 difference == 105 ( 5 + -100 == -95) 95 + + // -100 -5 difference == 95 (-100 + -5 == -105) 105 + // 100 -5 difference == 105 ( 100 + -5 == 95) 95 + // -100 5 difference == 105 (-100 + 5 == -95) 95 + // 100 5 difference == 95 ( 100 + 5 == 105) 105 + + // Above == wrong, Below == right. + + // ***SUBTRACT/ABS*** + // -5 -100 difference == 95 (-5 - -100 == 95) 95 * + // 5 100 difference == 95 ( 5 - 100 == -95) 95 * + // -5 100 difference == 105 (-5 - 100 == -105) 105 * + // 5 -100 difference == 105 ( 5 - -100 == 105) 105 * + + // -100 -5 difference == 95 (-100 - -5 == -95) 95 * + // 100 -5 difference == 105 ( 100 - -5 == 105) 105 * + // -100 5 difference == 105 (-100 - 5 == -105) 105 * + // 100 5 difference == 95 ( 100 - 5 == 95) 95 * + + // Based on the above table, the solution is to subtract one value from the other, + // and then take the absolute of that to get the actual difference. Then use an + // 'if' statement to see which was larger, and based on that, calculate whether the + // balance is what would be expected. + // + // -1099 // -99 (example of 1000 absolute difference) + const long lAbsoluteDifference = abs(lInboxBalanceChange - lReceiptBalanceChange); // How much money came out? (Or went in, if the chequeReceipt was for an invoice...) + // 901 // -99 (example of 1000 absolute difference) + const long lNegativeDifference = (lAbsoluteDifference*(-1)); + + // The new (current) inbox has a larger overall value than the balance in the old (receipt) inbox. (As shown by subitem.) + const bool bNewInboxWasBigger = ((lInboxBalanceChange > lReceiptBalanceChange) ? true : false); + const bool bNewInboxWasSmaller = ((lInboxBalanceChange < lReceiptBalanceChange) ? true : false); + + // -------------------------------- + + long lActualDifference; + + if (bNewInboxWasBigger) + lActualDifference = lAbsoluteDifference; + else if (bNewInboxWasSmaller) + lActualDifference = lNegativeDifference; + else + lActualDifference = 0; + + // -------------------------------- + + /* + Example for logic: + + Old Inbox on Receipt: + 10 + 15 + 40 + lReceiptBalanceChange: 65 + Old Balance (in addition to these inbox items): 1000 (total 1065) + + New Inbox scenario A: + 10 + 15 + 40 + 20 (lInboxSupposedDifference==(20)) 20 + lInboxBalanceChange: 85 + + New Inbox scenario B: + 10 + 15 + 40 + -20 (lInboxSupposedDifference==(-20)) -20 + lInboxBalanceChange: 45 + + + Inbox A: lAbsoluteDifference=abs(85-65)==abs( 20)==20 + Inbox B: lAbsoluteDifference=abs(45-65)==abs(-20)==20 + + Inbox A: lNegativeDifference == -20 + Inbox B: lNegativeDifference == -20 + + Inbox A: bNewInboxWasBigger == TRUE, + bNewInboxWasSmaller == FALSE + + Inbox B: bNewInboxWasBigger == FALSE, + bNewInboxWasSmaller == TRUE + + // -------------------------- + + if ( + (bNewInboxWasBigger && (lAbsoluteDifference != lInboxSupposedDifference)) || // lInboxSupposedDifference should be positive here. + (bNewInboxWasSmaller && (lNegativeDifference != lInboxSupposedDifference)) // lInboxSupposedDifference should be negative here. + ) + + Inbox A: + if ( + (TRUE && (20 != 20)) || // lInboxSupposedDifference should be positive here. *** + (FALSE && (-20 != 20)) // lInboxSupposedDifference should be negative here. + ) + + Inbox B: + if ( + (FALSE && (20 != -20)) || // lInboxSupposedDifference should be positive here. + (TRUE && (-20 != -20)) // lInboxSupposedDifference should be negative here. *** + ) + + --------------- + if ( + (lActualDifference != lInboxSupposedDifference) + ) + + Inbox A (bigger): (lActualDifference is lAbsoluteDifference) + if ( 20 != 20) + + Inbox B (smaller): (lActualDifference is lNegativeDifference) + if (-20 != -20) + + */ + + // If the actual difference between the two totals is not equal to the supposed difference from adding up just the new receipts, + // (Which is probably impossible anyway) then return false. + if (lActualDifference != lInboxSupposedDifference) + { + OTLog::vError("OTTransaction::VerifyBalanceReceipt: lActualDifference (%ld) is not equal to lInboxSupposedDifference (%ld)\n" + "FYI, Inbox balance on old receipt: %ld Inbox balance on current inbox: %ld\n", + lActualDifference, lInboxSupposedDifference, + lReceiptBalanceChange, lInboxBalanceChange); + return false; + } + + // --------------------------------------------- + // if, according to the two inboxes, they are different (in terms of how they would impact balance), + // then therefore, they must have impacted my balance. THEREFORE, my old balance MUST be equivalent to + // the current (apparently new) balance, PLUS OR MINUS THE DIFFERENCE, ACCORDING TO THE DIFFERENCE BETWEEN THE INBOXES. + // If the actual difference (according to inbox receipts) + actual account balance (according to newest copy of account) + // is not equal to the last signed balance agreement, then return false. + // + /* + if ( + (bNewInboxWasBigger && (pBalanceItem->GetAmount() != (THE_ACCOUNT.GetBalance() + lNegativeDifference))) || + (bNewInboxWasSmaller && (pBalanceItem->GetAmount() != (THE_ACCOUNT.GetBalance() + lAbsoluteDifference))) + ) + + Inbox A (bigger): + if ( + (TRUE && (1000 != (1020 + -20))) || + (FALSE && (1000 != (1020 + 20))) + ) + --- + Inbox B (smaller): + if ( + (FALSE && (1000 != (980 + -20))) || + (TRUE && (1000 != (980 + 20))) + ) + --------------------------------------------------------------------- + + if (pBalanceItem->GetAmount() != (THE_ACCOUNT.GetBalance() + (lActualDifference*(-1)))) + + Inbox A (bigger): + if (1000 != (1020 + -20)) + + Inbox B (smaller): + if (1000 != (980 + 20)) + */ + + if (pBalanceItem->GetAmount() != (THE_ACCOUNT.GetBalance() + (lActualDifference*(-1)))) + { + // Let's say ActualDifference == 10-3 (prev balance minus current balance) == 7. + // If that's the case, then 7 + THE_ACCT.Balance should equal 10 again from the last balance statement! + + OTLog::vError("OTTransaction::VerifyBalanceReceipt: lActualDifference in receipts (%ld) " + "plus current acct balance (%ld) is NOT equal to last signed balance (%ld)\n", + lActualDifference, THE_ACCOUNT.GetBalance(), pBalanceItem->GetAmount()); + return false; + } + + // At this point: all good! + // + + return true; +} + + + + + + +// When the items are first loaded up, VerifyContractID() is called on them. +// Therefore, the serverID and account ID have already been verified. +// Now I want to go deeper, before actually processing a transaction, and +// make sure that the items on it also have the right owner, as well as that +// owner's signature, and a matching transaction number to boot. +// +bool OTTransaction::VerifyItems(OTPseudonym & theNym) +{ + // loop through the ALL items that make up this transaction and check to see if a response to deposit. + OTItem * pItem = NULL; + + const OTIdentifier NYM_ID(theNym); + + if (NYM_ID != GetUserID()) + { + OTLog::Error("Wrong owner passed to OTTransaction::VerifyItems\n"); + return false; + } + + // I'm not checking signature on transaction itself since that is already + // checked before this function is called. But I AM calling Verify Owner, + // so that when Verify Owner is called in the loop below, it proves the items + // and the transaction both have the same owner: Nym. + + // if pointer not null, and it's a withdrawal, and it's an acknowledgement (not a rejection or error) + for (listOfItems::iterator ii = GetItemList().begin(); ii != GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + if (GetTransactionNum() != pItem->GetTransactionNum()) + return false; + + if (NYM_ID != pItem->GetUserID()) + return false; + + if (false == pItem->VerifySignature(theNym)) // NO need to call VerifyAccount since VerifyContractID is ALREADY called and now here's VerifySignature(). + return false; + } + + return true; +} + + +// all common OTTransaction stuff goes here. +// (I don't like constructor loops, prefer to use a separate function they all call.) +void OTTransaction::InitTransaction() +{ + m_DATE_SIGNED = 0; // Make sure to set this to the current time whenever contract is signed. + + m_Type = OTTransaction::error_state; + m_strContractType = "TRANSACTION"; // CONTRACT, MESSAGE, TRANSACTION, LEDGER, TRANSACTION ITEM + + m_lClosingTransactionNo = 0; +} + + +// private and hopefully not needed +OTTransaction::OTTransaction() : OTTransactionType(), m_DATE_SIGNED(0), m_Type(OTTransaction::error_state), + m_lClosingTransactionNo(0) +{ + InitTransaction(); +} + + +// Let's say you never knew their UserID, you just loaded the inbox based on AccountID. +// Now you want to add a transaction to that inbox. Just pass the inbox into the +// transaction constructor (below) and it will get the rest of the info it needs off of +// the inbox itself (which you presumably just read from a file or socket.) +OTTransaction::OTTransaction(const OTLedger & theOwner) +: OTTransactionType(theOwner.GetUserID(), theOwner.GetPurportedAccountID(), theOwner.GetPurportedServerID()), + m_DATE_SIGNED(0), m_Type(OTTransaction::error_state), + m_lClosingTransactionNo(0) +{ + InitTransaction(); + +} + +// By calling this function, I'm saying "I know the real account ID and Server ID, and here +// they are, and feel free to compare them with whatever YOU load up, which we'll leave +// blank for now unless you generate a transaction, or load one up, + +// ==> or maybe I might need to add a constructor where another transaction or a ledger is passed in. +// Then it can grab whatever it needs from those. I'm doing something similar in OTItem +OTTransaction::OTTransaction(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID) +: OTTransactionType(theUserID, theAccountID, theServerID), m_DATE_SIGNED(0), m_Type(OTTransaction::error_state), + m_lClosingTransactionNo(0) +{ + InitTransaction(); + +// m_AcctID = theID; // these must be loaded or generated. NOT set in constructor, for security reasons. +// m_ServerID = theServerID; +} + +OTTransaction::OTTransaction(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID, long lTransactionNum) +: OTTransactionType(theUserID, theAccountID, theServerID, lTransactionNum), + m_DATE_SIGNED(0), m_Type(OTTransaction::error_state), m_lClosingTransactionNo(0) +{ + InitTransaction(); + +// m_lTransactionNum = lTransactionNum; // This is set in OTTransactionType's constructor, as are m_ID and m_ServerID +// m_AcctID = theID; // these must be loaded or generated. NOT set in constructor, for security reasons. +// m_ServerID = theServerID; +} + +// --------------------------------------------------------------------------------- + +OTTransaction * OTTransaction::GenerateTransaction(const OTLedger & theOwner, transactionType theType, long lTransactionNum/*=0*/) +{ + return GenerateTransaction(theOwner.GetUserID(), theOwner.GetPurportedAccountID(), + theOwner.GetPurportedServerID(), theType, lTransactionNum); +} + +OTTransaction * OTTransaction::GenerateTransaction(const OTIdentifier & theUserID, + const OTIdentifier & theAccountID, + const OTIdentifier & theServerID, transactionType theType, + long lTransactionNum/*=0*/) +{ + OTTransaction * pTransaction = new OTTransaction(theUserID, theAccountID, theServerID, lTransactionNum); + + OT_ASSERT(NULL != pTransaction); + + pTransaction->m_Type = theType; + + // Since we're actually generating this transaction, then we can go ahead + // and set the purported account and server IDs (we have already set the + // real ones in the constructor). Now both sets are fill with matching data. + // No need to security check the IDs since we are creating this transaction + // versus loading and inspecting it. + pTransaction->SetPurportedAccountID(theAccountID); + pTransaction->SetPurportedServerID(theServerID); + + return pTransaction; +} + + + +// the constructors set the real IDs (account and server) but they do not set the +// IDs that are internal to this object, m_AcctID and m_AcctServerID. These, it is assumed, +// will match the real IDs,but they must be checked when they are loaded. +// If you wish to create a transaction object, but SET the internal members (you KNOW they are correct +// or you want to generate them here) then use this function or make one like it. +bool OTTransaction::GenerateTransaction(const OTIdentifier & theAccountID, const OTIdentifier & theServerID, long lTransactionNum) +{ + // Presumably the constructor was just called, so m_ID and m_ServerID are already set properly. + // I might make a class factory in order to enforce this. Sounds like an appropriate situation. + //m_ID + //m_ServerID + + SetPurportedAccountID(theAccountID); + SetPurportedServerID(theServerID); + + SetTransactionNum(lTransactionNum); + + // Make sure these match with the ones that were passed into the constructor. + return VerifyContractID(); +} + + + + +bool OTTransaction::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + + + +OTTransaction::~OTTransaction() +{ + ReleaseItems(); +} + + +void OTTransaction::ReleaseItems() +{ + OTItem * pItem = NULL; + + while (!m_listItems.empty()) + { + pItem = m_listItems.front(); + m_listItems.pop_front(); + delete pItem; + pItem = NULL; + } +} + + + +// You have to allocate the item on the heap and then pass it in as a reference. +// OTTransaction will take care of it from there and will delete it in destructor. +void OTTransaction::AddItem(OTItem & theItem) +{ + m_listItems.push_back(&theItem); +} + + +// While processing a transaction, you may wish to query it for items of a certain type. +OTItem * OTTransaction::GetItem(const OTItem::itemType theType) +{ + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + if (pItem->GetType() == theType) + return pItem; + } + + return NULL; +} + + +// While processing a transaction, you may wish to query it for items of a certain type. +OTItem * OTTransaction::GetItemInRefTo(const long lReference) +{ + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + OT_ASSERT(NULL != pItem); + + if (pItem->GetReferenceToNum() == lReference) + return pItem; + } + + return NULL; +} + +// Count the number of items that are IN REFERENCE TO some transaction#. +// +// Might want to change this so that it only counts ACCEPTED receipts. +// +int OTTransaction::GetItemCountInRefTo(const long lReference) +{ + int nCount = 0; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + OTItem * pItem = *ii; + OT_ASSERT(NULL != pItem); + + if (pItem->GetReferenceToNum() == lReference) + nCount++; + } + + return nCount; +} + + + +// Tries to determine, based on items within, whether it was a success or fail. +bool OTTransaction::GetSuccess() +{ + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + switch (pItem->GetType()) + { + case OTItem::atTransaction: + case OTItem::atTransfer: + + case OTItem::atAcceptTransaction: + case OTItem::atAcceptMessage: + + case OTItem::atAcceptPending: + case OTItem::atRejectPending: + + case OTItem::atAcceptCronReceipt: + case OTItem::atDisputeCronReceipt: + + case OTItem::atAcceptItemReceipt: + case OTItem::atDisputeItemReceipt: + + case OTItem::atAcceptFinalReceipt: + case OTItem::atDisputeFinalReceipt: + + case OTItem::atAcceptBasketReceipt: + case OTItem::atDisputeBasketReceipt: + + case OTItem::atServerfee: + case OTItem::atIssuerfee: + case OTItem::atBalanceStatement: + case OTItem::atTransactionStatement: + case OTItem::atWithdrawal: + case OTItem::atDeposit: + case OTItem::atWithdrawVoucher: + case OTItem::atDepositCheque: + case OTItem::atMarketOffer: + case OTItem::atPaymentPlan: + + case OTItem::atCancelCronItem: + case OTItem::atExchangeBasket: + +// case OTItem::chequeReceipt: // not needed in OTItem. + case OTItem::chequeReceipt: // but it's here anyway for dual use reasons (balance agreement sub-items) + case OTItem::marketReceipt: + case OTItem::paymentReceipt: + case OTItem::transferReceipt: + case OTItem::finalReceipt: + case OTItem::basketReceipt: + + if (OTItem::acknowledgement == pItem->GetStatus()) + { + return true; + } + else if (OTItem::rejection == pItem->GetStatus()) + { + return false; + } + break; + default: + OTLog::Error("Wrong transaction type passed to OTTransaction::GetSuccess()\n"); + break; + } + } + + return false; +} + + + + +// This is called automatically by SignContract to make sure what's being signed is the most up-to-date +// Before transmission or serialization, this is where the ledger saves its contents +// So let's make sure this transaction has the right contents. +void OTTransaction::UpdateContents() +{ + const char * pTypeStr = GetTypeString(); // TYPE + + + OTString strType, + strAcctID(GetPurportedAccountID()), + strServerID(GetPurportedServerID()), + strUserID(GetUserID()); + + if (NULL != pTypeStr) + strType.Set(pTypeStr); + else + strType.Set("error_state"); // todo: internationalization. + + + m_DATE_SIGNED = time(NULL); // We store the timestamp of when this transaction was signed. + const long lDateSigned = m_DATE_SIGNED; + + // I release this because I'm about to repopulate it. + m_xmlUnsigned.Release(); + + m_xmlUnsigned.Concatenate("\n\n", + strType.Get(), lDateSigned, strAcctID.Get(), strUserID.Get(), strServerID.Get(), GetTransactionNum(), + GetReferenceToNum()); + + // OTLog::vError("IN REFERENCE TO, LENGTH: %d\n", m_ascInReferenceTo.GetLength()); + + if ((OTTransaction::finalReceipt == m_Type) || + (OTTransaction::basketReceipt == m_Type)) + { + m_xmlUnsigned.Concatenate("\n\n", + m_lClosingTransactionNo); + } + + // a transaction contains a list of items, but it is also in reference to some item, from someone else + // We include that item here. + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + if (m_ascCancellationRequest.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascCancellationRequest.Get()); + + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTItem * pItem = NULL; + + for (listOfItems::iterator ii = m_listItems.begin(); ii != m_listItems.end(); ++ii) + { + if ((pItem = *ii)) // if pointer not null + { + OTString strItem; + pItem->SaveContract(strItem); + + OTASCIIArmor ascItem; + ascItem.SetString(strItem, true); // linebreaks = true + + m_xmlUnsigned.Concatenate("\n%s\n\n", ascItem.Get()); + } + } + + m_xmlUnsigned.Concatenate("\n"); +} + + +// return -1 if error, 0 if nothing, and 1 if the node was processed. +int OTTransaction::ProcessXMLNode(irr::io::IrrXMLReader*& xml) +{ + if (!strcmp("transaction", xml->getNodeName())) + { + OTString strType, strAcctID, strServerID, strUserID; + + strType = xml->getAttributeValue("type"); + + if (strType.Compare("blank")) + m_Type = OTTransaction::blank; + else if (strType.Compare("pending")) + m_Type = OTTransaction::pending; + else if (strType.Compare("message")) + m_Type = OTTransaction::message; + else if (strType.Compare("processNymbox")) + m_Type = OTTransaction::processNymbox; + else if (strType.Compare("atProcessNymbox")) + m_Type = OTTransaction::atProcessNymbox; + else if (strType.Compare("processInbox")) + m_Type = OTTransaction::processInbox; + else if (strType.Compare("atProcessInbox")) + m_Type = OTTransaction::atProcessInbox; + else if (strType.Compare("transfer")) + m_Type = OTTransaction::transfer; + else if (strType.Compare("atTransfer")) + m_Type = OTTransaction::atTransfer; + else if (strType.Compare("deposit")) + m_Type = OTTransaction::deposit; + else if (strType.Compare("atDeposit")) + m_Type = OTTransaction::atDeposit; + else if (strType.Compare("withdrawal")) + m_Type = OTTransaction::withdrawal; + else if (strType.Compare("atWithdrawal")) + m_Type = OTTransaction::atWithdrawal; + else if (strType.Compare("marketOffer")) + m_Type = OTTransaction::marketOffer; + else if (strType.Compare("atMarketOffer")) + m_Type = OTTransaction::atMarketOffer; + else if (strType.Compare("paymentPlan")) + m_Type = OTTransaction::paymentPlan; + else if (strType.Compare("atPaymentPlan")) + m_Type = OTTransaction::atPaymentPlan; + + else if (strType.Compare("cancelCronItem")) + m_Type = OTTransaction::cancelCronItem; + else if (strType.Compare("atCancelCronItem")) + m_Type = OTTransaction::atCancelCronItem; + else if (strType.Compare("exchangeBasket")) + m_Type = OTTransaction::exchangeBasket; + else if (strType.Compare("atExchangeBasket")) + m_Type = OTTransaction::atExchangeBasket; + + else if (strType.Compare("transferReceipt")) + m_Type = OTTransaction::transferReceipt; + else if (strType.Compare("chequeReceipt")) + m_Type = OTTransaction::chequeReceipt; + else if (strType.Compare("marketReceipt")) + m_Type = OTTransaction::marketReceipt; + else if (strType.Compare("paymentReceipt")) + m_Type = OTTransaction::paymentReceipt; + else if (strType.Compare("finalReceipt")) + m_Type = OTTransaction::finalReceipt; + else if (strType.Compare("basketReceipt")) + m_Type = OTTransaction::basketReceipt; + else + m_Type = OTTransaction::error_state; + + + OTString strDateSigned(xml->getAttributeValue("dateSigned")); + + const long lDateSigned = strDateSigned.Exists() ? atol(strDateSigned.Get()) : 0; + + m_DATE_SIGNED = lDateSigned; + + strAcctID = xml->getAttributeValue("accountID"); + strServerID = xml->getAttributeValue("serverID"); + strUserID = xml->getAttributeValue("userID"); + + OTIdentifier ACCOUNT_ID(strAcctID), SERVER_ID(strServerID), USER_ID(strUserID); + + SetPurportedAccountID(ACCOUNT_ID); + SetPurportedServerID(SERVER_ID); + SetUserID(USER_ID); + + // ------------------------------------------- + // m_bLoadSecurely defaults to true. + // Normally the RealAccountID and RealServerID are set from above, before + // loading. That way, I can compare them to whatever is actually loaded. + // (So people don't swap files on us!!) + // But if the coder SPECIALLY sets m_bLoadSecurely to FALSE, that means he + // honestly doesn't know those IDs, and he is loading the file, and he wants it + // to load up properly AS IF THE IDs IN THE FILE WERE CORRECT. He only does this + // because it's the only way to get the file loaded without knowing those IDs in + // advance, and because he takes care, when doing this, to check them after the fact + // and see if they are, indeed, the ones he was expecting. + // + // This mechanism was ONLY FINALLY ADDED to get the class factory working properly. + // And even in this case, it is still INTERNALLY CONSISTENT. (The sub-items will still + // be expected to be correct with their parent items.) + // + if (false == m_bLoadSecurely) + { + SetRealAccountID(ACCOUNT_ID); + SetRealServerID(SERVER_ID); + } + + OTString strTemp; + + strTemp = xml->getAttributeValue("transactionNum"); + if (strTemp.Exists()) + SetTransactionNum(atol(strTemp.Get())); + + strTemp = xml->getAttributeValue("inReferenceTo"); + if (strTemp.Exists()) + SetReferenceToNum(atol(strTemp.Get())); + + OTLog::vOutput(4, "Loaded transaction %ld, in reference to: %ld type: %s\n", +// "accountID:\n%s\n serverID:\n%s\n----------\n", + GetTransactionNum(), + GetReferenceToNum(), strType.Get() +// strAcctID.Get(), strServerID.Get() + ); + + return 1; + } + else if (!strcmp("closingTransactionNumber", xml->getNodeName())) + { + OTString strClosingNumber = xml->getAttributeValue("value"); + + if (strClosingNumber.Exists() && + ((OTTransaction::finalReceipt == m_Type) || (OTTransaction::basketReceipt == m_Type)) + ) + m_lClosingTransactionNo = atol(strClosingNumber.Get()); + else + { + OTLog::Error("Error in OTTransaction::ProcessXMLNode: closingTransactionNumber field without value, or in wrong transaction type.\n"); + return (-1); // error condition + } + + return 1; + } + else if (!strcmp("cancelRequest", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascCancellationRequest)) + { + OTLog::Error("Error in OTTransaction::ProcessXMLNode: cancelRequest field without value.\n"); + return (-1); // error condition + } + + return 1; + } + else if (!strcmp("inReferenceTo", xml->getNodeName())) + { + if (false == LoadEncodedTextField(xml, m_ascInReferenceTo)) + { + OTLog::Error("Error in OTTransaction::ProcessXMLNode: inReferenceTo field without value.\n"); + return (-1); // error condition + } + + return 1; + } + + else if (!strcmp("item", xml->getNodeName())) + { + OTString strData; + + if (!LoadEncodedTextField(xml, strData) || !strData.Exists()) + { + OTLog::Error("Error in OTTransaction::ProcessXMLNode: transaction item field without value.\n"); + return (-1); // error condition + } + else + { + OTItem * pItem = new OTItem(GetUserID(), *this); + + OT_ASSERT(NULL != pItem); + + // If we're able to successfully base64-decode the string and load it up as + // a transaction, then add it to the ledger's list of transactions + if (false == pItem->LoadContractFromString(strData)) + { + OTLog::vError("ERROR: OTTransaction failed loading item from string: \n\n%s\n\n", + strData.Exists() ? strData.Get() : ""); + delete pItem; pItem = NULL; + return (-1); + } + else if (false == pItem->VerifyContractID()) + { + OTLog::vError("ERROR: Failed verifying transaction Item in OTTransaction::ProcessXMLNode: \n\n%s\n\n", + strData.Get()); + delete pItem; pItem = NULL; + return (-1); + } + else + { + m_listItems.push_back(pItem); +// OTLog::Output(5, "Loaded transaction Item and adding to m_listItems in OTTransaction\n"); + } + } + + return 1; + } + + return 0; +} + + + + +// The ONE case where an Item has SUB-ITEMS is in the case of Balance Agreement. +// For example, you might have a Withdrawal Transaction (request) that contains +// 2 items: the withdrawal item itself, and the balance agreement item for that +// withdrawal. The balance agreement item contains a LIST OF SUB ITEMS, each of +// which represents a chequeReceipt, marketReceipt, or paymentReceipt from my +// inbox. The Balance Agreement item needs to be able to report on the inbox +// status, so I give it a list of sub-items. +void OTTransaction::ProduceInboxReportItem(OTItem & theBalanceItem) +{ + OTItem::itemType theItemType = OTItem::error_state; + + OTLog::vOutput(3, "Producing statement report item for inbox item type: %s.\n", GetTypeString()); // temp remove. + + switch (m_Type) + { // These are the types that have an amount (somehow) + case OTTransaction::pending: // the amount is stored on the transfer item in my list. + theItemType = OTItem::transfer; + break; + case OTTransaction::chequeReceipt: // the amount is stored on cheque (attached to depositCheque item, attached.) + theItemType = OTItem::chequeReceipt; + break; + case OTTransaction::marketReceipt: // the amount is stored on marketReceipt item + theItemType = OTItem::marketReceipt; + break; + case OTTransaction::paymentReceipt: // amount is stored on paymentReceipt item + theItemType = OTItem::paymentReceipt; + break; + case OTTransaction::transferReceipt: // amount is 0 according to GetReceiptAmount() + theItemType = OTItem::transferReceipt; + break; + case OTTransaction::basketReceipt: // amount is stored on basketReceipt item. + theItemType = OTItem::basketReceipt; + break; + case OTTransaction::finalReceipt: // amount is 0 according to GetReceiptAmount() + theItemType = OTItem::finalReceipt; + break; + default: // All other types are irrelevant for inbox reports + { + OTLog::vOutput(3, "OTTransaction::ProduceInboxReportItem: Ignoring %s transaction " + "in inbox while making balance statement.\n", GetTypeString()); + } + return; + } // why not transfer receipt? Because the amount was already removed from your account when you transferred it, + // and you already signed a balance agreement at that time. Thus, nothing in your inbox is necessary to prove + // the change in balance -- you already signed off on it. UPDATE: that's okay since the below GetReceiptAmount() + // will return 0 for a transfer receipt anyway. + + // --------------------------------------------------- + // In the case of a cron receipt which is in the inbox, but is being accepted + // by a notarizeProcessInbox, (if theOwner is a processInbox transaction) then + // we don't want to report that item. Why not? Because if the processInbox is a + // success, the item would be presumed removed. (That's what the process aims to do, + // after all: accept and remove the market receipt.) Therefore, I don't want to add + // it to the report, since the server will then think it's supposed to be there, when + // in fact it's supposed to be gone. I'm supposed to be showing a picture of what would + // be left in the event of a success. And if I successfully processed the receipt out of my + // inbox, then I would expect not to see it there anymore, so since that is what I would + // expect in that case, that is the picture I need to construct now. + // + // Thus, here we loop through theOwner (IF he's a process inbox transaction) and we see + // if he's actually trying to process a receipt off the inbox FOR ME (THIS transaction.) If he is, then + // we don't need to add this transaction to the report. + // + /* + if (OTTransaction::processInbox == theOwner.GetType()) // <==== IF it's a process inbox !!! + { + for (listOfItems::iterator ii = theOwner.GetItemList().begin(); ii != theOwner.GetItemList().end(); ++ii) + { + OTItem * pItem = *ii; + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + // In this place, it means that someone is trying to PROCESS his INBOX. He is looping through that inbox, + // creating an INBOX REPORT, so he can attach it to the balance agreement for his PROCESS INBOX TRANSACTION. + // + // Well... What if, as part of processing his inbox, he is trying to remove some receipts? + // If he tries to remove a marketReceipt, then we'd expect, in the event of success, that + // said marketReceipt would disappear from his inbox. + // + // The purpose of the balance agreement is to have both sides SIGN and AGREE what the picture looks + // like, after and assuming the transaction is a success. If I SUCCESSFULLY remove + + if ((pItem->GetType() == OTItem::acceptCronReceipt) && // <==== IF AND IF, cron receipt, transaction number matches + (pItem->GetReferenceToNum() == GetTransactionNum())) // that means I'm DEFINITELY accepting it aka REMOVING it, right? + { + return; // We don't add THIS transaction to the balance agreement item then, since + // the balance agreement is actually part of a transaction that is REMOVING + // THIS TRANSACTION from my inbox, and therefore I don't WANT it showing in + // the balance agreement. (Wouldn't expect it to be there, in the event of success. + // The whole idea is to sign a picture of how things would look IN THE EVENT OF SUCCESS.) + } + + // Why is there not a similar if statement here for acceptItemReceipt, the way there is + // for acceptCronReceipt? If it turns out to be an issue, this might just be where I'd put it. + + // AHHH: I bet this is done in the code that CALLS this function... I BET the relevant items + // are ALREADY removed from the Inbox, BEFORE THIS FUNCTION IS EVEN CALLED... And THAT's why I don't + // see the other things here that I would expect to see. + // + // Therefore, the above fix really needs to be MOVED to THAT LOCATION. + // + // FINAL NOTE: THAT IS CORRECT. (Done.) This function is meant to be called with the inbox SET UP PRIOR, + // and for that Inbox to be passed in resembling the way it would in the event of success. This + // function is NOT responsible for knowing about which kinds of transactions might need which numbers + // removed. This function is too "Dumb" for that, at its level. It must assume the CALLER sets that up + // in advance. Different callers set the inbox up in different ways, depending on what they are trying + // to verify. (An "accept basket receipt" message would assume THAT basket receipt would be removed from Inbox, + // whereas an "accept market receipt" message would assume that THAT market receipt would be removed. Etc.) + } + } + */ + + // ----------------------------------------------------------- + + // the item will represent THIS TRANSACTION, and will be added to theBalanceItem. + + OTItem * pReportItem = OTItem::CreateItemFromTransaction(*this, theItemType); + + if (NULL != pReportItem) // above line will assert if mem allocation fails. + { + long lAmount = GetReceiptAmount(); + pReportItem->SetAmount(lAmount); + + pReportItem->SetTransactionNum(GetTransactionNum()); // Just making sure these both get set. + pReportItem->SetReferenceToNum(GetReferenceToNum()); // Especially this one. + + // The "closing transaction number" is only used on finalReceipts and basketReceipts. + // FYI, Any cron receipts need to see if there is a corresponding final receipt before checking + // their transaction number for validity (since it changes that number)... and also, if the final + // receipt itself is present, then ALL of the cron receipts that it corresponds to must be closed! + // + if ((OTTransaction::finalReceipt == m_Type) || (OTTransaction::basketReceipt == m_Type)) + pReportItem->SetClosingNum(GetClosingNum()); + + theBalanceItem.AddItem(*pReportItem); // Now theBalanceItem will handle cleaning it up. + + // No need to sign/save pReportItem, since it is just used for in-memory storage, and is + // otherwise saved as part of its owner's data, as part of its owner. (As long as theBalanceItem + // is signed and saved, which the caller does, then we're fine.) + } +} + + +// No longer using outbox hash :( +// Since I would have to add the pending items to the outbox and calculate +// it myself, and there's no way every single byte would be the same as the server +// (Well with this implementation there is, actually, but what one of the items +// in the outbox is SIGNED by me on one side, and by the server on the other? the +// hashes won't match!) Therefore I'm sending a real outbox report, the same as +// I do for the inbox. In fact, it's the same report! Just more items being added. +// +void OTTransaction::ProduceOutboxReportItem(OTItem & theBalanceItem) +{ + OTItem::itemType theItemType = OTItem::error_state; + + switch (m_Type) + { + case OTTransaction::pending: + theItemType = OTItem::transfer; + break; + default: // All other types are irrelevant for outbox reports. + OTLog::Error("ProduceOutboxReportItem: Error, wrong item type. Returning.\n"); + return; + } + + // the item will represent THIS TRANSACTION, and will be added to theBalanceItem. + + OTItem * pReportItem = OTItem::CreateItemFromTransaction(*this, theItemType); + + if (NULL != pReportItem) // above line will assert if mem allocation fails. + { + const long lAmount = GetReceiptAmount()*(-1); // in outbox, a transfer is leaving my account. Balance gets smaller. + pReportItem->SetAmount(lAmount); + + pReportItem->SetTransactionNum(GetTransactionNum()); // Just making sure these both get set. + pReportItem->SetReferenceToNum(GetReferenceToNum()); // Especially this one. + + theBalanceItem.AddItem(*pReportItem); // Now theBalanceItem will handle cleaning it up. + + + // debugging remove this +// OTLog::vError("PRODUCING OUTBOX REPORT ITEM: lAmount: %ld Trans# %ld Ref# %ld \n", lAmount, pReportItem->GetTransactionNum(), +// pReportItem->GetReferenceToNum()); + + // No need to sign/save pReportItem, since it is just used for in-memory storage, and is + // otherwise saved as part of its owner's data, as part of its owner. (As long as theBalanceItem + // is signed and saved, which the caller does, then we're fine.) + } +} + + +// ----------------------------------------------------------------------------- + + +// A Transaction normally doesn't have an amount. (Only a transaction item does.) +// But this function will look up the item, when appropriate, and find out the amount. +// +// That way we can record it during a balance agreement. +// NOTE: Not ALL transaction types with an amount are listed here, +// just the ones necessary for balance agreement. +// +long OTTransaction::GetReceiptAmount() +{ + long lAdjustment = 0; + + OTItem * pOriginalItem = NULL; + OTCleanup theItemAngel; + + switch (this->GetType()) + { // These are the types that have an amount (somehow) + case OTTransaction::marketReceipt: // amount is stored on ** marketReceipt item **, on MY LIST of items. + pOriginalItem = GetItem(OTItem::marketReceipt); // (The Reference string contains an OTCronItem with the Original Trade.) + break; // The "reference to" ID is + case OTTransaction::paymentReceipt: // amount is stored on ** paymentReceipt ** item, on MY LIST of items. + pOriginalItem = GetItem(OTItem::paymentReceipt); + break; + case OTTransaction::basketReceipt: // amount is stored on ** basketReceipt ** item, on MY LIST of items. + pOriginalItem = GetItem(OTItem::basketReceipt); + break; + case OTTransaction::pending: // amount is stored on the ** transfer item **, here as reference string. + case OTTransaction::chequeReceipt: // amount is stored on *cheque* (attached to ** depositCheque ITEM **, which is here as reference string.) + case OTTransaction::transferReceipt: // amount is stored on ** acceptPending ITEM **, (here as reference string.) + { + OTString strReference; + GetReferenceString(strReference); + + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + + if (NULL != pOriginalItem) + theItemAngel.SetCleanupTargetPointer(pOriginalItem); + + break; + } + + default: // All other types have no amount -- return 0. + return 0; + } + + + if (NULL == pOriginalItem) + { + OTLog::Error("OTTransaction::GetReceiptAmount: Unable to find original item. Should never happen.\n"); + return 0; // Should never happen, since we always expect one based on the transaction type. + } + + // ------------------------------------------------- + + OTString strAttachment; + + OTCheque theCheque; // allocated on the stack :-) + + switch (GetType()) + { // These are the types that have an amount (somehow) + case OTTransaction::chequeReceipt: // amount is stored on cheque (attached to depositCheque item, attached.) + { + if (pOriginalItem->GetType() != OTItem::depositCheque) + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return 0; + } + + // Get the cheque from the Item and load it up into a Cheque object. + pOriginalItem->GetAttachment(strAttachment); + bool bLoadContractFromString = theCheque.LoadContractFromString(strAttachment); + + if (!bLoadContractFromString) + { + OTString strCheque(theCheque); + + OTLog::vError("ERROR loading cheque from string in OTTransaction::GetReceiptAmount:\n%s\n", + strCheque.Get()); + } + else + { + lAdjustment = (theCheque.GetAmount()*(-1)); // a cheque reduces my balance, unless it's negative. + } // So if I wrote a 100clam cheque, that means -100 hit my account when I got the + // chequeReceipt, and writing a -100c cheque means 100 went in when I got the chequeReceipt. + } + break; + + case OTTransaction::transferReceipt: // amount is stored on acceptPending item. (Server refuses acceptPendings with wrong amount on them.) + + if (pOriginalItem->GetType() != OTItem::acceptPending) + { + OTLog::Error("Wrong item type attached to transferReceipt\n"); + } + else + { // If I transfer 100 clams to someone, then my account is smaller by 100 clams. -100 has hit my account. + // So it will show as -100 in my outbox, not 100, because that is the adjustment actually made to my account. + + lAdjustment = (pOriginalItem->GetAmount()*(-1)); // <==================== + } + break; + case OTTransaction::pending: // amount is stored on transfer item + + if (pOriginalItem->GetType() != OTItem::transfer) + { + OTLog::Error("Wrong item type attached to pending transfer\n"); + } + else + { + // Pending transfer adds to my account if this is inbox, and removes if outbox. + // I'll let the caller multiply by (-1) or not. His choice. + // Note: Indeed, if you look in ProduceOutboxReportItem(), it is multiplying by (-1). + lAdjustment = pOriginalItem->GetAmount(); + } + break; + case OTTransaction::marketReceipt: // amount is stored on marketReceipt item + + if (pOriginalItem->GetType() != OTItem::marketReceipt) + { + OTLog::Error("Wrong item type attached to marketReceipt\n"); + } + else + { + lAdjustment = pOriginalItem->GetAmount(); // THIS WILL ALSO USE THE POSITIVE / NEGATIVE THING. (Already.) + } + break; + case OTTransaction::paymentReceipt: // amount is stored on paymentReceipt item + + if (pOriginalItem->GetType() != OTItem::paymentReceipt) + { + OTLog::Error("Wrong item type attached to paymentReceipt\n"); + } + else + { + lAdjustment = pOriginalItem->GetAmount(); // THIS WILL ALSO USE THE POSITIVE / NEGATIVE THING. (Already.) + } + break; + case OTTransaction::basketReceipt: // amount is stored on basketReceipt item + + if (pOriginalItem->GetType() != OTItem::basketReceipt) + { + OTLog::Error("Wrong item type attached to basketReceipt\n"); + } + else + { + lAdjustment = pOriginalItem->GetAmount(); // THIS WILL ALSO USE THE POSITIVE / NEGATIVE THING. (Already.) + } + + break; + default: // All other types have no amount -- return 0. + return 0; + } + + return lAdjustment; +} + + + + + + + + +/// for display purposes. The "reference #" we show the user is not the same one we used internally. +/// +/// The "display reference #" that we want to display for the User might be +/// different depending on the type. +/// +/// For example, if pending, then it's in ref to the original transfer request (sender's transaction #) +/// But if chequeReceipt, then it's in reference to the original cheque (also sender's transaction #) +/// But if marketReceipt, then it's in reference to the original market offer (which is my own trans#) +/// But if paymentReceipt, then it's in reference to the original "activate payment plan" request, which may or may not be mine. +/// +/// Internally of course, a chequeReceipt is "in reference to" the depositor's deposit request. +/// But the user doesn't care about that number -- he wants to see the original cheque # from when he first wrote it. +/// Thus we have this function for resolving the "display reference #" in cases like that. +/// Another example: with market trades, you want the "in reference to" to show the trans# of the original market offer request. +/// Of course, if you load up the item within, you can get the "in reference to" showing a different trans# for EACH TRADE THAT HAS OCCURRED. +/// We use that internally, we need to be able to reference each of those trades. But the user merely wants to see that his receipt is +/// in reference to the original market offer, so he can line up his receipts with his offers. What else does he care? +/// +long OTTransaction::GetReferenceNumForDisplay() +{ + long lReferenceNum = 0; + + OTItem * pOriginalItem = NULL; + OTCleanup theItemAngel; + + switch (GetType()) + { + // "in ref to #" is stored on me: GetReferenceToNum() + case OTTransaction::pending: + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + case OTTransaction::basketReceipt: + case OTTransaction::finalReceipt: + lReferenceNum = GetReferenceToNum(); + break; + + // A transferReceipt ACTUALLY references the acceptPending (recipient's trans#) that accepted it. + // But I don't care about the recipient's transaction #s! I am the sender, and I want to see a + // reference to my original transfer that I sent. This receipt, as far as I care, is for THAT TRANSFER. + case OTTransaction::transferReceipt: + { + OTString strReference; + GetReferenceString(strReference); + + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + OT_ASSERT(NULL != pOriginalItem); + theItemAngel.SetCleanupTarget(*pOriginalItem); + + if (pOriginalItem->GetType() != OTItem::acceptPending) + { + OTLog::Error("Wrong item type attached to transferReceipt\n"); + return 0; + } + else + { + lReferenceNum = pOriginalItem->GetReferenceToNum(); + } + } + break; + + // "in ref to #" is the transaction# on the cheque (attached to depositCheque item, attached.) + case OTTransaction::chequeReceipt: + { + OTString strReference; + GetReferenceString(strReference); + + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); // in this case "reference to" is the depositor's trans#, which I use here, but the User doesn't care about on the screen. + OT_ASSERT(NULL != pOriginalItem); + theItemAngel.SetCleanupTarget(*pOriginalItem); + + OTString strAttachment; + OTCheque theCheque; // allocated on the stack :-) + + if (pOriginalItem->GetType() != OTItem::depositCheque) // This is a deposit cheque item, signed by the depositor, presumably whomever I gave the cheque to. + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return 0; + } + + // Get the cheque from the Item and load it up into a Cheque object. + pOriginalItem->GetAttachment(strAttachment); + bool bLoadContractFromString = theCheque.LoadContractFromString(strAttachment); + + if (!bLoadContractFromString) + { + OTString strCheque(theCheque); + + OTLog::vError("ERROR loading cheque from string in OTTransaction::CalcReferenceNum:\n%s\n", + strCheque.Get()); + } + else + { + lReferenceNum = theCheque.GetTransactionNum(); + } + } + break; + + default: // All other types have no amount -- return 0. + return 0; + } + + + // ------------------------------------------------- + + return lReferenceNum; +} + + +// ----------------------------------------- + +// ----------------------------------------------------------------------------------- + + +// +// Decoding and understanding the various subtleties of the marketReceipt transaction!!! +// +// For a marketReceipt transaction, the transaction itself carries a NEW TRANSACTION ID for EACH RECEIPT. +// I might have many trades process against a single offer. Each time, the marketReceipt will be a fresh one, +// with its own fresh transaction number that's owned by the server. +// +// The marketReceipt's "reference to" is for the original Trade, placed by the trader, owned by the trader. +// +// 1. pTrans1->SetReferenceToNum(theTrade.GetTransactionNum()); +// 2. pTrans1->SetReferenceString(strOrigTrade); +// +// In 2, the Reference String contains the ORIGINAL TRADE, signed by the TRADER. +// +// The marketReceipt transaction is SIGNED by the SERVER, AS IS the marketReceipt Item on its list. +// but the original trade was signed by the TRADER. The marketReceipt is in REFERENCE to that +// original trade, and so references its number and contains its complete string as the reference. +// +// The Item is a marketReceipt item, which is on the "my list of items" for the marketReceipt transaction. +// It is signed by the server, and it bears a transaction number that's owned by the server. +// The ITEM also contains the AMOUNT for the CURRENT RECEIPT. If THIS trade deducted 50 clams from your +// account, then THIS ITEM will have an AMOUNT of -50 on THIS RECEIPT! + +// The item has two attachments... The NOTE, which contains the updated (server-signed) TRADE, and +// the ATTACHMENT, which contains the updated (server-signed) OFFER. Both should have the same transaction +// number as pTrans->ReferenceTo(). +// +// 3. pItem1->SetNote(strTrade); +// 4. pItem1->SetAttachment(strOffer); +// + + + +bool OTTransaction::GetSenderUserIDForDisplay(OTIdentifier & theReturnID) +{ + bool bSuccess = false; + + OTItem * pOriginalItem = NULL; OTCleanup theItemAngel; + OTCronItem * pCronItem = NULL; OTCleanup theCronItemAngel; + + OTString strReference; + GetReferenceString(strReference); + + if (strReference.GetLength() < 2) + return false; + + switch (GetType()) + { +// case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + { + pCronItem = OTCronItem::NewCronItem(strReference); + + if (NULL != pCronItem) + { + theCronItemAngel.SetCleanupTargetPointer(pCronItem); + theReturnID = pCronItem->GetSenderUserID(); + return true; + } + else + { + OTLog::Error("OTTransaction::GetSenderUserIDForDisplay: Unable to load Cron Item. Should never happen.\n"); + return false; + } + } + break; + case OTTransaction::pending: + case OTTransaction::chequeReceipt: + { + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + + if (NULL != pOriginalItem) + theItemAngel.SetCleanupTargetPointer(pOriginalItem); + + break; + } + + default: // All other types are irrelevant here. + return false; + } + + if (NULL == pOriginalItem) + { + OTLog::Error("OTTransaction::GetSenderUserIDForDisplay: original item not found. Should never happen.\n"); + return false; // Should never happen, since we always expect one based on the transaction type. + } + // ------------------------------------------------- + + OTCheque theCheque; // allocated on the stack :-) + OTString strAttachment; + + switch (GetType()) + { // These are the types that have an amount (somehow) + case OTTransaction::chequeReceipt: // amount is stored on cheque (attached to depositCheque item, attached.) + + { + if (pOriginalItem->GetType() != OTItem::depositCheque) + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return false; + } + + // Get the cheque from the Item and load it up into a Cheque object. + pOriginalItem->GetAttachment(strAttachment); + bool bLoadContractFromString = theCheque.LoadContractFromString(strAttachment); + + if (!bLoadContractFromString) + { + OTString strCheque(theCheque); + + OTLog::vError("ERROR loading cheque from string in OTTransaction::GetSenderUserIDForDisplay:\n%s\n", + strCheque.Get()); + } + else + { + theReturnID = theCheque.GetSenderUserID(); + bSuccess = true; + } + } + break; + + case OTTransaction::pending: // amount is stored on transfer item + + if (pOriginalItem->GetType() != OTItem::transfer) + { + OTLog::Error("Wrong item type attached to pending transfer\n"); + } + else + { + theReturnID = pOriginalItem->GetUserID(); + bSuccess = true; + } + break; + default: // All other types have no amount -- return 0. + return false; + } + + return bSuccess; +} + + + +bool OTTransaction::GetRecipientUserIDForDisplay(OTIdentifier & theReturnID) +{ + bool bSuccess = false; + + OTItem * pOriginalItem = NULL; OTCleanup theItemAngel; + OTCronItem * pCronItem = NULL; OTCleanup theCronItemAngel; + + OTString strReference; + GetReferenceString(strReference); + + switch (this->GetType()) + { +// case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + { + pCronItem = OTCronItem::NewCronItem(strReference); + + if (NULL != pCronItem) + { + theCronItemAngel.SetCleanupTargetPointer(pCronItem); + + if (OTTransaction::paymentReceipt == this->GetType()) + { + OTPaymentPlan * pPlan = dynamic_cast(pCronItem); + + if (NULL != pPlan) + { + theReturnID = pPlan->GetRecipientUserID(); + return true; + } + } + else // must be a marketReceipt. They don't have a "recipient" so I'm putting sender here, + // to see if it works out in the GUI that way. + { + theReturnID = pCronItem->GetSenderUserID(); + return true; + } + } + else + OTLog::Error("OTTransaction::GetRecipientUserIDForDisplay: Unable to load Cron Item. Should never happen.\n"); + + return false; + } + break; // this break never actually happens. Above always returns, if triggered. + case OTTransaction::transferReceipt: + case OTTransaction::chequeReceipt: + { + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + + if (NULL != pOriginalItem) + theItemAngel.SetCleanupTargetPointer(pOriginalItem); + + break; + } + default: // All other types have no amount -- return false. + return false; + } + + if (NULL == pOriginalItem) + return false; // Should never happen, since we always expect one based on the transaction type. + + // ------------------------------------------------- + + switch (GetType()) + { + case OTTransaction::transferReceipt: + { + if (pOriginalItem->GetType() != OTItem::acceptPending) + { + OTLog::Error("Wrong item type attached to transferReceipt\n"); + return false; + } + else + { + theReturnID = pOriginalItem->GetUserID(); // Even though a transfer has no recipient user (just a recipient acct) I still get the User ID when he accepts it! + bSuccess = true; + } + } + break; + + case OTTransaction::chequeReceipt: // amount is stored on cheque (attached to depositCheque item, attached.) + { + if (pOriginalItem->GetType() != OTItem::depositCheque) + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return false; + } + else + { + theReturnID = pOriginalItem->GetUserID(); // Even if the cheque had a blank payee, I still get his UserID when he deposits it. + bSuccess = true; + } + } + break; + + default: // All other types have no amount -- return 0. + return false; + } + + return bSuccess; +} + + +bool OTTransaction::GetSenderAcctIDForDisplay(OTIdentifier & theReturnID) +{ + bool bSuccess = false; + + OTItem * pOriginalItem = NULL; OTCleanup theItemAngel; + OTCronItem * pCronItem = NULL; OTCleanup theCronItemAngel; + + OTString strReference; + GetReferenceString(strReference); + + if (strReference.GetLength() < 2) + return false; + + switch (GetType()) + { + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + { + pCronItem = OTCronItem::NewCronItem(strReference); + + if (NULL != pCronItem) + { + theCronItemAngel.SetCleanupTargetPointer(pCronItem); + theReturnID = pCronItem->GetSenderAcctID(); + return true; + } + else + { + OTLog::Error("OTTransaction::GetSenderAcctIDForDisplay: Unable to load Cron Item. Should never happen.\n"); + } + return false; + } + break; + case OTTransaction::pending: // amount is stored on the transfer item, on my list of items. + case OTTransaction::chequeReceipt: // amount is stored on cheque (attached to depositCheque item, attached.) + { + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + + if (NULL != pOriginalItem) + theItemAngel.SetCleanupTargetPointer(pOriginalItem); + + break; + } + default: // All other types have no amount -- return 0. + return false; + } + + + if (NULL == pOriginalItem) + { + OTLog::Error("OTTransaction::GetSenderAcctIDForDisplay: couldn't load original item, should never happen. \n"); + return false; // Should never happen, since we always expect one based on the transaction type. + } + // ------------------------------------------------- + + OTCheque theCheque; // allocated on the stack :-) + OTString strAttachment; + + switch (GetType()) + { // These are the types that have an amount (somehow) + case OTTransaction::chequeReceipt: // amount is stored on cheque (attached to depositCheque item, attached.) + + { + if (pOriginalItem->GetType() != OTItem::depositCheque) + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return false; + } + + // Get the cheque from the Item and load it up into a Cheque object. + pOriginalItem->GetAttachment(strAttachment); + bool bLoadContractFromString = theCheque.LoadContractFromString(strAttachment); + + if (!bLoadContractFromString) + { + OTString strCheque(theCheque); + + OTLog::vError("ERROR loading cheque from string in OTTransaction::GetSenderUserIDForDisplay:\n%s\n", + strCheque.Get()); + } + else + { + theReturnID = theCheque.GetSenderAcctID(); + bSuccess = true; + } + } + break; + + case OTTransaction::pending: // amount is stored on transfer item + + if (pOriginalItem->GetType() != OTItem::transfer) + { + OTLog::Error("Wrong item type attached to pending transfer\n"); + } + else + { + theReturnID = pOriginalItem->GetPurportedAccountID(); + bSuccess = true; + } + break; + + default: // All other types have no amount -- return 0. + return false; + } + + return bSuccess; +} + + +bool OTTransaction::GetRecipientAcctIDForDisplay(OTIdentifier & theReturnID) +{ + bool bSuccess = false; + + OTItem * pOriginalItem = NULL; OTCleanup theItemAngel; + OTCronItem * pCronItem = NULL; OTCleanup theCronItemAngel; + + OTString strReference; + GetReferenceString(strReference); + + switch (this->GetType()) + { + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + { + pCronItem = OTCronItem::NewCronItem(strReference); + + if (NULL != pCronItem) + { + theCronItemAngel.SetCleanupTargetPointer(pCronItem); + + if (OTTransaction::paymentReceipt == this->GetType()) + { + OTPaymentPlan * pPlan = dynamic_cast(pCronItem); + + if (NULL != pPlan) + { + theReturnID = pPlan->GetRecipientAcctID(); + return true; + } + } + else // must be a marketReceipt. They don't have a "recipient" so I'm putting the sender here, + // to see if it works out in the GUI that way. + { + theReturnID = pCronItem->GetSenderAcctID(); + return true; + } + } + else + OTLog::Error("OTTransaction::GetRecipientAcctIDForDisplay: Unable to load Cron Item. Should never happen.\n"); + + return false; + } + break; // this break never actually happens. Above always returns, if triggered. + // ------------------------------------------ + case OTTransaction::pending: + case OTTransaction::transferReceipt: + case OTTransaction::chequeReceipt: + { + pOriginalItem = OTItem::CreateItemFromString(strReference, GetPurportedServerID(), GetReferenceToNum()); + + if (NULL != pOriginalItem) + theItemAngel.SetCleanupTargetPointer(pOriginalItem); + + break; + } + default: // All other types have no amount -- return 0. + return false; + } + + if (NULL == pOriginalItem) + return false; // Should never happen, since we always expect one based on the transaction type. + + // ------------------------------------------------- + + OTCheque theCheque; // allocated on the stack :-) + OTString strAttachment; + + switch (GetType()) + { + case OTTransaction::transferReceipt: + { + if (pOriginalItem->GetType() != OTItem::acceptPending) + { + OTLog::Error("Wrong item type attached to transferReceipt\n"); + return false; + } + else + { + theReturnID = pOriginalItem->GetPurportedAccountID(); + bSuccess = true; + } + } + break; + + case OTTransaction::chequeReceipt: + + { + if (pOriginalItem->GetType() != OTItem::depositCheque) + { + OTLog::Error("Wrong item type attached to chequeReceipt\n"); + return false; + } + else + { + theReturnID = pOriginalItem->GetPurportedAccountID(); // Here's the depositor's account ID (even though the cheque was made out to a user, not an account, it still eventually had to be DEPOSITED into an account... right?) + bSuccess = true; + } + } + break; + + case OTTransaction::pending: // amount is stored on transfer item + + if (pOriginalItem->GetType() != OTItem::transfer) + { + OTLog::Error("Wrong item type attached to pending transfer\n"); + } + else + { + theReturnID = pOriginalItem->GetDestinationAcctID(); + bSuccess = true; + } + break; + + default: // All other types have no amount -- return 0. + return false; + } + + return bSuccess; +} + + + + + diff --git a/OTLib/OTTransaction.h b/OTLib/OTTransaction.h new file mode 100644 index 000000000..7b890210c --- /dev/null +++ b/OTLib/OTTransaction.h @@ -0,0 +1,384 @@ +/************************************************************************************ + * + * OTTransaction.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTTRANSACTION_H__ +#define __OTTRANSACTION_H__ + +#include + +#include +#include + +/* +WHEN THE server receives a transaction request, it receives a MESSAGE containing an ascii-armored LEDGER. + + The TYPE of the message might be "process inbox" or "process these transfers". + but either way there is a ledger bundled that contains a list of transactions (often a list of one.) + + a ledger is stored as my inbox + + a ledger is sent in a message to send me my inbox + + a ledger is what I send the server when I ask it to process a couple of transactions. + Each one of them has a transaction number. + Therefore the ledger must have a MAP of transactions, indexed by TRANSACTION NUMBER. + + Therefore message cannot handle transaction number. + + Perhaps ledger is derived from message. CMD3 is a ledger in an envelope. + Then it can do everything that a message can do, + + + + + A message contains a payload of a ledger + + the ledger contains a list of transactions + +Ledger is derived from contract because you must be able to save / sign it and load from string, + and because it must have items in it. + + + transactions are derived from messages. a transaction is a form of message. + (technically you could do a CMD3 and just send a transaction but the above is cleaner.) + + Messages already have server ID, command, Account ID, + + No a transaction is just a sibling to a message. It's it's own thing derived from contract. + but they have similarities + + so a ledger has a list of transactions. BOTH are derived from contract. + + A transaction has a list of Items. a transaction can also be "in reference to" an item. + + does an item need to be a contract? + + each item has to be individually signed (because when I accept Sue's spend, that signed accepted item goes back to Sue.) + + So the item has to be a contract. Each is signed and then put on the transaction's list of items. + + Each transaction is also signed and includes a transaction number and is on the ledger's list of transactions. + + The ledger itself is signed because it may be saved into a file. + + The whole enchilada is wrapped up in ascii-armor and attached to a message and sent over the pipe. +*/ + + +#include "OTTransactionType.h" +#include "OTIdentifier.h" +#include "OTItem.h" + +class OTLedger; + + +class OTTransaction : public OTTransactionType +{ + friend OTTransactionType * OTTransactionType::TransactionFactory(const OTString & strInput); + +public: + // a transaction can be blank (issued from server) + // or pending (in the inbox/outbox) + // or it can be a "process inbox" transaction + // might also be in the nymbox. + // + enum transactionType + { + // ***** INBOX / OUTBOX / NYMBOX + +// -------------------------------------------------------------------------------------- + // NYMBOX + blank, // freshly issued transaction number, not used yet + // (the server drops these into the nymbox.) + message, // A message from one user to another, also in the nymbox. +// -------------------------------------------------------------------------------------- + + // INBOX / OUTBOX (pending transfer) + pending, // Server puts this in your outbox (when sending) and recipient's inbox. + + // INBOX / receipts + transferReceipt,// the server drops this into your inbox, when someone accepts your transfer. + + chequeReceipt, // the server drops this into your inbox, when someone cashes your cheque. + marketReceipt, // server periodically drops this into your inbox if an offer is live. + paymentReceipt, // the server drops this into people's inboxes, every time a payment processes. + + finalReceipt, // the server drops this into your inbox(es), when a CronItem expires or is canceled. + basketReceipt, // the server drops this into your inboxes, when a basket exchange is processed. + +// -------------------------------------------------------------------------------------- + + // **** MESSAGES **** + + processNymbox, // process nymbox transaction // comes from client + atProcessNymbox,// process nymbox reply // comes from server +// -------------------------------------------------------------------------------------- + processInbox, // process inbox transaction // comes from client + atProcessInbox, // process inbox reply // comes from server +// -------------------------------------------------------------------------------------- + transfer, // or "spend". This transaction is a request to transfer from one account to another + atTransfer, // reply from the server regarding a transfer request +// -------------------------------------------------------------------------------------- + deposit, // this transaction is a deposit (cash or cheque) + atDeposit, // reply from the server regarding a deposit request +// -------------------------------------------------------------------------------------- + withdrawal, // this transaction is a withdrawal (cash or voucher) + atWithdrawal, // reply from the server regarding a withdrawal request +// -------------------------------------------------------------------------------------- + marketOffer, // this transaction is a market offer + atMarketOffer, // reply from the server regarding a market offer +// -------------------------------------------------------------------------------------- + paymentPlan, // this transaction is a payment plan + atPaymentPlan, // reply from the server regarding a payment plan +// -------------------------------------------------------------------------------------- + cancelCronItem, // this transaction is intended to cancel a market offer or payment plan. + atCancelCronItem,// reply from the server regarding said cancellation. +// -------------------------------------------------------------------------------------- + exchangeBasket, // this transaction is an exchange in/out of a basket currency. + atExchangeBasket,// reply from the server regarding said exchange. +// -------------------------------------------------------------------------------------- + error_state + }; // If you add any types to this list, update the list of strings at the top of the .CPP file. + + +protected: + time_t m_DATE_SIGNED; // The date, in seconds, when the instrument was last signed. + + transactionType m_Type; // blank, pending, processInbox, transfer, deposit, withdrawal, trade, etc. + + listOfItems m_listItems; // the various items in this transaction. + + long m_lClosingTransactionNo; // used by finalReceipt + + OTASCIIArmor m_ascCancellationRequest; // used by finalReceipt + + // Compares m_AcctID in the xml portion of the transaction + // with m_ID (supposedly the same number.) +// bool VerifyContractID(); + + // return -1 if error, 0 if nothing, and 1 if the node was processed. + virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + + virtual void UpdateContents(); // Before transmission or serialization, this is where the transaction saves its contents + + OTTransaction(); // only the factory gets to use this one. + +public: + + // These are used for finalReceipt and basketReceipt + long GetClosingNum() const; + void SetClosingNum(const long lClosingNum); + + // ------------------------------------------- + + long GetReferenceNumForDisplay(); /// For display purposes. The "ref #" you actually display (versus the one you use internally) might change based on transaction type. (Like with a cheque receipt you actually have to load up the original cheque.) + + bool GetSenderUserIDForDisplay(OTIdentifier & theReturnID); + bool GetRecipientUserIDForDisplay(OTIdentifier & theReturnID); + + bool GetSenderAcctIDForDisplay(OTIdentifier & theReturnID); + bool GetRecipientAcctIDForDisplay(OTIdentifier & theReturnID); + + inline time_t GetDateSigned() const { return m_DATE_SIGNED; } + + bool GetSuccess(); // Tries to determine, based on items within, whether it was a success or fail. + + long GetReceiptAmount(); // Tries to determine IF there is an amount (depending on type) and return it. + + OTTransaction(const OTLedger & theOwner); + OTTransaction(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + OTTransaction(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID, long lTransactionNum); + virtual ~OTTransaction(); + + bool GenerateTransaction(const OTIdentifier & theAccountID, const OTIdentifier & theServerID, long lTransactionNum); + + static OTTransaction * GenerateTransaction(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, + const OTIdentifier & theServerID, transactionType theType, + long lTransactionNum=0); + static OTTransaction * GenerateTransaction(const OTLedger & theOwner, transactionType theType, long lTransactionNum=0); + + void InitTransaction(); + void ReleaseItems(); + + inline transactionType GetType() const { return m_Type; } + inline void SetType(const transactionType theType) { m_Type = theType; } + + // ------------- + + static bool VerifyBalanceReceipt(OTPseudonym & SERVER_NYM, + OTPseudonym & THE_NYM, + OTIdentifier & SERVER_ID, + OTIdentifier & ACCT_ID + ); + + bool VerifyBalanceReceipt(OTPseudonym & SERVER_NYM, OTPseudonym & THE_NYM); + + // ---- + + static bool VerifyTransactionReceipt(OTPseudonym & SERVER_NYM, + OTPseudonym & THE_NYM, + OTIdentifier & SERVER_ID); + + bool VerifyTransactionReceipt(OTPseudonym & SERVER_NYM, OTPseudonym & THE_NYM); + + // ----------- + + bool VerifyItems(OTPseudonym & theNym); + + // used for looping through the items in a few places. + inline listOfItems & GetItemList() { return m_listItems; } + + OTItem * GetItem(const OTItem::itemType theType); // While processing a transaction, you may wish to query it for items of a certain type. + OTItem * GetItemInRefTo(const long lReference); + inline int GetItemCount() const { return m_listItems.size(); } + int GetItemCountInRefTo(const long lReference); // Count the number of items that are IN REFERENCE TO some transaction#. + void AddItem(OTItem & theItem); // You have to allocate the item on the heap and then pass it in as a reference. + // OTTransaction will take care of it from there and will delete it in destructor. +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); + + + void ProduceInboxReportItem(OTItem & theBalanceItem); + void ProduceOutboxReportItem(OTItem & theBalanceItem); + +// -------------------------------------------------------------- + + static const char * _TypeStrings[]; // for translating transaction type into a string. + + static inline const char * _GetTypeString(transactionType theType) + { int nType = (int)theType; return OTTransaction::_TypeStrings[nType]; } + + inline const char * GetTypeString() const { return OTTransaction::_GetTypeString(m_Type); } +}; + + + +#endif // __OTTRANSACTION_H__ diff --git a/OTLib/OTTransactionType.cpp b/OTLib/OTTransactionType.cpp new file mode 100644 index 000000000..309ce66e0 --- /dev/null +++ b/OTLib/OTTransactionType.cpp @@ -0,0 +1,377 @@ +/************************************************************************************ + * + * OTTransactionType.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include "OTStorage.h" + +#include "OTTransactionType.h" +#include "OTLog.h" + +#include "OTItem.h" +#include "OTTransaction.h" +#include "OTAccount.h" +#include "OTLedger.h" + + + +// static -- class factory. +// +OTTransactionType * OTTransactionType::TransactionFactory(const OTString & strInput) +{ + static char buf[45] = ""; + + OTTransactionType * pItem = NULL; + + if (!strInput.Exists()) + return NULL; + + OTString strContract(strInput); + + strContract.reset(); // for sgets + buf[0] = 0; // probably unnecessary. + bool bGotLine = strContract.sgets(buf, 40); + + if (!bGotLine) + return NULL; + + OTString strFirstLine(buf); + strContract.reset(); // set the "file" pointer within this string back to index 0. + + // Now I feel pretty safe -- the string I'm examining is within + // the first 45 characters of the beginning of the contract, and + // it will NOT contain the escape "- " sequence. From there, if + // it contains the proper sequence, I will instantiate that type. + if (!strFirstLine.Exists() || strFirstLine.Contains("- -")) + return NULL; + + if (strFirstLine.Contains("-----BEGIN SIGNED TRANSACTION-----")) // this string is 34 chars long. + { pItem = new OTTransaction(); OT_ASSERT(NULL != pItem); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED TRANSACTION ITEM-----")) // this string is 39 chars long. + { pItem = new OTItem(); OT_ASSERT(NULL != pItem); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED LEDGER-----")) // this string is 29 chars long. + { pItem = new OTLedger(); OT_ASSERT(NULL != pItem); } + + else if (strFirstLine.Contains("-----BEGIN SIGNED ACCOUNT-----")) // this string is 30 chars long. + { pItem = new OTAccount(); OT_ASSERT(NULL != pItem); } + + + // The string didn't match any of the options in the factory. + if (NULL == pItem) + return NULL; + + // This causes pItem to load ASSUMING that the PurportedAcctID and PurportedServerID are correct. + // The object is still expected to be internally consistent with its sub-items, regarding those IDs, + // but the big difference is that it will SET the Real Acct and Real Server IDs based on the purported + // values. This way you can load a transaction without knowing the account in advance. + // + pItem->m_bLoadSecurely = false; + + // Does the contract successfully load from the string passed in? + if (pItem->LoadContractFromString(strContract)) + return pItem; + else + delete pItem; + + return NULL; +} + + + + +// keeping constructor private in order to force people to use the other constructors and +// therefore provide the requisite IDs. +OTTransactionType::OTTransactionType() : OTContract(), + m_lTransactionNum(0), m_lInReferenceToTransaction(0), m_bLoadSecurely(true) +{ + // this function is private to prevent people from using it. + // Should never actually get called. + + InitTransactionType(); // Just in case. +} + + +OTTransactionType::OTTransactionType(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, + const OTIdentifier & theServerID) : OTContract(theAccountID), + m_lTransactionNum(0), m_lInReferenceToTransaction(0), m_bLoadSecurely(true) +{ + InitTransactionType(); + + // m_ID = theAccountID -- This happens in OTContract, no need to do it twice. + m_ServerID = theServerID; + m_AcctUserID = theUserID; + + // do NOT set m_AcctID and m_AcctServerID here. Let the child classes LOAD them or GENERATE them. +} + +OTTransactionType::OTTransactionType(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, + const OTIdentifier & theServerID, long lTransactionNum) : OTContract(theAccountID), + m_lTransactionNum(0), m_lInReferenceToTransaction(0), m_bLoadSecurely(true) +{ + // This initializes m_lTransactionNum, so it must come FIRST. + // In fact, that's the general rule with this function. + InitTransactionType(); + + // m_ID = theAccountID -- This happens in OTContract, no need to do it twice. + m_ServerID = theServerID; + m_AcctUserID = theUserID; + m_lTransactionNum = lTransactionNum; + + // do NOT set m_AcctID and m_AcctServerID here. Let the child classes LOAD them or GENERATE them. +} + + +void OTTransactionType::InitTransactionType() +{ + m_lTransactionNum = 0; + m_lInReferenceToTransaction = 0; +} + +OTTransactionType::~OTTransactionType() +{ + // No need to call Release() here, it's called already by the framework. + +} + +void OTTransactionType::Release() +{ + // If there were any dynamically allocated objects, clean them up here. + + OTContract::Release(); // since I've overridden the base class, I call it now... +} + + +void OTTransactionType::GetReferenceString(OTString & theStr) const +{ + m_ascInReferenceTo.GetString(theStr); +} + +void OTTransactionType::SetReferenceString(const OTString & theStr) +{ + m_ascInReferenceTo.SetString(theStr); +} + + + +bool OTTransactionType::SaveContractWallet(std::ofstream & ofs) +{ + return true; +} + + +// Make sure this contract checks out. Very high level. +// Verifies ID and signature. +// I do NOT call VerifyOwner() here, because the server may +// wish to verify its signature on this account, even though +// the server may not be the actual owner. +// So if you wish to VerifyOwner(), then call it. +bool OTTransactionType::VerifyAccount(OTPseudonym & theNym) +{ + // Make sure that the supposed Contract ID that was set is actually + // a hash of the contract file, signatures and all. + if (false == VerifyContractID()) + { + OTLog::Error("Error verifying account ID in OTTransactionType::VerifyAccount\n"); + return false; + } + else if (false == VerifySignature(theNym)) + { + OTLog::Error("Error verifying signature in OTTransactionType::VerifyAccount.\n"); + return false; + } + + OTLog::Output(4, "\nWe now know that...\n" + "1) The expected Account ID matches the ID that was found on the object.\n" + "2) The SIGNATURE VERIFIED on the object.\n\n"); + return true; +} + +bool OTTransactionType::VerifyContractID() +{ + //m_AcctID contains the number we read from the xml file + //we can compare it to the existing and actual identifier. + + // m_AcctID contains the "IDENTIFIER" of the object, according to the xml file. + // + // Meanwhile m_ID contains the same identifier, except it was generated. + // + // Now let's compare the two and make sure they match... + + // Also, for this class, we compare ServerID as well. They go hand in hand. + + // I use the == operator here because there is no != operator at this time. + // That's why you see the ! outside the parenthesis. + if (!(m_ID == m_AcctID) || !(m_ServerID == m_AcctServerID)) + { + OTString str1(m_ID), str2(m_AcctID), str3(m_ServerID), str4(m_AcctServerID); + OTLog::vError("Identifiers do NOT match in OTTransactionType::VerifyContractID.\n" + "m_ID: %s\n m_AcctID: %s\n m_ServerID: %s\n m_AcctServerID: %s\n", + str1.Get(), str2.Get(), str3.Get(), str4.Get()); + return false; + } + else { +// OTString str1(m_AcctID), str2(m_AcctServerID); +// OTLog::vError("Expected Account ID and Server ID both *SUCCESSFUL* match to " +// "IDs in the xml:\n Account ID:\n%s\n ServerID:\n%s\n" +// "-----------------------------------------------------------------------------\n", +// str1.Get(), str2.Get()); + return true; + } +} + + + + +// need to know the transaction number of this transaction? Call this. +long OTTransactionType::GetTransactionNum() const +{ + return m_lTransactionNum; +} + + +void OTTransactionType::SetTransactionNum(const long lTransactionNum) +{ + m_lTransactionNum = lTransactionNum; +} + + +// need to know the transaction number of this transaction? Call this. +long OTTransactionType::GetReferenceToNum() const +{ + return m_lInReferenceToTransaction; +} + + +void OTTransactionType::SetReferenceToNum(const long lTransactionNum) +{ + m_lInReferenceToTransaction = lTransactionNum; +} + diff --git a/OTLib/OTTransactionType.h b/OTLib/OTTransactionType.h new file mode 100644 index 000000000..13e0b4b5f --- /dev/null +++ b/OTLib/OTTransactionType.h @@ -0,0 +1,261 @@ +/************************************************************************************ + * + * OTTransactionType.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTTRANSACTION_TYPE_H__ +#define __OTTRANSACTION_TYPE_H__ + +#include + +#include "OTASCIIArmor.h" +#include "OTContract.h" + +class OTString; +class OTIdentifier; + + +// use as a base class for OTLedger, OTTransaction, and OTItem +// +class OTTransactionType : public OTContract +{ +private: + +protected: + // keeping constructor protected in order to force people to use the other constructors and + // therefore provide the requisite IDs. + OTTransactionType(); + + + // Basically what I want here is, SERVER ID and ACCOUNT ID. + // That way, all the child classes can also have a server ID and account ID, + // and they can compare to the internal ones to make sure they match. + // This class centralizes that mechanism so I'm not duplicating it three or four times. + // + // So I need the SERVER ID and the ACCOUNT ID stored here. + // + // Fortunately, OTContract already handles the ID, which is the Account ID in + // the context of all transaction objects. + // + // So therefore I just need to add the Server ID, and I have both. + // Then all child classes should ALSO implement their own copy of both, and compare the + // two whenever loading something, so that we know we're safe, as well as comparing + // signatures. + // + // That's really the whole point of this software -- comparing IDs and verifying + // signatures. + + OTIdentifier m_ServerID; // All child classes will have m_ID from OTContract and m_ServerID from here. + + // Update: instead of in the child classes, I put the "purported acct ID" and "purported server ID" here too, + // to manage it all centrally. + + OTIdentifier m_AcctID; // THE PRIMARY ACCOUNT. Compare to m_ID. + OTIdentifier m_AcctServerID; // transaction server ID for security reasons. Compare to m_ServerID. + + OTIdentifier m_AcctUserID; // NymID of the user who created this item. (In the future, this item + // might be the only reference someone has. They'll want my NymID.) + + // return -1 if error, 0 if nothing, and 1 if the node was processed. +// virtual int ProcessXMLNode(irr::io::IrrXMLReader*& xml); + +// void UpdateContents(); // I don't think I need this here. My parent and child classes do well enough. + + // I put this in protected because there are now Get/Set methods...so use them! + long m_lTransactionNum; // The server issues this and it must be sent with transaction request. + long m_lInReferenceToTransaction; + // Sometimes an item is in reference to some other transaction, which does NOT need to be + // included in the item (since the server already has it) but instead can be referenced by + // transaction ID. + + OTASCIIArmor m_ascInReferenceTo; // This item may be in reference to a different item + + bool m_bLoadSecurely; // defaults to true. + +public: + + static OTTransactionType * TransactionFactory(const OTString & strInput); + + // ------------------------------------------------------------------ + + inline const OTIdentifier & GetUserID() const { return m_AcctUserID; } + inline void SetUserID(const OTIdentifier & theID) { m_AcctUserID = theID; } + + inline const OTIdentifier & GetRealAccountID() const { return m_ID; } + inline void SetRealAccountID(const OTIdentifier & theID) { m_ID = theID; } + + inline const OTIdentifier & GetRealServerID() const { return m_ServerID; } + inline void SetRealServerID(const OTIdentifier & theID) { m_ServerID = theID; } + + inline const OTIdentifier & GetPurportedAccountID() const { return m_AcctID; } + inline void SetPurportedAccountID(const OTIdentifier & theID) { m_AcctID = theID; } + + inline const OTIdentifier & GetPurportedServerID() const { return m_AcctServerID; } + inline void SetPurportedServerID(const OTIdentifier & theID) { m_AcctServerID = theID; } + + + // Compares the m_AcctID from the xml portion of the contract + // with m_ID (supposedly the same number.) + // Also Verifies the ServerID, since this object type is all about the both of those IDs. + virtual bool VerifyContractID(); + + // This calls VerifyContractID() as well as VerifySignature() + // Use this instead of OTContract::VerifyContract, which expects/uses a pubkey from inside the contract. + virtual bool VerifyAccount(OTPseudonym & theNym); + + // The parameters to the constructor are supposed to be the ACTUAL account ID and server ID. + // Whereas the child classes contain their own copies of those IDs which they load into their + // own member variables. When that happens, they can then be compared to the ones that were + // already passed in HERE to see if anything is fishy. + // Thus, while OTContract instituted a constructor with an ID, OTTransactionType will require + // both the Account ID and the ServerID. + OTTransactionType(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID); + OTTransactionType(const OTIdentifier & theUserID, const OTIdentifier & theAccountID, const OTIdentifier & theServerID, + long lTransactionNum); + + void InitTransactionType(); + virtual ~OTTransactionType(); + virtual void Release(); + + // need to know the transaction number of this transaction? Call this. + long GetTransactionNum() const; + void SetTransactionNum(const long lTransactionNum); + + long GetReferenceToNum() const; + void SetReferenceToNum(const long lTransactionNum); + + void GetReferenceString(OTString & theStr) const; + void SetReferenceString(const OTString & theStr); + +// virtual bool SaveContractWallet(FILE * fl); + virtual bool SaveContractWallet(std::ofstream & ofs); +}; + + +#endif // __OTTRANSACTION_TYPE_H__ diff --git a/OTLib/OTWallet.cpp b/OTLib/OTWallet.cpp new file mode 100644 index 000000000..a6d191a8f --- /dev/null +++ b/OTLib/OTWallet.cpp @@ -0,0 +1,1433 @@ +/************************************************************************************ + * + * OTWallet.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; + + +#include "OTStorage.h" + + +#include "OTIdentifier.h" +#include "OTString.h" +#include "OTPseudonym.h" + +#include "OTWallet.h" +#include "OTLog.h" + +#include "OTAssetContract.h" +#include "OTServerContract.h" +#include "OTContract.h" +#include "OTAccount.h" +#include "OTEnvelope.h" +#include "OTPurse.h" + + + +OTWallet::OTWallet() +{ + m_pWithdrawalPurse = NULL; +} + +OTWallet::~OTWallet() +{ + Release(); +} + +void OTWallet::Release() +{ + //1) Go through the map of Nyms and delete them. (They were dynamically allocated.) + while (!m_mapNyms.empty()) + { + OTPseudonym * pNym = m_mapNyms.begin()->second; + + OT_ASSERT(NULL != pNym); + + delete pNym; + pNym = NULL; + + m_mapNyms.erase(m_mapNyms.begin()); + } + + //2) Go through the map of Contracts and delete them. (They were dynamically allocated.) + while (!m_mapContracts.empty()) + { + OTAssetContract * pContract = m_mapContracts.begin()->second; + + OT_ASSERT(NULL != pContract); + + delete pContract; + pContract = NULL; + + m_mapContracts.erase(m_mapContracts.begin()); + } + + //3) Go through the map of Servers and delete them. (They were dynamically allocated.) + while (!m_mapServers.empty()) + { + OTServerContract * pContract = m_mapServers.begin()->second; + + OT_ASSERT(NULL != pContract); + + delete pContract; + pContract = NULL; + + m_mapServers.erase(m_mapServers.begin()); + } + + //4) Go through the map of Accounts and delete them. (They were dynamically allocated.) + while (!m_mapAccounts.empty()) + { + OTAccount * pAccount = m_mapAccounts.begin()->second; + + OT_ASSERT(NULL != pAccount); + + delete pAccount; + pAccount = NULL; + + m_mapAccounts.erase(m_mapAccounts.begin()); + } +} + + +// While waiting on server response to a withdrawal, we keep the private coin +// data here so we can unblind the response. +// This information is so important (as important as the digital cash token +// itself, until the unblinding is done) that we need to save the file right away. +void OTWallet::AddPendingWithdrawal(const OTPurse & thePurse) +{ + // TODO maintain a list here (I don't know why, the server response is nearly + // instant and then it's done.) + + // TODO notice I don't check the pointer here to see if it's already set, I + // just start using it.. Fix that. + m_pWithdrawalPurse = (OTPurse *)&thePurse; +} // TODO WARNING: If this data is lost before the transaction is completed, + // the user will be unable to unblind his tokens and make them spendable. + // So this data MUST be SAVED until the successful withdrawal is verified! + + +void OTWallet::RemovePendingWithdrawal() +{ + if (m_pWithdrawalPurse) + delete m_pWithdrawalPurse; + + m_pWithdrawalPurse = NULL; +} + + + +bool OTWallet::SignContractWithFirstNymOnList(OTContract & theContract) +{ + if (this->GetNymCount() > 0) + { + OTIdentifier NYM_ID; + OTString NYM_NAME; + + if (this->GetNym(0, // index 0 + NYM_ID, NYM_NAME)) + { + OTPseudonym * pNym = this->GetNymByID(NYM_ID); + + if (NULL != pNym) + { + theContract.SignContract(*pNym); + return true; + } + } + } + + return false; +} + + + +// The wallet presumably has multiple Nyms listed within. +// I should be able to pass in a Nym ID and, if the Nym is there, +// the wallet returns a pointer to that nym. +OTPseudonym * OTWallet::GetNymByID(const OTIdentifier & NYM_ID) +{ + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG((NULL != pNym), "NULL pseudonym pointer in OTWallet::GetNymByID."); + + OTIdentifier id_CurrentNym; + pNym->GetIdentifier(id_CurrentNym); + + if (id_CurrentNym == NYM_ID) + return pNym; + } + + return NULL; +} + +OTPseudonym * OTWallet::GetNymByIDPartialMatch(const std::string PARTIAL_ID) +{ + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + OT_ASSERT_MSG((NULL != pNym), "NULL pseudonym pointer in OTWallet::GetNymByID."); + + OTString strTemp; + pNym->GetIdentifier(strTemp); + + std::string strIdentifier = strTemp.Get(); + + if (strIdentifier.compare(0,PARTIAL_ID.length(),PARTIAL_ID) == 0) + return pNym; + } + + return NULL; +} + + +// used by high-level wrapper. +int OTWallet::GetNymCount() +{ + return m_mapNyms.size(); +} + +int OTWallet::GetServerCount() +{ + return m_mapServers.size(); +} + +int OTWallet::GetAssetTypeCount() +{ + return m_mapContracts.size(); +} + +int OTWallet::GetAccountCount() +{ + return m_mapAccounts.size(); +} + + +// used by high-level wrapper. +bool OTWallet::GetNym(const int iIndex, OTIdentifier & NYM_ID, OTString & NYM_NAME) +{ + // if iIndex is within proper bounds (0 through count minus 1) + if (iIndex < GetNymCount() && iIndex >= 0) + { + OTPseudonym * pNym = NULL; + int iCurrentIndex = (-1); + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + iCurrentIndex++; // On first iteration, this becomes 0 here. (For 0 index.) Increments thereafter. + + if ((iIndex == iCurrentIndex) && (pNym = (*ii).second)) // if not null + { + pNym->GetIdentifier(NYM_ID); + NYM_NAME.Set(pNym->GetNymName()); + return true; + } + } + } + + return false; +} + + +// used by high-level wrapper. +bool OTWallet::GetServer(const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + // if iIndex is within proper bounds (0 through count minus 1) + if (iIndex < GetServerCount() && iIndex >= 0) + { + OTServerContract * pServer = NULL; + int iCurrentIndex = (-1); + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + iCurrentIndex++; // On first iteration, this becomes 0 here. (For 0 index.) Increments thereafter. + + if ((iIndex == iCurrentIndex) && (pServer = (*ii).second)) // if not null + { + pServer->GetIdentifier(THE_ID); + pServer->GetName(THE_NAME); + return true; + } + } + } + + return false; +} + +// used by high-level wrapper. +bool OTWallet::GetAssetType(const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + // if iIndex is within proper bounds (0 through count minus 1) + if (iIndex < GetAssetTypeCount() && iIndex >= 0) + { + OTAssetContract * pAssetType = NULL; + int iCurrentIndex = (-1); + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + iCurrentIndex++; // On first iteration, this becomes 0 here. (For 0 index.) Increments thereafter. + + if ((iIndex == iCurrentIndex) && (pAssetType = (*ii).second)) // if not null + { + pAssetType->GetIdentifier(THE_ID); + pAssetType->GetName(THE_NAME); + return true; + } + } + } + + return false; +} + +// used by high-level wrapper. +bool OTWallet::GetAccount(const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + // if iIndex is within proper bounds (0 through count minus 1) + if (iIndex < GetAccountCount() && iIndex >= 0) + { + OTAccount * pAccount = NULL; + int iCurrentIndex = (-1); + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + iCurrentIndex++; // On first iteration, this becomes 0 here. (For 0 index.) Increments thereafter. + + if ((iIndex == iCurrentIndex) && (pAccount = (*ii).second)) // if not null + { + pAccount->GetIdentifier(THE_ID); + pAccount->GetName(THE_NAME); + return true; + } + } + } + + return false; +} + + +void OTWallet::DisplayStatistics(OTString & strOutput) +{ + strOutput.Concatenate("\n-------------------------------------------------\n"); + strOutput.Concatenate("WALLET STATISTICS:\n"); + + OTPseudonym * pNym = NULL; + + strOutput.Concatenate("\nPSEUDONYM(s):\n\n"); + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG((NULL != pNym), "NULL pseudonym pointer in OTWallet::m_mapNyms, OTWallet::DisplayStatistics."); + + pNym->DisplayStatistics(strOutput); + } + + // --------------------------------------------------------------- + + strOutput.Concatenate("\n-------------------------------------------------\n"); + strOutput.Concatenate("ASSET CONTRACTS:\n\n"); + + OTContract * pContract = NULL; + + for (mapOfContracts::iterator i2i = m_mapContracts.begin(); i2i != m_mapContracts.end(); ++i2i) + { + pContract = (*i2i).second; + + OT_ASSERT_MSG(NULL != pContract, "NULL contract pointer in OTWallet::m_mapContracts, OTWallet::DisplayStatistics"); + + pContract->DisplayStatistics(strOutput); + } + + // --------------------------------------------------------------- + + strOutput.Concatenate("-------------------------------------------------\n"); + strOutput.Concatenate("SERVER CONTRACTS:\n\n"); + + OTContract * pServer = NULL; + + for (mapOfServers::iterator i3i = m_mapServers.begin(); i3i != m_mapServers.end(); ++i3i) + { + pServer = (*i3i).second; + + OT_ASSERT_MSG(NULL != pServer, "NULL server pointer in OTWallet::m_mapServers, OTWallet::DisplayStatistics"); + + pServer->DisplayStatistics(strOutput); + } + + // --------------------------------------------------------------- + + + strOutput.Concatenate("-------------------------------------------------\n"); + strOutput.Concatenate("ACCOUNTS:\n\n"); + + OTAccount * pAccount = NULL; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + + OT_ASSERT_MSG(NULL != pAccount, "NULL account pointer in OTWallet::m_mapAccounts, OTWallet::DisplayStatistics"); + + pAccount->DisplayStatistics(strOutput); + + strOutput.Concatenate("-------------------------------------------------\n\n"); + } + + // --------------------------------------------------------------- + + +} + + + + + + + +// Wallet takes ownership and will delete. +// theNym is passed as reference only to prove that it's real. +// +// This function assumes the Nym has already been loaded, verified, etc. +// AND that it's been dynamically allocated. +// +void OTWallet::AddNym(const OTPseudonym & theNym) +{ + const OTIdentifier NYM_ID(theNym); + + OTPseudonym * pNym = NULL; + OTIdentifier aNymID; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT(NULL != pNym); + + pNym->GetIdentifier(aNymID); + + if (aNymID == NYM_ID) + { + OTString strName(pNym->GetNymName()); + (const_cast(theNym)).SetNymName(strName); + + m_mapNyms.erase(ii); + delete pNym; + pNym = NULL; + +// OTLog::Error("Error: Adding Nym to wallet when there was already one there with same ID...\n"); + + break; + } + } + + const OTString strNymID(NYM_ID); + m_mapNyms[strNymID.Get()] = (OTPseudonym *)&theNym; // Insert to wallet's list of Nyms. + +} + + +void OTWallet::AddAccount(const OTAccount & theAcct) +{ + const OTIdentifier ACCOUNT_ID(theAcct); + + // See if there is already an account object on this wallet with the same ID + // (Otherwise if we don't delete it, this would be a memory leak.) + // Should use a smart pointer. + OTAccount * pAccount = NULL; + OTIdentifier anAccountID; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + + OT_ASSERT(NULL != pAccount); + + pAccount->GetIdentifier(anAccountID); + + if (anAccountID == ACCOUNT_ID) + { + OTString strName; + pAccount->GetName(strName); + + if (strName.Exists()) + ((OTAccount &)theAcct).SetName(strName); + + m_mapAccounts.erase(ii); + delete pAccount; + pAccount = NULL; + + break; + } + } + + const OTString strAcctID(ACCOUNT_ID); + m_mapAccounts[strAcctID.Get()] = (OTAccount *)&theAcct; +} + + +// Look up an account by ID and see if it is in the wallet. +// If it is, return a pointer to it, otherwise return NULL. +OTAccount * OTWallet::GetAccount(const OTIdentifier & theAccountID) +{ + // loop through the accounts and find one with a specific ID. + OTAccount * pAccount = NULL; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + OT_ASSERT(NULL != pAccount); + + OTIdentifier anAccountID; + pAccount->GetIdentifier(anAccountID); + + if (anAccountID == theAccountID) + return pAccount; + } + + return NULL; +} + +OTAccount * OTWallet::GetAccountPartialMatch(const std::string PARTIAL_ID) +{ + // loop through the accounts and find one with a specific ID. + OTAccount * pAccount = NULL; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + OT_ASSERT(NULL != pAccount); + + OTIdentifier anAccountID; + pAccount->GetIdentifier(anAccountID); + OTString strTemp(anAccountID); + std::string strIdentifier = strTemp.Get(); + + if (strIdentifier.compare(0,PARTIAL_ID.length(),PARTIAL_ID) == 0) + return pAccount; + } + + return NULL; +} + + + +// Pass in the Server ID and get the pointer back. +OTServerContract * OTWallet::GetServerContract(const OTIdentifier & SERVER_ID) +{ + OTContract * pServer = NULL; + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + pServer = (*ii).second; + + OT_ASSERT_MSG((NULL != pServer), "NULL server pointer in OTWallet::m_mapServers, OTWallet::GetServerContract"); + + OTIdentifier id_CurrentContract; + pServer->GetIdentifier(id_CurrentContract); + + if (id_CurrentContract == SERVER_ID) + return dynamic_cast(pServer); + } + + return NULL; +} + +OTServerContract * OTWallet::GetServerContractPartialMatch(const std::string PARTIAL_ID) +{ + OTContract * pServer = NULL; + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + pServer = (*ii).second; + OT_ASSERT_MSG((NULL != pServer), "NULL server pointer in OTWallet::m_mapServers, OTWallet::GetServerContract"); + + OTIdentifier id_CurrentContract; + pServer->GetIdentifier(id_CurrentContract); + + OTString strTemp(id_CurrentContract); + std::string strIdentifier = strTemp.Get(); + + if (strIdentifier.compare(0,PARTIAL_ID.length(),PARTIAL_ID) == 0) + return dynamic_cast(pServer); + } + + return NULL; +} + + + +// The wallet "owns" theContract and will handle cleaning it up. +// So make SURE you allocate it on the heap. +void OTWallet::AddServerContract(const OTServerContract & theContract) +{ + OTIdentifier CONTRACT_ID(theContract); + OTString STR_CONTRACT_ID(CONTRACT_ID); + + OTServerContract * pContract = GetServerContract(CONTRACT_ID); + + if (pContract) + { + OTLog::Error("Error: Attempt to add Server Contract but it is already in the wallet.\n"); + + delete &theContract; // I have to do this, since the return value is void, the caller MUST assume I took ownership. + } + else + { + m_mapServers[STR_CONTRACT_ID.Get()] = &(const_cast(theContract)); + + OTLog::Output(2, "Saving server contract to disk...\n"); + (const_cast(theContract)).SaveToContractFolder(); + + SaveWallet(); + } +} + + + +// The wallet "owns" theContract and will handle cleaning it up. +// So make SURE you allocate it on the heap. +void OTWallet::AddAssetContract(const OTAssetContract & theContract) +{ + OTIdentifier CONTRACT_ID(theContract); + OTString STR_CONTRACT_ID(CONTRACT_ID); + + OTAssetContract * pContract = GetAssetContract(CONTRACT_ID); + + if (pContract) + { + OTLog::Error("Error: Attempt to add Asset Contract but it is already in the wallet.\n"); + + delete &theContract; // I have to do this, since the return value is void, the caller MUST assume I took ownership. + } + else + { + m_mapContracts[STR_CONTRACT_ID.Get()] = &(const_cast(theContract)); + + OTLog::Output(2, "Saving asset contract to disk...\n"); + (const_cast(theContract)).SaveToContractFolder(); + + SaveWallet(); + } +} + +// -------------------------------------------- + +// These functions are low-level. They don't check for dependent data before deleting, +// and they don't save the wallet after they do. +// +// You have to handle that at a higher level. + +bool OTWallet::RemoveAssetContract(const OTIdentifier & theTargetID) +{ + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTAssetContract * pContract = NULL; + OTIdentifier aContractID; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + pContract = (*ii).second; + + OT_ASSERT(NULL != pContract); + + pContract->GetIdentifier(aContractID); + + if (aContractID == theTargetID) + { + m_mapContracts.erase(ii); + + delete pContract; + + return true; + } + } + + return false; +} + +bool OTWallet::RemoveServerContract(const OTIdentifier & theTargetID) +{ + OTContract * pServer = NULL; + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + pServer = (*ii).second; + + OT_ASSERT_MSG((NULL != pServer), "NULL server pointer in OTWallet::m_mapServers, OTWallet::RemoveServerContract"); + + OTIdentifier id_CurrentContract; + pServer->GetIdentifier(id_CurrentContract); + + if (id_CurrentContract == theTargetID) + { + m_mapServers.erase(ii); + + OTServerContract * pServerContract = static_cast (pServer); + delete pServerContract; + + return true; + } + } + + return false; +} + +// higher level version of this will require a server message, in addition to removing from wallet. +bool OTWallet::RemoveNym(const OTIdentifier & theTargetID) +{ + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG((NULL != pNym), "NULL pseudonym pointer in OTWallet::RemoveNym."); + + OTIdentifier id_CurrentNym; + pNym->GetIdentifier(id_CurrentNym); + + if (id_CurrentNym == theTargetID) + { + m_mapNyms.erase(ii); + + delete pNym; + + return true; + } + } + + return false; +} + +// higher level version of this will require a server message, in addition to removing from wallet. +bool OTWallet::RemoveAccount(const OTIdentifier & theTargetID) +{ + // loop through the accounts and find one with a specific ID. + OTAccount * pAccount = NULL; + OTIdentifier anAccountID; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + + OT_ASSERT(NULL != pAccount); + + pAccount->GetIdentifier(anAccountID); + + if (anAccountID == theTargetID) + { + m_mapAccounts.erase(ii); + + delete pAccount; + + return true; + } + } + + return false; +} + + + +// -------------------------------------------- + +OTAssetContract * OTWallet::GetAssetContract(const OTIdentifier & theContractID) +{ + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTAssetContract * pContract = NULL; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + pContract = (*ii).second; + OT_ASSERT(NULL != pContract); + + OTIdentifier aContractID; + pContract->GetIdentifier(aContractID); + + if (aContractID == theContractID) + return pContract; + } + + return NULL; +} + +OTAssetContract * OTWallet::GetAssetContractPartialMatch(const std::string PARTIAL_ID) +{ + // loop through the items that make up this transaction and print them out here, base64-encoded, of course. + OTAssetContract * pContract = NULL; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + pContract = (*ii).second; + OT_ASSERT(NULL != pContract); + + OTIdentifier aContractID; + pContract->GetIdentifier(aContractID); + + OTString strTemp(aContractID); + std::string strIdentifier = strTemp.Get(); + + if (strIdentifier.compare(0,PARTIAL_ID.length(),PARTIAL_ID) == 0) + return pContract; + } + + return NULL; +} + + +bool OTWallet::SaveContract(OTString & strContract) +{ + OTASCIIArmor ascName; + + if (m_strName.Exists()) // name is in the clear in memory, and base64 in storage. + { + ascName.SetString(m_strName, false); // linebreaks == false + } + + + strContract.Concatenate("\n\n\n", + ascName.Get(), m_strVersion.Get()); + + //mapOfNyms m_mapNyms; // So far no file writing for these (and none needed...) + //mapOfContracts m_mapContracts; // This is what I'm testing now, which includes the other 3. + //mapOfServers m_mapServers; + //mapOfAccounts m_mapAccounts; + + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG(NULL != pNym, "NULL pseudonym pointer in OTWallet::m_mapNyms, OTWallet::SaveContract"); + + pNym->SavePseudonymWallet(strContract); + } + + // --------------------------------------------------------------- + + OTContract * pContract = NULL; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + pContract = (*ii).second; + + OT_ASSERT_MSG(NULL != pContract, "NULL contract pointer in OTWallet::m_mapContracts, OTWallet::SaveContract"); + + pContract->SaveContractWallet(strContract); + + //TODO remove this test code--------------- + // Used for putting new signatures on contracts + /* + { + // Right now it's configured to sign with USER public key, not server. + // OTString strNewFile, strIdentifier("1"); // This is where I've got the server Nym + OTString strNewFile; + pContract->GetFilename(strNewFile); + strNewFile.Concatenate("NEW"); + + // OTPseudonym theSigningNym; + // theSigningNym.SetIdentifier(strIdentifier); + + // if (theSigningNym.Loadx509CertAndPrivateKey()) // with ID 1 in the certs folder. + if (g_pTemporaryNym) + pContract->SignContract(*g_pTemporaryNym); + + //TODO remove this test code. + pContract->SaveContract(strNewFile.Get()); + } + */ + // ---------------------------------------- + } + + // --------------------------------------------------------------- + + OTContract * pServer = NULL; + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + pServer = (*ii).second; + + OT_ASSERT_MSG(NULL != pServer, "NULL server pointer in OTWallet::m_mapServers, OTWallet::SaveContract"); + + pServer->SaveContractWallet(strContract); + /* + //TODO remove this test code--------------- + // Used for putting new signatures on contracts + + { + OTString strNewFile, strIdentifier("1"); + pServer->GetFilename(strNewFile); + strNewFile.Concatenate("NEW"); + + OTPseudonym theSigningNym; + theSigningNym.SetIdentifier(strIdentifier); + + if (theSigningNym.Loadx509CertAndPrivateKey()) // with ID 1 in the certs folder + pServer->SignContract(theSigningNym); + + //TODO remove this test code. + pServer->SaveContract(strNewFile.Get()); + } + */ + // ---------------------------------------- + } + + // --------------------------------------------------------------- + + OTContract * pAccount = NULL; + + for (mapOfAccounts::iterator ii = m_mapAccounts.begin(); ii != m_mapAccounts.end(); ++ii) + { + pAccount = (*ii).second; + + OT_ASSERT_MSG(NULL != pAccount, "NULL account pointer in OTWallet::m_mapAccounts, OTWallet::SaveContract"); + + pAccount->SaveContractWallet(strContract); + + //TODO remove this test code + /* + OTString strNewFile; + pAccount->GetFilename(strNewFile); + strNewFile.Concatenate("NEW"); + + // The others, I merely save them. + // But the accounts, I must sign them first. + // Only when the account is signed, is the signed portion + // updated to match the new account balance and date. + if (g_pTemporaryNym) + { + if (!pAccount->SignContract(*g_pTemporaryNym)) + { + OTLog::Error("Error signing account in OTWallet::SaveWallet\n"); + } + } + + pAccount->SaveContract(strNewFile.Get()); + */ + // ---------------------------------------- + } + + // --------------------------------------------------------------- + + strContract.Concatenate("%s", "\n"); + + return true; +} + + + + + + + +// Pass in the name only, NOT the full path. +// If you pass NULL, it remembers full path from last time. +// (Better to do that.) +// +bool OTWallet::SaveWallet(const char * szFilename/*=NULL*/) +{ + char * szFilenameToUse = NULL; + + if (NULL != szFilename) + m_strFilename.Set(szFilename); + + szFilenameToUse = (char *)m_strFilename.Get(); + + OT_ASSERT_MSG(NULL != szFilenameToUse, "Null filename in OTWallet::SaveWallet\n"); + + // --------------------------------------------------------------- + + bool bSuccess = false; + + OTString strContract; + + if (this->SaveContract(strContract)) + // Wallet file is the only one in data_folder (".") and not a subfolder of that. + bSuccess = OTDB::StorePlainString(strContract.Get(), ".", szFilenameToUse); // <==== Store Plain String + + // --------------------------------------------------------------- + + return bSuccess; +} + + + +bool OTWallet::LoadWallet(const char * szFilename) +{ + OT_ASSERT_MSG(NULL != szFilename, "NULL filename in OTWallet::LoadWallet.\n"); + + Release(); + + // -------------------------------------------------------------------- + + // Save this for later... (the full path to this file.) +// m_strFilename.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), szFilename); + + m_strFilename.Set(szFilename); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(szFilename)) + { + OTLog::vError("Wallet file does not exist: %s\n", szFilename); + return false; + } + + // -------------------------------------------------------------------- + + // The directory is "." because unlike every other OT file, the wallet file + // doesn't go into a subdirectory, but it goes into the main data_folder itself. + // Every other file, however, needs to specify its folder AND filename (and both + // of those will be appended to the local path to form the complete file path.) + // + OTStringXML xmlFileContents(OTDB::QueryPlainString(".", szFilename)); // <=== LOADING FROM DATA STORE. + + if (xmlFileContents.GetLength() < 2) + { + OTLog::vError("Error reading wallet file: %s\n",szFilename); + return false; + } + + // -------------------------------------------------------------------- + + IrrXMLReader* xml = createIrrXMLReader(&xmlFileContents); + + // parse the file until end reached + while(xml && xml->read()) + { + // strings for storing the data that we want to read out of the file + OTString NymName; + OTString NymID; + + OTString AssetName; + OTString AssetContract; + OTString AssetID; + + OTString ServerName; + OTString ServerContract; + OTString ServerID; + + OTString AcctName; + OTString AcctFile; + OTString AcctID; + + switch(xml->getNodeType()) + { + case EXN_NONE: + case EXN_TEXT: + case EXN_COMMENT: + case EXN_ELEMENT_END: + case EXN_CDATA: + // in this xml file, the only text which occurs is the messageText + //messageText = xml->getNodeData(); + break; + case EXN_ELEMENT: + { + if (!strcmp("wallet", xml->getNodeName())) // ------------------------------------------------------------- + { + OTASCIIArmor ascWalletName = xml->getAttributeValue("name"); + + if (ascWalletName.Exists()) + ascWalletName.GetString(m_strName, false); // linebreaks == false + +// m_strName = xml->getAttributeValue("name"); +// OTLog::OTPath = xml->getAttributeValue("path"); + m_strVersion = xml->getAttributeValue("version"); + + OTLog::vOutput(1, "\nLoading wallet: %s, version: %s\n", m_strName.Get(), m_strVersion.Get()); + } + else if (!strcmp("pseudonym", xml->getNodeName())) // ------------------------------------------------------------- + { + OTASCIIArmor ascNymName = xml->getAttributeValue("name"); + + if (ascNymName.Exists()) + ascNymName.GetString(NymName, false); // linebreaks == false + +// NymName = xml->getAttributeValue("name");// user-assigned name for GUI usage + NymID = xml->getAttributeValue("nymID"); // message digest from hash of x.509 cert + + OTLog::vOutput(2, "\n\n** Pseudonym ** (wallet listing): %s\nID: %s\n", + NymName.Get(), NymID.Get()); + + OTPseudonym * pNym = new OTPseudonym(NymName, NymID, NymID); + + OT_ASSERT_MSG((NULL != pNym), "Unable to allocate memory for an OTPseudonym"); + + if (pNym->Loadx509CertAndPrivateKey()) + { + if (pNym->VerifyPseudonym()) + { +// pNym->LoadSignedNymfile(*pNym); // Uncomment this line to generate a new Nym by hand. + if (pNym->LoadSignedNymfile(*pNym)) // (Uncomment) Comment OUT this line to generate a new nym by hand. + { +// pNym->SaveSignedNymfile(*pNym); // Uncomment this if you want to generate a new nym by hand. NORMALLY LEAVE IT COMMENTED OUT!!!! IT'S DANGEROUS!!! + // Also see OTPseudonym.cpp where it says: // && theNymfile.VerifyFile() + + + this->AddNym(*pNym); // Nym loaded. Insert to wallet's list of Nyms. + } + else + { + OTLog::Output(0, "Error loading Nym in OTWallet::LoadWallet\n"); + } + } + else + { + OTLog::Output(0, "Error verifying public key against Nym ID in OTWallet::LoadWallet\n"); + } + } + else { + OTLog::Output(0, "Error loading x509 file for Pseudonym in OTWallet::LoadWallet\n"); + } + } + else if (!strcmp("assetType", xml->getNodeName())) // ------------------------------------------------------------- + { + OTASCIIArmor ascAssetName = xml->getAttributeValue("name"); + + if (ascAssetName.Exists()) + ascAssetName.GetString(AssetName, false); // linebreaks == false + +// AssetName = xml->getAttributeValue("name"); + AssetID = xml->getAttributeValue("assetTypeID"); // hash of contract itself + + OTLog::vOutput(2, "\n\n****Asset Contract**** (server listing) Name: %s\nContract ID:\n%s\n", + AssetName.Get(), AssetID.Get()); + + OTString strContractPath; + strContractPath.Format(OTLog::ContractFolder()); + OTAssetContract * pContract = new OTAssetContract(AssetName, strContractPath, AssetID, AssetID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Asset Contract in OTWallet::LoadWallet\n"); + + if (pContract->LoadContract()) + { + if (pContract->VerifyContract()) + { + OTLog::Output(1, "** Asset Contract Verified **\n-----------------------------------------------------------------------------\n\n"); + + pContract->SetName(AssetName); + + m_mapContracts[AssetID.Get()] = pContract; + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Contract FAILED to verify.\n"); + } + } + else + { + delete pContract; pContract = NULL; + OTLog::Error("Error reading file for Asset Contract in OTWallet::LoadWallet\n"); + } + + } + else if (!strcmp("notaryProvider", xml->getNodeName())) // ------------------------------------------------------------- + { + OTASCIIArmor ascServerName = xml->getAttributeValue("name"); + + if (ascServerName.Exists()) + ascServerName.GetString(ServerName, false); // linebreaks == false + +// ServerName = xml->getAttributeValue("name"); + ServerID = xml->getAttributeValue("serverID"); // hash of contract + + OTLog::vOutput(2, "\n\n\n****Notary Server (contract)**** (wallet listing): %s\n ServerID:\n%s\n", + ServerName.Get(), ServerID.Get()); + + OTString strContractPath(OTLog::ContractFolder()); + + OTServerContract * pContract = new OTServerContract(ServerName, strContractPath, ServerID, ServerID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Server Contract in OTWallet::LoadWallet\n"); + + if (pContract->LoadContract()) + { + if (pContract->VerifyContract()) + { + pContract->SetName(ServerName); // This isn't needed, but it's proper. + + OTLog::Output(1, "** Server Contract Verified **\n-----------------------------------------------------------------------------\n\n"); + // Uncomment : Move these lines back above the 'if' block to regenerate some newly-signed contracts. + // (for testing only.) Otherwise leave here where it belongs. + m_mapServers[ServerID.Get()] = pContract; + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Server contract failed to verify.\n"); + } + } + else + { + delete pContract; pContract = NULL; + OTLog::Error("Error reading file for Transaction Server in OTWallet::LoadWallet\n"); + } + } + else if (!strcmp("assetAccount", xml->getNodeName())) // ------------------------------------------------------------- + { + OTASCIIArmor ascAcctName = xml->getAttributeValue("name"); + + if (ascAcctName.Exists()) + ascAcctName.GetString(AcctName, false); // linebreaks == false + + AcctID = xml->getAttributeValue("accountID"); + ServerID = xml->getAttributeValue("serverID"); + + OTLog::vOutput(2, "\n--------------------------------------------------------------------------\n" + "****Account**** (wallet listing) " + "name: %s\n AccountID: %s\n ServerID: %s\n", + AcctName.Get(), AcctID.Get(), ServerID.Get()); + + const OTIdentifier ACCOUNT_ID(AcctID), SERVER_ID(ServerID); + + OTAccount * pAccount = OTAccount::LoadExistingAccount(ACCOUNT_ID, SERVER_ID); + + if (pAccount) + { + pAccount->SetName(AcctName); + this->AddAccount(*pAccount); + } + else + { + OTLog::Error("Error loading existing Asset Account in OTWallet::LoadWallet\n"); + } + } + else + { + // unknown element type + OTLog::vError("unknown element type: %s\n", xml->getNodeName()); + } + } + break; + default: + OTLog::vOutput(5, "Unknown XML type in OTWallet::LoadWallet: %s\n", xml->getNodeName()); + break; + } + } + + + + + + + // TODO remove this test code + //bool GetAsciiArmoredData(OTASCIIArmor & theArmoredText) const; + //bool SetAsciiArmoredData(const OTASCIIArmor & theArmoredText) + + /* + OTString strPlaintext("Testing testing testing testing blah blah blah"); + OTLog::vError("\n\nTesting new RSA ENVELOPES (public key crypto).\n\nPlaintext: %s\n", strPlaintext.Get()); + + OTEnvelope theEVP; + theEVP.Seal(*g_pTemporaryNym, strPlaintext); + + + OTASCIIArmor ascCiphertext; + theEVP.GetAsciiArmoredData(ascCiphertext); // Now the contents of encrypted envelope are ascii-encoded + + OTLog::vError("\nASCII-ARMORED Ciphertext:\n%s\n", ascCiphertext.Get()); + + + // Now decrypt it + OTEnvelope evpReceived; + evpReceived.SetAsciiArmoredData(ascCiphertext); + + OTString strDecrypted; + evpReceived.Open(*g_pTemporaryNym, strDecrypted); + + OTLog::vError("Decrypted text: %s\n\n\n", strDecrypted.Get()); + */ + + + // delete the xml parser after usage + if (xml) + delete xml; + + return true; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/OTWallet.h b/OTLib/OTWallet.h new file mode 100644 index 000000000..39b3ce1c4 --- /dev/null +++ b/OTLib/OTWallet.h @@ -0,0 +1,240 @@ +/************************************************************************************ + * + * OTWallet.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#ifndef __OTWALLET_H__ +#define __OTWALLET_H__ + +#include +#include + +#include "OTPseudonym.h" +#include "OTContract.h" +#include "OTAssetContract.h" +#include "OTServerContract.h" +#include "OTAccount.h" + + +class OTMessage; +class OTPurse; +class OTString; + +//typedef std::map mapOfNyms; // in OTContract.h now. +typedef std::map mapOfServers; +typedef std::map mapOfAccounts; + +class OTWallet +{ +private: + mapOfNyms m_mapNyms; + mapOfContracts m_mapContracts; + mapOfServers m_mapServers; + mapOfAccounts m_mapAccounts; + + OTString m_strName; + OTString m_strVersion; + + OTPurse * m_pWithdrawalPurse; // While waiting on server response to withdrawal, store private coin data here for unblinding +public: + OTString m_strFilename; + + OTWallet(); + virtual ~OTWallet(); + void Release(); + + //------------------------------------------------------------ + + // Used by high-level wrapper. + + int GetNymCount(); + int GetServerCount(); + int GetAssetTypeCount(); + int GetAccountCount(); + + bool GetNym (const int iIndex, OTIdentifier & NYM_ID, OTString & NYM_NAME); + bool GetServer (const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + bool GetAssetType (const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + bool GetAccount (const int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + + //------------------------------------------------------------ + + void DisplayStatistics(OTString & strOutput); + + OTPseudonym * GetNymByID(const OTIdentifier & NYM_ID); + OTPseudonym * GetNymByIDPartialMatch(const std::string PARTIAL_ID); + + void AddServerContract(const OTServerContract & theContract); + OTServerContract * GetServerContract(const OTIdentifier & SERVER_ID); + OTServerContract * GetServerContractPartialMatch(const std::string PARTIAL_ID); + + void AddNym (const OTPseudonym & theNym); + void AddAccount (const OTAccount & theAcct); + + void AddAssetContract(const OTAssetContract & theContract); + OTAssetContract * GetAssetContract(const OTIdentifier & theContractID); + OTAssetContract * GetAssetContractPartialMatch(const std::string PARTIAL_ID); + + OTAccount * GetAccount(const OTIdentifier & theAccountID); + OTAccount * GetAccountPartialMatch(const std::string PARTIAL_ID); + + // While waiting on server response to a withdrawal, we keep the private coin + // data here so we can unblind the response. + // This information is so important (as important as the digital cash token + // itself, until the unblinding is done) that we need to save the file right away. + void AddPendingWithdrawal(const OTPurse & thePurse); + void RemovePendingWithdrawal(); + inline OTPurse * GetPendingWithdrawal() const { return m_pWithdrawalPurse; } + + bool LoadWallet(const char * szFilename); + bool SaveWallet(const char * szFilename=NULL); + bool SaveContract(OTString & strContract); // For saving the wallet to a string. + + bool SignContractWithFirstNymOnList(OTContract & theContract); + + // ---------------------------------------------------- + + + // These functions are low-level. They don't check for dependent data before deleting, + // and they don't save the wallet after they do. + // + // (You have to handle that at a higher level.) + + bool RemoveAssetContract(const OTIdentifier & theTargetID); + bool RemoveServerContract(const OTIdentifier & theTargetID); + + // higher level version of these two will require a server message, + // in addition to removing from wallet. (To delete them on server side.) + // + bool RemoveAccount(const OTIdentifier & theTargetID); + bool RemoveNym(const OTIdentifier & theTargetID); +}; + +#endif // __OTWALLET_H__ + + diff --git a/OTLib/OTglobal.h b/OTLib/OTglobal.h new file mode 100644 index 000000000..9b5f6ac0e --- /dev/null +++ b/OTLib/OTglobal.h @@ -0,0 +1,172 @@ +/************************************************************* + * + * OTGlobal.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#ifndef __GLOBAL_H__ +#define __GLOBAL_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +#define TYPE_1_CMD_1 1 +#define TYPE_1_CMD_2 2 +#define TYPE_1_CMD_3 3 +#define TYPE_1_CMD_4 4 + +#define CMD_TYPE_1 1 + +#define OT_CMD_HEADER_SIZE 9 + + typedef unsigned char BYTE; + typedef unsigned short USHORT; + + union u_header + { + BYTE buf[OT_CMD_HEADER_SIZE]; + struct { + BYTE type_id; // 1 byte + BYTE command_id; // 1 byte + BYTE filler[2]; // 2 extra bytes here so the size begins on a 4-byte boundary + uint32_t size; // 4 bytes to describe size of payload + BYTE checksum; // 1 byte + } fields; // total of 9 bytes + }; + +#ifdef __cplusplus +} +#endif + + + + +#endif // __GLOBAL_H__ diff --git a/OTLib/anyoption.cpp b/OTLib/anyoption.cpp new file mode 100755 index 000000000..4b7548f1a --- /dev/null +++ b/OTLib/anyoption.cpp @@ -0,0 +1,1177 @@ +/* + * AnyOption 1.3 + * + * kishan at hackorama dot com www.hackorama.com JULY 2001 + * + * + Acts as a common facade class for reading + * commandline options as well as options from + * an optionfile with delimited type value pairs + * + * + Handles the POSIX style single character options ( -w ) + * as well as the newer GNU long options ( --width ) + * + * + The option file assumes the traditional format of + * first character based comment lines and type value + * pairs with a delimiter , and flags which are not pairs + * + * # this is a coment + * # next line is an option value pair + * width : 100 + * # next line is a flag + * noimages + * + * + Supports printing out Help and Usage + * + * + Why not just use getopt() ? + * + * getopt() Its a POSIX standard not part of ANSI-C. + * So it may not be available on platforms like Windows. + * + * + Why it is so long ? + * + * The actual code which does command line parsing + * and option file parsing are done in few methods. + * Most of the extra code are for providing a flexible + * common public interface to both a resourcefile and + * and command line supporting POSIX style and + * GNU long option as well as mixing of both. + * + * + Please see "anyoption.h" for public method descriptions + * + */ + +/* Updated Auguest 2004 + * Fix from Michael D Peters (mpeters at sandia.gov) + * to remove static local variables, allowing multiple instantiations + * of the reader (for using multiple configuration files). There is + * an error in the destructor when using multiple instances, so you + * cannot delete your objects (it will crash), but not calling the + * destructor only introduces a small memory leak, so I + * have not bothered tracking it down. + * + * Also updated to use modern C++ style headers, rather than + * depricated iostream.h (it was causing my compiler problems) +*/ + +/* + * Updated September 2006 + * Fix from Boyan Asenov for a bug in mixing up option indexes + * leading to exception when mixing different options types + */ + +// FellowTraveler: added the below include. +#include + +#include "anyoption.h" + +AnyOption::AnyOption() +{ + init(); +} + +AnyOption::AnyOption(int maxopt) +{ + init( maxopt , maxopt ); +} + +AnyOption::AnyOption(int maxopt, int maxcharopt) +{ + init( maxopt , maxcharopt ); +} + +AnyOption::~AnyOption() +{ + if( mem_allocated ) + cleanup(); +} + +void +AnyOption::init() +{ + init( DEFAULT_MAXOPTS , DEFAULT_MAXOPTS ); +} + +void +AnyOption::init(int maxopt, int maxcharopt ) +{ + + max_options = maxopt; + max_char_options = maxcharopt; + max_usage_lines = DEFAULT_MAXUSAGE; + usage_lines = 0 ; + argc = 0; + argv = NULL; + posix_style = true; + verbose = false; + filename = NULL; + appname = NULL; + option_counter = 0; + optchar_counter = 0; + new_argv = NULL; + new_argc = 0 ; + max_legal_args = 0 ; + command_set = false; + file_set = false; + values = NULL; + g_value_counter = 0; + mem_allocated = false; + command_set = false; + file_set = false; + opt_prefix_char = '-'; + file_delimiter_char = ':'; + file_comment_char = '#'; + equalsign = '='; + comment = '#' ; + delimiter = ':' ; + endofline = '\n'; + whitespace = ' ' ; + nullterminate = '\0'; + set = false; + once = true; + hasoptions = false; + autousage = false; + + strcpy( long_opt_prefix , "--" ); + + if( alloc() == false ){ + cout << endl << "OPTIONS ERROR : Failed allocating memory" ; + cout << endl ; + cout << "Exiting." << endl ; + exit (0); + } +} + +bool +AnyOption::alloc() +{ + int i = 0 ; + int size = 0 ; + + if( mem_allocated ) + return true; + + size = (max_options+1) * sizeof(const char*); + options = (const char**)malloc( size ); + optiontype = (int*) malloc( (max_options+1)*sizeof(int) ); + optionindex = (int*) malloc( (max_options+1)*sizeof(int) ); + if( options == NULL || optiontype == NULL || optionindex == NULL ) + return false; + else + mem_allocated = true; + for( i = 0 ; i < max_options ; i++ ){ + options[i] = NULL; + optiontype[i] = 0 ; + optionindex[i] = -1 ; + } + optionchars = (char*) malloc( (max_char_options+1)*sizeof(char) ); + optchartype = (int*) malloc( (max_char_options+1)*sizeof(int) ); + optcharindex = (int*) malloc( (max_char_options+1)*sizeof(int) ); + if( optionchars == NULL || + optchartype == NULL || + optcharindex == NULL ) + { + mem_allocated = false; + return false; + } + for( i = 0 ; i < max_char_options ; i++ ){ + optionchars[i] = '0'; + optchartype[i] = 0 ; + optcharindex[i] = -1 ; + } + + size = (max_usage_lines+1) * sizeof(const char*) ; + usage = (const char**) malloc( size ); + + if( usage == NULL ){ + mem_allocated = false; + return false; + } + for( i = 0 ; i < max_usage_lines ; i++ ) + usage[i] = NULL; + + return true; +} + +bool +AnyOption::doubleOptStorage() +{ + options = (const char**)realloc( options, + ((2*max_options)+1) * sizeof( const char*) ); + optiontype = (int*) realloc( optiontype , + ((2 * max_options)+1)* sizeof(int) ); + optionindex = (int*) realloc( optionindex, + ((2 * max_options)+1) * sizeof(int) ); + if( options == NULL || optiontype == NULL || optionindex == NULL ) + return false; + /* init new storage */ + for( int i = max_options ; i < 2*max_options ; i++ ){ + options[i] = NULL; + optiontype[i] = 0 ; + optionindex[i] = -1 ; + } + max_options = 2 * max_options ; + return true; +} + +bool +AnyOption::doubleCharStorage() +{ + optionchars = (char*) realloc( optionchars, + ((2*max_char_options)+1)*sizeof(char) ); + optchartype = (int*) realloc( optchartype, + ((2*max_char_options)+1)*sizeof(int) ); + optcharindex = (int*) realloc( optcharindex, + ((2*max_char_options)+1)*sizeof(int) ); + if( optionchars == NULL || + optchartype == NULL || + optcharindex == NULL ) + return false; + /* init new storage */ + for( int i = max_char_options ; i < 2*max_char_options ; i++ ){ + optionchars[i] = '0'; + optchartype[i] = 0 ; + optcharindex[i] = -1 ; + } + max_char_options = 2 * max_char_options; + return true; +} + +bool +AnyOption::doubleUsageStorage() +{ + usage = (const char**)realloc( usage, + ((2*max_usage_lines)+1) * sizeof( const char*) ); + if ( usage == NULL ) + return false; + for( int i = max_usage_lines ; i < 2*max_usage_lines ; i++ ) + usage[i] = NULL; + max_usage_lines = 2 * max_usage_lines ; + return true; + +} + + +void +AnyOption::cleanup() +{ + free (options); + free (optiontype); + free (optionindex); + free (optionchars); + free (optchartype); + free (optcharindex); + free (usage); + if( values != NULL ) + free (values); + if( new_argv != NULL ) + free (new_argv); +} + +void +AnyOption::setCommandPrefixChar( char _prefix ) +{ + opt_prefix_char = _prefix; +} + +void +AnyOption::setCommandLongPrefix( char *_prefix ) +{ + if( strlen( _prefix ) > MAX_LONG_PREFIX_LENGTH ){ + *( _prefix + MAX_LONG_PREFIX_LENGTH ) = '\0'; + } + + strcpy (long_opt_prefix, _prefix); +} + +void +AnyOption::setFileCommentChar( char _comment ) +{ + file_delimiter_char = _comment; +} + + +void +AnyOption::setFileDelimiterChar( char _delimiter ) +{ + file_comment_char = _delimiter ; +} + +bool +AnyOption::CommandSet() +{ + return( command_set ); +} + +bool +AnyOption::FileSet() +{ + return( file_set ); +} + +void +AnyOption::noPOSIX() +{ + posix_style = false; +} + +bool +AnyOption::POSIX() +{ + return posix_style; +} + + +void +AnyOption::setVerbose() +{ + verbose = true ; +} + +void +AnyOption::printVerbose() +{ + if( verbose ) + cout << endl ; +} +void +AnyOption::printVerbose( const char *msg ) +{ + if( verbose ) + cout << msg ; +} + +void +AnyOption::printVerbose( char *msg ) +{ + if( verbose ) + cout << msg ; +} + +void +AnyOption::printVerbose( char ch ) +{ + if( verbose ) + cout << ch ; +} + +bool +AnyOption::hasOptions() +{ + return hasoptions; +} + +void +AnyOption::autoUsagePrint(bool _autousage) +{ + autousage = _autousage; +} + +void +AnyOption::useCommandArgs( int _argc, char **_argv ) +{ + argc = _argc; + argv = _argv; + command_set = true; + appname = argv[0]; + if(argc > 1) hasoptions = true; +} + +void +AnyOption::useFiileName( const char *_filename ) +{ + filename = _filename; + file_set = true; +} + +/* + * set methods for options + */ + +void +AnyOption::setCommandOption( const char *opt ) +{ + addOption( opt , COMMAND_OPT ); + g_value_counter++; +} + +void +AnyOption::setCommandOption( char opt ) +{ + addOption( opt , COMMAND_OPT ); + g_value_counter++; +} + +void +AnyOption::setCommandOption( const char *opt , char optchar ) +{ + addOption( opt , COMMAND_OPT ); + addOption( optchar , COMMAND_OPT ); + g_value_counter++; +} + +void +AnyOption::setCommandFlag( const char *opt ) +{ + addOption( opt , COMMAND_FLAG ); + g_value_counter++; +} + +void +AnyOption::setCommandFlag( char opt ) +{ + addOption( opt , COMMAND_FLAG ); + g_value_counter++; +} + +void +AnyOption::setCommandFlag( const char *opt , char optchar ) +{ + addOption( opt , COMMAND_FLAG ); + addOption( optchar , COMMAND_FLAG ); + g_value_counter++; +} + +void +AnyOption::setFileOption( const char *opt ) +{ + addOption( opt , FILE_OPT ); + g_value_counter++; +} + +void +AnyOption::setFileOption( char opt ) +{ + addOption( opt , FILE_OPT ); + g_value_counter++; +} + +void +AnyOption::setFileOption( const char *opt , char optchar ) +{ + addOption( opt , FILE_OPT ); + addOption( optchar, FILE_OPT ); + g_value_counter++; +} + +void +AnyOption::setFileFlag( const char *opt ) +{ + addOption( opt , FILE_FLAG ); + g_value_counter++; +} + +void +AnyOption::setFileFlag( char opt ) +{ + addOption( opt , FILE_FLAG ); + g_value_counter++; +} + +void +AnyOption::setFileFlag( const char *opt , char optchar ) +{ + addOption( opt , FILE_FLAG ); + addOption( optchar , FILE_FLAG ); + g_value_counter++; +} + +void +AnyOption::setOption( const char *opt ) +{ + addOption( opt , COMMON_OPT ); + g_value_counter++; +} + +void +AnyOption::setOption( char opt ) +{ + addOption( opt , COMMON_OPT ); + g_value_counter++; +} + +void +AnyOption::setOption( const char *opt , char optchar ) +{ + addOption( opt , COMMON_OPT ); + addOption( optchar , COMMON_OPT ); + g_value_counter++; +} + +void +AnyOption::setFlag( const char *opt ) +{ + addOption( opt , COMMON_FLAG ); + g_value_counter++; +} + +void +AnyOption::setFlag( const char opt ) +{ + addOption( opt , COMMON_FLAG ); + g_value_counter++; +} + +void +AnyOption::setFlag( const char *opt , char optchar ) +{ + addOption( opt , COMMON_FLAG ); + addOption( optchar , COMMON_FLAG ); + g_value_counter++; +} + +void +AnyOption::addOption( const char *opt, int type ) +{ + if( option_counter >= max_options ){ + if( doubleOptStorage() == false ){ + addOptionError( opt ); + return; + } + } + options[ option_counter ] = opt ; + optiontype[ option_counter ] = type ; + optionindex[ option_counter ] = g_value_counter; + option_counter++; +} + +void +AnyOption::addOption( char opt, int type ) +{ + if( !POSIX() ){ + printVerbose("Ignoring the option character \""); + printVerbose( opt ); + printVerbose( "\" ( POSIX options are turned off )" ); + printVerbose(); + return; + } + + + if( optchar_counter >= max_char_options ){ + if( doubleCharStorage() == false ){ + addOptionError( opt ); + return; + } + } + optionchars[ optchar_counter ] = opt ; + optchartype[ optchar_counter ] = type ; + optcharindex[ optchar_counter ] = g_value_counter; + optchar_counter++; +} + +void +AnyOption::addOptionError( const char *opt ) +{ + cout << endl ; + cout << "OPTIONS ERROR : Failed allocating extra memory " << endl ; + cout << "While adding the option : \""<< opt << "\"" << endl; + cout << "Exiting." << endl ; + cout << endl ; + exit(0); +} + +void +AnyOption::addOptionError( char opt ) +{ + cout << endl ; + cout << "OPTIONS ERROR : Failed allocating extra memory " << endl ; + cout << "While adding the option: \""<< opt << "\"" << endl; + cout << "Exiting." << endl ; + cout << endl ; + exit(0); +} + +void +AnyOption::processOptions() +{ + if( ! valueStoreOK() ) + return; +} + +void +AnyOption::processCommandArgs(int max_args) +{ + max_legal_args = max_args; + processCommandArgs(); +} + +void +AnyOption::processCommandArgs( int _argc, char **_argv, int max_args ) +{ + max_legal_args = max_args; + processCommandArgs( _argc, _argv ); +} + +void +AnyOption::processCommandArgs( int _argc, char **_argv ) +{ + useCommandArgs( _argc, _argv ); + processCommandArgs(); +} + +void +AnyOption::processCommandArgs() +{ + if( ! ( valueStoreOK() && CommandSet() ) ) + return; + + if( max_legal_args == 0 ) + max_legal_args = argc; + new_argv = (int*) malloc( (max_legal_args+1) * sizeof(int) ); + for( int i = 1 ; i < argc ; i++ ){/* ignore first argv */ + if( argv[i][0] == long_opt_prefix[0] && + argv[i][1] == long_opt_prefix[1] ) { /* long GNU option */ + int match_at = parseGNU( argv[i]+2 ); /* skip -- */ + if( match_at >= 0 && i < argc-1 ) /* found match */ + setValue( options[match_at] , argv[++i] ); + }else if( argv[i][0] == opt_prefix_char ) { /* POSIX char */ + if( POSIX() ){ + char ch = parsePOSIX( argv[i]+1 );/* skip - */ + if( ch != '0' && i < argc-1 ) /* matching char */ + setValue( ch , argv[++i] ); + } else { /* treat it as GNU option with a - */ + int match_at = parseGNU( argv[i]+1 ); /* skip - */ + if( match_at >= 0 && i < argc-1 ) /* found match */ + setValue( options[match_at] , argv[++i] ); + } + }else { /* not option but an argument keep index */ + if( new_argc < max_legal_args ){ + new_argv[ new_argc ] = i ; + new_argc++; + }else{ /* ignore extra arguments */ + printVerbose( "Ignoring extra argument: " ); + printVerbose( argv[i] ); + printVerbose( ); + printAutoUsage(); + } + printVerbose( "Unknown command argument option : " ); + printVerbose( argv[i] ); + printVerbose( ); + printAutoUsage(); + } + } +} + +char +AnyOption::parsePOSIX( char* arg ) +{ + + for( unsigned int i = 0 ; i < strlen(arg) ; i++ ){ + char ch = arg[i] ; + if( matchChar(ch) ) { /* keep matching flags till an option */ + /*if last char argv[++i] is the value */ + if( i == strlen(arg)-1 ){ + return ch; + }else{/* else the rest of arg is the value */ + i++; /* skip any '=' and ' ' */ + while( arg[i] == whitespace + || arg[i] == equalsign ) + i++; + setValue( ch , arg+i ); + return '0'; + } + } + } + printVerbose( "Unknown command argument option : " ); + printVerbose( arg ); + printVerbose( ); + printAutoUsage(); + return '0'; +} + +int +AnyOption::parseGNU( char *arg ) +{ + int split_at = 0; + /* if has a '=' sign get value */ + for( unsigned int i = 0 ; i < strlen(arg) ; i++ ){ + if(arg[i] == equalsign ){ + split_at = i ; /* store index */ + i = strlen(arg); /* get out of loop */ + } + } + if( split_at > 0 ){ /* it is an option value pair */ + char* tmp = (char*) malloc( (split_at+1)*sizeof(char) ); + for( int i = 0 ; i < split_at ; i++ ) + tmp[i] = arg[i]; + tmp[split_at] = '\0'; + + if ( matchOpt( tmp ) >= 0 ){ + setValue( options[matchOpt(tmp)] , arg+split_at+1 ); + free (tmp); + }else{ + printVerbose( "Unknown command argument option : " ); + printVerbose( arg ); + printVerbose( ); + printAutoUsage(); + free (tmp); + return -1; + } + }else{ /* regular options with no '=' sign */ + return matchOpt(arg); + } + return -1; +} + + +int +AnyOption::matchOpt( char *opt ) +{ + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], opt ) == 0 ){ + if( optiontype[i] == COMMON_OPT || + optiontype[i] == COMMAND_OPT ) + { /* found option return index */ + return i; + }else if( optiontype[i] == COMMON_FLAG || + optiontype[i] == COMMAND_FLAG ) + { /* found flag, set it */ + setFlagOn( opt ); + return -1; + } + } + } + printVerbose( "Unknown command argument option : " ); + printVerbose( opt ) ; + printVerbose( ); + printAutoUsage(); + return -1; +} +bool +AnyOption::matchChar( char c ) +{ + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == c ) { /* found match */ + if(optchartype[i] == COMMON_OPT || + optchartype[i] == COMMAND_OPT ) + { /* an option store and stop scanning */ + return true; + }else if( optchartype[i] == COMMON_FLAG || + optchartype[i] == COMMAND_FLAG ) { /* a flag store and keep scanning */ + setFlagOn( c ); + return false; + } + } + } + printVerbose( "Unknown command argument option : " ); + printVerbose( c ) ; + printVerbose( ); + printAutoUsage(); + return false; +} + +bool +AnyOption::valueStoreOK( ) +{ + int size= 0; + if( !set ){ + if( g_value_counter > 0 ){ + size = g_value_counter * sizeof(char*); + values = (char**)malloc( size ); + for( int i = 0 ; i < g_value_counter ; i++) + values[i] = NULL; + set = true; + } + } + return set; +} + +/* + * public get methods + */ +char* +AnyOption::getValue( const char *option ) +{ + if( !valueStoreOK() ) + return NULL; + + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], option ) == 0 ) + return values[ optionindex[i] ]; + } + return NULL; +} + +bool +AnyOption::getFlag( const char *option ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], option ) == 0 ) + return findFlag( values[ optionindex[i] ] ); + } + return false; +} + +char* +AnyOption::getValue( char option ) +{ + if( !valueStoreOK() ) + return NULL; + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == option ) + return values[ optcharindex[i] ]; + } + return NULL; +} + +bool +AnyOption::getFlag( char option ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == option ) + return findFlag( values[ optcharindex[i] ] ) ; + } + return false; +} + +bool +AnyOption::findFlag( char* val ) +{ + if( val == NULL ) + return false; + + if( strcmp( TRUE_FLAG , val ) == 0 ) + return true; + + return false; +} + +/* + * private set methods + */ +bool +AnyOption::setValue( const char *option , char *value ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], option ) == 0 ){ + values[ optionindex[i] ] = (char*) malloc((strlen(value)+1)*sizeof(char)); + strcpy( values[ optionindex[i] ], value ); + return true; + } + } + return false; +} + +bool +AnyOption::setFlagOn( const char *option ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], option ) == 0 ){ + values[ optionindex[i] ] = (char*) malloc((strlen(TRUE_FLAG)+1)*sizeof(char)); + strcpy( values[ optionindex[i] ] , TRUE_FLAG ); + return true; + } + } + return false; +} + +bool +AnyOption::setValue( char option , char *value ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == option ){ + values[ optcharindex[i] ] = (char*) malloc((strlen(value)+1)*sizeof(char)); + strcpy( values[ optcharindex[i] ], value ); + return true; + } + } + return false; +} + +bool +AnyOption::setFlagOn( char option ) +{ + if( !valueStoreOK() ) + return false; + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == option ){ + values[ optcharindex[i] ] = (char*) malloc((strlen(TRUE_FLAG)+1)*sizeof(char)); + strcpy( values[ optcharindex[i] ] , TRUE_FLAG ); + return true; + } + } + return false; +} + + +int +AnyOption::getArgc( ) +{ + return new_argc; +} + +char* +AnyOption::getArgv( int index ) +{ + if( index < new_argc ){ + return ( argv[ new_argv[ index ] ] ); + } + return NULL; +} + +/* dotfile sub routines */ + +bool +AnyOption::processFile() +{ + if( ! (valueStoreOK() && FileSet()) ) + return false; + return ( consumeFile(readFile()) ); +} + +bool +AnyOption::processFile( const char *filename ) +{ + useFiileName(filename ); + return ( processFile() ); +} + +char* +AnyOption::readFile() +{ + return ( readFile(filename) ); +} + +/* + * read the file contents to a character buffer + */ + +char* +AnyOption::readFile( const char* fname ) +{ + int length; + char *buffer; + ifstream is; + is.open ( fname , ifstream::in ); + if( ! is.good() ){ + is.close(); + return NULL; + } + is.seekg (0, ios::end); + length = is.tellg(); + is.seekg (0, ios::beg); + buffer = (char*) malloc(length*sizeof(char)); + is.read (buffer,length); + is.close(); + return buffer; +} + +/* + * scans a char* buffer for lines that does not + * start with the specified comment character. + */ +bool +AnyOption::consumeFile( char *buffer ) +{ + + if( buffer == NULL ) + return false; + + char *cursor = buffer;/* preserve the ptr */ + char *pline = NULL ; + int linelength = 0; + bool newline = true; + for( unsigned int i = 0 ; i < strlen( buffer ) ; i++ ){ + if( *cursor == endofline ) { /* end of line */ + if( pline != NULL ) /* valid line */ + processLine( pline, linelength ); + pline = NULL; + newline = true; + }else if( newline ){ /* start of line */ + newline = false; + if( (*cursor != comment ) ){ /* not a comment */ + pline = cursor ; + linelength = 0 ; + } + } + cursor++; /* keep moving */ + linelength++; + } + free (buffer); + return true; +} + + +/* + * find a valid type value pair separated by a delimiter + * character and pass it to valuePairs() + * any line which is not valid will be considered a value + * and will get passed on to justValue() + * + * assuming delimiter is ':' the behaviour will be, + * + * width:10 - valid pair valuePairs( width, 10 ); + * width : 10 - valid pair valuepairs( width, 10 ); + * + * :::: - not valid + * width - not valid + * :10 - not valid + * width: - not valid + * :: - not valid + * : - not valid + * + */ + +void +AnyOption::processLine( char *theline, int length ) +{ + bool found = false; + char *pline = (char*) malloc( (length+1)*sizeof(char) ); + for( int i = 0 ; i < length ; i ++ ) + pline[i]= *(theline++); + pline[length] = nullterminate; + char *cursor = pline ; /* preserve the ptr */ + if( *cursor == delimiter || *(cursor+length-1) == delimiter ){ + justValue( pline );/* line with start/end delimiter */ + }else{ + for( int i = 1 ; i < length-1 && !found ; i++){/* delimiter */ + if( *cursor == delimiter ){ + *(cursor-1) = nullterminate; /* two strings */ + found = true; + valuePairs( pline , cursor+1 ); + } + cursor++; + } + cursor++; + if( !found ) /* not a pair */ + justValue( pline ); + } + free (pline); +} + +/* + * removes trailing and preceeding whitespaces from a string + */ +char* +AnyOption::chomp( char *str ) +{ + while( *str == whitespace ) + str++; + char *end = str+strlen(str)-1; + while( *end == whitespace ) + end--; + *(end+1) = nullterminate; + return str; +} + +void +AnyOption::valuePairs( char *type, char *value ) +{ + if ( strlen(chomp(type)) == 1 ){ /* this is a char option */ + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == type[0] ){ /* match */ + if( optchartype[i] == COMMON_OPT || + optchartype[i] == FILE_OPT ) + { + setValue( type[0] , chomp(value) ); + return; + } + } + } + } + /* if no char options matched */ + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], type ) == 0 ){ /* match */ + if( optiontype[i] == COMMON_OPT || + optiontype[i] == FILE_OPT ) + { + setValue( type , chomp(value) ); + return; + } + } + } + printVerbose( "Unknown option in resourcefile : " ); + printVerbose( type ); + printVerbose( ); +} + +void +AnyOption::justValue( char *type ) +{ + + if ( strlen(chomp(type)) == 1 ){ /* this is a char option */ + for( int i = 0 ; i < optchar_counter ; i++ ){ + if( optionchars[i] == type[0] ){ /* match */ + if( optchartype[i] == COMMON_FLAG || + optchartype[i] == FILE_FLAG ) + { + setFlagOn( type[0] ); + return; + } + } + } + } + /* if no char options matched */ + for( int i = 0 ; i < option_counter ; i++ ){ + if( strcmp( options[i], type ) == 0 ){ /* match */ + if( optiontype[i] == COMMON_FLAG || + optiontype[i] == FILE_FLAG ) + { + setFlagOn( type ); + return; + } + } + } + printVerbose( "Unknown option in resourcefile : " ); + printVerbose( type ); + printVerbose( ); +} + +/* + * usage and help + */ + + +void +AnyOption::printAutoUsage() +{ + if( autousage ) printUsage(); +} + +void +AnyOption::printUsage() +{ + + if( once ) { + once = false ; + cout << endl ; + for( int i = 0 ; i < usage_lines ; i++ ) + cout << usage[i] << endl ; + cout << endl ; + } +} + + +void +AnyOption::addUsage( const char *line ) +{ + if( usage_lines >= max_usage_lines ){ + if( doubleUsageStorage() == false ){ + addUsageError( line ); + exit(1); + } + } + usage[ usage_lines ] = line ; + usage_lines++; +} + +void +AnyOption::addUsageError( const char *line ) +{ + cout << endl ; + cout << "OPTIONS ERROR : Failed allocating extra memory " << endl ; + cout << "While adding the usage/help : \""<< line << "\"" << endl; + cout << "Exiting." << endl ; + cout << endl ; + exit(0); + +} diff --git a/OTLib/anyoption.h b/OTLib/anyoption.h new file mode 100755 index 000000000..01501df2b --- /dev/null +++ b/OTLib/anyoption.h @@ -0,0 +1,270 @@ +#ifndef _ANYOPTION_H +#define _ANYOPTION_H + +#include +#include +#include +#include + +#define COMMON_OPT 1 +#define COMMAND_OPT 2 +#define FILE_OPT 3 +#define COMMON_FLAG 4 +#define COMMAND_FLAG 5 +#define FILE_FLAG 6 + +#define COMMAND_OPTION_TYPE 1 +#define COMMAND_FLAG_TYPE 2 +#define FILE_OPTION_TYPE 3 +#define FILE_FLAG_TYPE 4 +#define UNKNOWN_TYPE 5 + +#define DEFAULT_MAXOPTS 10 +#define MAX_LONG_PREFIX_LENGTH 2 + +#define DEFAULT_MAXUSAGE 3 +#define DEFAULT_MAXHELP 10 + +#define TRUE_FLAG "true" + +using namespace std; + +class AnyOption +{ + +public: /* the public interface */ + AnyOption(); + AnyOption(int maxoptions ); + AnyOption(int maxoptions , int maxcharoptions); + ~AnyOption(); + + /* + * following set methods specifies the + * special characters and delimiters + * if not set traditional defaults will be used + */ + + void setCommandPrefixChar( char _prefix ); /* '-' in "-w" */ + void setCommandLongPrefix( char *_prefix ); /* '--' in "--width" */ + void setFileCommentChar( char _comment ); /* '#' in shellscripts */ + void setFileDelimiterChar( char _delimiter );/* ':' in "width : 100" */ + + /* + * provide the input for the options + * like argv[] for commndline and the + * option file name to use; + */ + + void useCommandArgs( int _argc, char **_argv ); + void useFiileName( const char *_filename ); + + /* + * turn off the POSIX style options + * this means anything starting with a '-' or "--" + * will be considered a valid option + * which alo means you cannot add a bunch of + * POIX options chars together like "-lr" for "-l -r" + * + */ + + void noPOSIX(); + + /* + * prints warning verbose if you set anything wrong + */ + void setVerbose(); + + + /* + * there are two types of options + * + * Option - has an associated value ( -w 100 ) + * Flag - no value, just a boolean flag ( -nogui ) + * + * the options can be either a string ( GNU style ) + * or a character ( traditional POSIX style ) + * or both ( --width, -w ) + * + * the options can be common to the commandline and + * the optionfile, or can belong only to either of + * commandline and optionfile + * + * following set methods, handle all the aboove + * cases of options. + */ + + /* options comman to command line and option file */ + void setOption( const char *opt_string ); + void setOption( char opt_char ); + void setOption( const char *opt_string , char opt_char ); + void setFlag( const char *opt_string ); + void setFlag( char opt_char ); + void setFlag( const char *opt_string , char opt_char ); + + /* options read from commandline only */ + void setCommandOption( const char *opt_string ); + void setCommandOption( char opt_char ); + void setCommandOption( const char *opt_string , char opt_char ); + void setCommandFlag( const char *opt_string ); + void setCommandFlag( char opt_char ); + void setCommandFlag( const char *opt_string , char opt_char ); + + /* options read from an option file only */ + void setFileOption( const char *opt_string ); + void setFileOption( char opt_char ); + void setFileOption( const char *opt_string , char opt_char ); + void setFileFlag( const char *opt_string ); + void setFileFlag( char opt_char ); + void setFileFlag( const char *opt_string , char opt_char ); + + /* + * process the options, registerd using + * useCommandArgs() and useFileName(); + */ + void processOptions(); + void processCommandArgs(); + void processCommandArgs( int max_args ); + bool processFile(); + + /* + * process the specified options + */ + void processCommandArgs( int _argc, char **_argv ); + void processCommandArgs( int _argc, char **_argv, int max_args ); + bool processFile( const char *_filename ); + + /* + * get the value of the options + * will return NULL if no value is set + */ + char *getValue( const char *_option ); + bool getFlag( const char *_option ); + char *getValue( char _optchar ); + bool getFlag( char _optchar ); + + /* + * Print Usage + */ + void printUsage(); + void printAutoUsage(); + void addUsage( const char *line ); + void printHelp(); + /* print auto usage printing for unknown options or flag */ + void autoUsagePrint(bool flag); + + /* + * get the argument count and arguments sans the options + */ + int getArgc(); + char* getArgv( int index ); + bool hasOptions(); + +private: /* the hidden data structure */ + int argc; /* commandline arg count */ + char **argv; /* commndline args */ + const char* filename; /* the option file */ + char* appname; /* the application name from argv[0] */ + + int *new_argv; /* arguments sans options (index to argv) */ + int new_argc; /* argument count sans the options */ + int max_legal_args; /* ignore extra arguments */ + + + /* option strings storage + indexing */ + int max_options; /* maximum number of options */ + const char **options; /* storage */ + int *optiontype; /* type - common, command, file */ + int *optionindex; /* index into value storage */ + int option_counter; /* counter for added options */ + + /* option chars storage + indexing */ + int max_char_options; /* maximum number options */ + char *optionchars; /* storage */ + int *optchartype; /* type - common, command, file */ + int *optcharindex; /* index into value storage */ + int optchar_counter; /* counter for added options */ + + /* values */ + char **values; /* common value storage */ + int g_value_counter; /* globally updated value index LAME! */ + + /* help and usage */ + const char **usage; /* usage */ + int max_usage_lines; /* max usage lines reseverd */ + int usage_lines; /* number of usage lines */ + + bool command_set; /* if argc/argv were provided */ + bool file_set; /* if a filename was provided */ + bool mem_allocated; /* if memory allocated in init() */ + bool posix_style; /* enables to turn off POSIX style options */ + bool verbose; /* silent|verbose */ + bool print_usage; /* usage verbose */ + bool print_help; /* help verbose */ + + char opt_prefix_char; /* '-' in "-w" */ + char long_opt_prefix[MAX_LONG_PREFIX_LENGTH + 1]; /* '--' in "--width" */ + char file_delimiter_char; /* ':' in width : 100 */ + char file_comment_char; /* '#' in "#this is a comment" */ + char equalsign; + char comment; + char delimiter; + char endofline; + char whitespace; + char nullterminate; + + bool set; //was static member + bool once; //was static member + + bool hasoptions; + bool autousage; + +private: /* the hidden utils */ + void init(); + void init(int maxopt, int maxcharopt ); + bool alloc(); + void cleanup(); + bool valueStoreOK(); + + /* grow storage arrays as required */ + bool doubleOptStorage(); + bool doubleCharStorage(); + bool doubleUsageStorage(); + + bool setValue( const char *option , char *value ); + bool setFlagOn( const char *option ); + bool setValue( char optchar , char *value); + bool setFlagOn( char optchar ); + + void addOption( const char* option , int type ); + void addOption( char optchar , int type ); + void addOptionError( const char *opt); + void addOptionError( char opt); + bool findFlag( char* value ); + void addUsageError( const char *line ); + bool CommandSet(); + bool FileSet(); + bool POSIX(); + + char parsePOSIX( char* arg ); + int parseGNU( char *arg ); + bool matchChar( char c ); + int matchOpt( char *opt ); + + /* dot file methods */ + char *readFile(); + char *readFile( const char* fname ); + bool consumeFile( char *buffer ); + void processLine( char *theline, int length ); + char *chomp( char *str ); + void valuePairs( char *type, char *value ); + void justValue( char *value ); + + void printVerbose( const char *msg ); + void printVerbose( char *msg ); + void printVerbose( char ch ); + void printVerbose( ); + + +}; + +#endif /* ! _ANYOPTION_H */ diff --git a/OTLib/bigint/.gitignore b/OTLib/bigint/.gitignore new file mode 100755 index 000000000..4467edcf5 --- /dev/null +++ b/OTLib/bigint/.gitignore @@ -0,0 +1,6 @@ +*.o +sample +testsuite +testsuite.expected +testsuite.out +testsuite.err diff --git a/OTLib/bigint/BigInteger.cc b/OTLib/bigint/BigInteger.cc new file mode 100755 index 000000000..95711a16c --- /dev/null +++ b/OTLib/bigint/BigInteger.cc @@ -0,0 +1,421 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#include "BigInteger.hh" + +void BigInteger::operator =(const BigInteger &x) { + // Calls like a = a have no effect + if (this == &x) + return; + // Copy sign + sign = x.sign; + // Copy the rest + mag = x.mag; +} + +BigInteger::BigInteger(const Blk *b, Index blen, Sign s) : mag(b, blen) { + switch (s) { + case zero: + if (!mag.isZero()) + throw "BigInteger::BigInteger(const Blk *, Index, Sign): Cannot use a sign of zero with a nonzero magnitude"; + sign = zero; + break; + case positive: + case negative: + // If the magnitude is zero, force the sign to zero. + sign = mag.isZero() ? zero : s; + break; + default: + /* g++ seems to be optimizing out this case on the assumption + * that the sign is a valid member of the enumeration. Oh well. */ + throw "BigInteger::BigInteger(const Blk *, Index, Sign): Invalid sign"; + } +} + +BigInteger::BigInteger(const BigUnsigned &x, Sign s) : mag(x) { + switch (s) { + case zero: + if (!mag.isZero()) + throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Cannot use a sign of zero with a nonzero magnitude"; + sign = zero; + break; + case positive: + case negative: + // If the magnitude is zero, force the sign to zero. + sign = mag.isZero() ? zero : s; + break; + default: + /* g++ seems to be optimizing out this case on the assumption + * that the sign is a valid member of the enumeration. Oh well. */ + throw "BigInteger::BigInteger(const BigUnsigned &, Sign): Invalid sign"; + } +} + +/* CONSTRUCTION FROM PRIMITIVE INTEGERS + * Same idea as in BigUnsigned.cc, except that negative input results in a + * negative BigInteger instead of an exception. */ + +// Done longhand to let us use initialization. +BigInteger::BigInteger(unsigned long x) : mag(x) { sign = mag.isZero() ? zero : positive; } +BigInteger::BigInteger(unsigned int x) : mag(x) { sign = mag.isZero() ? zero : positive; } +BigInteger::BigInteger(unsigned short x) : mag(x) { sign = mag.isZero() ? zero : positive; } + +// For signed input, determine the desired magnitude and sign separately. + +namespace { + template + BigInteger::Blk magOf(X x) { + /* UX(...) cast needed to stop short(-2^15), which negates to + * itself, from sign-extending in the conversion to Blk. */ + return BigInteger::Blk(x < 0 ? UX(-x) : x); + } + template + BigInteger::Sign signOf(X x) { + return (x == 0) ? BigInteger::zero + : (x > 0) ? BigInteger::positive + : BigInteger::negative; + } +} + +BigInteger::BigInteger(long x) : sign(signOf(x)), mag(magOf(x)) {} +BigInteger::BigInteger(int x) : sign(signOf(x)), mag(magOf(x)) {} +BigInteger::BigInteger(short x) : sign(signOf(x)), mag(magOf(x)) {} + +// CONVERSION TO PRIMITIVE INTEGERS + +/* Reuse BigUnsigned's conversion to an unsigned primitive integer. + * The friend is a separate function rather than + * BigInteger::convertToUnsignedPrimitive to avoid requiring BigUnsigned to + * declare BigInteger. */ +template +inline X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a) { + return a.convertToPrimitive(); +} + +template +X BigInteger::convertToUnsignedPrimitive() const { + if (sign == negative) + throw "BigInteger::to: " + "Cannot convert a negative integer to an unsigned type"; + else + return convertBigUnsignedToPrimitiveAccess(mag); +} + +/* Similar to BigUnsigned::convertToPrimitive, but split into two cases for + * nonnegative and negative numbers. */ +template +X BigInteger::convertToSignedPrimitive() const { + if (sign == zero) + return 0; + else if (mag.getLength() == 1) { + // The single block might fit in an X. Try the conversion. + Blk b = mag.getBlock(0); + if (sign == positive) { + X x = X(b); + if (x >= 0 && Blk(x) == b) + return x; + } else { + X x = -X(b); + /* UX(...) needed to avoid rejecting conversion of + * -2^15 to a short. */ + if (x < 0 && Blk(UX(-x)) == b) + return x; + } + // Otherwise fall through. + } + throw "BigInteger::to: " + "Value is too big to fit in the requested type"; +} + +unsigned long BigInteger::toUnsignedLong () const { return convertToUnsignedPrimitive (); } +unsigned int BigInteger::toUnsignedInt () const { return convertToUnsignedPrimitive (); } +unsigned short BigInteger::toUnsignedShort() const { return convertToUnsignedPrimitive (); } +long BigInteger::toLong () const { return convertToSignedPrimitive (); } +int BigInteger::toInt () const { return convertToSignedPrimitive (); } +short BigInteger::toShort () const { return convertToSignedPrimitive (); } + +// COMPARISON +BigInteger::CmpRes BigInteger::compareTo(const BigInteger &x) const { + // A greater sign implies a greater number + if (sign < x.sign) + return less; + else if (sign > x.sign) + return greater; + else switch (sign) { + // If the signs are the same... + case zero: + return equal; // Two zeros are equal + case positive: + // Compare the magnitudes + return mag.compareTo(x.mag); + case negative: + // Compare the magnitudes, but return the opposite result + return CmpRes(-mag.compareTo(x.mag)); + default: + throw "BigInteger internal error"; + } +} + +/* COPY-LESS OPERATIONS + * These do some messing around to determine the sign of the result, + * then call one of BigUnsigned's copy-less operations. */ + +// See remarks about aliased calls in BigUnsigned.cc . +#define DTRT_ALIASED(cond, op) \ + if (cond) { \ + BigInteger tmpThis; \ + tmpThis.op; \ + *this = tmpThis; \ + return; \ + } + +void BigInteger::add(const BigInteger &a, const BigInteger &b) { + DTRT_ALIASED(this == &a || this == &b, add(a, b)); + // If one argument is zero, copy the other. + if (a.sign == zero) + operator =(b); + else if (b.sign == zero) + operator =(a); + // If the arguments have the same sign, take the + // common sign and add their magnitudes. + else if (a.sign == b.sign) { + sign = a.sign; + mag.add(a.mag, b.mag); + } else { + // Otherwise, their magnitudes must be compared. + switch (a.mag.compareTo(b.mag)) { + case equal: + // If their magnitudes are the same, copy zero. + mag = 0; + sign = zero; + break; + // Otherwise, take the sign of the greater, and subtract + // the lesser magnitude from the greater magnitude. + case greater: + sign = a.sign; + mag.subtract(a.mag, b.mag); + break; + case less: + sign = b.sign; + mag.subtract(b.mag, a.mag); + break; + } + } +} + +void BigInteger::subtract(const BigInteger &a, const BigInteger &b) { + // Notice that this routine is identical to BigInteger::add, + // if one replaces b.sign by its opposite. + DTRT_ALIASED(this == &a || this == &b, subtract(a, b)); + // If a is zero, copy b and flip its sign. If b is zero, copy a. + if (a.sign == zero) { + mag = b.mag; + // Take the negative of _b_'s, sign, not ours. + // Bug pointed out by Sam Larkin on 2005.03.30. + sign = Sign(-b.sign); + } else if (b.sign == zero) + operator =(a); + // If their signs differ, take a.sign and add the magnitudes. + else if (a.sign != b.sign) { + sign = a.sign; + mag.add(a.mag, b.mag); + } else { + // Otherwise, their magnitudes must be compared. + switch (a.mag.compareTo(b.mag)) { + // If their magnitudes are the same, copy zero. + case equal: + mag = 0; + sign = zero; + break; + // If a's magnitude is greater, take a.sign and + // subtract a from b. + case greater: + sign = a.sign; + mag.subtract(a.mag, b.mag); + break; + // If b's magnitude is greater, take the opposite + // of b.sign and subtract b from a. + case less: + sign = Sign(-b.sign); + mag.subtract(b.mag, a.mag); + break; + } + } +} + +void BigInteger::multiply(const BigInteger &a, const BigInteger &b) { + DTRT_ALIASED(this == &a || this == &b, multiply(a, b)); + // If one object is zero, copy zero and return. + if (a.sign == zero || b.sign == zero) { + sign = zero; + mag = 0; + return; + } + // If the signs of the arguments are the same, the result + // is positive, otherwise it is negative. + sign = (a.sign == b.sign) ? positive : negative; + // Multiply the magnitudes. + mag.multiply(a.mag, b.mag); +} + +/* + * DIVISION WITH REMAINDER + * Please read the comments before the definition of + * `BigUnsigned::divideWithRemainder' in `BigUnsigned.cc' for lots of + * information you should know before reading this function. + * + * Following Knuth, I decree that x / y is to be + * 0 if y==0 and floor(real-number x / y) if y!=0. + * Then x % y shall be x - y*(integer x / y). + * + * Note that x = y * (x / y) + (x % y) always holds. + * In addition, (x % y) is from 0 to y - 1 if y > 0, + * and from -(|y| - 1) to 0 if y < 0. (x % y) = x if y = 0. + * + * Examples: (q = a / b, r = a % b) + * a b q r + * === === === === + * 4 3 1 1 + * -4 3 -2 2 + * 4 -3 -2 -2 + * -4 -3 1 -1 + */ +void BigInteger::divideWithRemainder(const BigInteger &b, BigInteger &q) { + // Defend against aliased calls; + // same idea as in BigUnsigned::divideWithRemainder . + if (this == &q) + throw "BigInteger::divideWithRemainder: Cannot write quotient and remainder into the same variable"; + if (this == &b || &q == &b) { + BigInteger tmpB(b); + divideWithRemainder(tmpB, q); + return; + } + + // Division by zero gives quotient 0 and remainder *this + if (b.sign == zero) { + q.mag = 0; + q.sign = zero; + return; + } + // 0 / b gives quotient 0 and remainder 0 + if (sign == zero) { + q.mag = 0; + q.sign = zero; + return; + } + + // Here *this != 0, b != 0. + + // Do the operands have the same sign? + if (sign == b.sign) { + // Yes: easy case. Quotient is zero or positive. + q.sign = positive; + } else { + // No: harder case. Quotient is negative. + q.sign = negative; + // Decrease the magnitude of the dividend by one. + mag--; + /* + * We tinker with the dividend before and with the + * quotient and remainder after so that the result + * comes out right. To see why it works, consider the following + * list of examples, where A is the magnitude-decreased + * a, Q and R are the results of BigUnsigned division + * with remainder on A and |b|, and q and r are the + * final results we want: + * + * a A b Q R q r + * -3 -2 3 0 2 -1 0 + * -4 -3 3 1 0 -2 2 + * -5 -4 3 1 1 -2 1 + * -6 -5 3 1 2 -2 0 + * + * It appears that we need a total of 3 corrections: + * Decrease the magnitude of a to get A. Increase the + * magnitude of Q to get q (and make it negative). + * Find r = (b - 1) - R and give it the desired sign. + */ + } + + // Divide the magnitudes. + mag.divideWithRemainder(b.mag, q.mag); + + if (sign != b.sign) { + // More for the harder case (as described): + // Increase the magnitude of the quotient by one. + q.mag++; + // Modify the remainder. + mag.subtract(b.mag, mag); + mag--; + } + + // Sign of the remainder is always the sign of the divisor b. + sign = b.sign; + + // Set signs to zero as necessary. (Thanks David Allen!) + if (mag.isZero()) + sign = zero; + if (q.mag.isZero()) + q.sign = zero; + + // WHEW!!! +} + +// Negation +void BigInteger::negate(const BigInteger &a) { + DTRT_ALIASED(this == &a, negate(a)); + // Copy a's magnitude + mag = a.mag; + // Copy the opposite of a.sign + sign = Sign(-a.sign); +} + +// INCREMENT/DECREMENT OPERATORS + +// Prefix increment +void BigInteger::operator ++() { + if (sign == negative) { + mag--; + if (mag == 0) + sign = zero; + } else { + mag++; + sign = positive; // if not already + } +} + +// Postfix increment: same as prefix +void BigInteger::operator ++(int) { + operator ++(); +} + +// Prefix decrement +void BigInteger::operator --() { + if (sign == positive) { + mag--; + if (mag == 0) + sign = zero; + } else { + mag++; + sign = negative; + } +} + +// Postfix decrement: same as prefix +void BigInteger::operator --(int) { + operator --(); +} + diff --git a/OTLib/bigint/BigInteger.hh b/OTLib/bigint/BigInteger.hh new file mode 100755 index 000000000..81ff2df0f --- /dev/null +++ b/OTLib/bigint/BigInteger.hh @@ -0,0 +1,231 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef BIGINTEGER_H +#define BIGINTEGER_H + +#include "BigUnsigned.hh" + +/* A BigInteger object represents a signed integer of size limited only by + * available memory. BigUnsigneds support most mathematical operators and can + * be converted to and from most primitive integer types. + * + * A BigInteger is just an aggregate of a BigUnsigned and a sign. (It is no + * longer derived from BigUnsigned because that led to harmful implicit + * conversions.) */ +class BigInteger { + +public: + typedef BigUnsigned::Blk Blk; + typedef BigUnsigned::Index Index; + typedef BigUnsigned::CmpRes CmpRes; + static const CmpRes + less = BigUnsigned::less , + equal = BigUnsigned::equal , + greater = BigUnsigned::greater; + // Enumeration for the sign of a BigInteger. + enum Sign { negative = -1, zero = 0, positive = 1 }; + +protected: + Sign sign; + BigUnsigned mag; + +public: + // Constructs zero. + BigInteger() : sign(zero), mag() {} + + // Copy constructor + BigInteger(const BigInteger &x) : sign(x.sign), mag(x.mag) {}; + + // Assignment operator + void operator=(const BigInteger &x); + + // Constructor that copies from a given array of blocks with a sign. + BigInteger(const Blk *b, Index blen, Sign s); + + // Nonnegative constructor that copies from a given array of blocks. + BigInteger(const Blk *b, Index blen) : mag(b, blen) { + sign = mag.isZero() ? zero : positive; + } + + // Constructor from a BigUnsigned and a sign + BigInteger(const BigUnsigned &x, Sign s); + + // Nonnegative constructor from a BigUnsigned + BigInteger(const BigUnsigned &x) : mag(x) { + sign = mag.isZero() ? zero : positive; + } + + // Constructors from primitive integer types + BigInteger(unsigned long x); + BigInteger( long x); + BigInteger(unsigned int x); + BigInteger( int x); + BigInteger(unsigned short x); + BigInteger( short x); + + /* Converters to primitive integer types + * The implicit conversion operators caused trouble, so these are now + * named. */ + unsigned long toUnsignedLong () const; + long toLong () const; + unsigned int toUnsignedInt () const; + int toInt () const; + unsigned short toUnsignedShort() const; + short toShort () const; +protected: + // Helper + template X convertToUnsignedPrimitive() const; + template X convertToSignedPrimitive() const; +public: + + // ACCESSORS + Sign getSign() const { return sign; } + /* The client can't do any harm by holding a read-only reference to the + * magnitude. */ + const BigUnsigned &getMagnitude() const { return mag; } + + // Some accessors that go through to the magnitude + Index getLength() const { return mag.getLength(); } + Index getCapacity() const { return mag.getCapacity(); } + Blk getBlock(Index i) const { return mag.getBlock(i); } + bool isZero() const { return sign == zero; } // A bit special + + // COMPARISONS + + // Compares this to x like Perl's <=> + CmpRes compareTo(const BigInteger &x) const; + + // Ordinary comparison operators + bool operator ==(const BigInteger &x) const { + return sign == x.sign && mag == x.mag; + } + bool operator !=(const BigInteger &x) const { return !operator ==(x); }; + bool operator < (const BigInteger &x) const { return compareTo(x) == less ; } + bool operator <=(const BigInteger &x) const { return compareTo(x) != greater; } + bool operator >=(const BigInteger &x) const { return compareTo(x) != less ; } + bool operator > (const BigInteger &x) const { return compareTo(x) == greater; } + + // OPERATORS -- See the discussion in BigUnsigned.hh. + void add (const BigInteger &a, const BigInteger &b); + void subtract(const BigInteger &a, const BigInteger &b); + void multiply(const BigInteger &a, const BigInteger &b); + /* See the comment on BigUnsigned::divideWithRemainder. Semantics + * differ from those of primitive integers when negatives and/or zeros + * are involved. */ + void divideWithRemainder(const BigInteger &b, BigInteger &q); + void negate(const BigInteger &a); + + /* Bitwise operators are not provided for BigIntegers. Use + * getMagnitude to get the magnitude and operate on that instead. */ + + BigInteger operator +(const BigInteger &x) const; + BigInteger operator -(const BigInteger &x) const; + BigInteger operator *(const BigInteger &x) const; + BigInteger operator /(const BigInteger &x) const; + BigInteger operator %(const BigInteger &x) const; + BigInteger operator -() const; + + void operator +=(const BigInteger &x); + void operator -=(const BigInteger &x); + void operator *=(const BigInteger &x); + void operator /=(const BigInteger &x); + void operator %=(const BigInteger &x); + void flipSign(); + + // INCREMENT/DECREMENT OPERATORS + void operator ++( ); + void operator ++(int); + void operator --( ); + void operator --(int); +}; + +// NORMAL OPERATORS +/* These create an object to hold the result and invoke + * the appropriate put-here operation on it, passing + * this and x. The new object is then returned. */ +inline BigInteger BigInteger::operator +(const BigInteger &x) const { + BigInteger ans; + ans.add(*this, x); + return ans; +} +inline BigInteger BigInteger::operator -(const BigInteger &x) const { + BigInteger ans; + ans.subtract(*this, x); + return ans; +} +inline BigInteger BigInteger::operator *(const BigInteger &x) const { + BigInteger ans; + ans.multiply(*this, x); + return ans; +} +inline BigInteger BigInteger::operator /(const BigInteger &x) const { + if (x.isZero()) throw "BigInteger::operator /: division by zero"; + BigInteger q, r; + r = *this; + r.divideWithRemainder(x, q); + return q; +} +inline BigInteger BigInteger::operator %(const BigInteger &x) const { + if (x.isZero()) throw "BigInteger::operator %: division by zero"; + BigInteger q, r; + r = *this; + r.divideWithRemainder(x, q); + return r; +} +inline BigInteger BigInteger::operator -() const { + BigInteger ans; + ans.negate(*this); + return ans; +} + +/* + * ASSIGNMENT OPERATORS + * + * Now the responsibility for making a temporary copy if necessary + * belongs to the put-here operations. See Assignment Operators in + * BigUnsigned.hh. + */ +inline void BigInteger::operator +=(const BigInteger &x) { + add(*this, x); +} +inline void BigInteger::operator -=(const BigInteger &x) { + subtract(*this, x); +} +inline void BigInteger::operator *=(const BigInteger &x) { + multiply(*this, x); +} +inline void BigInteger::operator /=(const BigInteger &x) { + if (x.isZero()) throw "BigInteger::operator /=: division by zero"; + /* The following technique is slightly faster than copying *this first + * when x is large. */ + BigInteger q; + divideWithRemainder(x, q); + // *this contains the remainder, but we overwrite it with the quotient. + *this = q; +} +inline void BigInteger::operator %=(const BigInteger &x) { + if (x.isZero()) throw "BigInteger::operator %=: division by zero"; + BigInteger q; + // Mods *this by x. Don't care about quotient left in q. + divideWithRemainder(x, q); +} +// This one is trivial +inline void BigInteger::flipSign() { + sign = Sign(-sign); +} + +#endif diff --git a/OTLib/bigint/BigIntegerAlgorithms.cc b/OTLib/bigint/BigIntegerAlgorithms.cc new file mode 100755 index 000000000..5f6e84b2c --- /dev/null +++ b/OTLib/bigint/BigIntegerAlgorithms.cc @@ -0,0 +1,86 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#include "BigIntegerAlgorithms.hh" + +BigUnsigned gcd(BigUnsigned a, BigUnsigned b) { + BigUnsigned trash; + // Neat in-place alternating technique. + for (;;) { + if (b.isZero()) + return a; + a.divideWithRemainder(b, trash); + if (a.isZero()) + return b; + b.divideWithRemainder(a, trash); + } +} + +void extendedEuclidean(BigInteger m, BigInteger n, + BigInteger &g, BigInteger &r, BigInteger &s) { + if (&g == &r || &g == &s || &r == &s) + throw "BigInteger extendedEuclidean: Outputs are aliased"; + BigInteger r1(1), s1(0), r2(0), s2(1), q; + /* Invariants: + * r1*m(orig) + s1*n(orig) == m(current) + * r2*m(orig) + s2*n(orig) == n(current) */ + for (;;) { + if (n.isZero()) { + r = r1; s = s1; g = m; + return; + } + // Subtract q times the second invariant from the first invariant. + m.divideWithRemainder(n, q); + r1 -= q*r2; s1 -= q*s2; + + if (m.isZero()) { + r = r2; s = s2; g = n; + return; + } + // Subtract q times the first invariant from the second invariant. + n.divideWithRemainder(m, q); + r2 -= q*r1; s2 -= q*s1; + } +} + +BigUnsigned modinv(const BigInteger &x, const BigUnsigned &n) { + BigInteger g, r, s; + extendedEuclidean(x, n, g, r, s); + if (g == 1) + // r*x + s*n == 1, so r*x === 1 (mod n), so r is the answer. + return (r % n).getMagnitude(); // (r % n) will be nonnegative + else + throw "BigInteger modinv: x and n have a common factor"; +} + +BigUnsigned modexp(const BigInteger &base, const BigUnsigned &exponent, + const BigUnsigned &modulus) { + BigUnsigned ans = 1, base2 = (base % modulus).getMagnitude(); + BigUnsigned::Index i = exponent.bitLength(); + // For each bit of the exponent, most to least significant... + while (i > 0) { + i--; + // Square. + ans *= ans; + ans %= modulus; + // And multiply if the bit is a 1. + if (exponent.getBit(i)) { + ans *= base2; + ans %= modulus; + } + } + return ans; +} diff --git a/OTLib/bigint/BigIntegerAlgorithms.hh b/OTLib/bigint/BigIntegerAlgorithms.hh new file mode 100755 index 000000000..5689cf9c3 --- /dev/null +++ b/OTLib/bigint/BigIntegerAlgorithms.hh @@ -0,0 +1,41 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef BIGINTEGERALGORITHMS_H +#define BIGINTEGERALGORITHMS_H + +#include "BigInteger.hh" + +/* Some mathematical algorithms for big integers. + * This code is new and, as such, experimental. */ + +// Returns the greatest common divisor of a and b. +BigUnsigned gcd(BigUnsigned a, BigUnsigned b); + +/* Extended Euclidean algorithm. + * Given m and n, finds gcd g and numbers r, s such that r*m + s*n == g. */ +void extendedEuclidean(BigInteger m, BigInteger n, + BigInteger &g, BigInteger &r, BigInteger &s); + +/* Returns the multiplicative inverse of x modulo n, or throws an exception if + * they have a common factor. */ +BigUnsigned modinv(const BigInteger &x, const BigUnsigned &n); + +// Returns (base ^ exponent) % modulus. +BigUnsigned modexp(const BigInteger &base, const BigUnsigned &exponent, + const BigUnsigned &modulus); + +#endif diff --git a/OTLib/bigint/BigIntegerLibrary.hh b/OTLib/bigint/BigIntegerLibrary.hh new file mode 100755 index 000000000..2d2cfb077 --- /dev/null +++ b/OTLib/bigint/BigIntegerLibrary.hh @@ -0,0 +1,24 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +// This header file includes all of the library header files. + +#include "NumberlikeArray.hh" +#include "BigUnsigned.hh" +#include "BigInteger.hh" +#include "BigIntegerAlgorithms.hh" +#include "BigUnsignedInABase.hh" +#include "BigIntegerUtils.hh" diff --git a/OTLib/bigint/BigIntegerUtils.cc b/OTLib/bigint/BigIntegerUtils.cc new file mode 100644 index 000000000..77f9ef61d --- /dev/null +++ b/OTLib/bigint/BigIntegerUtils.cc @@ -0,0 +1,130 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#include "BigIntegerUtils.hh" +#include "BigUnsignedInABase.hh" + +// --------------------------------- + + +std::string bigUnsignedToString(const BigUnsigned &x) { + return std::string(BigUnsignedInABase(x, 10)); +} + +BigUnsigned stringToBigUnsigned(const std::string &s) { + return BigUnsigned(BigUnsignedInABase(s, 10)); +} + +// --------------------------------- + + +std::string bigUnsignedToStringBase62(const BigUnsigned &x) { + return std::string(BigUnsignedInABase(x, 62)); +} + +BigUnsigned stringToBigUnsignedBase62(const std::string &s) { + return BigUnsigned(BigUnsignedInABase(s, 62)); +} + +// --------------------------------- + + +std::string bigUnsignedToStringBase16(const BigUnsigned &x) { + return std::string(BigUnsignedInABase(x, 16)); +} + +BigUnsigned stringToBigUnsignedBase16(const std::string &s) { + return BigUnsigned(BigUnsignedInABase(s, 16)); +} + + +// --------------------------------- + +std::string bigIntegerToString(const BigInteger &x) { + return (x.getSign() == BigInteger::negative) + ? (std::string("-") + bigUnsignedToString(x.getMagnitude())) + : (bigUnsignedToString(x.getMagnitude())); +} + +BigInteger stringToBigInteger(const std::string &s) { + // Recognize a sign followed by a BigUnsigned. + return (s[0] == '-') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1)), BigInteger::negative) + : (s[0] == '+') ? BigInteger(stringToBigUnsigned(s.substr(1, s.length() - 1))) + : BigInteger(stringToBigUnsigned(s)); +} + + +// --------------------------------- + +std::string bigIntegerToStringBase62(const BigInteger &x) { + return (x.getSign() == BigInteger::negative) + ? (std::string("-") + bigUnsignedToStringBase62(x.getMagnitude())) + : (bigUnsignedToStringBase62(x.getMagnitude())); +} + +BigInteger stringToBigIntegerBase62(const std::string &s) { + // Recognize a sign followed by a BigUnsigned. + return (s[0] == '-') ? BigInteger(stringToBigUnsignedBase62(s.substr(1, s.length() - 1)), BigInteger::negative) + : (s[0] == '+') ? BigInteger(stringToBigUnsignedBase62(s.substr(1, s.length() - 1))) + : BigInteger(stringToBigUnsignedBase62(s)); +} + + +// --------------------------------- + +std::string bigIntegerToStringBase16(const BigInteger &x) { + return (x.getSign() == BigInteger::negative) + ? (std::string("-") + bigUnsignedToStringBase16(x.getMagnitude())) + : (bigUnsignedToStringBase16(x.getMagnitude())); +} + +BigInteger stringToBigIntegerBase16(const std::string &s) { + // Recognize a sign followed by a BigUnsigned. + return (s[0] == '-') ? BigInteger(stringToBigUnsignedBase16(s.substr(1, s.length() - 1)), BigInteger::negative) + : (s[0] == '+') ? BigInteger(stringToBigUnsignedBase16(s.substr(1, s.length() - 1))) + : BigInteger(stringToBigUnsignedBase16(s)); +} + + +// --------------------------------- + + +std::ostream &operator <<(std::ostream &os, const BigUnsigned &x) { + BigUnsignedInABase::Base base; + long osFlags = os.flags(); + if (osFlags & os.dec) + base = 10; + else if (osFlags & os.hex) { + base = 16; + if (osFlags & os.showbase) + os << "0x"; + } else if (osFlags & os.oct) { + base = 8; + if (osFlags & os.showbase) + os << '0'; + } else + throw "std::ostream << BigUnsigned: Could not determine the desired base from output-stream flags"; + std::string s = std::string(BigUnsignedInABase(x, base)); + os << s; + return os; +} + +std::ostream &operator <<(std::ostream &os, const BigInteger &x) { + if (x.getSign() == BigInteger::negative) + os << '-'; + os << x.getMagnitude(); + return os; +} diff --git a/OTLib/bigint/BigIntegerUtils.hh b/OTLib/bigint/BigIntegerUtils.hh new file mode 100644 index 000000000..82f7feaff --- /dev/null +++ b/OTLib/bigint/BigIntegerUtils.hh @@ -0,0 +1,102 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef BIGINTEGERUTILS_H +#define BIGINTEGERUTILS_H + +#include "BigInteger.hh" +#include +#include + +/* This file provides: + * - Convenient std::string <-> BigUnsigned/BigInteger conversion routines + * - std::ostream << operators for BigUnsigned/BigInteger */ + +std::string bigUnsignedToString(const BigUnsigned &x); +BigUnsigned stringToBigUnsigned(const std::string &s); + +std::string bigUnsignedToStringBase62(const BigUnsigned &x); +BigUnsigned stringToBigUnsignedBase62(const std::string &s); + +std::string bigUnsignedToStringBase16(const BigUnsigned &x); +BigUnsigned stringToBigUnsignedBase16(const std::string &s); + + +// std::string conversion routines. Base 10. +std::string bigIntegerToString(const BigInteger &x); +BigInteger stringToBigInteger(const std::string &s); + +std::string bigIntegerToStringBase62(const BigInteger &x); +BigInteger stringToBigIntegerBase62(const std::string &s); + +std::string bigIntegerToStringBase16(const BigInteger &x); +BigInteger stringToBigIntegerBase16(const std::string &s); + +// Creates a BigInteger from data such as `char's; read below for details. +template +BigInteger dataToBigInteger(const T* data, BigInteger::Index length, BigInteger::Sign sign); + +// Outputs x to os, obeying the flags `dec', `hex', `bin', and `showbase'. +std::ostream &operator <<(std::ostream &os, const BigUnsigned &x); + +// Outputs x to os, obeying the flags `dec', `hex', `bin', and `showbase'. +// My somewhat arbitrary policy: a negative sign comes before a base indicator (like -0xFF). +std::ostream &operator <<(std::ostream &os, const BigInteger &x); + +// BEGIN TEMPLATE DEFINITIONS. + +/* + * Converts binary data to a BigInteger. + * Pass an array `data', its length, and the desired sign. + * + * Elements of `data' may be of any type `T' that has the following + * two properties (this includes almost all integral types): + * + * (1) `sizeof(T)' correctly gives the amount of binary data in one + * value of `T' and is a factor of `sizeof(Blk)'. + * + * (2) When a value of `T' is casted to a `Blk', the low bytes of + * the result contain the desired binary data. + */ +template +BigInteger dataToBigInteger(const T* data, BigInteger::Index length, BigInteger::Sign sign) { + // really ceiling(numBytes / sizeof(BigInteger::Blk)) + unsigned int pieceSizeInBits = 8 * sizeof(T); + unsigned int piecesPerBlock = sizeof(BigInteger::Blk) / sizeof(T); + unsigned int numBlocks = (length + piecesPerBlock - 1) / piecesPerBlock; + + // Allocate our block array + BigInteger::Blk *blocks = new BigInteger::Blk[numBlocks]; + + BigInteger::Index blockNum, pieceNum, pieceNumHere; + + // Convert + for (blockNum = 0, pieceNum = 0; blockNum < numBlocks; blockNum++) { + BigInteger::Blk curBlock = 0; + for (pieceNumHere = 0; pieceNumHere < piecesPerBlock && pieceNum < length; + pieceNumHere++, pieceNum++) + curBlock |= (BigInteger::Blk(data[pieceNum]) << (pieceSizeInBits * pieceNumHere)); + blocks[blockNum] = curBlock; + } + + // Create the BigInteger. + BigInteger x(blocks, numBlocks, sign); + + delete [] blocks; + return x; +} + +#endif diff --git a/OTLib/bigint/BigUnsigned.cc b/OTLib/bigint/BigUnsigned.cc new file mode 100755 index 000000000..db701dd4d --- /dev/null +++ b/OTLib/bigint/BigUnsigned.cc @@ -0,0 +1,713 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#include "BigUnsigned.hh" + +// Memory management definitions have moved to the bottom of NumberlikeArray.hh. + +// The templates used by these constructors and converters are at the bottom of +// BigUnsigned.hh. + +BigUnsigned::BigUnsigned(unsigned long x) { initFromPrimitive (x); } +BigUnsigned::BigUnsigned(unsigned int x) { initFromPrimitive (x); } +BigUnsigned::BigUnsigned(unsigned short x) { initFromPrimitive (x); } +BigUnsigned::BigUnsigned( long x) { initFromSignedPrimitive(x); } +BigUnsigned::BigUnsigned( int x) { initFromSignedPrimitive(x); } +BigUnsigned::BigUnsigned( short x) { initFromSignedPrimitive(x); } + +unsigned long BigUnsigned::toUnsignedLong () const { return convertToPrimitive (); } +unsigned int BigUnsigned::toUnsignedInt () const { return convertToPrimitive (); } +unsigned short BigUnsigned::toUnsignedShort() const { return convertToPrimitive (); } +long BigUnsigned::toLong () const { return convertToSignedPrimitive< long >(); } +int BigUnsigned::toInt () const { return convertToSignedPrimitive< int >(); } +short BigUnsigned::toShort () const { return convertToSignedPrimitive< short>(); } + +// BIT/BLOCK ACCESSORS + +void BigUnsigned::setBlock(Index i, Blk newBlock) { + if (newBlock == 0) { + if (i < len) { + blk[i] = 0; + zapLeadingZeros(); + } + // If i >= len, no effect. + } else { + if (i >= len) { + // The nonzero block extends the number. + allocateAndCopy(i+1); + // Zero any added blocks that we aren't setting. + for (Index j = len; j < i; j++) + blk[j] = 0; + len = i+1; + } + blk[i] = newBlock; + } +} + +/* Evidently the compiler wants BigUnsigned:: on the return type because, at + * that point, it hasn't yet parsed the BigUnsigned:: on the name to get the + * proper scope. */ +BigUnsigned::Index BigUnsigned::bitLength() const { + if (isZero()) + return 0; + else { + Blk leftmostBlock = getBlock(len - 1); + Index leftmostBlockLen = 0; + while (leftmostBlock != 0) { + leftmostBlock >>= 1; + leftmostBlockLen++; + } + return leftmostBlockLen + (len - 1) * N; + } +} + +void BigUnsigned::setBit(Index bi, bool newBit) { + Index blockI = bi / N; + Blk block = getBlock(blockI), mask = Blk(1) << (bi % N); + block = newBit ? (block | mask) : (block & ~mask); + setBlock(blockI, block); +} + +// COMPARISON +BigUnsigned::CmpRes BigUnsigned::compareTo(const BigUnsigned &x) const { + // A bigger length implies a bigger number. + if (len < x.len) + return less; + else if (len > x.len) + return greater; + else { + // Compare blocks one by one from left to right. + Index i = len; + while (i > 0) { + i--; + if (blk[i] == x.blk[i]) + continue; + else if (blk[i] > x.blk[i]) + return greater; + else + return less; + } + // If no blocks differed, the numbers are equal. + return equal; + } +} + +// COPY-LESS OPERATIONS + +/* + * On most calls to copy-less operations, it's safe to read the inputs little by + * little and write the outputs little by little. However, if one of the + * inputs is coming from the same variable into which the output is to be + * stored (an "aliased" call), we risk overwriting the input before we read it. + * In this case, we first compute the result into a temporary BigUnsigned + * variable and then copy it into the requested output variable *this. + * Each put-here operation uses the DTRT_ALIASED macro (Do The Right Thing on + * aliased calls) to generate code for this check. + * + * I adopted this approach on 2007.02.13 (see Assignment Operators in + * BigUnsigned.hh). Before then, put-here operations rejected aliased calls + * with an exception. I think doing the right thing is better. + * + * Some of the put-here operations can probably handle aliased calls safely + * without the extra copy because (for example) they process blocks strictly + * right-to-left. At some point I might determine which ones don't need the + * copy, but my reasoning would need to be verified very carefully. For now + * I'll leave in the copy. + */ +#define DTRT_ALIASED(cond, op) \ + if (cond) { \ + BigUnsigned tmpThis; \ + tmpThis.op; \ + *this = tmpThis; \ + return; \ + } + + + +void BigUnsigned::add(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, add(a, b)); + // If one argument is zero, copy the other. + if (a.len == 0) { + operator =(b); + return; + } else if (b.len == 0) { + operator =(a); + return; + } + // Some variables... + // Carries in and out of an addition stage + bool carryIn, carryOut; + Blk temp; + Index i; + // a2 points to the longer input, b2 points to the shorter + const BigUnsigned *a2, *b2; + if (a.len >= b.len) { + a2 = &a; + b2 = &b; + } else { + a2 = &b; + b2 = &a; + } + // Set prelimiary length and make room in this BigUnsigned + len = a2->len + 1; + allocate(len); + // For each block index that is present in both inputs... + for (i = 0, carryIn = false; i < b2->len; i++) { + // Add input blocks + temp = a2->blk[i] + b2->blk[i]; + // If a rollover occurred, the result is less than either input. + // This test is used many times in the BigUnsigned code. + carryOut = (temp < a2->blk[i]); + // If a carry was input, handle it + if (carryIn) { + temp++; + carryOut |= (temp == 0); + } + blk[i] = temp; // Save the addition result + carryIn = carryOut; // Pass the carry along + } + // If there is a carry left over, increase blocks until + // one does not roll over. + for (; i < a2->len && carryIn; i++) { + temp = a2->blk[i] + 1; + carryIn = (temp == 0); + blk[i] = temp; + } + // If the carry was resolved but the larger number + // still has blocks, copy them over. + for (; i < a2->len; i++) + blk[i] = a2->blk[i]; + // Set the extra block if there's still a carry, decrease length otherwise + if (carryIn) + blk[i] = 1; + else + len--; +} + +void BigUnsigned::subtract(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, subtract(a, b)); + if (b.len == 0) { + // If b is zero, copy a. + operator =(a); + return; + } else if (a.len < b.len) + // If a is shorter than b, the result is negative. + throw "BigUnsigned::subtract: " + "Negative result in unsigned calculation"; + // Some variables... + bool borrowIn, borrowOut; + Blk temp; + Index i; + // Set preliminary length and make room + len = a.len; + allocate(len); + // For each block index that is present in both inputs... + for (i = 0, borrowIn = false; i < b.len; i++) { + temp = a.blk[i] - b.blk[i]; + // If a reverse rollover occurred, + // the result is greater than the block from a. + borrowOut = (temp > a.blk[i]); + // Handle an incoming borrow + if (borrowIn) { + borrowOut |= (temp == 0); + temp--; + } + blk[i] = temp; // Save the subtraction result + borrowIn = borrowOut; // Pass the borrow along + } + // If there is a borrow left over, decrease blocks until + // one does not reverse rollover. + for (; i < a.len && borrowIn; i++) { + borrowIn = (a.blk[i] == 0); + blk[i] = a.blk[i] - 1; + } + /* If there's still a borrow, the result is negative. + * Throw an exception, but zero out this object so as to leave it in a + * predictable state. */ + if (borrowIn) { + len = 0; + throw "BigUnsigned::subtract: Negative result in unsigned calculation"; + } else + // Copy over the rest of the blocks + for (; i < a.len; i++) + blk[i] = a.blk[i]; + // Zap leading zeros + zapLeadingZeros(); +} + +/* + * About the multiplication and division algorithms: + * + * I searched unsucessfully for fast C++ built-in operations like the `b_0' + * and `c_0' Knuth describes in Section 4.3.1 of ``The Art of Computer + * Programming'' (replace `place' by `Blk'): + * + * ``b_0[:] multiplication of a one-place integer by another one-place + * integer, giving a two-place answer; + * + * ``c_0[:] division of a two-place integer by a one-place integer, + * provided that the quotient is a one-place integer, and yielding + * also a one-place remainder.'' + * + * I also missed his note that ``[b]y adjusting the word size, if + * necessary, nearly all computers will have these three operations + * available'', so I gave up on trying to use algorithms similar to his. + * A future version of the library might include such algorithms; I + * would welcome contributions from others for this. + * + * I eventually decided to use bit-shifting algorithms. To multiply `a' + * and `b', we zero out the result. Then, for each `1' bit in `a', we + * shift `b' left the appropriate amount and add it to the result. + * Similarly, to divide `a' by `b', we shift `b' left varying amounts, + * repeatedly trying to subtract it from `a'. When we succeed, we note + * the fact by setting a bit in the quotient. While these algorithms + * have the same O(n^2) time complexity as Knuth's, the ``constant factor'' + * is likely to be larger. + * + * Because I used these algorithms, which require single-block addition + * and subtraction rather than single-block multiplication and division, + * the innermost loops of all four routines are very similar. Study one + * of them and all will become clear. + */ + +/* + * This is a little inline function used by both the multiplication + * routine and the division routine. + * + * `getShiftedBlock' returns the `x'th block of `num << y'. + * `y' may be anything from 0 to N - 1, and `x' may be anything from + * 0 to `num.len'. + * + * Two things contribute to this block: + * + * (1) The `N - y' low bits of `num.blk[x]', shifted `y' bits left. + * + * (2) The `y' high bits of `num.blk[x-1]', shifted `N - y' bits right. + * + * But we must be careful if `x == 0' or `x == num.len', in + * which case we should use 0 instead of (2) or (1), respectively. + * + * If `y == 0', then (2) contributes 0, as it should. However, + * in some computer environments, for a reason I cannot understand, + * `a >> b' means `a >> (b % N)'. This means `num.blk[x-1] >> (N - y)' + * will return `num.blk[x-1]' instead of the desired 0 when `y == 0'; + * the test `y == 0' handles this case specially. + */ +inline BigUnsigned::Blk getShiftedBlock(const BigUnsigned &num, + BigUnsigned::Index x, unsigned int y) { + BigUnsigned::Blk part1 = (x == 0 || y == 0) ? 0 : (num.blk[x - 1] >> (BigUnsigned::N - y)); + BigUnsigned::Blk part2 = (x == num.len) ? 0 : (num.blk[x] << y); + return part1 | part2; +} + +void BigUnsigned::multiply(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, multiply(a, b)); + // If either a or b is zero, set to zero. + if (a.len == 0 || b.len == 0) { + len = 0; + return; + } + /* + * Overall method: + * + * Set this = 0. + * For each 1-bit of `a' (say the `i2'th bit of block `i'): + * Add `b << (i blocks and i2 bits)' to *this. + */ + // Variables for the calculation + Index i, j, k; + unsigned int i2; + Blk temp; + bool carryIn, carryOut; + // Set preliminary length and make room + len = a.len + b.len; + allocate(len); + // Zero out this object + for (i = 0; i < len; i++) + blk[i] = 0; + // For each block of the first number... + for (i = 0; i < a.len; i++) { + // For each 1-bit of that block... + for (i2 = 0; i2 < N; i2++) { + if ((a.blk[i] & (Blk(1) << i2)) == 0) + continue; + /* + * Add b to this, shifted left i blocks and i2 bits. + * j is the index in b, and k = i + j is the index in this. + * + * `getShiftedBlock', a short inline function defined above, + * is now used for the bit handling. It replaces the more + * complex `bHigh' code, in which each run of the loop dealt + * immediately with the low bits and saved the high bits to + * be picked up next time. The last run of the loop used to + * leave leftover high bits, which were handled separately. + * Instead, this loop runs an additional time with j == b.len. + * These changes were made on 2005.01.11. + */ + for (j = 0, k = i, carryIn = false; j <= b.len; j++, k++) { + /* + * The body of this loop is very similar to the body of the first loop + * in `add', except that this loop does a `+=' instead of a `+'. + */ + temp = blk[k] + getShiftedBlock(b, j, i2); + carryOut = (temp < blk[k]); + if (carryIn) { + temp++; + carryOut |= (temp == 0); + } + blk[k] = temp; + carryIn = carryOut; + } + // No more extra iteration to deal with `bHigh'. + // Roll-over a carry as necessary. + for (; carryIn; k++) { + blk[k]++; + carryIn = (blk[k] == 0); + } + } + } + // Zap possible leading zero + if (blk[len - 1] == 0) + len--; +} + +/* + * DIVISION WITH REMAINDER + * This monstrous function mods *this by the given divisor b while storing the + * quotient in the given object q; at the end, *this contains the remainder. + * The seemingly bizarre pattern of inputs and outputs was chosen so that the + * function copies as little as possible (since it is implemented by repeated + * subtraction of multiples of b from *this). + * + * "modWithQuotient" might be a better name for this function, but I would + * rather not change the name now. + */ +void BigUnsigned::divideWithRemainder(const BigUnsigned &b, BigUnsigned &q) { + /* Defending against aliased calls is more complex than usual because we + * are writing to both *this and q. + * + * It would be silly to try to write quotient and remainder to the + * same variable. Rule that out right away. */ + if (this == &q) + throw "BigUnsigned::divideWithRemainder: Cannot write quotient and remainder into the same variable"; + /* Now *this and q are separate, so the only concern is that b might be + * aliased to one of them. If so, use a temporary copy of b. */ + if (this == &b || &q == &b) { + BigUnsigned tmpB(b); + divideWithRemainder(tmpB, q); + return; + } + + /* + * Knuth's definition of mod (which this function uses) is somewhat + * different from the C++ definition of % in case of division by 0. + * + * We let a / 0 == 0 (it doesn't matter much) and a % 0 == a, no + * exceptions thrown. This allows us to preserve both Knuth's demand + * that a mod 0 == a and the useful property that + * (a / b) * b + (a % b) == a. + */ + if (b.len == 0) { + q.len = 0; + return; + } + + /* + * If *this.len < b.len, then *this < b, and we can be sure that b doesn't go into + * *this at all. The quotient is 0 and *this is already the remainder (so leave it alone). + */ + if (len < b.len) { + q.len = 0; + return; + } + + // At this point we know (*this).len >= b.len > 0. (Whew!) + + /* + * Overall method: + * + * For each appropriate i and i2, decreasing: + * Subtract (b << (i blocks and i2 bits)) from *this, storing the + * result in subtractBuf. + * If the subtraction succeeds with a nonnegative result: + * Turn on bit i2 of block i of the quotient q. + * Copy subtractBuf back into *this. + * Otherwise bit i2 of block i remains off, and *this is unchanged. + * + * Eventually q will contain the entire quotient, and *this will + * be left with the remainder. + * + * subtractBuf[x] corresponds to blk[x], not blk[x+i], since 2005.01.11. + * But on a single iteration, we don't touch the i lowest blocks of blk + * (and don't use those of subtractBuf) because these blocks are + * unaffected by the subtraction: we are subtracting + * (b << (i blocks and i2 bits)), which ends in at least `i' zero + * blocks. */ + // Variables for the calculation + Index i, j, k; + unsigned int i2; + Blk temp; + bool borrowIn, borrowOut; + + /* + * Make sure we have an extra zero block just past the value. + * + * When we attempt a subtraction, we might shift `b' so + * its first block begins a few bits left of the dividend, + * and then we'll try to compare these extra bits with + * a nonexistent block to the left of the dividend. The + * extra zero block ensures sensible behavior; we need + * an extra block in `subtractBuf' for exactly the same reason. + */ + Index origLen = len; // Save real length. + /* To avoid an out-of-bounds access in case of reallocation, allocate + * first and then increment the logical length. */ + allocateAndCopy(len + 1); + len++; + blk[origLen] = 0; // Zero the added block. + + // subtractBuf holds part of the result of a subtraction; see above. + Blk *subtractBuf = new Blk[len]; + + // Set preliminary length for quotient and make room + q.len = origLen - b.len + 1; + q.allocate(q.len); + // Zero out the quotient + for (i = 0; i < q.len; i++) + q.blk[i] = 0; + + // For each possible left-shift of b in blocks... + i = q.len; + while (i > 0) { + i--; + // For each possible left-shift of b in bits... + // (Remember, N is the number of bits in a Blk.) + q.blk[i] = 0; + i2 = N; + while (i2 > 0) { + i2--; + /* + * Subtract b, shifted left i blocks and i2 bits, from *this, + * and store the answer in subtractBuf. In the for loop, `k == i + j'. + * + * Compare this to the middle section of `multiply'. They + * are in many ways analogous. See especially the discussion + * of `getShiftedBlock'. + */ + for (j = 0, k = i, borrowIn = false; j <= b.len; j++, k++) { + temp = blk[k] - getShiftedBlock(b, j, i2); + borrowOut = (temp > blk[k]); + if (borrowIn) { + borrowOut |= (temp == 0); + temp--; + } + // Since 2005.01.11, indices of `subtractBuf' directly match those of `blk', so use `k'. + subtractBuf[k] = temp; + borrowIn = borrowOut; + } + // No more extra iteration to deal with `bHigh'. + // Roll-over a borrow as necessary. + for (; k < origLen && borrowIn; k++) { + borrowIn = (blk[k] == 0); + subtractBuf[k] = blk[k] - 1; + } + /* + * If the subtraction was performed successfully (!borrowIn), + * set bit i2 in block i of the quotient. + * + * Then, copy the portion of subtractBuf filled by the subtraction + * back to *this. This portion starts with block i and ends-- + * where? Not necessarily at block `i + b.len'! Well, we + * increased k every time we saved a block into subtractBuf, so + * the region of subtractBuf we copy is just [i, k). + */ + if (!borrowIn) { + q.blk[i] |= (Blk(1) << i2); + while (k > i) { + k--; + blk[k] = subtractBuf[k]; + } + } + } + } + // Zap possible leading zero in quotient + if (q.blk[q.len - 1] == 0) + q.len--; + // Zap any/all leading zeros in remainder + zapLeadingZeros(); + // Deallocate subtractBuf. + // (Thanks to Brad Spencer for noticing my accidental omission of this!) + delete [] subtractBuf; +} + +/* BITWISE OPERATORS + * These are straightforward blockwise operations except that they differ in + * the output length and the necessity of zapLeadingZeros. */ + +void BigUnsigned::bitAnd(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, bitAnd(a, b)); + // The bitwise & can't be longer than either operand. + len = (a.len >= b.len) ? b.len : a.len; + allocate(len); + Index i; + for (i = 0; i < len; i++) + blk[i] = a.blk[i] & b.blk[i]; + zapLeadingZeros(); +} + +void BigUnsigned::bitOr(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, bitOr(a, b)); + Index i; + const BigUnsigned *a2, *b2; + if (a.len >= b.len) { + a2 = &a; + b2 = &b; + } else { + a2 = &b; + b2 = &a; + } + allocate(a2->len); + for (i = 0; i < b2->len; i++) + blk[i] = a2->blk[i] | b2->blk[i]; + for (; i < a2->len; i++) + blk[i] = a2->blk[i]; + len = a2->len; + // Doesn't need zapLeadingZeros. +} + +void BigUnsigned::bitXor(const BigUnsigned &a, const BigUnsigned &b) { + DTRT_ALIASED(this == &a || this == &b, bitXor(a, b)); + Index i; + const BigUnsigned *a2, *b2; + if (a.len >= b.len) { + a2 = &a; + b2 = &b; + } else { + a2 = &b; + b2 = &a; + } + allocate(a2->len); + for (i = 0; i < b2->len; i++) + blk[i] = a2->blk[i] ^ b2->blk[i]; + for (; i < a2->len; i++) + blk[i] = a2->blk[i]; + len = a2->len; + zapLeadingZeros(); +} + +void BigUnsigned::bitShiftLeft(const BigUnsigned &a, int b) { + DTRT_ALIASED(this == &a, bitShiftLeft(a, b)); + if (b < 0) { + if (b << 1 == 0) + throw "BigUnsigned::bitShiftLeft: " + "Pathological shift amount not implemented"; + else { + bitShiftRight(a, -b); + return; + } + } + Index shiftBlocks = b / N; + unsigned int shiftBits = b % N; + // + 1: room for high bits nudged left into another block + len = a.len + shiftBlocks + 1; + allocate(len); + Index i, j; + for (i = 0; i < shiftBlocks; i++) + blk[i] = 0; + for (j = 0, i = shiftBlocks; j <= a.len; j++, i++) + blk[i] = getShiftedBlock(a, j, shiftBits); + // Zap possible leading zero + if (blk[len - 1] == 0) + len--; +} + +void BigUnsigned::bitShiftRight(const BigUnsigned &a, int b) { + DTRT_ALIASED(this == &a, bitShiftRight(a, b)); + if (b < 0) { + if (b << 1 == 0) + throw "BigUnsigned::bitShiftRight: " + "Pathological shift amount not implemented"; + else { + bitShiftLeft(a, -b); + return; + } + } + // This calculation is wacky, but expressing the shift as a left bit shift + // within each block lets us use getShiftedBlock. + Index rightShiftBlocks = (b + N - 1) / N; + unsigned int leftShiftBits = N * rightShiftBlocks - b; + // Now (N * rightShiftBlocks - leftShiftBits) == b + // and 0 <= leftShiftBits < N. + if (rightShiftBlocks >= a.len + 1) { + // All of a is guaranteed to be shifted off, even considering the left + // bit shift. + len = 0; + return; + } + // Now we're allocating a positive amount. + // + 1: room for high bits nudged left into another block + len = a.len + 1 - rightShiftBlocks; + allocate(len); + Index i, j; + for (j = rightShiftBlocks, i = 0; j <= a.len; j++, i++) + blk[i] = getShiftedBlock(a, j, leftShiftBits); + // Zap possible leading zero + if (blk[len - 1] == 0) + len--; +} + +// INCREMENT/DECREMENT OPERATORS + +// Prefix increment +void BigUnsigned::operator ++() { + Index i; + bool carry = true; + for (i = 0; i < len && carry; i++) { + blk[i]++; + carry = (blk[i] == 0); + } + if (carry) { + // Allocate and then increase length, as in divideWithRemainder + allocateAndCopy(len + 1); + len++; + blk[i] = 1; + } +} + +// Postfix increment: same as prefix +void BigUnsigned::operator ++(int) { + operator ++(); +} + +// Prefix decrement +void BigUnsigned::operator --() { + if (len == 0) + throw "BigUnsigned::operator --(): Cannot decrement an unsigned zero"; + Index i; + bool borrow = true; + for (i = 0; borrow; i++) { + borrow = (blk[i] == 0); + blk[i]--; + } + // Zap possible leading zero (there can only be one) + if (blk[len - 1] == 0) + len--; +} + +// Postfix decrement: same as prefix +void BigUnsigned::operator --(int) { + operator --(); +} diff --git a/OTLib/bigint/BigUnsigned.hh b/OTLib/bigint/BigUnsigned.hh new file mode 100755 index 000000000..ac40860a7 --- /dev/null +++ b/OTLib/bigint/BigUnsigned.hh @@ -0,0 +1,434 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef BIGUNSIGNED_H +#define BIGUNSIGNED_H + +#include "NumberlikeArray.hh" + +/* A BigUnsigned object represents a nonnegative integer of size limited only by + * available memory. BigUnsigneds support most mathematical operators and can + * be converted to and from most primitive integer types. + * + * The number is stored as a NumberlikeArray of unsigned longs as if it were + * written in base 256^sizeof(unsigned long). The least significant block is + * first, and the length is such that the most significant block is nonzero. */ +class BigUnsigned : protected NumberlikeArray { + +public: + // Enumeration for the result of a comparison. + enum CmpRes { less = -1, equal = 0, greater = 1 }; + + // BigUnsigneds are built with a Blk type of unsigned long. + typedef unsigned long Blk; + + typedef NumberlikeArray::Index Index; + NumberlikeArray::N; + +protected: + // Creates a BigUnsigned with a capacity; for internal use. + BigUnsigned(int, Index c) : NumberlikeArray(0, c) {} + + // Decreases len to eliminate any leading zero blocks. + void zapLeadingZeros() { + while (len > 0 && blk[len - 1] == 0) + len--; + } + +public: + // Constructs zero. + BigUnsigned() : NumberlikeArray() {} + + // Copy constructor + BigUnsigned(const BigUnsigned &x) : NumberlikeArray(x) {} + + // Assignment operator + void operator=(const BigUnsigned &x) { + NumberlikeArray::operator =(x); + } + + // Constructor that copies from a given array of blocks. + BigUnsigned(const Blk *b, Index blen) : NumberlikeArray(b, blen) { + // Eliminate any leading zeros we may have been passed. + zapLeadingZeros(); + } + + // Destructor. NumberlikeArray does the delete for us. + ~BigUnsigned() {} + + // Constructors from primitive integer types + BigUnsigned(unsigned long x); + BigUnsigned( long x); + BigUnsigned(unsigned int x); + BigUnsigned( int x); + BigUnsigned(unsigned short x); + BigUnsigned( short x); +protected: + // Helpers + template void initFromPrimitive (X x); + template void initFromSignedPrimitive(X x); +public: + + /* Converters to primitive integer types + * The implicit conversion operators caused trouble, so these are now + * named. */ + unsigned long toUnsignedLong () const; + long toLong () const; + unsigned int toUnsignedInt () const; + int toInt () const; + unsigned short toUnsignedShort() const; + short toShort () const; +protected: + // Helpers + template X convertToSignedPrimitive() const; + template X convertToPrimitive () const; +public: + + // BIT/BLOCK ACCESSORS + + // Expose these from NumberlikeArray directly. + NumberlikeArray::getCapacity; + NumberlikeArray::getLength; + + /* Returns the requested block, or 0 if it is beyond the length (as if + * the number had 0s infinitely to the left). */ + Blk getBlock(Index i) const { return i >= len ? 0 : blk[i]; } + /* Sets the requested block. The number grows or shrinks as necessary. */ + void setBlock(Index i, Blk newBlock); + + // The number is zero if and only if the canonical length is zero. + bool isZero() const { return NumberlikeArray::isEmpty(); } + + /* Returns the length of the number in bits, i.e., zero if the number + * is zero and otherwise one more than the largest value of bi for + * which getBit(bi) returns true. */ + Index bitLength() const; + /* Get the state of bit bi, which has value 2^bi. Bits beyond the + * number's length are considered to be 0. */ + bool getBit(Index bi) const { + return (getBlock(bi / N) & (Blk(1) << (bi % N))) != 0; + } + /* Sets the state of bit bi to newBit. The number grows or shrinks as + * necessary. */ + void setBit(Index bi, bool newBit); + + // COMPARISONS + + // Compares this to x like Perl's <=> + CmpRes compareTo(const BigUnsigned &x) const; + + // Ordinary comparison operators + bool operator ==(const BigUnsigned &x) const { + return NumberlikeArray::operator ==(x); + } + bool operator !=(const BigUnsigned &x) const { + return NumberlikeArray::operator !=(x); + } + bool operator < (const BigUnsigned &x) const { return compareTo(x) == less ; } + bool operator <=(const BigUnsigned &x) const { return compareTo(x) != greater; } + bool operator >=(const BigUnsigned &x) const { return compareTo(x) != less ; } + bool operator > (const BigUnsigned &x) const { return compareTo(x) == greater; } + + /* + * BigUnsigned and BigInteger both provide three kinds of operators. + * Here ``big-integer'' refers to BigInteger or BigUnsigned. + * + * (1) Overloaded ``return-by-value'' operators: + * +, -, *, /, %, unary -, &, |, ^, <<, >>. + * Big-integer code using these operators looks identical to code using + * the primitive integer types. These operators take one or two + * big-integer inputs and return a big-integer result, which can then + * be assigned to a BigInteger variable or used in an expression. + * Example: + * BigInteger a(1), b = 1; + * BigInteger c = a + b; + * + * (2) Overloaded assignment operators: + * +=, -=, *=, /=, %=, flipSign, &=, |=, ^=, <<=, >>=, ++, --. + * Again, these are used on big integers just like on ints. They take + * one writable big integer that both provides an operand and receives a + * result. Most also take a second read-only operand. + * Example: + * BigInteger a(1), b(1); + * a += b; + * + * (3) Copy-less operations: `add', `subtract', etc. + * These named methods take operands as arguments and store the result + * in the receiver (*this), avoiding unnecessary copies and allocations. + * `divideWithRemainder' is special: it both takes the dividend from and + * stores the remainder into the receiver, and it takes a separate + * object in which to store the quotient. NOTE: If you are wondering + * why these don't return a value, you probably mean to use the + * overloaded return-by-value operators instead. + * + * Examples: + * BigInteger a(43), b(7), c, d; + * + * c = a + b; // Now c == 50. + * c.add(a, b); // Same effect but without the two copies. + * + * c.divideWithRemainder(b, d); + * // 50 / 7; now d == 7 (quotient) and c == 1 (remainder). + * + * // ``Aliased'' calls now do the right thing using a temporary + * // copy, but see note on `divideWithRemainder'. + * a.add(a, b); + */ + + // COPY-LESS OPERATIONS + + // These 8: Arguments are read-only operands, result is saved in *this. + void add(const BigUnsigned &a, const BigUnsigned &b); + void subtract(const BigUnsigned &a, const BigUnsigned &b); + void multiply(const BigUnsigned &a, const BigUnsigned &b); + void bitAnd(const BigUnsigned &a, const BigUnsigned &b); + void bitOr(const BigUnsigned &a, const BigUnsigned &b); + void bitXor(const BigUnsigned &a, const BigUnsigned &b); + /* Negative shift amounts translate to opposite-direction shifts, + * except for -2^(8*sizeof(int)-1) which is unimplemented. */ + void bitShiftLeft(const BigUnsigned &a, int b); + void bitShiftRight(const BigUnsigned &a, int b); + + /* `a.divideWithRemainder(b, q)' is like `q = a / b, a %= b'. + * / and % use semantics similar to Knuth's, which differ from the + * primitive integer semantics under division by zero. See the + * implementation in BigUnsigned.cc for details. + * `a.divideWithRemainder(b, a)' throws an exception: it doesn't make + * sense to write quotient and remainder into the same variable. */ + void divideWithRemainder(const BigUnsigned &b, BigUnsigned &q); + + /* `divide' and `modulo' are no longer offered. Use + * `divideWithRemainder' instead. */ + + // OVERLOADED RETURN-BY-VALUE OPERATORS + BigUnsigned operator +(const BigUnsigned &x) const; + BigUnsigned operator -(const BigUnsigned &x) const; + BigUnsigned operator *(const BigUnsigned &x) const; + BigUnsigned operator /(const BigUnsigned &x) const; + BigUnsigned operator %(const BigUnsigned &x) const; + /* OK, maybe unary minus could succeed in one case, but it really + * shouldn't be used, so it isn't provided. */ + BigUnsigned operator &(const BigUnsigned &x) const; + BigUnsigned operator |(const BigUnsigned &x) const; + BigUnsigned operator ^(const BigUnsigned &x) const; + BigUnsigned operator <<(int b) const; + BigUnsigned operator >>(int b) const; + + // OVERLOADED ASSIGNMENT OPERATORS + void operator +=(const BigUnsigned &x); + void operator -=(const BigUnsigned &x); + void operator *=(const BigUnsigned &x); + void operator /=(const BigUnsigned &x); + void operator %=(const BigUnsigned &x); + void operator &=(const BigUnsigned &x); + void operator |=(const BigUnsigned &x); + void operator ^=(const BigUnsigned &x); + void operator <<=(int b); + void operator >>=(int b); + + /* INCREMENT/DECREMENT OPERATORS + * To discourage messy coding, these do not return *this, so prefix + * and postfix behave the same. */ + void operator ++( ); + void operator ++(int); + void operator --( ); + void operator --(int); + + // Helper function that needs access to BigUnsigned internals + friend Blk getShiftedBlock(const BigUnsigned &num, Index x, + unsigned int y); + + // See BigInteger.cc. + template + friend X convertBigUnsignedToPrimitiveAccess(const BigUnsigned &a); +}; + +/* Implementing the return-by-value and assignment operators in terms of the + * copy-less operations. The copy-less operations are responsible for making + * any necessary temporary copies to work around aliasing. */ + +inline BigUnsigned BigUnsigned::operator +(const BigUnsigned &x) const { + BigUnsigned ans; + ans.add(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator -(const BigUnsigned &x) const { + BigUnsigned ans; + ans.subtract(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator *(const BigUnsigned &x) const { + BigUnsigned ans; + ans.multiply(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator /(const BigUnsigned &x) const { + if (x.isZero()) throw "BigUnsigned::operator /: division by zero"; + BigUnsigned q, r; + r = *this; + r.divideWithRemainder(x, q); + return q; +} +inline BigUnsigned BigUnsigned::operator %(const BigUnsigned &x) const { + if (x.isZero()) throw "BigUnsigned::operator %: division by zero"; + BigUnsigned q, r; + r = *this; + r.divideWithRemainder(x, q); + return r; +} +inline BigUnsigned BigUnsigned::operator &(const BigUnsigned &x) const { + BigUnsigned ans; + ans.bitAnd(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator |(const BigUnsigned &x) const { + BigUnsigned ans; + ans.bitOr(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator ^(const BigUnsigned &x) const { + BigUnsigned ans; + ans.bitXor(*this, x); + return ans; +} +inline BigUnsigned BigUnsigned::operator <<(int b) const { + BigUnsigned ans; + ans.bitShiftLeft(*this, b); + return ans; +} +inline BigUnsigned BigUnsigned::operator >>(int b) const { + BigUnsigned ans; + ans.bitShiftRight(*this, b); + return ans; +} + +inline void BigUnsigned::operator +=(const BigUnsigned &x) { + add(*this, x); +} +inline void BigUnsigned::operator -=(const BigUnsigned &x) { + subtract(*this, x); +} +inline void BigUnsigned::operator *=(const BigUnsigned &x) { + multiply(*this, x); +} +inline void BigUnsigned::operator /=(const BigUnsigned &x) { + if (x.isZero()) throw "BigUnsigned::operator /=: division by zero"; + /* The following technique is slightly faster than copying *this first + * when x is large. */ + BigUnsigned q; + divideWithRemainder(x, q); + // *this contains the remainder, but we overwrite it with the quotient. + *this = q; +} +inline void BigUnsigned::operator %=(const BigUnsigned &x) { + if (x.isZero()) throw "BigUnsigned::operator %=: division by zero"; + BigUnsigned q; + // Mods *this by x. Don't care about quotient left in q. + divideWithRemainder(x, q); +} +inline void BigUnsigned::operator &=(const BigUnsigned &x) { + bitAnd(*this, x); +} +inline void BigUnsigned::operator |=(const BigUnsigned &x) { + bitOr(*this, x); +} +inline void BigUnsigned::operator ^=(const BigUnsigned &x) { + bitXor(*this, x); +} +inline void BigUnsigned::operator <<=(int b) { + bitShiftLeft(*this, b); +} +inline void BigUnsigned::operator >>=(int b) { + bitShiftRight(*this, b); +} + +/* Templates for conversions of BigUnsigned to and from primitive integers. + * BigInteger.cc needs to instantiate convertToPrimitive, and the uses in + * BigUnsigned.cc didn't do the trick; I think g++ inlined convertToPrimitive + * instead of generating linkable instantiations. So for consistency, I put + * all the templates here. */ + +// CONSTRUCTION FROM PRIMITIVE INTEGERS + +/* Initialize this BigUnsigned from the given primitive integer. The same + * pattern works for all primitive integer types, so I put it into a template to + * reduce code duplication. (Don't worry: this is protected and we instantiate + * it only with primitive integer types.) Type X could be signed, but x is + * known to be nonnegative. */ +template +void BigUnsigned::initFromPrimitive(X x) { + if (x == 0) + ; // NumberlikeArray already initialized us to zero. + else { + // Create a single block. blk is NULL; no need to delete it. + cap = 1; + blk = new Blk[1]; + len = 1; + blk[0] = Blk(x); + } +} + +/* Ditto, but first check that x is nonnegative. I could have put the check in + * initFromPrimitive and let the compiler optimize it out for unsigned-type + * instantiations, but I wanted to avoid the warning stupidly issued by g++ for + * a condition that is constant in *any* instantiation, even if not in all. */ +template +void BigUnsigned::initFromSignedPrimitive(X x) { + if (x < 0) + throw "BigUnsigned constructor: " + "Cannot construct a BigUnsigned from a negative number"; + else + initFromPrimitive(x); +} + +// CONVERSION TO PRIMITIVE INTEGERS + +/* Template with the same idea as initFromPrimitive. This might be slightly + * slower than the previous version with the masks, but it's much shorter and + * clearer, which is the library's stated goal. */ +template +X BigUnsigned::convertToPrimitive() const { + if (len == 0) + // The number is zero; return zero. + return 0; + else if (len == 1) { + // The single block might fit in an X. Try the conversion. + X x = X(blk[0]); + // Make sure the result accurately represents the block. + if (Blk(x) == blk[0]) + // Successful conversion. + return x; + // Otherwise fall through. + } + throw "BigUnsigned::to: " + "Value is too big to fit in the requested type"; +} + +/* Wrap the above in an x >= 0 test to make sure we got a nonnegative result, + * not a negative one that happened to convert back into the correct nonnegative + * one. (E.g., catch incorrect conversion of 2^31 to the long -2^31.) Again, + * separated to avoid a g++ warning. */ +template +X BigUnsigned::convertToSignedPrimitive() const { + X x = convertToPrimitive(); + if (x >= 0) + return x; + else + throw "BigUnsigned::to(Primitive): " + "Value is too big to fit in the requested type"; +} + +#endif diff --git a/OTLib/bigint/BigUnsignedInABase.cc b/OTLib/bigint/BigUnsignedInABase.cc new file mode 100755 index 000000000..da0e9df20 --- /dev/null +++ b/OTLib/bigint/BigUnsignedInABase.cc @@ -0,0 +1,149 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#include "BigUnsignedInABase.hh" + +BigUnsignedInABase::BigUnsignedInABase(const Digit *d, Index l, Base base) + : NumberlikeArray(d, l), base(base) { + // Check the base + if (base < 2) + throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): The base must be at least 2"; + + // Validate the digits. + for (Index i = 0; i < l; i++) + if (blk[i] >= base) + throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base"; + + // Eliminate any leading zeros we may have been passed. + zapLeadingZeros(); +} + +namespace { + unsigned int bitLen(unsigned int x) { + unsigned int len = 0; + while (x > 0) { + x >>= 1; + len++; + } + return len; + } + unsigned int ceilingDiv(unsigned int a, unsigned int b) { + return (a + b - 1) / b; + } +} + +BigUnsignedInABase::BigUnsignedInABase(const BigUnsigned &x, Base base) { + // Check the base + if (base < 2) + throw "BigUnsignedInABase(BigUnsigned, Base): The base must be at least 2"; + this->base = base; + + // Get an upper bound on how much space we need + int maxBitLenOfX = x.getLength() * BigUnsigned::N; + int minBitsPerDigit = bitLen(base) - 1; + int maxDigitLenOfX = ceilingDiv(maxBitLenOfX, minBitsPerDigit); + len = maxDigitLenOfX; // Another change to comply with `staying in bounds'. + allocate(len); // Get the space + + BigUnsigned x2(x), buBase(base); + Index digitNum = 0; + + while (!x2.isZero()) { + // Get last digit. This is like `lastDigit = x2 % buBase, x2 /= buBase'. + BigUnsigned lastDigit(x2); + lastDigit.divideWithRemainder(buBase, x2); + // Save the digit. + blk[digitNum] = lastDigit.toUnsignedShort(); + // Move on. We can't run out of room: we figured it out above. + digitNum++; + } + + // Save the actual length. + len = digitNum; +} + +BigUnsignedInABase::operator BigUnsigned() const { + BigUnsigned ans(0), buBase(base), temp; + Index digitNum = len; + while (digitNum > 0) { + digitNum--; + temp.multiply(ans, buBase); + ans.add(temp, BigUnsigned(blk[digitNum])); + } + return ans; +} + +BigUnsignedInABase::BigUnsignedInABase(const std::string &s, Base base) { + // Check the base. + if (base > 62) + throw "BigUnsignedInABase(std::string, Base): The default string conversion routines use the symbol set 0-9, A-Z, a-z, and therefore support only up to base 62. You tried a conversion with a base over 62; write your own string conversion routine."; + // Save the base. + // This pattern is seldom seen in C++, but the analogous ``this.'' is common in Java. + this->base = base; + + // `s.length()' is a `size_t', while `len' is a `NumberlikeArray::Index', + // also known as an `unsigned int'. Some compilers warn without this cast. + len = Index(s.length()); + allocate(len); + + Index digitNum, symbolNumInString; + for (digitNum = 0; digitNum < len; digitNum++) { + symbolNumInString = len - 1 - digitNum; + char theSymbol = s[symbolNumInString]; + if (theSymbol >= '0' && theSymbol <= '9') + blk[digitNum] = theSymbol - '0'; + else if (theSymbol >= 'A' && theSymbol <= 'Z') + blk[digitNum] = theSymbol - 'A' + 10; + else if (theSymbol >= 'a' && theSymbol <= 'z') + blk[digitNum] = theSymbol - 'a' + 36; + else + throw "BigUnsignedInABase(std::string, Base): Bad symbol in input. Only 0-9, A-Z, a-z are accepted."; + + if (blk[digitNum] >= base) + throw "BigUnsignedInABase::BigUnsignedInABase(const Digit *, Index, Base): A digit is too large for the specified base"; + } + zapLeadingZeros(); +} + +BigUnsignedInABase::operator std::string() const { + if (base > 62) + throw "BigUnsignedInABase ==> std::string: The default string conversion routines use the symbol set 0-9, A-Z, a-z, and therefore support only up to base 62. You tried a conversion with a base over 62; write your own string conversion routine."; + if (len == 0) + return std::string("0"); + // Some compilers don't have push_back, so use a char * buffer instead. + char *s = new char[len + 1]; + s[len] = '\0'; + Index digitNum, symbolNumInString; + for (symbolNumInString = 0; symbolNumInString < len; symbolNumInString++) { + digitNum = len - 1 - symbolNumInString; + Digit theDigit = blk[digitNum]; + if (theDigit < 10) + s[symbolNumInString] = char('0' + theDigit); + else if (theDigit < 36) + s[symbolNumInString] = char('A' + theDigit - 10); + else + s[symbolNumInString] = char('a' + theDigit - 36); + } + std::string s2(s); + delete [] s; + return s2; +} + + + + + + diff --git a/OTLib/bigint/BigUnsignedInABase.hh b/OTLib/bigint/BigUnsignedInABase.hh new file mode 100755 index 000000000..9986b688e --- /dev/null +++ b/OTLib/bigint/BigUnsignedInABase.hh @@ -0,0 +1,138 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef BIGUNSIGNEDINABASE_H +#define BIGUNSIGNEDINABASE_H + +#include "NumberlikeArray.hh" +#include "BigUnsigned.hh" +#include + +/* + * A BigUnsignedInABase object represents a nonnegative integer of size limited + * only by available memory, represented in a user-specified base that can fit + * in an `unsigned short' (most can, and this saves memory). + * + * BigUnsignedInABase is intended as an intermediary class with little + * functionality of its own. BigUnsignedInABase objects can be constructed + * from, and converted to, BigUnsigneds (requiring multiplication, mods, etc.) + * and `std::string's (by switching digit values for appropriate characters). + * + * BigUnsignedInABase is similar to BigUnsigned. Note the following: + * + * (1) They represent the number in exactly the same way, except that + * BigUnsignedInABase uses ``digits'' (or Digit) where BigUnsigned uses + * ``blocks'' (or Blk). + * + * (2) Both use the management features of NumberlikeArray. (In fact, my desire + * to add a BigUnsignedInABase class without duplicating a lot of code led me to + * introduce NumberlikeArray.) + * + * (3) The only arithmetic operation supported by BigUnsignedInABase is an + * equality test. Use BigUnsigned for arithmetic. + */ + +class BigUnsignedInABase : protected NumberlikeArray { + +public: + // The digits of a BigUnsignedInABase are unsigned shorts. + typedef unsigned short Digit; + // That's also the type of a base. + typedef Digit Base; + +protected: + // The base in which this BigUnsignedInABase is expressed + Base base; + + // Creates a BigUnsignedInABase with a capacity; for internal use. + BigUnsignedInABase(int, Index c) : NumberlikeArray(0, c) {} + + // Decreases len to eliminate any leading zero digits. + void zapLeadingZeros() { + while (len > 0 && blk[len - 1] == 0) + len--; + } + +public: + // Constructs zero in base 2. + BigUnsignedInABase() : NumberlikeArray(), base(2) {} + + // Copy constructor + BigUnsignedInABase(const BigUnsignedInABase &x) : NumberlikeArray(x), base(x.base) {} + + // Assignment operator + void operator =(const BigUnsignedInABase &x) { + NumberlikeArray::operator =(x); + base = x.base; + } + + // Constructor that copies from a given array of digits. + BigUnsignedInABase(const Digit *d, Index l, Base base); + + // Destructor. NumberlikeArray does the delete for us. + ~BigUnsignedInABase() {} + + // LINKS TO BIGUNSIGNED + BigUnsignedInABase(const BigUnsigned &x, Base base); + operator BigUnsigned() const; + + /* LINKS TO STRINGS + * + * These use the symbols ``0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'' to + * represent digits of 0 through 61. When parsing strings, lowercase is + * also accepted. + * + * All string representations are big-endian (big-place-value digits + * first). (Computer scientists have adopted zero-based counting; why + * can't they tolerate little-endian numbers?) + * + * No string representation has a ``base indicator'' like ``0x''. + * + * An exception is made for zero: it is converted to ``0'' and not the + * empty string. + * + * If you want different conventions, write your own routines to go + * between BigUnsignedInABase and strings. It's not hard. + */ + operator std::string() const; + BigUnsignedInABase(const std::string &s, Base base); + +public: + + // ACCESSORS + Base getBase() const { return base; } + + // Expose these from NumberlikeArray directly. + NumberlikeArray::getCapacity; + NumberlikeArray::getLength; + + /* Returns the requested digit, or 0 if it is beyond the length (as if + * the number had 0s infinitely to the left). */ + Digit getDigit(Index i) const { return i >= len ? 0 : blk[i]; } + + // The number is zero if and only if the canonical length is zero. + bool isZero() const { return NumberlikeArray::isEmpty(); } + + /* Equality test. For the purposes of this test, two BigUnsignedInABase + * values must have the same base to be equal. */ + bool operator ==(const BigUnsignedInABase &x) const { + return base == x.base && NumberlikeArray::operator ==(x); + } + bool operator !=(const BigUnsignedInABase &x) const { return !operator ==(x); } + +}; + +#endif diff --git a/OTLib/bigint/ChangeLog b/OTLib/bigint/ChangeLog new file mode 100755 index 000000000..ac6927c40 --- /dev/null +++ b/OTLib/bigint/ChangeLog @@ -0,0 +1,146 @@ + Change Log + +These entries tell you what was added, fixed, or improved in each version as +compared to the previous one. In case you haven't noticed, a version number +roughly corresponds to the release date of that version in `YYYY.MM.DD[.N]' +format, where `.N' goes `.2', `.3', etc. if there are multiple versions on the +same day. The topmost version listed is the one you have. + +2010.04.30 +---------- +- Strengthen the advice about build/IDE configuration in the README. + +2009.05.03 +---------- +- BigUnsigned::{get,set}Bit: Change two remaining `1 <<' to `Blk(1) <<' to work + on systems where sizeof(unsigned int) != sizeof(Blk). Bug reported by Brad + Spencer. +- dataToBigInteger: Change a `delete' to `delete []' to avoid leaking memory. + Bug reported by Nicolás Carrasco. + +2009.03.26 +---------- +- BigUnsignedInABase(std::string) Reject digits too big for the base. + Bug reported by Niakam Kazemi. + +2008.07.20 +---------- +Dennis Yew pointed out serious problems with ambiguities and unwanted +conversions when mixing BigInteger/BigUnsigned and primitive integers. To fix +these, I removed the implicit conversions from BigInteger/BigUnsigned to +primitive integers and from BigInteger to BigUnsigned. Removing the +BigInteger-to-BigUnsigned conversion required changing BigInteger to have a +BigUnsigned field instead of inheriting from it; this was a complex task but +ultimately gave a saner design. At the same time, I went through the entire +codebase, making the formatting and comments prettier and reworking anything I +thought was unclear. I also added a testsuite (currently for 32-bit systems +only); it doesn't yet cover the entire library but should help to ensure that +things work the way they should. + +A number of changes from version 2007.07.07 break compatibility with existing +code that uses the library, but updating that code should be pretty easy: +- BigInteger can no longer be implicitly converted to BigUnsigned. Use + getMagnitude() instead. +- BigUnsigned and BigInteger can no longer be implicitly converted to primitive + integers. Use the toInt() family of functions instead. +- The easy* functions have been renamed to more mature names: + bigUnsignedToString, bigIntegerToString, stringToBigUnsigned, + stringToBigInteger, dataToBigInteger. +- BigInteger no longer supports bitwise operations. Get the magnitude with + getMagnitude() and operate on that instead. +- The old {BigUnsigned,BigInteger}::{divide,modulo} copy-less options have been + removed. Use divideWithRemainder instead. +- Added a base argument to BigUnsignedInABase's digit-array constructor. I + ope no one used that constructor in its broken state anyway. + +Other notable changes: +- Added BigUnsigned functions setBlock, bitLength, getBit, setBit. +- The bit-shifting operations now support negative shift amounts, which shift in + the other direction. +- Added some big-integer algorithms in BigIntegerAlgorithms.hh: gcd, + extendedEuclidean, modinv, modexp. + +2007.07.07 +---------- +Update the "Running the sample program produces this output:" comment in +sample.cc for the bitwise operators. + +2007.06.14 +---------- +- Implement << and >> for BigUnsigned in response to email from Marco Schulze. +- Fix name: DOTR_ALIASED -> DTRT_ALIASED. +- Demonstrate all bitwise operators (&, |, ^, <<, >>) in sample.cc. + +2007.02.16 +---------- +Boris Dessy pointed out that the library threw an exception on "a *= a", so I changed all the put-here operations to handle aliased calls correctly using a temporary copy instead of throwing exceptions. + +2006.08.14 +---------- +In BigUnsigned::bitXor, change allocate(b2->len) to allocate(a2->len): we should allocate enough space for the longer number, not the shorter one! Thanks to Sriram Sankararaman for pointing this out. + +2006.05.03 +---------- +I ran the sample program using valgrind and discovered a `delete s' that should be `delete [] s' and a `len++' before an `allocateAndCopy(len)' that should have been after an `allocateAndCopy(len + 1)'. I fixed both. Yay for valgrind! + +2006.05.01 +---------- +I fixed incorrect results reported by Mohand Mezmaz and related memory corruption on platforms where Blk is bigger than int. I replaced (1 << x) with (Blk(1) << x) in two places in BigUnsigned.cc. + +2006.04.24 +---------- +Two bug fixes: BigUnsigned "++x" no longer segfaults when x grows in length, and BigUnsigned == and != are now redeclared so as to be usable. I redid the Makefile: I removed the *.tag mechanism and hard-coded the library's header dependencies, I added comments, and I made the Makefile more useful for building one's own programs instead of just the sample. + +2006.02.26 +---------- +A few tweaks in preparation for a group to distribute the library. The project Web site has moved; I updated the references. I fixed a typo and added a missing function in NumberlikeArray.hh. I'm using Eclipse now, so you get Eclipse project files. + +2005.03.30 +---------- +Sam Larkin found a bug in `BigInteger::subtract'; I fixed it. + +2005.01.18 +---------- +I fixed some problems with `easyDataToBI'. Due to some multiply declared variables, this function would not compile. However, it is a template function, so the compiler parses it and doesn't compile the parsed representation until something uses the function; this is how I missed the problems. I also removed debugging output from this function. + +2005.01.17 +---------- +A fix to some out-of-bounds accesses reported by Milan Tomic (see the comment under `BigUnsigned::divideWithRemainder'). `BigUnsigned::multiply' and `BigUnsigned::divideWithRemainder' implementations neatened up a bit with the help of a function `getShiftedBlock'. I (finally!) introduced a constant `BigUnsigned::N', the number of bits in a `BigUnsigned::Blk', which varies depending on machine word size. In both code and comments, it replaces the much clunkier `8*sizeof(Blk)'. Numerous other small changes. There's a new conversion routine `easyDataToBI' that will convert almost any format of binary data to a `BigInteger'. + +I have inserted a significant number of new comments. Most explain unobvious aspects of the code. + +2005.01.06 +---------- +Some changes to the way zero-length arrays are handled by `NumberlikeArray', which fixed a memory leak reported by Milan Tomic. + +2004.12.24.2 +------------ +I tied down a couple of loose ends involving division/modulo. I added an explanation of put-here vs. overloaded operators in the sample program; this has confused too many people. Miscellaneous other improvements. + +I believe that, at this point, the Big Integer Library makes no assumptions about the word size of the machine it is using. `BigUnsigned::Blk' is always an `unsigned long', whatever that may be, and its size is computed with `sizeof' when necessary. However, just in case, I would be interested to have someone test the library on a non-32-bit machine to see if it works. + +2004.12.24 +---------- +This is a _major_ upgrade to the library. Among the things that have changed: + +I wrote the original version of the library, particularly the four ``classical algorithms'' in `BigUnsigned.cc', using array indexing. Then I rewrote it to use pointers because I thought that would be faster. But recently, I revisited the code in `BigUnsigned.cc' and found that I could not begin to understand what it was doing. + +I have decided that the drawbacks of pointers, increased coding difficulty and reduced code readability, far outweigh their speed benefits. Plus, any modern optimizing compiler should produce fast code either way. Therefore, I rewrote the library to use array indexing again. (Thank goodness for regular-expression find-and-replace. It saved me a lot of time.) + +The put-here operations `divide' and `modulo' of each of `BigUnsigned' and `BigInteger' have been supplanted by a single operation `divideWithRemainder'. Read the profuse comments for more information on its exact behavior. + +There is a new class `BigUnsignedInABase' that is like `BigUnsigned' but uses a user-specified, small base instead of `256 ^ sizeof(unsigned long)'. Much of the code common to the two has been factored out into `NumberlikeArray'. + +`BigUnsignedInABase' facilitates conversion between `BigUnsigned's and digit-by-digit string representations using `std::string'. Convenience routines to do this conversion are in `BigIntegerUtils.hh'. `iostream' compatibility has been improved. + +I would like to thank Chris Morbitzer for the e-mail message that catalyzed this major upgrade. He wanted a way to convert a string to a BigInteger. One thing just led to another, roughly in reverse order from how they are listed here. + +2004.1216 +--------- +Brad Spencer pointed out a memory leak in `BigUnsigned::divide'. It is fixed in the December 16, 2004 version. + +2004.1205 +--------- +After months of inactivity, I fixed a bug in the `BigInteger' division routine; thanks to David Allen for reporting the bug. I also added simple routines for decimal output to `std::ostream's, and there is a demo that prints out powers of 3. + +~~~~ diff --git a/OTLib/bigint/Makefile b/OTLib/bigint/Makefile new file mode 100755 index 000000000..3018e98e6 --- /dev/null +++ b/OTLib/bigint/Makefile @@ -0,0 +1,73 @@ +# Mention default target. +all: + +# Implicit rule to compile C++ files. Modify to your taste. +%.o: %.cc + g++ -c -O2 -Wall -Wextra -pedantic $< + +# Components of the library. +library-objects = \ + BigUnsigned.o \ + BigInteger.o \ + BigIntegerAlgorithms.o \ + BigUnsignedInABase.o \ + BigIntegerUtils.o \ + +library-headers = \ + NumberlikeArray.hh \ + BigUnsigned.hh \ + BigInteger.hh \ + BigIntegerAlgorithms.hh \ + BigUnsignedInABase.hh \ + BigIntegerLibrary.hh \ + +# To ``make the library'', make all its objects using the implicit rule. +library: $(library-objects) + +# Conservatively assume that all the objects depend on all the headers. +$(library-objects): $(library-headers) + +# TESTSUITE (NOTE: Currently expects a 32-bit system) +# Compiling the testsuite. +testsuite.o: $(library-headers) +testsuite: testsuite.o $(library-objects) + g++ $^ -o $@ +# Extract the expected output from the testsuite source. +testsuite.expected: testsuite.cc + nl -ba -p -s: $< | sed -nre 's,^ +([0-9]+):.*//([^ ]),Line \1: \2,p' >$@ +# Run the testsuite. +.PHONY: test +test: testsuite testsuite.expected + ./run-testsuite +testsuite-cleanfiles = \ + testsuite.o testsuite testsuite.expected \ + testsuite.out testsuite.err + +# The rules below build a program that uses the library. They are preset to +# build ``sample'' from ``sample.cc''. You can change the name(s) of the +# source file(s) and program file to build your own program, or you can write +# your own Makefile. + +# Components of the program. +program = sample +program-objects = sample.o + +# Conservatively assume all the program source files depend on all the library +# headers. You can change this if it is not the case. +$(program-objects) : $(library-headers) + +# How to link the program. The implicit rule covers individual objects. +$(program) : $(program-objects) $(library-objects) + g++ $^ -o $@ + +# Delete all generated files we know about. +clean : + rm -f $(library-objects) $(testsuite-cleanfiles) $(program-objects) $(program) + +# I removed the *.tag dependency tracking system because it had few advantages +# over manually entering all the dependencies. If there were a portable, +# reliable dependency tracking system, I'd use it, but I know of no such; +# cons and depcomp are almost good enough. + +# Come back and define default target. +all : library $(program) diff --git a/OTLib/bigint/NumberlikeArray.hh b/OTLib/bigint/NumberlikeArray.hh new file mode 100755 index 000000000..3b50fe313 --- /dev/null +++ b/OTLib/bigint/NumberlikeArray.hh @@ -0,0 +1,193 @@ +/* + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, waive my + copyright to it, placing it in the public domain. The library comes with + absolutely no warranty. + + */ + +#ifndef NUMBERLIKEARRAY_H +#define NUMBERLIKEARRAY_H + +// Make sure we have NULL. +#ifndef NULL +#define NULL 0 +#endif + +/* A NumberlikeArray object holds a heap-allocated array of Blk with a + * length and a capacity and provides basic memory management features. + * BigUnsigned and BigUnsignedInABase both subclass it. + * + * NumberlikeArray provides no information hiding. Subclasses should use + * nonpublic inheritance and manually expose members as desired using + * declarations like this: + * + * public: + * NumberlikeArray< the-type-argument >::getLength; + */ +template +class NumberlikeArray { +public: + + // Type for the index of a block in the array + typedef unsigned int Index; + // The number of bits in a block, defined below. + static const unsigned int N; + + // The current allocated capacity of this NumberlikeArray (in blocks) + Index cap; + // The actual length of the value stored in this NumberlikeArray (in blocks) + Index len; + // Heap-allocated array of the blocks (can be NULL if len == 0) + Blk *blk; + + // Constructs a ``zero'' NumberlikeArray with the given capacity. + NumberlikeArray(Index c) : cap(c), len(0) { + blk = (cap > 0) ? (new Blk[cap]) : NULL; + } + + /* Constructs a zero NumberlikeArray without allocating a backing array. + * A subclass that doesn't know the needed capacity at initialization + * time can use this constructor and then overwrite blk without first + * deleting it. */ + NumberlikeArray() : cap(0), len(0) { + blk = NULL; + } + + // Destructor. Note that `delete NULL' is a no-op. + ~NumberlikeArray() { + delete [] blk; + } + + /* Ensures that the array has at least the requested capacity; may + * destroy the contents. */ + void allocate(Index c); + + /* Ensures that the array has at least the requested capacity; does not + * destroy the contents. */ + void allocateAndCopy(Index c); + + // Copy constructor + NumberlikeArray(const NumberlikeArray &x); + + // Assignment operator + void operator=(const NumberlikeArray &x); + + // Constructor that copies from a given array of blocks + NumberlikeArray(const Blk *b, Index blen); + + // ACCESSORS + Index getCapacity() const { return cap; } + Index getLength() const { return len; } + Blk getBlock(Index i) const { return blk[i]; } + bool isEmpty() const { return len == 0; } + + /* Equality comparison: checks if both objects have the same length and + * equal (==) array elements to that length. Subclasses may wish to + * override. */ + bool operator ==(const NumberlikeArray &x) const; + + bool operator !=(const NumberlikeArray &x) const { + return !operator ==(x); + } +}; + +/* BEGIN TEMPLATE DEFINITIONS. They are present here so that source files that + * include this header file can generate the necessary real definitions. */ + +template +const unsigned int NumberlikeArray::N = 8 * sizeof(Blk); + +template +void NumberlikeArray::allocate(Index c) { + // If the requested capacity is more than the current capacity... + if (c > cap) { + // Delete the old number array + delete [] blk; + // Allocate the new array + cap = c; + blk = new Blk[cap]; + } +} + +template +void NumberlikeArray::allocateAndCopy(Index c) { + // If the requested capacity is more than the current capacity... + if (c > cap) { + Blk *oldBlk = blk; + // Allocate the new number array + cap = c; + blk = new Blk[cap]; + // Copy number blocks + Index i; + for (i = 0; i < len; i++) + blk[i] = oldBlk[i]; + // Delete the old array + delete [] oldBlk; + } +} + +template +NumberlikeArray::NumberlikeArray(const NumberlikeArray &x) + : len(x.len) { + // Create array + cap = len; + blk = new Blk[cap]; + // Copy blocks + Index i; + for (i = 0; i < len; i++) + blk[i] = x.blk[i]; +} + +template +void NumberlikeArray::operator=(const NumberlikeArray &x) { + /* Calls like a = a have no effect; catch them before the aliasing + * causes a problem */ + if (this == &x) + return; + // Copy length + len = x.len; + // Expand array if necessary + allocate(len); + // Copy number blocks + Index i; + for (i = 0; i < len; i++) + blk[i] = x.blk[i]; +} + +template +NumberlikeArray::NumberlikeArray(const Blk *b, Index blen) + : cap(blen), len(blen) { + // Create array + blk = new Blk[cap]; + // Copy blocks + Index i; + for (i = 0; i < len; i++) + blk[i] = b[i]; +} + +template +bool NumberlikeArray::operator ==(const NumberlikeArray &x) const { + if (len != x.len) + // Definitely unequal. + return false; + else { + // Compare corresponding blocks one by one. + Index i; + for (i = 0; i < len; i++) + if (blk[i] != x.blk[i]) + return false; + // No blocks differed, so the objects are equal. + return true; + } +} + +#endif diff --git a/OTLib/bigint/README b/OTLib/bigint/README new file mode 100755 index 000000000..ae9d3dac5 --- /dev/null +++ b/OTLib/bigint/README @@ -0,0 +1,71 @@ + + C++ Big Integer Library + (see ChangeLog for version) + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + +You can use this library in a C++ program to do arithmetic on integers of size +limited only by your computer's memory. The library provides BigUnsigned and +BigInteger classes that represent nonnegative integers and signed integers, +respectively. Most of the C++ arithmetic operators are overloaded for these +classes, so big-integer calculations are as easy as: + + #include "BigIntegerLibrary.hh" + + BigInteger a = 65536; + cout << (a * a * a * a * a * a * a * a); + + (prints 340282366920938463463374607431768211456) + +The code in `sample.cc' demonstrates the most important features of the library. +To get started quickly, read the code and explanations in that file and run it. +If you want more detail or a feature not shown in `sample.cc', consult the +consult the actual header and source files, which are thoroughly commented. + +This library emphasizes ease of use and clarity of implementation over speed; +some users will prefer GMP (http://swox.com/gmp/), which is faster. The code is +intended to be reasonably portable across computers and modern C++ compilers; in +particular, it uses whatever word size the computer provides (32-bit, 64-bit, or +otherwise). + +Compiling programs that use the library +--------------------------------------- +The library consists of a folder full of C++ header files (`.hh') and source +files (`.cc'). Your own programs should `#include' the necessary header files +and link with the source files. A makefile that builds the sample program +(`sample.cc') is included; you can adapt it to replace the sample with your own +program. + +Alternatively, you can use your own build system or IDE. In that case, you must +put the library header files where the compiler will find them and arrange to +have your program linked with the library source files; otherwise, you will get +errors about missing header files or "undefined references". To learn how to do +this, consult the documentation for the build system or IDE; don't bother asking +me. Adding all the library files to your project will work in many IDEs but may +not be the most desirable approach. + +Resources +--------- +The library's Web site (above) provides links to released versions, the current +development version, and a mailing list for release announcements, questions, +bug reports, and other discussion of the library. I would be delighted to hear +from you if you like this library and/or find a good use for it. + +Bugs and enhancements +--------------------- +The library has been tested by me and others but is by no means bug-free. If +you find a bug, please report it, whether it comes in the form of compiling +trouble, a mathematically inaccurate result, or a memory-management blooper +(since I use Java, these are altogether too common in my C++). I generally fix +all reported bugs. You are also welcome to request enhancements, but I am +unlikely to do substantial amounts of work on enhancements at this point. + +Legal +----- +I, Matt McCutchen, the sole author of the original Big Integer Library, waive my +copyright to it, placing it in the public domain. The library comes with +absolutely no warranty. + +~~~~ diff --git a/OTLib/bigint/run-testsuite b/OTLib/bigint/run-testsuite new file mode 100755 index 000000000..ff7372916 --- /dev/null +++ b/OTLib/bigint/run-testsuite @@ -0,0 +1,37 @@ +#!/bin/bash + +bad= + +# If you encounter the following problem with Valgrind like I did: +# https://bugzilla.redhat.com/show_bug.cgi?id=455644 +# you can pass the environment variable NO_VALGRIND=1 to run the testsuite +# without it. +if [ "$NO_VALGRIND" ]; then + cmd=(./testsuite) +else + cmd=(valgrind --error-exitcode=1 --leak-check=full ./testsuite) +fi + +set -o pipefail +# Stdout goes directly to testsuite.out; stderr goes down the pipe. +if ! "${cmd[@]}" 2>&1 >testsuite.out | tee testsuite.err; then + echo >&2 'Memory errors!' + bad=1 +fi + +if grep 'LEAK SUMMARY' testsuite.err >/dev/null; then + echo >&2 'Memory leaks!' + bad=1 +fi + +if ! diff -u testsuite.expected testsuite.out; then + echo >&2 'Output is incorrect!' + bad=1 +fi + +if [ $bad ]; then + echo >&2 'Test suite failed!' + exit 1 +else + echo 'Test suite passed.' +fi diff --git a/OTLib/bigint/sample.cc b/OTLib/bigint/sample.cc new file mode 100644 index 000000000..f43121c60 --- /dev/null +++ b/OTLib/bigint/sample.cc @@ -0,0 +1,139 @@ +// Sample program demonstrating the use of the Big Integer Library. + +// Standard libraries +#include +#include + +// `BigIntegerLibrary.hh' includes all of the library headers. +#include "BigIntegerLibrary.hh" + +int main() { + /* The library throws `const char *' error messages when things go + * wrong. It's a good idea to catch them using a `try' block like this + * one. Your C++ compiler might need a command-line option to compile + * code that uses exceptions. */ + try { + BigInteger a; // a is 0 + int b = 535; + + /* Any primitive integer can be converted implicitly to a + * BigInteger. */ + a = b; + + /* The reverse conversion requires a method call (implicit + * conversions were previously supported but caused trouble). + * If a were too big for an int, the library would throw an + * exception. */ + b = a.toInt(); + + BigInteger c(a); // Copy a BigInteger. + + // The int literal is converted to a BigInteger. + BigInteger d(-314159265); + + /* This won't compile (at least on 32-bit machines) because the + * number is too big to be a primitive integer literal, and + * there's no such thing as a BigInteger literal. */ + //BigInteger e(3141592653589793238462643383279); + + std::string server_ID("4CC4DD50CB6A7D9C7D05240E09DAF2BEFCD189331D69A07F7DD117D4299AD6DE"); + + BigUnsignedInABase theBaseConverter(server_ID, 16); // base16 + + std::string strBASE62_VERSION = bigUnsignedToStringBase62(theBaseConverter); + + std::cout << server_ID << '\n' << strBASE62_VERSION << '\n' ; + + BigUnsignedInABase theConvertBack(strBASE62_VERSION, 62); + + std::string strBACK = bigUnsignedToStringBase16(theConvertBack); + + std::cout << strBACK << '\n' << std::endl; + + // Instead you can convert the number from a string. + std::string s("3141592653589793238462643383279"); + BigInteger f = stringToBigInteger(s); + + // You can convert the other way too. + std::string s2 = bigIntegerToString(f); + + // f is implicitly stringified and sent to std::cout. + std::cout << f << std::endl; + + /* Let's do some math! The library overloads most of the + * mathematical operators (including assignment operators) to + * work on BigIntegers. There are also ``copy-less'' + * operations; see `BigUnsigned.hh' for details. */ + + // Arithmetic operators + BigInteger g(314159), h(265); + std::cout << (g + h) << '\n' + << (g - h) << '\n' + << (g * h) << '\n' + << (g / h) << '\n' + << (g % h) << std::endl; + + // Bitwise operators + BigUnsigned i(0xFF0000FF), j(0x0000FFFF); + // The library's << operator recognizes base flags. + std::cout.flags(std::ios::hex | std::ios::showbase); + std::cout << (i & j) << '\n' + << (i | j) << '\n' + << (i ^ j) << '\n' + // Shift distances are ordinary unsigned ints. + << (j << 21) << '\n' + << (j >> 10) << '\n'; + std::cout.flags(std::ios::dec); + + // Let's do some heavy lifting and calculate powers of 314. + int maxPower = 10; + BigUnsigned x(1), big314(314); + for (int power = 0; power <= maxPower; power++) { + std::cout << "314^" << power << " = " << x << std::endl; + x *= big314; // A BigInteger assignment operator + } + + // Some big-integer algorithms (albeit on small integers). + std::cout << gcd(BigUnsigned(60), 72) << '\n' + << modinv(BigUnsigned(7), 11) << '\n' + << modexp(BigUnsigned(314), 159, 2653) << std::endl; + + // Add your own code here to experiment with the library. + } catch(char const* err) { + std::cout << "The library threw an exception:\n" + << err << std::endl; + } + + return 0; +} + +/* +The original sample program produces this output: + +3141592653589793238462643383279 +314424 +313894 +83252135 +1185 +134 +0xFF +0xFF00FFFF +0xFF00FF00 +0x1FFFE00000 +0x3F +314^0 = 1 +314^1 = 314 +314^2 = 98596 +314^3 = 30959144 +314^4 = 9721171216 +314^5 = 3052447761824 +314^6 = 958468597212736 +314^7 = 300959139524799104 +314^8 = 94501169810786918656 +314^9 = 29673367320587092457984 +314^10 = 9317437338664347031806976 +12 +8 +1931 + +*/ diff --git a/OTLib/bigint/testsuite.cc b/OTLib/bigint/testsuite.cc new file mode 100755 index 000000000..7cb9768e6 --- /dev/null +++ b/OTLib/bigint/testsuite.cc @@ -0,0 +1,326 @@ +/* Test suite for the library. First, it ``tests'' that all the constructs it + * uses compile successfully. Then, its output to stdout is compared to the + * expected output automatically extracted from slash-slash comments below. + * + * NOTE: For now, the test suite expects a 32-bit system. On others, some tests + * may fail, and it may be ineffective at catching bugs. TODO: Remedy this. */ + +#include "BigIntegerLibrary.hh" + +#include +#include +using namespace std; + +// Evaluate expr and print the result or "error" as appropriate. +#define TEST(expr) do {\ + cout << "Line " << __LINE__ << ": ";\ + try {\ + cout << (expr);\ + } catch (const char *err) {\ + cout << "error";\ + }\ + cout << endl;\ +} while (0) + +const BigUnsigned &check(const BigUnsigned &x) { + unsigned int l = x.getLength(); + if (l != 0 && x.getBlock(l-1) == 0) + cout << "check: Unzapped number!" << endl; + if (l > x.getCapacity()) + cout << "check: Capacity inconsistent with length!" << endl; + return x; +} + +const BigInteger &check(const BigInteger &x) { + if (x.getSign() == 0 && !x.getMagnitude().isZero()) + cout << "check: Sign should not be zero!" << endl; + if (x.getSign() != 0 && x.getMagnitude().isZero()) + cout << "check: Sign should be zero!" << endl; + check(x.getMagnitude()); + return x; +} + +short pathologicalShort = ~((unsigned short)(~0) >> 1); +int pathologicalInt = ~((unsigned int)(~0) >> 1); +long pathologicalLong = ~((unsigned long)(~0) >> 1); + +int main() { + +try { + +BigUnsigned z(0), one(1), ten(10); +TEST(z); //0 +TEST(1); //1 +TEST(10); //10 + +// TODO: Comprehensively test the general and special cases of each function. + +// === Default constructors === + +TEST(check(BigUnsigned())); //0 +TEST(check(BigInteger())); //0 + +// === Block-array constructors === + +BigUnsigned::Blk myBlocks[3]; +myBlocks[0] = 3; +myBlocks[1] = 4; +myBlocks[2] = 0; +BigUnsigned bu(myBlocks, 3); +TEST(check(bu)); //17179869187 +TEST(check(BigInteger(myBlocks, 3))); //17179869187 +TEST(check(BigInteger(bu ))); //17179869187 + +// For nonzero magnitude, reject zero and invalid signs. +TEST(check(BigInteger(myBlocks, 3, BigInteger::positive))); //17179869187 +TEST(check(BigInteger(myBlocks, 3, BigInteger::negative))); //-17179869187 +TEST(check(BigInteger(myBlocks, 3, BigInteger::zero ))); //error +TEST(check(BigInteger(bu, BigInteger::positive))); //17179869187 +TEST(check(BigInteger(bu, BigInteger::negative))); //-17179869187 +TEST(check(BigInteger(bu, BigInteger::zero ))); //error + +// For zero magnitude, force the sign to zero without error. +BigUnsigned::Blk myZeroBlocks[1]; +myZeroBlocks[0] = 0; +TEST(check(BigInteger(myZeroBlocks, 1, BigInteger::positive))); //0 +TEST(check(BigInteger(myZeroBlocks, 1, BigInteger::negative))); //0 +TEST(check(BigInteger(myZeroBlocks, 1, BigInteger::zero ))); //0 + +// === BigUnsigned conversion limits === + +TEST(BigUnsigned(0).toUnsignedLong()); //0 +TEST(BigUnsigned(4294967295U).toUnsignedLong()); //4294967295 +TEST(stringToBigUnsigned("4294967296").toUnsignedLong()); //error + +TEST(BigUnsigned(0).toLong()); //0 +TEST(BigUnsigned(2147483647).toLong()); //2147483647 +TEST(BigUnsigned(2147483648U).toLong()); //error + +// int is the same as long on a 32-bit system +TEST(BigUnsigned(0).toUnsignedInt()); //0 +TEST(BigUnsigned(4294967295U).toUnsignedInt()); //4294967295 +TEST(stringToBigUnsigned("4294967296").toUnsignedInt()); //error + +TEST(BigUnsigned(0).toInt()); //0 +TEST(BigUnsigned(2147483647).toInt()); //2147483647 +TEST(BigUnsigned(2147483648U).toInt()); //error + +TEST(BigUnsigned(0).toUnsignedShort()); //0 +TEST(BigUnsigned(65535).toUnsignedShort()); //65535 +TEST(BigUnsigned(65536).toUnsignedShort()); //error + +TEST(BigUnsigned(0).toShort()); //0 +TEST(BigUnsigned(32767).toShort()); //32767 +TEST(BigUnsigned(32768).toShort()); //error + +// === BigInteger conversion limits === + +TEST(BigInteger(-1).toUnsignedLong()); //error +TEST(BigInteger(0).toUnsignedLong()); //0 +TEST(BigInteger(4294967295U).toUnsignedLong()); //4294967295 +TEST(stringToBigInteger("4294967296").toUnsignedLong()); //error + +TEST(stringToBigInteger("-2147483649").toLong()); //error +TEST(stringToBigInteger("-2147483648").toLong()); //-2147483648 +TEST(BigInteger(-2147483647).toLong()); //-2147483647 +TEST(BigInteger(0).toLong()); //0 +TEST(BigInteger(2147483647).toLong()); //2147483647 +TEST(BigInteger(2147483648U).toLong()); //error + +// int is the same as long on a 32-bit system +TEST(BigInteger(-1).toUnsignedInt()); //error +TEST(BigInteger(0).toUnsignedInt()); //0 +TEST(BigInteger(4294967295U).toUnsignedInt()); //4294967295 +TEST(stringToBigInteger("4294967296").toUnsignedInt()); //error + +TEST(stringToBigInteger("-2147483649").toInt()); //error +TEST(stringToBigInteger("-2147483648").toInt()); //-2147483648 +TEST(BigInteger(-2147483647).toInt()); //-2147483647 +TEST(BigInteger(0).toInt()); //0 +TEST(BigInteger(2147483647).toInt()); //2147483647 +TEST(BigInteger(2147483648U).toInt()); //error + +TEST(BigInteger(-1).toUnsignedShort()); //error +TEST(BigInteger(0).toUnsignedShort()); //0 +TEST(BigInteger(65535).toUnsignedShort()); //65535 +TEST(BigInteger(65536).toUnsignedShort()); //error + +TEST(BigInteger(-32769).toShort()); //error +TEST(BigInteger(-32768).toShort()); //-32768 +TEST(BigInteger(-32767).toShort()); //-32767 +TEST(BigInteger(0).toShort()); //0 +TEST(BigInteger(32767).toShort()); //32767 +TEST(BigInteger(32768).toShort()); //error + +// === Negative BigUnsigneds === + +// ...during construction +TEST(BigUnsigned(short(-1))); //error +TEST(BigUnsigned(pathologicalShort)); //error +TEST(BigUnsigned(-1)); //error +TEST(BigUnsigned(pathologicalInt)); //error +TEST(BigUnsigned(long(-1))); //error +TEST(BigUnsigned(pathologicalLong)); //error + +// ...during subtraction +TEST(BigUnsigned(5) - BigUnsigned(6)); //error +TEST(stringToBigUnsigned("314159265358979323") - stringToBigUnsigned("314159265358979324")); //error +TEST(check(BigUnsigned(5) - BigUnsigned(5))); //0 +TEST(check(stringToBigUnsigned("314159265358979323") - stringToBigUnsigned("314159265358979323"))); //0 +TEST(check(stringToBigUnsigned("4294967296") - BigUnsigned(1))); //4294967295 + +// === BigUnsigned addition === + +TEST(check(BigUnsigned(0) + 0)); //0 +TEST(check(BigUnsigned(0) + 1)); //1 +// Ordinary carry +TEST(check(stringToBigUnsigned("8589934591" /* 2^33 - 1*/) + + stringToBigUnsigned("4294967298" /* 2^32 + 2 */))); //12884901889 +// Creation of a new block +TEST(check(BigUnsigned(0xFFFFFFFFU) + 1)); //4294967296 + +// === BigUnsigned subtraction === + +TEST(check(BigUnsigned(1) - 0)); //1 +TEST(check(BigUnsigned(1) - 1)); //0 +TEST(check(BigUnsigned(2) - 1)); //1 +// Ordinary borrow +TEST(check(stringToBigUnsigned("12884901889") + - stringToBigUnsigned("4294967298"))); //8589934591 +// Borrow that removes a block +TEST(check(stringToBigUnsigned("4294967296") - 1)); //4294967295 + +// === BigUnsigned multiplication and division === + +BigUnsigned a = check(BigUnsigned(314159265) * 358979323); +TEST(a); //112776680263877595 +TEST(a / 123); //916883579381118 +TEST(a % 123); //81 + +TEST(BigUnsigned(5) / 0); //error + +// === Block accessors === + +BigUnsigned b; +TEST(b); //0 +TEST(b.getBlock(0)); //0 +b.setBlock(1, 314); +// Did b grow properly? And did we zero intermediate blocks? +TEST(check(b)); //1348619730944 +TEST(b.getLength()); //2 +TEST(b.getBlock(0)); //0 +TEST(b.getBlock(1)); //314 +// Did b shrink properly? +b.setBlock(1, 0); +TEST(check(b)); //0 + +BigUnsigned bb(314); +bb.setBlock(1, 159); +// Make sure we used allocateAndCopy, not allocate +TEST(bb.getBlock(0)); //314 +TEST(bb.getBlock(1)); //159 +// Blocks beyond the number should be zero regardless of whether they are +// within the capacity. +bb.add(1, 2); +TEST(bb.getBlock(0)); //3 +TEST(bb.getBlock(1)); //0 +TEST(bb.getBlock(2)); //0 +TEST(bb.getBlock(314159)); //0 + +// === Bit accessors === + +TEST(BigUnsigned(0).bitLength()); //0 +TEST(BigUnsigned(1).bitLength()); //1 +TEST(BigUnsigned(4095).bitLength()); //12 +TEST(BigUnsigned(4096).bitLength()); //13 +// 5 billion is between 2^32 (about 4 billion) and 2^33 (about 8 billion). +TEST(stringToBigUnsigned("5000000000").bitLength()); //33 + +// 25 is binary 11001. +BigUnsigned bbb(25); +TEST(bbb.getBit(4)); //1 +TEST(bbb.getBit(3)); //1 +TEST(bbb.getBit(2)); //0 +TEST(bbb.getBit(1)); //0 +TEST(bbb.getBit(0)); //1 +TEST(bbb.bitLength()); //5 +// Effectively add 2^32. +bbb.setBit(32, true); +TEST(bbb); //4294967321 +bbb.setBit(31, true); +bbb.setBit(32, false); +TEST(check(bbb)); //2147483673 + +// === Combining BigUnsigned, BigInteger, and primitive integers === + +BigUnsigned p1 = BigUnsigned(3) * 5; +TEST(p1); //15 +/* In this case, we would like g++ to implicitly promote the BigUnsigned to a + * BigInteger, but it seems to prefer converting the -5 to a BigUnsigned, which + * causes an error. If I take out constructors for BigUnsigned from signed + * primitive integers, the BigUnsigned(3) becomes ambiguous, and if I take out + * all the constructors but BigUnsigned(unsigned long), g++ uses that + * constructor and gets a wrong (positive) answer. Thus, I think we'll just + * have to live with this cast. */ +BigInteger p2 = BigInteger(BigUnsigned(3)) * -5; +TEST(p2); //-15 + +// === Test some previous bugs === + +{ + /* Test that BigInteger division sets the sign to zero. + * Bug reported by David Allen. */ + BigInteger num(3), denom(5), quotient; + num.divideWithRemainder(denom, quotient); + check(quotient); + num = 5; + num.divideWithRemainder(denom, quotient); + check(num); +} + +{ + /* Test that BigInteger subtraction sets the sign properly. + * Bug reported by Samuel Larkin. */ + BigInteger zero(0), three(3), ans; + ans = zero - three; + TEST(check(ans).getSign()); //-1 +} + +{ + /* Test that BigInteger multiplication shifts bits properly on systems + * where long is bigger than int. (Obviously, this would only catch the + * bug when run on such a system.) + * Bug reported by Mohand Mezmaz. */ + BigInteger f=4; f*=3; + TEST(check(f)); //12 +} + +{ + /* Test that bitwise XOR allocates the larger length. + * Bug reported by Sriram Sankararaman. */ + BigUnsigned a(0), b(3), ans; + ans = a ^ b; + TEST(ans); //3 +} + +{ + /* Test that an aliased multiplication works. + * Bug reported by Boris Dessy. */ + BigInteger num(5); + num *= num; + TEST(check(num)); //25 +} + +{ + /* Test that BigUnsignedInABase(std::string) constructor rejects digits + * too big for the specified base. + * Bug reported by Niakam Kazemi. */ + TEST(BigUnsignedInABase("f", 10)); //error +} + +} catch (const char *err) { + cout << "UNCAUGHT ERROR: " << err << endl; +} + +return 0; +} diff --git a/OTLib/buildproto b/OTLib/buildproto new file mode 100755 index 000000000..63b7fd3f2 --- /dev/null +++ b/OTLib/buildproto @@ -0,0 +1,5 @@ +protoc --cpp_out=. *.proto +mv Bitcoin.pb.cc Bitcoin.pb.cpp +mv Generics.pb.cc Generics.pb.cpp +mv Markets.pb.cc Markets.pb.cpp +mv Moneychanger.pb.cc Moneychanger.pb.cpp diff --git a/OTLib/containers/containers.hpp b/OTLib/containers/containers.hpp new file mode 100644 index 000000000..1363b6d5c --- /dev/null +++ b/OTLib/containers/containers.hpp @@ -0,0 +1,23 @@ +#ifndef STLPLUS_CONTAINERS +#define STLPLUS_CONTAINERS +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// Allows all the STLplus containers to be included in one go + +//////////////////////////////////////////////////////////////////////////////// + +#include "digraph.hpp" +#include "foursome.hpp" +#include "hash.hpp" +#include "matrix.hpp" +#include "ntree.hpp" +#include "smart_ptr.hpp" +#include "triple.hpp" + +//////////////////////////////////////////////////////////////////////////////// +#endif diff --git a/OTLib/containers/containers_fixes.hpp b/OTLib/containers/containers_fixes.hpp new file mode 100644 index 000000000..75ceb1d4a --- /dev/null +++ b/OTLib/containers/containers_fixes.hpp @@ -0,0 +1,132 @@ +#ifndef STLPLUS_CONTAINERS_FIXES +#define STLPLUS_CONTAINERS_FIXES +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// Contains work arounds for OS or Compiler specific problems with container +// templates + +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Unnecessary compiler warnings +//////////////////////////////////////////////////////////////////////////////// + +#ifdef _MSC_VER +// Microsoft Visual Studio +// shut up the following irritating warnings +// 4786 - VC6, identifier string exceeded maximum allowable length and was truncated (only affects debugger) +// 4305 - VC6, identifier type was converted to a smaller type +// 4503 - VC6, decorated name was longer than the maximum the compiler allows (only affects debugger) +// 4309 - VC6, type conversion operation caused a constant to exceeded the space allocated for it +// 4290 - VC6, C++ exception specification ignored +// 4800 - VC6, forcing value to bool 'true' or 'false' (performance warning) +// 4355 - VC6, 'this' : used in base member initializer list +// 4675 - VC7.1, "change" in function overload resolution _might_ have altered program +// 4996 - VC8, 'xxxx' was declared deprecated +#pragma warning(disable: 4786 4305 4503 4309 4290 4800 4355 4675 4996) +#endif + +#ifdef __BORLANDC__ +// Borland +// Shut up the following irritating warnings +// 8026 - Functions with exception specifications are not expanded inline +// 8027 - Functions with xxx are not expanded inline +#pragma warn -8026 +#pragma warn -8027 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Problems with the typename keyword +//////////////////////////////////////////////////////////////////////////////// + +// There are problems with using the 'typename' keyword. Technically, if you +// use a type member of a template class (i.e. a type declared within the +// template class by a local typedef), you need to tell the compiler that it +// is a type name. This is because the compiler cannot work out whether a +// member is a type, a method or a data field at compile time. However, +// support for the typename keyword has traditionally been incomplete in both +// gcc and Visual Studio. I have used macros to try to resolve this issue. The +// macros add the keyword for compiler versions that require it and omit it +// for compiler versions that do not support it + +// There are five places where typename keywords cause problems: +// +// 1) in a typedef where a template class's member type is being mapped onto +// a type definition within another template class or function +// e.g. template fn () { +// typedef typename someclass::member_type local_type; +// ^^^^^^^^ +// 2) in a function parameter declaration, with similar rules to the above +// e.g. template fn (typename someclass::member_type) +// ^^^^^^^^ +// 3) in instantiating a template, the parameter to the template, with similar rules to the above +// e.g. template_class::member_type> +// ^^^^^^^^ +// 4) Return expressions +// e.g. return typename ntree::const_iterator(this,m_root); +// ^^^^^^^^ +// 5) Creating temporary objects when passing arguments to a function or constructor +// e.g. return typename ntree::const_prefix_iterator(typename ntree::const_iterator(this,m_root)); +// ^^^^^^^^ +// Note that the typename keyword is only required when the type being referred to is a member of a template class +// +// So far it *seems* as if all compilers either require all of them or none of +// them, so this set of situations can be handled by a single macro + +// default values, overridden for individual problem cases below +#define TYPENAME typename + +// GCC +// - pre-version 3 didn't handle typename in any of these cases +// - version 3 onwards, typename is required for all three cases as per default +#ifdef __GNUC__ +#if __GNUC__ < 3 +#undef TYPENAME +#define TYPENAME +#endif +#endif + +// Visual Studio +// - version 6 (compiler v.12) cannot handle typename in any of these cases +// - version 7 (.NET) (compiler v.13) requires a typename in a parameter specification but supports all +// - version 8 (2005) (compiler v.14) requires parameters and templates, supports all +#ifdef _MSC_VER +#if _MSC_VER <= 1200 +#undef TYPENAME +#define TYPENAME +#endif +#endif + +// Borland +// - doesn't handle typename in 5.5, does in 5.82, not sure about other cases +#ifdef __BORLANDC__ +#if __BORLANDC__ <= 0x550 +#undef TYPENAME +#define TYPENAME +#endif +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Member templates +// e.g. a template function in a template class + +// Not all compilers support them - this fix can be used to disable member +// templates for compilers that don't. Unfortunately that means that some +// functionality will be missing for those compilers. + +#define STLPLUS_MEMBER_TEMPLATES + +// Visual Studio v6 (compiler version 12) does not support them +#ifdef _MSC_VER +#if _MSC_VER <= 1200 +#undef STLPLUS_MEMBER_TEMPLATES +#endif +#endif + +//////////////////////////////////////////////////////////////////////////////// +#endif diff --git a/OTLib/containers/copy_functors.hpp b/OTLib/containers/copy_functors.hpp new file mode 100644 index 000000000..ce530b831 --- /dev/null +++ b/OTLib/containers/copy_functors.hpp @@ -0,0 +1,66 @@ +#ifndef STLPLUS_COPY_FUNCTORS +#define STLPLUS_COPY_FUNCTORS +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// The function constructor classes below are used by the smart_ptr and the +// simple_ptr classes. They provide three (well ok, two) copying mechanisms. +// These classes have been separated from the smart_ptr header by DJDM, as +// the simple_ptr classes now also use them. + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // copy functors implementing the three possible copy semantics + + // constructor_copy uses the copy constructor of the object - used for simple types + + template + class constructor_copy + { + public: + T* operator() (const T& from) throw() + { + return new T(from); + } + }; + + // clone_copy uses the clone method of the object - used for polymorphic types + + template + class clone_copy + { + public: + T* operator() (const T& from) throw() + { + return from.clone(); + } + }; + + // no_copy throws an exception - used for types that cannot be copied + + template + class no_copy + { + public: + T* operator() (const T& from) throw(illegal_copy) + { + throw illegal_copy("no_copy functor called"); + return 0; + } + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#endif diff --git a/OTLib/containers/digraph.hpp b/OTLib/containers/digraph.hpp new file mode 100644 index 000000000..e4ffb5fd7 --- /dev/null +++ b/OTLib/containers/digraph.hpp @@ -0,0 +1,507 @@ +#ifndef STLPLUS_DIGRAPH +#define STLPLUS_DIGRAPH +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// STL-style Directed graph template component +// Digraph stands for directed-graph, i.e. all arcs have a direction + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "safe_iterator.hpp" +#include "exceptions.hpp" +#include +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // Internals + + template class digraph_node; + template class digraph_arc; + template class digraph; + + //////////////////////////////////////////////////////////////////////////////// + // The Digraph iterator classes + // a digraph_iterator points to a node whilst a digraph_arc_iterator points to an arc + // Note that these are redefined as: + // digraph::iterator - points to a non-const node + // digraph::const_iterator - points to a const node + // digraph::arc_iterator - points to a non-const arc + // digraph::const_arc_iterator - points to a const arc + // and this is the form in which they should be used + + template + class digraph_iterator : public safe_iterator, digraph_node > + { + public: + friend class digraph; + + // local type definitions + // an iterator points to an object whilst a const_iterator points to a const object + typedef digraph_iterator iterator; + typedef digraph_iterator const_iterator; + typedef digraph_iterator this_iterator; + typedef NRef reference; + typedef NPtr pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + digraph_iterator(void); + ~digraph_iterator(void); + + // Type conversion methods allow const_iterator and iterator to be converted + // convert an iterator/const_iterator to a const_iterator + const_iterator constify(void) const; + // convert an iterator/const_iterator to an iterator + iterator deconstify(void) const; + + // increment/decrement operators used to step through the set of all nodes in a graph + // it is only legal to increment a valid iterator + // pre-increment + this_iterator& operator ++ (void) + throw(null_dereference,end_dereference); + // post-increment + this_iterator operator ++ (int) + throw(null_dereference,end_dereference); + // pre-decrement + this_iterator& operator -- (void) + throw(null_dereference,end_dereference); + // post-decrement + this_iterator operator -- (int) + throw(null_dereference,end_dereference); + + // test useful for testing whether iteration has completed and for inclusion in other containers + // Note: this class also inherits the safe_iterator methods: valid(), null(), end() + bool operator == (const this_iterator& r) const; + bool operator != (const this_iterator& r) const; + bool operator < (const this_iterator& r) const; + + // access the node data - a const_iterator gives you a const element, an iterator a non-const element + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + public: + // constructor used by digraph to create a non-null iterator + explicit digraph_iterator(digraph_node* node); + // constructor used by digraph to create an end iterator + explicit digraph_iterator(const digraph* owner); + // used to create an alias of an iterator + explicit digraph_iterator(const safe_iterator, digraph_node >& iterator); + }; + + //////////////////////////////////////////////////////////////////////////////// + + template + class digraph_arc_iterator : public safe_iterator, digraph_arc > + { + public: + friend class digraph; + + // local type definitions + // an iterator points to an object whilst a const_iterator points to a const object + typedef digraph_arc_iterator iterator; + typedef digraph_arc_iterator const_iterator; + typedef digraph_arc_iterator this_iterator; + typedef ARef reference; + typedef APtr pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + digraph_arc_iterator(void); + ~digraph_arc_iterator(void); + + // Type conversion methods allow const_iterator and iterator to be converted + // convert an iterator/const_iterator to a const_iterator + const_iterator constify(void) const; + // convert an iterator/const_iterator to an iterator + iterator deconstify(void) const; + + // increment/decrement operators used to step through the set of all nodes in a graph + // it is only legal to increment a valid iterator + // pre-increment + this_iterator& operator ++ (void) + throw(null_dereference,end_dereference); + // post-increment + this_iterator operator ++ (int) + throw(null_dereference,end_dereference); + // pre-decrement + this_iterator& operator -- (void) + throw(null_dereference,end_dereference); + // post-decrement + this_iterator operator -- (int) + throw(null_dereference,end_dereference); + + // test useful for testing whether iteration has completed and for inclusion in other containers + // Note: this class also inherits the safe_iterator methods: valid(), null(), end() + bool operator == (const this_iterator&) const; + bool operator != (const this_iterator&) const; + bool operator < (const this_iterator&) const; + + // access the node data - a const_iterator gives you a const element, an iterator a non-const element + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + public: + // constructor used by digraph to create a non-null iterator + explicit digraph_arc_iterator(digraph_arc* arc); + // constructor used by digraph to create an end iterator + explicit digraph_arc_iterator(const digraph* owner); + // used to create an alias of an iterator + explicit digraph_arc_iterator(const safe_iterator, digraph_arc >& iterator); + }; + + //////////////////////////////////////////////////////////////////////////////// + // The Graph class + // NT is the Node type and AT is the Arc type + //////////////////////////////////////////////////////////////////////////////// + + template + class digraph + { + public: + // STL-like typedefs for the types and iterators + typedef NT node_type; + typedef AT arc_type; + typedef digraph_iterator iterator; + typedef digraph_iterator const_iterator; + typedef digraph_arc_iterator arc_iterator; + typedef digraph_arc_iterator const_arc_iterator; + + // supplementary types used throughout + + // a path is represented as a vector of arcs so the forward traversal is + // done by going from begin() to end() or 0 to size-1 - of course a backward + // traversal can be done by traversing the vector backwards + typedef std::vector arc_vector; + typedef std::vector const_arc_vector; + const_arc_vector constify_arcs(const arc_vector&) const + throw(wrong_object,null_dereference,end_dereference); + arc_vector deconstify_arcs(const const_arc_vector&) const + throw(wrong_object,null_dereference,end_dereference); + + // a path vector is a vector of paths used to represent all the paths from one node to another + // there is no particular ordering to the paths in the vector + typedef std::vector path_vector; + typedef std::vector const_path_vector; + const_path_vector constify_paths(const path_vector&) const + throw(wrong_object,null_dereference,end_dereference); + path_vector deconstify_paths(const const_path_vector&) const + throw(wrong_object,null_dereference,end_dereference); + + // a node vector is a simple vector of nodes used to represent the reachable sets + // there is no particular ordering to the nodes in the vector + typedef std::vector node_vector; + typedef std::vector const_node_vector; + const_node_vector constify_nodes(const node_vector&) const + throw(wrong_object,null_dereference,end_dereference); + node_vector deconstify_nodes(const const_node_vector&) const + throw(wrong_object,null_dereference,end_dereference); + + // callback used in the path algorithms to select which arcs to consider + typedef bool (*arc_select_fn) (const digraph&, const_arc_iterator); + + // a value representing an unknown offset + // Note that it's static so use in the form digraph::npos() + static unsigned npos(void); + + ////////////////////////////////////////////////////////////////////////// + // Constructors, destructors and copies + + digraph(void); + ~digraph(void); + + // copy constructor and assignment both copy the graph + digraph(const digraph&); + digraph& operator=(const digraph&); + + ////////////////////////////////////////////////////////////////////////// + // Basic Node functions + // Nodes are referred to by iterators created when the node is inserted. + // Iterators remain valid unless the node is erased (they are list iterators, so no resize problems) + // It is also possible to walk through all the nodes using a list-like start() to end() loop + // Each node has a set of input arcs and output arcs. These are indexed by an unsigned i.e. they form a vector. + // The total number of inputs is the fanin and the total number of outputs is the fanout. + // The contents of the node (type NT) are accessed, of course, by dereferencing the node iterator. + + // tests for the number of nodes and the special test for zero nodes + bool empty(void) const; + unsigned size(void) const; + + // add a new node and return its iterator + iterator insert(const NT& node_data); + + // remove a node and return the iterator to the next node + // erasing a node erases its arcs + iterator erase(iterator) + throw(wrong_object,null_dereference,end_dereference); + // remove all nodes + void clear(void); + + // traverse all the nodes in no particular order using STL-style iteration + const_iterator begin(void) const; + iterator begin(void); + const_iterator end(void) const; + iterator end(void); + + // access the inputs of this node + // the fanin is the number of inputs and the inputs are accessed using an index from 0..fanin-1 + unsigned fanin(const_iterator) const + throw(wrong_object,null_dereference,end_dereference); + unsigned fanin(iterator) + throw(wrong_object,null_dereference,end_dereference); + const_arc_iterator input(const_iterator, unsigned) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + arc_iterator input(iterator, unsigned) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + // access the outputs of this node + // the fanout is the number of outputs and the outputs are accessed using an index from 0..fanout-1 + unsigned fanout(const_iterator) const + throw(wrong_object,null_dereference,end_dereference); + unsigned fanout(iterator) + throw(wrong_object,null_dereference,end_dereference); + const_arc_iterator output(const_iterator, unsigned) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + arc_iterator output(iterator, unsigned) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + // convenience routines for getting the set of all inputs or all outputs as vectors + const_arc_vector inputs(const_iterator) const + throw(wrong_object,null_dereference,end_dereference); + arc_vector inputs(iterator) + throw(wrong_object,null_dereference,end_dereference); + const_arc_vector outputs(const_iterator) const + throw(wrong_object,null_dereference,end_dereference); + arc_vector outputs(iterator) + throw(wrong_object,null_dereference,end_dereference); + + // find the output index of an arc which goes from this node + // returns digraph::npos if the arc is not an output of from + unsigned output_offset(const_iterator from, const_arc_iterator arc) const + throw(wrong_object,null_dereference,end_dereference); + unsigned output_offset(iterator from, arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference); + // ditto for an input arc + unsigned input_offset(const_iterator to, const_arc_iterator arc) const + throw(wrong_object,null_dereference,end_dereference); + unsigned input_offset(iterator to, arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference); + + ////////////////////////////////////////////////////////////////////////// + // Basic Arc functions + // to avoid name conflicts, arc functions have the arc_ prefix + // Arcs, like nodes, are referred to by a list iterator which is returned by the arc_insert function + // They may also be visited from arc_begin() to arc_end() + // Each arc has a from field and a to field which contain the node iterators of the endpoints of the arc + // Of course, the arc data can be accessed by simply dereferencing the iterator + + // tests for the number of arcs and the special test for zero arcs + bool arc_empty (void) const; + unsigned arc_size(void) const; + + // add a new arc and return its iterator + arc_iterator arc_insert(iterator from, iterator to, const AT& arc_data = AT()) + throw(wrong_object,null_dereference,end_dereference); + + // remove an arc and return the iterator to the next arc + arc_iterator arc_erase(arc_iterator) + throw(wrong_object,null_dereference,end_dereference); + // remove all arcs + void arc_clear(void); + + // traverse all the arcs in no particular order using STL-style iteration + const_arc_iterator arc_begin(void) const; + arc_iterator arc_begin(void); + const_arc_iterator arc_end(void) const; + arc_iterator arc_end(void); + + // find the node that an arc points from or to + const_iterator arc_from(const_arc_iterator) const + throw(wrong_object,null_dereference,end_dereference); + iterator arc_from(arc_iterator) + throw(wrong_object,null_dereference,end_dereference); + const_iterator arc_to(const_arc_iterator) const + throw(wrong_object,null_dereference,end_dereference); + iterator arc_to(arc_iterator) + throw(wrong_object,null_dereference,end_dereference); + + // reconnect an arc to a different from and to node + void arc_move(arc_iterator arc, iterator from, iterator to) + throw(wrong_object,null_dereference,end_dereference); + // reconnect just the from node + void arc_move_from(arc_iterator arc, iterator from) + throw(wrong_object,null_dereference,end_dereference); + // reconnect just the to node + void arc_move_to(arc_iterator arc, iterator to) + throw(wrong_object,null_dereference,end_dereference); + // reverse the arc direction so that to becomes from and vice-versa + void arc_flip(arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference); + + //////////////////////////////////////////////////////////////////////////////// + // Adjacency algorithms + + // test whether the nodes are adjacent i.e. whether there is an arc going from from to to + bool adjacent(const_iterator from, const_iterator to) const + throw(wrong_object,null_dereference,end_dereference); + bool adjacent(iterator from, iterator to) + throw(wrong_object,null_dereference,end_dereference); + + // as above, but returns the arc that makes the nodes adjacent + // returns the first arc if there's more than one, returns arc_end() if there are none + const_arc_iterator adjacent_arc(const_iterator from, const_iterator to) const + throw(wrong_object,null_dereference,end_dereference); + arc_iterator adjacent_arc(iterator from, iterator to) + throw(wrong_object,null_dereference,end_dereference); + + // as above, but returns the set of all arcs that make two nodes adjacent (there may be more than one) + // returns an empty vector if there are none + const_arc_vector adjacent_arcs(const_iterator from, const_iterator to) const + throw(wrong_object,null_dereference,end_dereference); + arc_vector adjacent_arcs(iterator from, iterator to) + throw(wrong_object,null_dereference,end_dereference); + + // return the adjacency sets for the node inputs or outputs, i.e. the set of nodes adjacent to this node + // each adjacent node will only be entered once even if there are multiple arcs between the nodes + const_node_vector input_adjacencies(const_iterator to) const + throw(wrong_object,null_dereference,end_dereference); + node_vector input_adjacencies(iterator to) + throw(wrong_object,null_dereference,end_dereference); + const_node_vector output_adjacencies(const_iterator from) const + throw(wrong_object,null_dereference,end_dereference); + node_vector output_adjacencies(iterator from) + throw(wrong_object,null_dereference,end_dereference); + + //////////////////////////////////////////////////////////////////////////////// + // Topographical Sort Algorithm + // This generates a node ordering such that each node is visited after its fanin nodes. + + // This only generates a valid ordering for a DAG. + + // The return value is a pair : + // - the node vector which is a set of iterators to the nodes in sorted order + // - the arc vector is the set of backward ards that were broken to achieve the sort + // If the arc vector is empty then the graph formed a DAG. + + // The arc selection callback can be used to ignore arcs that are not part + // of the ordering, i.e. arcs that are meant to be backwards arcs + + std::pair sort(arc_select_fn = 0) const; + std::pair sort(arc_select_fn = 0); + + // Simplified variant of above for graphs that are known to be DAGs. + // If the sort fails due to backward arcs, the + // return vector is empty. Note that this will also be empty if the graph + // has no nodes in it, so use the empty() method to differentiate. + + const_node_vector dag_sort(arc_select_fn = 0) const; + node_vector dag_sort(arc_select_fn = 0); + + //////////////////////////////////////////////////////////////////////////////// + // Basic Path Algorithms + // A path is a series of arcs - you can use arc_from and arc_to to convert + // that into a series of nodes. All the path algorithms take an arc_select + // which allows arcs to be selected or rejected for consideration in a path. + + // A selection callback function is applied to each arc in the traversal and + // returns true if the arc is to be selected and false if the arc is to be + // rejected. If no function is provided the arc is selected. If you want to + // use arc selection you should create a function with the type profile given + // by the arc_select_fn type. The select function is passed both the graph and + // the arc iterator so that it is possible to select an arc on the basis of + // the nodes it is connected to. + + // Note: I used a callback because the STL-like predicate idea wasn't working for me... + + // test for the existence of a path from from to to + bool path_exists(const_iterator from, const_iterator to, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + bool path_exists(iterator from, iterator to, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + // get the set of all paths from from to to + const_path_vector all_paths(const_iterator from, const_iterator to, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + path_vector all_paths(iterator from, iterator to, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + // get the set of all nodes that can be reached by any path from from + const_node_vector reachable_nodes(const_iterator from, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + node_vector reachable_nodes(iterator from, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + // get the set of all nodes that can reach to to by any path + const_node_vector reaching_nodes(const_iterator to, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + node_vector reaching_nodes(iterator to, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + //////////////////////////////////////////////////////////////////////////////// + // Unweighted Shortest path algorithms + + // find the shortest path from from to to + // This is an unweighted shortest path algorithm, i.e. the weight of each + // arc is assumed to be 1, so just counts the number of arcs + // if there is more than one shortest path it returns the first one + // If there are no paths, returns an empty path + const_arc_vector shortest_path(const_iterator from, const_iterator to, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + arc_vector shortest_path(iterator from, iterator to, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + // find the set of shortest paths from from to any other node in the graph + // that is reachable (i.e. for which path_exists() is true) + // This is an unweighted shortest path, so just counts the number of arcs + // if there is more than one shortest path to a node it returns the first one + // If there are no paths, returns an empty list + const_path_vector shortest_paths(const_iterator from, arc_select_fn = 0) const + throw(wrong_object,null_dereference,end_dereference); + path_vector shortest_paths(iterator from, arc_select_fn = 0) + throw(wrong_object,null_dereference,end_dereference); + + private: + friend class digraph_iterator; + friend class digraph_iterator; + friend class digraph_arc_iterator; + friend class digraph_arc_iterator; + + typedef std::set const_iterator_set; + typedef TYPENAME const_iterator_set::iterator const_iterator_set_iterator; + + bool path_exists_r(const_iterator from, const_iterator to, const_iterator_set& visited, arc_select_fn) const + throw(wrong_object,null_dereference,end_dereference); + + void all_paths_r(const_iterator from, const_iterator to, const_arc_vector& so_far, const_path_vector& result, arc_select_fn) const + throw(wrong_object,null_dereference,end_dereference); + + void reachable_nodes_r(const_iterator from, const_iterator_set& visited, arc_select_fn) const + throw(wrong_object,null_dereference,end_dereference); + + void reaching_nodes_r(const_iterator to, const_iterator_set& visited, arc_select_fn) const + throw(wrong_object,null_dereference,end_dereference); + + digraph_node* m_nodes_begin; + digraph_node* m_nodes_end; + digraph_arc* m_arcs_begin; + digraph_arc* m_arcs_end; + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "digraph.tpp" +#endif diff --git a/OTLib/containers/digraph.tpp b/OTLib/containers/digraph.tpp new file mode 100644 index 000000000..ea6f84e3d --- /dev/null +++ b/OTLib/containers/digraph.tpp @@ -0,0 +1,1483 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// Note: I tried to write this using STL lists for the node and arc lists, but +// it got far too hairy. The specific problem is that I wanted a digraph +// iterator to contain a list::iterator so I needed to be able to generate a +// list::iterator from a node or arc and STL list iterators don't give you that +// functionality. I tried burgling the data structures, but that was +// non-portable between different STL implementations so needed lots of #ifdefs +// and so was mind-bogglingly awful and unreadable - in other words a +// maintenance nightmare. I gave up and impemented my own lists - not difficult. + +// I use circular double-linked lists. The circular design means that both +// ends of the list are equally accessible in unit time. An empty list +// contains no objects. There is no end node in the list - unlike the STL +// lists which have a dummy node for end iterators to point to - +// conceptually the end iterator points one element beyond the end of the +// list. However, I implement the end iterator concept in the iterator +// itself, so do not need the dummy end node. + +//////////////////////////////////////////////////////////////////////////////// +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +// Internals + +namespace stlplus +{ + + template + class digraph_node + { + public: + master_iterator, digraph_node > m_master; + NT m_data; + digraph_node* m_prev; + digraph_node* m_next; + std::vector*> m_inputs; + std::vector*> m_outputs; + public: + digraph_node(const digraph* owner, const NT& d = NT()) : + m_master(owner,this), m_data(d), m_prev(0), m_next(0) + { + } + ~digraph_node(void) + { + } + }; + + template + class digraph_arc + { + public: + master_iterator, digraph_arc > m_master; + AT m_data; + digraph_arc* m_prev; + digraph_arc* m_next; + digraph_node* m_from; + digraph_node* m_to; + digraph_arc(const digraph* owner, digraph_node* from = 0, digraph_node* to = 0, const AT& d = AT()) : + m_master(owner,this), m_data(d), m_prev(0), m_next(0), m_from(from), m_to(to) + { + } + }; + + //////////////////////////////////////////////////////////////////////////////// + // Iterators + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // Node iterator + + // construct a null iterator + template + digraph_iterator::digraph_iterator(void) + { + } + + // valid iterator + template + digraph_iterator::digraph_iterator(digraph_node* node) : + safe_iterator,digraph_node >(node->m_master) + { + } + + // end iterator + template + digraph_iterator::digraph_iterator(const digraph* owner) : + safe_iterator,digraph_node >(owner) + { + } + + // alias an iterator + template + digraph_iterator::digraph_iterator(const safe_iterator, digraph_node >& iterator) : + safe_iterator,digraph_node >(iterator) + { + } + + // destructor + template + digraph_iterator::~digraph_iterator(void) + { + } + + template + TYPENAME digraph_iterator::const_iterator digraph_iterator::constify (void) const + { + return digraph_iterator(*this); + } + + template + TYPENAME digraph_iterator::iterator digraph_iterator::deconstify (void) const + { + return digraph_iterator(*this); + } + + template + TYPENAME digraph_iterator::this_iterator& digraph_iterator::operator ++ (void) + throw(null_dereference,end_dereference) + { + this->assert_valid(); + if (this->node()->m_next) + this->set(this->node()->m_next->m_master); + else + this->set_end(); + return *this; + } + + template + TYPENAME digraph_iterator::this_iterator digraph_iterator::operator ++ (int) + throw(null_dereference,end_dereference) + { + // post-increment is defined in terms of the pre-increment + digraph_iterator result(*this); + ++(*this); + return result; + } + + template + TYPENAME digraph_iterator::this_iterator& digraph_iterator::operator -- (void) + throw(null_dereference,end_dereference) + { + this->assert_valid(); + if (this->node()->m_prev) + this->set(this->node()->m_prev->m_master); + else + this->set_end(); + return *this; + } + + template + TYPENAME digraph_iterator::this_iterator digraph_iterator::operator -- (int) + throw(null_dereference,end_dereference) + { + // post-decrement is defined in terms of the pre-decrement + digraph_iterator result(*this); + --(*this); + return result; + } + + template + bool digraph_iterator::operator == (const TYPENAME digraph_iterator::this_iterator& r) const + { + return equal(r); + } + + template + bool digraph_iterator::operator != (const TYPENAME digraph_iterator::this_iterator& r) const + { + return !operator==(r); + } + + template + bool digraph_iterator::operator < (const TYPENAME digraph_iterator::this_iterator& r) const + { + return compare(r) < 0; + } + + template + TYPENAME digraph_iterator::reference digraph_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + this->assert_valid(); + return this->node()->m_data; + } + + template + TYPENAME digraph_iterator::pointer digraph_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return &(operator*()); + } + + //////////////////////////////////////////////////////////////////////////////// + // Arc Iterator + + template + digraph_arc_iterator::digraph_arc_iterator(void) + { + } + + // valid iterator + template + digraph_arc_iterator::digraph_arc_iterator(digraph_arc* arc) : + safe_iterator,digraph_arc >(arc->m_master) + { + } + + // end iterator + template + digraph_arc_iterator::digraph_arc_iterator(const digraph* owner) : + safe_iterator,digraph_arc >(owner) + { + } + + // alias an iterator + template + digraph_arc_iterator::digraph_arc_iterator(const safe_iterator, digraph_arc >& iterator) : + safe_iterator,digraph_arc >(iterator) + { + } + + template + digraph_arc_iterator::~digraph_arc_iterator(void) + { + } + + template + TYPENAME digraph_arc_iterator::const_iterator digraph_arc_iterator::constify (void) const + { + return digraph_arc_iterator(*this); + } + + template + TYPENAME digraph_arc_iterator::iterator digraph_arc_iterator::deconstify (void) const + { + return digraph_arc_iterator(*this); + } + + template + TYPENAME digraph_arc_iterator::this_iterator& digraph_arc_iterator::operator ++ (void) + throw(null_dereference,end_dereference) + { + this->assert_valid(); + if (this->node()->m_next) + this->set(this->node()->m_next->m_master); + else + this->set_end(); + return *this; + } + + template + TYPENAME digraph_arc_iterator::this_iterator digraph_arc_iterator::operator ++ (int) + throw(null_dereference,end_dereference) + { + // post-increment is defined in terms of the pre-increment + digraph_arc_iterator result(*this); + ++(*this); + return result; + } + + template + TYPENAME digraph_arc_iterator::this_iterator& digraph_arc_iterator::operator -- (void) + throw(null_dereference,end_dereference) + { + this->assert_valid(); + if (this->node()->m_prev) + this->set(this->node()->m_prev->m_master); + else + this->set_end(); + return *this; + } + + template + TYPENAME digraph_arc_iterator::this_iterator digraph_arc_iterator::operator -- (int) + throw(null_dereference,end_dereference) + { + // post-decrement is defined in terms of the pre-decrement + digraph_arc_iterator result(*this); + --(*this); + return result; + } + + template + bool digraph_arc_iterator::operator == (const TYPENAME digraph_arc_iterator::this_iterator& r) const + { + return equal(r); + } + + template + bool digraph_arc_iterator::operator != (const TYPENAME digraph_arc_iterator::this_iterator& r) const + { + return !operator==(r); + } + + template + bool digraph_arc_iterator::operator < (const TYPENAME digraph_arc_iterator::this_iterator& r) const + { + return compare(r) < 0; + } + + template + TYPENAME digraph_arc_iterator::reference digraph_arc_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + this->assert_valid(); + return this->node()->m_data; + } + + template + TYPENAME digraph_arc_iterator::pointer digraph_arc_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return &(operator*()); + } + + //////////////////////////////////////////////////////////////////////////////// + // subtype utilities + + template + TYPENAME digraph::const_arc_vector digraph::constify_arcs(const TYPENAME digraph::arc_vector& arcs) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned i = 0; i < arcs.size(); i++) + { + arcs[i].assert_valid(this); + result.push_back(arcs[i].constify()); + } + return result; + } + + template + TYPENAME digraph::arc_vector digraph::deconstify_arcs(const TYPENAME digraph::const_arc_vector& arcs) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned i = 0; i < arcs.size(); i++) + { + arcs[i].assert_valid(this); + result.push_back(arcs[i].deconstify()); + } + return result; + } + + template + TYPENAME digraph::const_path_vector digraph::constify_paths(const TYPENAME digraph::path_vector& paths) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > > result; + for (unsigned i = 0; i < paths.size(); i++) + result.push_back(constify_arcs(paths[i])); + return result; + } + + template + TYPENAME digraph::path_vector digraph::deconstify_paths(const TYPENAME digraph::const_path_vector& paths) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > > result; + for (unsigned i = 0; i < paths.size(); i++) + result.push_back(deconstify_arcs(paths[i])); + return result; + } + + template + TYPENAME digraph::const_node_vector digraph::constify_nodes(const TYPENAME digraph::node_vector& nodes) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned i = 0; i < nodes.size(); i++) + { + nodes[i].assert_valid(this); + result.push_back(nodes[i].constify()); + } + return result; + } + + template + TYPENAME digraph::node_vector digraph::deconstify_nodes(const TYPENAME digraph::const_node_vector& nodes) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned i = 0; i < nodes.size(); i++) + { + nodes[i].assert_valid(this); + result.push_back(nodes[i].deconstify()); + } + return result; + } + + template + unsigned digraph::npos(void) + { + return(unsigned)-1; + } + + //////////////////////////////////////////////////////////////////////////////// + // Constructors etc. + + template + digraph::digraph(void) : + m_nodes_begin(0), m_nodes_end(0), m_arcs_begin(0), m_arcs_end(0) + { + // node and arc lists are circular double-linked lists + // they start out empty (no dummy end node) + } + + template + digraph::~digraph(void) + { + clear(); + } + + template + digraph::digraph(const digraph& r) : + m_nodes_begin(0), m_nodes_end(0), m_arcs_begin(0), m_arcs_end(0) + { + *this = r; + } + + template + digraph& digraph::operator=(const digraph& r) + { + // make it self-copy safe i.e. a=a; is a valid instruction + if (this == &r) return *this; + clear(); + // first phase is to copy the nodes, creating a map of cross references from the old nodes to their new equivalents + std::map, digraph_iterator > xref; + for (digraph_iterator n = r.begin(); n != r.end(); n++) + xref[n] = insert(*n); + // second phase is to copy the arcs, using the map to convert the old to and from nodes to the new nodes + for (digraph_arc_iterator a = r.arc_begin(); a != r.arc_end(); a++) + arc_insert(xref[r.arc_from(a)],xref[r.arc_to(a)],*a); + return *this; + } + + //////////////////////////////////////////////////////////////////////////////// + // Basic Node functions + + template + bool digraph::empty(void) const + { + return m_nodes_begin == 0; + } + + template + unsigned digraph::size(void) const + { + unsigned count = 0; + for (digraph_iterator i = begin(); i != end(); i++) + count++; + return count; + } + + template + TYPENAME digraph::iterator digraph::insert(const NT& node_data) + { + digraph_node* new_node = new digraph_node(this,node_data); + if (!m_nodes_end) + { + // insert into an empty list + m_nodes_begin = new_node; + m_nodes_end = new_node; + } + else + { + // insert at the end of the list + new_node->m_prev = m_nodes_end; + m_nodes_end->m_next = new_node; + m_nodes_end = new_node; + } + return digraph_iterator(new_node); + } + + template + TYPENAME digraph::iterator digraph::erase(TYPENAME digraph::iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + // remove all arcs connected to this node first + // use arc_erase rather than arcs.erase because that tidies up the node at the other end of the arc too + for (unsigned i = fanin(iter); i--; ) + arc_erase(input(iter,i)); + for (unsigned j = fanout(iter); j--; ) + arc_erase(output(iter,j)); + // now unlink the node from the list and delete it + if (iter.node()->m_next) + iter.node()->m_next->m_prev = iter.node()->m_prev; + if (iter.node()->m_prev) + iter.node()->m_prev->m_next = iter.node()->m_next; + digraph_node* next = iter.node()->m_next; + delete iter.node(); + // return the next node in the list + if (next) + return digraph_iterator(next); + else + return digraph_iterator(this); + } + + template + void digraph::clear(void) + { + // clearing the nodes also clears the arcs + for (digraph_iterator i = begin(); i != end(); ) + i = erase(i); + } + + template + TYPENAME digraph::const_iterator digraph::begin(void) const + { + if (m_nodes_begin) + return digraph_iterator(m_nodes_begin); + else + return digraph_iterator(this); + } + + template + TYPENAME digraph::iterator digraph::begin(void) + { + if (m_nodes_begin) + return digraph_iterator(m_nodes_begin); + else + return digraph_iterator(this); + } + + template + TYPENAME digraph::const_iterator digraph::end(void) const + { + return digraph_iterator(this); + } + + template + TYPENAME digraph::iterator digraph::end(void) + { + return digraph_iterator(this); + } + + template + unsigned digraph::fanin(TYPENAME digraph::const_iterator iter) const + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return iter.node()->m_inputs.size(); + } + + template + unsigned digraph::fanin(TYPENAME digraph::iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return iter.node()->m_inputs.size(); + } + + template + TYPENAME digraph::const_arc_iterator digraph::input(TYPENAME digraph::const_iterator iter, unsigned i) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + iter.assert_valid(this); + if (i >= iter.node()->m_inputs.size()) throw std::out_of_range("digraph::input"); + return digraph_arc_iterator(iter.node()->m_inputs[i]); + } + + template + TYPENAME digraph::arc_iterator digraph::input(TYPENAME digraph::iterator iter, unsigned i) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + iter.assert_valid(this); + if (i >= iter.node()->m_inputs.size()) throw std::out_of_range("digraph::input"); + return digraph_arc_iterator(iter.node()->m_inputs[i]); + } + + template + unsigned digraph::fanout(TYPENAME digraph::const_iterator iter) const + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return iter.node()->m_outputs.size(); + } + + template + unsigned digraph::fanout(TYPENAME digraph::iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return iter.node()->m_outputs.size(); + } + + template + TYPENAME digraph::const_arc_iterator digraph::output(TYPENAME digraph::const_iterator iter, unsigned i) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + iter.assert_valid(this); + if (i >= iter.node()->m_outputs.size()) throw std::out_of_range("digraph::output"); + return digraph_arc_iterator(iter.node()->m_outputs[i]); + } + + template + TYPENAME digraph::arc_iterator digraph::output(TYPENAME digraph::iterator iter, unsigned i) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + iter.assert_valid(this); + if (i >= iter.node()->m_outputs.size()) throw std::out_of_range("digraph::output"); + return digraph_arc_iterator(iter.node()->m_outputs[i]); + } + + template + TYPENAME digraph::const_arc_vector digraph::inputs(TYPENAME digraph::const_iterator node) const + throw(wrong_object,null_dereference,end_dereference) + { + node.assert_valid(this); + std::vector > result; + for (unsigned i = 0; i < fanin(node); i++) + result.push_back(input(node,i)); + return result; + } + + template + TYPENAME digraph::arc_vector digraph::inputs(TYPENAME digraph::iterator node) + throw(wrong_object,null_dereference,end_dereference) + { + node.assert_valid(this); + std::vector > result; + for (unsigned i = 0; i < fanin(node); i++) + result.push_back(input(node,i)); + return result; + } + + template + TYPENAME digraph::const_arc_vector digraph::outputs(TYPENAME digraph::const_iterator node) const + throw(wrong_object,null_dereference,end_dereference) + { + node.assert_valid(this); + std::vector > result; + for (unsigned i = 0; i < fanout(node); i++) + result.push_back(output(node,i)); + return result; + } + + template + TYPENAME digraph::arc_vector digraph::outputs(TYPENAME digraph::iterator node) + throw(wrong_object,null_dereference,end_dereference) + { + node.assert_valid(this); + std::vector > result; + for (unsigned i = 0; i < fanout(node); i++) + result.push_back(output(node,i)); + return result; + } + + template + unsigned digraph::output_offset(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_arc_iterator arc) const + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + arc.assert_valid(this); + for (unsigned i = 0; i < fanout(from); i++) + { + if (output(from,i) == arc) + return i; + } + return digraph::npos(); + } + + template + unsigned digraph::output_offset(TYPENAME digraph::iterator from, + TYPENAME digraph::arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + arc.assert_valid(this); + for (unsigned i = 0; i < fanout(from); i++) + { + if (output(from,i) == arc) + return i; + } + return digraph::npos(); + } + + template + unsigned digraph::input_offset(TYPENAME digraph::const_iterator to, + TYPENAME digraph::const_arc_iterator arc) const + throw(wrong_object,null_dereference,end_dereference) + { + to.assert_valid(this); + arc.assert_valid(this); + for (unsigned i = 0; i < fanin(to); i++) + { + if (input(to,i) == arc) + return i; + } + return digraph::npos(); + } + + template + unsigned digraph::input_offset(TYPENAME digraph::iterator to, + TYPENAME digraph::arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference) + { + to.assert_valid(this); + arc.assert_valid(this); + for (unsigned i = 0; i < fanin(to); i++) + { + if (input(to,i) == arc) + return i; + } + return digraph::npos(); + } + + //////////////////////////////////////////////////////////////////////////////// + // Basic Arc functions + + template + bool digraph::arc_empty(void) const + { + return m_arcs_end == 0; + } + + template + unsigned digraph::arc_size(void) const + { + unsigned count = 0; + for (digraph_arc_iterator i = arc_begin(); i != arc_end(); i++) + count++; + return count; + } + + template + TYPENAME digraph::arc_iterator digraph::arc_insert(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to, + const AT& arc_data) + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + to.assert_valid(this); + // create the new arc and link it in to the arc list + digraph_arc* new_arc = new digraph_arc(this, from.node(), to.node(), arc_data); + if (!m_arcs_end) + { + // insert into an empty list + m_arcs_begin = new_arc; + m_arcs_end = new_arc; + } + else + { + // insert at the end of the list + new_arc->m_prev = m_arcs_end; + m_arcs_end->m_next = new_arc; + m_arcs_end = new_arc; + } + // add this arc to the inputs and outputs of the end nodes + from.node()->m_outputs.push_back(new_arc); + to.node()->m_inputs.push_back(new_arc); + return digraph_arc_iterator(new_arc); + } + + template + TYPENAME digraph::arc_iterator digraph::arc_erase(TYPENAME digraph::arc_iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + // first remove this arc's pointers from the from/to nodes + for (TYPENAME std::vector*>::iterator i = iter.node()->m_to->m_inputs.begin(); i != iter.node()->m_to->m_inputs.end(); ) + { + if (*i == iter.node()) + i = iter.node()->m_to->m_inputs.erase(i); + else + i++; + } + for (TYPENAME std::vector*>::iterator o = iter.node()->m_from->m_outputs.begin(); o != iter.node()->m_from->m_outputs.end(); ) + { + if (*o == iter.node()) + o = iter.node()->m_from->m_outputs.erase(o); + else + o++; + } + // now unlink the arc from the list and delete it + if (iter.node()->m_next) + iter.node()->m_next->m_prev = iter.node()->m_prev; + if (iter.node()->m_prev) + iter.node()->m_prev->m_next = iter.node()->m_next; + digraph_arc* next = iter.node()->m_next; + delete iter.node(); + if (next) + return digraph_arc_iterator(next); + else + return digraph_arc_iterator(this); + } + + template + void digraph::arc_clear(void) + { + for (digraph_arc_iterator a = arc_begin(); a != arc_end(); ) + a = arc_erase(a); + } + + template + TYPENAME digraph::const_arc_iterator digraph::arc_begin(void) const + { + if (m_arcs_begin) + return digraph_arc_iterator(m_arcs_begin); + else + return digraph_arc_iterator(this); + } + + template + TYPENAME digraph::arc_iterator digraph::arc_begin(void) + { + if (m_arcs_begin) + return digraph_arc_iterator(m_arcs_begin); + else + return digraph_arc_iterator(this); + } + + template + TYPENAME digraph::const_arc_iterator digraph::arc_end(void) const + { + return digraph_arc_iterator(this); + } + + template + TYPENAME digraph::arc_iterator digraph::arc_end(void) + { + return digraph_arc_iterator(this); + } + + template + TYPENAME digraph::const_iterator digraph::arc_from(TYPENAME digraph::const_arc_iterator iter) const + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return digraph_iterator(iter.node()->m_from); + } + + template + TYPENAME digraph::iterator digraph::arc_from(TYPENAME digraph::arc_iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return digraph_iterator(iter.node()->m_from); + } + + template + TYPENAME digraph::const_iterator digraph::arc_to(TYPENAME digraph::const_arc_iterator iter) const + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return digraph_iterator(iter.node()->m_to); + } + + template + TYPENAME digraph::iterator digraph::arc_to(TYPENAME digraph::arc_iterator iter) + throw(wrong_object,null_dereference,end_dereference) + { + iter.assert_valid(this); + return digraph_iterator(iter.node()->m_to); + } + + template + void digraph::arc_move(TYPENAME digraph::arc_iterator arc, + TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + arc_move_to(arc,to); + arc_move_from(arc,from); + } + + template + void digraph::arc_move_from(TYPENAME digraph::arc_iterator arc, + TYPENAME digraph::iterator from) + throw(wrong_object,null_dereference,end_dereference) + { + arc.assert_valid(this); + from.assert_valid(this); + for (TYPENAME std::vector*>::iterator o = arc.node()->m_from->m_outputs.begin(); o != arc.node()->m_from->m_outputs.end(); ) + { + if (*o == arc.node()) + o = arc.node()->m_from->m_outputs.erase(o); + else + o++; + } + from.node()->m_outputs.push_back(arc.node()); + arc.node()->m_from = from.node(); + } + + template + void digraph::arc_move_to(TYPENAME digraph::arc_iterator arc, + TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + arc.assert_valid(this); + to.assert_valid(this); + for (TYPENAME std::vector*>::iterator i = arc.node()->m_to->m_inputs.begin(); i != arc.node()->m_to->m_inputs.end(); ) + { + if (*i == arc.node()) + i = arc.node()->m_to->m_inputs.erase(i); + else + i++; + } + to.node()->m_inputs.push_back(arc.node()); + arc.node()->m_to = to.node(); + } + + template + void digraph::arc_flip(TYPENAME digraph::arc_iterator arc) + throw(wrong_object,null_dereference,end_dereference) + { + arc_move(arc,arc_to(arc),arc_from(arc)); + } + + //////////////////////////////////////////////////////////////////////////////// + // Adjacency Algorithms + + template + bool digraph::adjacent(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to) const + throw(wrong_object,null_dereference,end_dereference) + { + return adjacent_arc(from,to) != arc_end(); + } + + template + bool digraph::adjacent(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + return adjacent_arc(from,to) != arc_end(); + } + + template + TYPENAME digraph::const_arc_iterator digraph::adjacent_arc(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to) const + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + to.assert_valid(this); + for (unsigned arc = 0; arc < fanout(from); arc++) + { + if (arc_to(output(from, arc)) == to) + return output(from,arc); + } + return arc_end(); + } + + template + TYPENAME digraph::arc_iterator digraph::adjacent_arc(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + return adjacent_arc(from.constify(), to.constify()).deconstify(); + } + + template + TYPENAME digraph::const_arc_vector digraph::adjacent_arcs(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to) const + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + to.assert_valid(this); + std::vector > result; + for (unsigned arc = 0; arc < fanout(from); arc++) + { + if (arc_to(output(from, arc)) == to) + result.push_back(output(from,arc)); + } + return result; + } + + template + TYPENAME digraph::arc_vector digraph::adjacent_arcs(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_arcs(adjacent_arcs(from.constify(), to.constify())); + } + + template + TYPENAME digraph::const_node_vector digraph::input_adjacencies(TYPENAME digraph::const_iterator to) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned arc = 0; arc < fanin(to); arc++) + { + digraph_iterator from = arc_from(input(to, arc)); + if (std::find(result.begin(), result.end(), from) == result.end()) + result.push_back(from); + } + return result; + } + + template + TYPENAME digraph::node_vector digraph::input_adjacencies(TYPENAME digraph::iterator to) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_nodes(input_adjacencies(to.constify())); + } + + template + TYPENAME digraph::const_node_vector digraph::output_adjacencies(TYPENAME digraph::const_iterator from) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > result; + for (unsigned arc = 0; arc < fanout(from); arc++) + { + digraph_iterator to = arc_to(output(from, arc)); + if (find(result.begin(), result.end(), to) == result.end()) + result.push_back(to); + } + return result; + } + + template + TYPENAME digraph::node_vector digraph::output_adjacencies(TYPENAME digraph::iterator from) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_nodes(output_adjacencies(from.constify())); + } + + //////////////////////////////////////////////////////////////////////////////// + // Topographical Sort Algorithms + + template + std::pair::const_node_vector, TYPENAME digraph::const_arc_vector> + digraph::sort(TYPENAME digraph::arc_select_fn select) const + { + std::vector > result; + std::vector > errors; + // build a map containing the number of fanins to each node that must be visited before this one + std::map,unsigned> fanin_map; + for (digraph_iterator n = begin(); n != end(); n++) + { + unsigned predecessors = 0; + // only count predecessors connected by selected arcs + for (unsigned f = 0; f < fanin(n); f++) + { + digraph_arc_iterator input_arc = input(n,f); + digraph_iterator predecessor = arc_from(input_arc); + if (!select || select(*this,input_arc)) + predecessors++; + } + if (predecessors == 0) + { + result.push_back(n); + } + else + { + fanin_map[n] = predecessors; + } + } + // main algorithm applies the topographical sort repeatedly. For a DAG, it + // will complete first time. However, with backward arcs, the first + // iteration will fail. The algorithm then tries breaking random arcs to try + // to get an ordering. + for(unsigned i = 0; !fanin_map.empty(); ) + { + // now visit each node in traversal order, decrementing the fanin count of + // all successors. As each successor's fanin count goes to zero, it is + // appended to the result. + for (; i < result.size(); i++) + { + // Note: dereferencing gives us a node iterator + digraph_iterator current = result[i]; + for (unsigned f = 0; f < fanout(current); f++) + { + // only consider successors connected by selected arcs + digraph_arc_iterator output_arc = output(current, f); + digraph_iterator successor = arc_to(output_arc); + if (!select || select(*this,output_arc)) + { + // don't consider arcs that have been eliminated to break a loop + if (fanin_map.find(successor) != fanin_map.end()) + { + --fanin_map[successor]; + if ((fanin_map[successor]) == 0) + { + result.push_back(successor); + fanin_map.erase(fanin_map.find(successor)); + } + } + } + } + } + if (!fanin_map.empty()) + { + // there must be backward arcs preventing completion + // try removing arcs from the sort to get a partial ordering containing all the nodes + + // select an arc that is still relevant to the sort and break it + // first select a node that has non-zero fanin and its predecessor that has non-zero fanin + digraph_iterator stuck_node = fanin_map.begin()->first; + for (unsigned f = 0; f < fanin(stuck_node); f++) + { + // now successively remove input arcs that are still part of the sort until the fanin reduces to zero + // first find a relevant arc - this must be a selected arc that has not yet been traversed by the first half of the algorithm + digraph_arc_iterator input_arc = input(stuck_node, f); + if (!select || select(*this,input_arc)) + { + digraph_iterator predecessor = arc_from(input_arc); + if (fanin_map.find(predecessor) != fanin_map.end()) + { + // found the right combination - remove this arc and then drop out of the fanin loop to restart the outer sort loop + errors.push_back(input_arc); + --fanin_map[stuck_node]; + if ((fanin_map[stuck_node]) == 0) + { + result.push_back(stuck_node); + fanin_map.erase(fanin_map.find(stuck_node)); + break; + } + } + } + } + } + } + return std::make_pair(result,errors); + } + + template + std::pair::node_vector, TYPENAME digraph::arc_vector> + digraph::sort(TYPENAME digraph::arc_select_fn select) + { + std::pair >, + std::vector > > const_result = + const_cast*>(this)->sort(select); + + std::pair >, + std::vector > > result = + std::make_pair(deconstify_nodes(const_result.first),deconstify_arcs(const_result.second)); + return result; + } + + template + TYPENAME digraph::const_node_vector digraph::dag_sort(TYPENAME digraph::arc_select_fn select) const + { + std::pair >, + std::vector > > result = sort(select); + if (result.second.empty()) return result.first; + return std::vector >(); + } + + template + TYPENAME digraph::node_vector digraph::dag_sort(TYPENAME digraph::arc_select_fn select) + { + return deconstify_nodes(const_cast*>(this)->dag_sort(select)); + } + //////////////////////////////////////////////////////////////////////////////// + // Path Algorithms + + template + bool digraph::path_exists_r(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to, + TYPENAME digraph::const_iterator_set& visited, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // Recursive part of the digraph::path_exists function. This is based on a + // depth first search algorithm and stops the moment it finds a path + // regardless of its length. Simply traverse every output and recurse on that + // node until we find the to node or run out of things to recurse on. However, + // to avoid infinite recursion due to cycles in the graph, I need to maintain + // a set of visited nodes. The visited set is updated when a candidate is + // found but tested before the recursion on the candidate so that the number of + // function calls is minimised. + for (unsigned i = 0; i < fanout(from); i++) + { + digraph_arc_iterator arc = output(from,i); + if (!select || select(*this, arc)) + { + digraph_iterator node = arc_to(arc); + // if the node is the target, return immediately + if (node == to) return true; + // update the visited set and give up if the insert fails, which indicates that the node has already been visited + if (!(visited.insert(node).second)) return false; + // now recurse - a path exists from from to to if a path exists from an adjacent node to to + if (path_exists_r(node,to,visited,select)) return true; + } + } + return false; + } + + template + bool digraph::path_exists(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // set up the recursion with its initial visited set and then recurse + std::set > visited; + visited.insert(from); + return path_exists_r(from, to, visited, select); + } + + template + bool digraph::path_exists(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return path_exists(from.constify(), to.constify(), select); + } + + template + void digraph::all_paths_r(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to, + TYPENAME digraph::const_arc_vector& so_far, + TYPENAME digraph::const_path_vector& result, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // This is the recursive part of the all_paths function. The field so_far + // contains the path so far so that when 'to' is reached, the path is + // complete. It serves the same purpose as the visited set in the path_exists + // function except that it also preserves the path order. It also serves the + // purpose of detecting cycles and thus stopping infinite recursion. Every + // time the recursion reaches the to node, a copy of so_far is appended to the + // path set. + for (unsigned i = 0; i < fanout(from); i++) + { + digraph_arc_iterator candidate = output(from,i); + // assert_valid that the arc is selected and then assert_valid that the candidate has not + // been visited on this path and only allow further recursion if it hasn't + if ((!select || select(*this, candidate)) && std::find(so_far.begin(), so_far.end(), candidate) == so_far.end()) + { + // extend the path tracing the route to this arc + so_far.push_back(candidate); + // if the candidate arc points to the target, update the result set and prevent further recursion, otherwise recurse + if (arc_to(candidate) == to) + result.push_back(so_far); + else + all_paths_r(arc_to(candidate),to,so_far,result,select); + so_far.pop_back(); + } + } + } + + template + TYPENAME digraph::const_path_vector + digraph::all_paths(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // set up the recursion with empty data fields and then recurse + std::vector > > result; + std::vector > so_far; + all_paths_r(from, to, so_far, result, select); + return result; + } + + template + TYPENAME digraph::path_vector + digraph::all_paths(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_paths(all_paths(from.constify(), to.constify(), select)); + } + + template + void digraph::reachable_nodes_r(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator_set& visited, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // The recursive part of the reachable_nodes function. + // This is a depth-first traversal again but this time it carries on to find all the reachable nodes + // Just keep recursing on all the adjacent nodes of each node, skipping already visited nodes to avoid cycles + for (unsigned i = 0; i < fanout(from); i++) + { + digraph_arc_iterator arc = output(from,i); + if (!select || select(*this,arc)) + { + digraph_iterator candidate = arc_to(arc); + if (visited.insert(candidate).second) + reachable_nodes_r(candidate,visited,select); + } + } + } + + template + TYPENAME digraph::const_node_vector + digraph::reachable_nodes(TYPENAME digraph::const_iterator from, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // seed the recursion, marking the starting node as already visited + std::set > visited; + visited.insert(from); + reachable_nodes_r(from, visited, select); + // convert the visited set into the required output form + // exclude the starting node + std::vector > result; + for (TYPENAME std::set >::iterator i = visited.begin(); i != visited.end(); i++) + if (*i != from) + result.push_back(*i); + return result; + } + + template + TYPENAME digraph::node_vector + digraph::reachable_nodes(TYPENAME digraph::iterator from, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_nodes(reachable_nodes(from.constify(), select)); + } + + template + void digraph::reaching_nodes_r(TYPENAME digraph::const_iterator to, + TYPENAME digraph::const_iterator_set& visited, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // The recursive part of the reaching_nodes function. + // Just like the reachable_nodes_r function but it goes backwards + for (unsigned i = 0; i < fanin(to); i++) + { + digraph_arc_iterator arc = input(to,i); + if (!select || select(*this,arc)) + { + digraph_iterator candidate = arc_from(input(to,i)); + if (visited.insert(candidate).second) + reaching_nodes_r(candidate,visited,select); + } + } + } + + template + TYPENAME digraph::const_node_vector + digraph::reaching_nodes(TYPENAME digraph::const_iterator to, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + // seed the recursion, marking the starting node as already visited + std::set > visited; + visited.insert(to); + reaching_nodes_r(to,visited,select); + // convert the visited set into the required output form + // exclude the end node + std::vector > result; + for (TYPENAME std::set >::iterator i = visited.begin(); i != visited.end(); i++) + if (*i != to) + result.push_back(*i); + return result; + } + + template + TYPENAME digraph::node_vector + digraph::reaching_nodes(TYPENAME digraph::iterator to, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_nodes(reaching_nodes(to.constify(),select)); + } + + //////////////////////////////////////////////////////////////////////////////// + // Shortest Path Algorithms + + template + TYPENAME digraph::const_arc_vector + digraph::shortest_path(TYPENAME digraph::const_iterator from, + TYPENAME digraph::const_iterator to, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + std::vector > > paths = all_paths(from,to,select); + std::vector > shortest; + for (TYPENAME std::vector > >::iterator i = paths.begin(); i != paths.end(); i++) + if (shortest.empty() || i->size() < shortest.size()) + shortest = *i; + return shortest; + } + + template + TYPENAME digraph::arc_vector + digraph::shortest_path(TYPENAME digraph::iterator from, + TYPENAME digraph::iterator to, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_arcs(shortest_path(from.constify(),to.constify(),select)); + } + + template + TYPENAME digraph::const_path_vector + digraph::shortest_paths(TYPENAME digraph::const_iterator from, + TYPENAME digraph::arc_select_fn select) const + throw(wrong_object,null_dereference,end_dereference) + { + from.assert_valid(this); + // This is an unweighted shortest path algorithm based on the algorithm from + // Weiss's book. This is essentially a breadth-first traversal or graph + // colouring algorithm. It is an iterative algorithm, so no recursion here! It + // works by creating a node queue initialised with the starting node. It then + // consumes the queue from front to back. For each node, it finds the + // successors and appends them to the queue. If a node is already 'known' it + // is not added - this avoids cycles. Thus the queue insert ordering + // represents the breadth-first ordering. On the way it creates a map of + // visited nodes. This is a map not a set because it also stores the arc that + // nominated this node as a shortest path. The full path can then be recreated + // from the map by just walking back through the predecessors. The depth (or + // colour) can be determined by the path length. + std::vector > > result; + // initialise the iteration by creating a queue and adding the start node + std::deque > nodes; + nodes.push_back(from); + // Create a map to store the set of known nodes mapped to their predecessor + // arcs. Initialise it with the current node, which has no predecessor. Note + // that the algorithm uses the feature of digraph iterators that they can be + // null iterators and that all null iterators are equal. + typedef std::map, + digraph_arc_iterator > known_map; + known_map known; + known.insert(std::make_pair(from,digraph_arc_iterator())); + // now the iterative part of the algorithm + while(!nodes.empty()) + { + // pop the queue to get the next node to process - unfortunately the STL + // deque::pop does not return the popped value + digraph_iterator current = nodes.front(); + nodes.pop_front(); + // now visit all the successors + for (unsigned i = 0; i < fanout(current); i++) + { + digraph_arc_iterator next_arc = output(current,i); + // assert_valid whether the successor arc is a selected arc and can be part of a path + if (!select || select(*this,next_arc)) + { + digraph_iterator next = arc_to(next_arc); + // Discard any successors that are known because to be known already they + // must have another shorter path. Otherwise add the successor node to the + // queue to be visited later. To minimise the overhead of map lookup I use + // the usual trick of trying to insert the node and determining whether + // the node was known by the success or failure of the insertion - this is + // a Good STL Trick (TM). + if (known.insert(std::make_pair(next,next_arc)).second) + nodes.push_back(next); + } + } + } + // The map contains the results as an unordered set of nodes, mapped to their + // predecessor arcs and weight. This now needs to be converted into a set of + // paths. This is done by starting with a node from the map, finding its + // predecessor arc and therefore its predecessor node, looking that up in the + // map to find its predecessor and so on until the start node is reached (it + // has a null predecessor). Note that the known set includes the from node + // which does not generate a path. + for (TYPENAME known_map::iterator i = known.begin(); i != known.end(); i++) + { + if (i->first != from) + { + const_arc_vector this_path; + for (TYPENAME known_map::iterator node = i; + node->second.valid(); + node = known.find(arc_from(node->second))) + this_path.insert(this_path.begin(),node->second); + result.push_back(this_path); + } + } + return result; + } + + template + TYPENAME digraph::path_vector + digraph::shortest_paths(TYPENAME digraph::iterator from, + TYPENAME digraph::arc_select_fn select) + throw(wrong_object,null_dereference,end_dereference) + { + return deconstify_paths(shortest_paths(from.constify(),select)); + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus diff --git a/OTLib/containers/exceptions.hpp b/OTLib/containers/exceptions.hpp new file mode 100644 index 000000000..f1aa14140 --- /dev/null +++ b/OTLib/containers/exceptions.hpp @@ -0,0 +1,71 @@ +#ifndef STLPLUS_EXCEPTIONS +#define STLPLUS_EXCEPTIONS +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// The set of general exceptions thrown by STLplus components + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // Thrown if a pointer or an iterator is dereferenced when it is null + + class null_dereference : public std::logic_error + { + public: + null_dereference(const std::string& description) throw() : + std::logic_error(std::string("stlplus::null_dereference: ") + description) {} + ~null_dereference(void) throw() {} + }; + + //////////////////////////////////////////////////////////////////////////////// + // Thrown if an iterator is dereferenced when it is pointing to the end element + + class end_dereference : public std::logic_error + { + public: + end_dereference(const std::string& description) throw() : + std::logic_error("stlplus::end_dereference: " + description) {} + ~end_dereference(void) throw() {} + }; + + //////////////////////////////////////////////////////////////////////////////// + // Thrown if an iterator is used with the wrong container. In other words, an + // iterator is created as a pointer to a sub-object within a container. If + // that iterator is then used with a different container, this exception is + // thrown. + + class wrong_object : public std::logic_error + { + public: + wrong_object(const std::string& description) throw() : + std::logic_error("stlplus::wrong_object: " + description) {} + ~wrong_object(void) throw() {} + }; + + //////////////////////////////////////////////////////////////////////////////// + // Thrown if an attempt is made to copy an object that is uncopyable + + class illegal_copy : public std::logic_error + { + public: + illegal_copy(const std::string& description) throw() : + std::logic_error("stlplus::illegal_copy: " + description) {} + ~illegal_copy(void) throw() {} + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#endif diff --git a/OTLib/containers/foursome.hpp b/OTLib/containers/foursome.hpp new file mode 100644 index 000000000..adae1466a --- /dev/null +++ b/OTLib/containers/foursome.hpp @@ -0,0 +1,61 @@ +#ifndef STLPLUS_FOURSOME +#define STLPLUS_FOURSOME +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton, from an original by Dan Milton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// The next in the series pair->triple->foursome + +// Originally called quadruple but that clashed (as did quad) with system +// libraries on some operating systems + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // the foursome class + + template + struct foursome + { + typedef T1 first_type; + typedef T2 second_type; + typedef T3 third_type; + typedef T4 fourth_type; + + T1 first; + T2 second; + T3 third; + T4 fourth; + + foursome(void); + foursome(const T1& p1, const T2& p2, const T3& p3, const T4& p4); + foursome(const foursome& t2); + }; + + //////////////////////////////////////////////////////////////////////////////// + // creation + + template + foursome make_foursome(const T1& first, const T2& second, const T3& third, const T4& fourth); + + //////////////////////////////////////////////////////////////////////////////// + // comparison + + template + bool operator == (const foursome& left, const foursome& right); + template + bool operator < (const foursome& left, const foursome& right); + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "foursome.tpp" +#endif diff --git a/OTLib/containers/foursome.tpp b/OTLib/containers/foursome.tpp new file mode 100644 index 000000000..79017b96f --- /dev/null +++ b/OTLib/containers/foursome.tpp @@ -0,0 +1,72 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton, from an original by Dan Milton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // the foursome class + + template + foursome::foursome(void) : + first(), second(), third(), fourth() + { + } + + template + foursome::foursome(const T1& p1, const T2& p2, const T3& p3, const T4& p4) : + first(p1), second(p2), third(p3), fourth(p4) + { + } + + template + foursome::foursome(const foursome& t2) : + first(t2.first), second(t2.second), third(t2.third), fourth(t2.fourth) + { + } + + //////////////////////////////////////////////////////////////////////////////// + // creation + + template + foursome make_foursome(const T1& first, const T2& second, const T3& third, const T4& fourth) + { + return foursome(first,second,third,fourth); + } + + //////////////////////////////////////////////////////////////////////////////// + // comparison + + template + bool operator == (const foursome& left, const foursome& right) + { + // foursomes are equal if all elements are equal + return + left.first == right.first && + left.second == right.second && + left.third == right.third && + left.fourth == right.fourth; + } + + template + bool operator < (const foursome& left, const foursome& right) + { + // use the < operator on each element + return left.first < right.first ? true : + right.first < left.first ? false : + left.second < right.second ? true : + right.second < left.second ? false : + left.third < right.third ? true : + right.third < left.third ? false : + left.fourth < right.fourth; + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus diff --git a/OTLib/containers/hash.hpp b/OTLib/containers/hash.hpp new file mode 100644 index 000000000..f85480ba7 --- /dev/null +++ b/OTLib/containers/hash.hpp @@ -0,0 +1,205 @@ +#ifndef STLPLUS_HASH +#define STLPLUS_HASH +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// A chained hash table using STL semantics + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" +#include "safe_iterator.hpp" +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // internals + + template class hash; + template class hash_element; + + //////////////////////////////////////////////////////////////////////////////// + // iterator class + + template + class hash_iterator : public safe_iterator,hash_element > + { + public: + friend class hash; + + // local type definitions + // an iterator points to a value whilst a const_iterator points to a const value + typedef V value_type; + typedef hash_iterator > iterator; + typedef hash_iterator > const_iterator; + typedef hash_iterator this_iterator; + typedef V& reference; + typedef V* pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + // any attempt to dereference or use a null iterator is an error + // the only valid thing you can do is assign an iterator to it + hash_iterator(void); + ~hash_iterator(void); + + // Type conversion methods allow const_iterator and iterator to be converted + // convert an iterator/const_iterator to a const_iterator + const_iterator constify(void) const; + // convert an iterator/const_iterator to an iterator + iterator deconstify(void) const; + + // increment operators used to step through the set of all values in a hash + // it is only legal to increment a valid iterator + // there's no decrement - I've only implemented this as a unidirectional iterator + // pre-increment + this_iterator& operator ++ (void) + throw(null_dereference,end_dereference); + // post-increment + this_iterator operator ++ (int) + throw(null_dereference,end_dereference); + + // test useful for testing whether iteration has completed + bool operator == (const this_iterator& r) const; + bool operator != (const this_iterator& r) const; + bool operator < (const this_iterator& r) const; + + // access the value - a const_iterator gives you a const value, an iterator a non-const value + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + private: + friend class hash_element; + + // constructor used by hash to create a non-null iterator + // you cannot create a valid iterator except by calling a hash method that returns one + explicit hash_iterator(hash_element* element); + // constructor used to create an end iterator + explicit hash_iterator(const hash* owner); + // used to create an alias of an iterator + explicit hash_iterator(const safe_iterator, hash_element >& iterator); + }; + + //////////////////////////////////////////////////////////////////////////////// + // Hash class + // K = key type + // T = value type + // H = hash function object with the profile 'unsigned H(const K&)' + // E = equal function object with profile 'bool E(const K&, const K&)' defaults to equal_to which in turn calls '==' + + template > + class hash + { + public: + typedef unsigned size_type; + typedef K key_type; + typedef T data_type; + typedef T mapped_type; + typedef std::pair value_type; + typedef hash_iterator iterator; + typedef hash_iterator const_iterator; + + // construct a hash table with specified number of bins + // the default 0 bins means leave it to the table to decide + // specifying 0 bins also enables auto-rehashing, otherwise auto-rehashing defaults off + hash(unsigned bins = 0); + ~hash(void); + + // copy and equality copy the data elements but not the size of the copied table + hash(const hash&); + hash& operator = (const hash&); + + // test for an empty table and for the size of a table + // efficient because the size is stored separately from the table contents + bool empty(void) const; + unsigned size(void) const; + + // test for equality - two hashes are equal if they contain equal values + bool operator == (const hash&) const; + bool operator != (const hash&) const; + + // switch auto-rehash on + void auto_rehash(void); + // switch auto-rehash off + void manual_rehash(void); + // force a rehash now + // default of 0 means implement built-in size calculation for rehashing (recommended - it doubles the number of bins) + void rehash(unsigned bins = 0); + // test the loading ratio, which is the size divided by the number of bins + // use this if you are doing your own rehashing + // the recommendation is to double the bins when the loading exceeds 0.5 which is what auto-rehashing does + float loading(void) const; + + // test for the presence of a key + bool present(const K& key) const; + // provide map equivalent key count function (0 or 1, as not a multimap) + size_type count(const K& key) const; + + // insert a new key/data pair - replaces any previous value for this key + iterator insert(const K& key, const T& data); + // insert a copy of the pair into the table (std::map compatible) + std::pair insert(const value_type& value); + // insert a new key and return the iterator so that the data can be filled in + iterator insert(const K& key); + + // remove a key/data pair from the hash table + // as in map, this returns the number of elements erased + size_type erase(const K& key); + // remove an element from the hash table using an iterator + // as in map, returns an iterator to the next element + iterator erase(iterator it); + // remove all elements from the hash table + void erase(void); + // map equivalent of above + void clear(void); + + // find a key and return an iterator to it + // The iterator is like a pointer to a pair + // end() is returned if the find fails + const_iterator find(const K& key) const; + iterator find(const K& key); + + // returns the data corresponding to the key + // const version is used for const hashes and cannot change the hash, so failure causes an exception + // non-const version is for non-const hashes and is like map - it creates a new key/data pair if find fails + const T& operator[] (const K& key) const throw(std::out_of_range); + T& operator[] (const K& key); + + // iterators allow the hash table to be traversed + // iterators remain valid unless an item is removed or unless a rehash happens + const_iterator begin(void) const; + iterator begin(void); + const_iterator end(void) const; + iterator end(void); + + // diagnostic report shows the number of items in each bin so can be used + // to diagnose effectiveness of hash functions + void debug_report(std::ostream&) const; + + // internals + private: + friend class hash_element; + friend class hash_iterator >; + friend class hash_iterator >; + + unsigned m_rehash; + unsigned m_bins; + unsigned m_size; + hash_element** m_values; + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "hash.tpp" +#endif diff --git a/OTLib/containers/hash.tpp b/OTLib/containers/hash.tpp new file mode 100644 index 000000000..dc83c0f57 --- /dev/null +++ b/OTLib/containers/hash.tpp @@ -0,0 +1,658 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // the element stored in the hash + + template + class hash_element + { + public: + master_iterator, hash_element > m_master; + std::pair m_value; + hash_element* m_next; + unsigned m_hash; + + hash_element(const hash* owner, const K& key, const T& data, unsigned hash) : + m_master(owner,this), m_value(key,data), m_next(0), m_hash(hash) + { + } + + hash_element(const hash* owner, const std::pair& value, unsigned hash) : + m_master(owner,this), m_value(value), m_next(0), m_hash(hash) + { + } + + ~hash_element(void) + { + m_next = 0; + m_hash = 0; + } + + const hash* owner(void) const + { + return m_master.owner(); + } + + // generate the bin number from the hash value and the owner's number of bins + unsigned bin(void) const + { + return m_hash % (owner()->m_bins); + } + }; + + //////////////////////////////////////////////////////////////////////////////// + // iterator + + // null constructor + template + hash_iterator::hash_iterator(void) + { + } + + // non-null constructor used from within the hash to construct a valid iterator + template + hash_iterator::hash_iterator(hash_element* element) : + safe_iterator,hash_element >(element->m_master) + { + } + + // constructor used to create an end iterator + template + hash_iterator::hash_iterator(const hash* owner) : + safe_iterator,hash_element >(owner) + { + } + + template + hash_iterator::hash_iterator(const safe_iterator, hash_element >& iterator) : + safe_iterator,hash_element >(iterator) + { + } + + // destructor + + template + hash_iterator::~hash_iterator(void) + { + } + + // mode conversions + + template + TYPENAME hash_iterator::const_iterator hash_iterator::constify(void) const + { + return hash_iterator >(*this); + } + + template + TYPENAME hash_iterator::iterator hash_iterator::deconstify(void) const + { + return hash_iterator >(*this); + } + + // increment operator looks for the next element in the table + // if there isn't one, then this becomes an end() iterator with m_bin = m_bins + template + TYPENAME hash_iterator::this_iterator& hash_iterator::operator ++ (void) + throw(null_dereference,end_dereference) + { + this->assert_valid(); + if (this->node()->m_next) + set(this->node()->m_next->m_master); + else + { + // failing that, subsequent hash values are tried until either an element is found or there are no more bins + // in which case it becomes an end() iterator + hash_element* element = 0; + unsigned current_bin = this->node()->bin(); + for(current_bin++; !element && (current_bin < this->owner()->m_bins); current_bin++) + element = this->owner()->m_values[current_bin]; + if (element) + set(element->m_master); + else + this->set_end(); + } + return *this; + } + + // post-increment is defined in terms of pre-increment + template + TYPENAME hash_iterator::this_iterator hash_iterator::operator ++ (int) + throw(null_dereference,end_dereference) + { + hash_iterator old(*this); + ++(*this); + return old; + } + + // two iterators are equal if they point to the same element + // both iterators must be non-null and belong to the same table + template + bool hash_iterator::operator == (const hash_iterator& r) const + { + return equal(r); + } + + template + bool hash_iterator::operator != (const hash_iterator& r) const + { + return !operator==(r); + } + + template + bool hash_iterator::operator < (const hash_iterator& r) const + { + return compare(r) < 0; + } + + // iterator dereferencing is only legal on a non-null iterator + template + V& hash_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + this->assert_valid(); + return this->node()->m_value; + } + + template + V* hash_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return &(operator*()); + } + + //////////////////////////////////////////////////////////////////////////////// + // hash + + // totally arbitrary initial size used for auto-rehashed tables + static unsigned hash_default_bins = 127; + + // constructor + // tests whether the user wants auto-rehash + // sets the rehash point to be a loading of 1.0 by setting it to the number of bins + // uses the user's size unless this is zero, in which case implement the default + + template + hash::hash(unsigned bins) : + m_rehash(bins), m_bins(bins > 0 ? bins : hash_default_bins), m_size(0), m_values(0) + { + m_values = new hash_element*[m_bins]; + for (unsigned i = 0; i < m_bins; i++) + m_values[i] = 0; + } + + template + hash::~hash(void) + { + // delete all the elements + clear(); + // and delete the data structure + delete[] m_values; + m_values = 0; + } + + // as usual, implement the copy constructor i.t.o. the assignment operator + + template + hash::hash(const hash& right) : + m_rehash(right.m_rehash), m_bins(right.m_bins), m_size(0), m_values(0) + { + m_values = new hash_element*[right.m_bins]; + // copy the rehash behaviour as well as the size + for (unsigned i = 0; i < m_bins; i++) + m_values[i] = 0; + *this = right; + } + + // assignment operator + // this is done by copying the elements + // the source and target hashes can be different sizes + // the hash is self-copy safe, i.e. it is legal to say x = x; + + template + hash& hash::operator = (const hash& r) + { + // make self-copy safe + if (&r == this) return *this; + // remove all the existing elements + clear(); + // copy the elements across - remember that this is rehashing because the two + // tables can be different sizes so there is no quick way of doing this by + // copying the lists + for (hash_iterator > i = r.begin(); i != r.end(); ++i) + insert(i->first, i->second); + return *this; + } + + // number of values in the hash + template + bool hash::empty(void) const + { + return m_size == 0; + } + + template + unsigned hash::size(void) const + { + return m_size; + } + + // equality + template + bool hash::operator == (const hash& right) const + { + // this table is the same as the right table if they are the same table! + if (&right == this) return true; + // they must be the same size to be equal + if (m_size != right.m_size) return false; + // now every key in this must be in right and have the same data + for (hash_iterator > i = begin(); i != end(); i++) + { + hash_iterator > found = right.find(i->first); + if (found == right.end()) return false; + if (!(i->second == found->second)) return false; + } + return true; + } + + // set up the hash to auto-rehash at a specific size + // setting the rehash size to 0 forces manual rehashing + template + void hash::auto_rehash(void) + { + m_rehash = m_bins; + } + + template + void hash::manual_rehash(void) + { + m_rehash = 0; + } + + // the rehash function + // builds a new hash table and moves the elements (without copying) from the old to the new + // I store the un-modulused hash value in the element for more efficient rehashing + // passing 0 to the bins parameter does auto-rehashing + // passing any other value forces the number of bins + + template + void hash::rehash(unsigned bins) + { + // user specified size: just take the user's value + // auto calculate: if the load is high, increase the size; else do nothing + unsigned new_bins = bins ? bins : m_bins; + if (bins == 0 && m_size > 0) + { + // these numbers are pretty arbitrary + // TODO - make them user-customisable? + float load = loading(); + if (load > 2.0) + new_bins = (unsigned)(m_bins * load); + else if (load > 1.0) + new_bins = m_bins * 2; + } + if (new_bins == m_bins) return; + // set the new rehashing point if auto-rehashing is on + if (m_rehash) m_rehash = new_bins; + // move aside the old structure + hash_element** old_values = m_values; + unsigned old_bins = m_bins; + // create a replacement structure + m_values = new hash_element*[new_bins]; + for (unsigned i = 0; i < new_bins; i++) + m_values[i] = 0; + m_bins = new_bins; + // move all the old elements across, rehashing each one + for (unsigned j = 0; j < old_bins; j++) + { + while(old_values[j]) + { + // unhook from the old structure + hash_element* current = old_values[j]; + old_values[j] = current->m_next; + // rehash using the stored hash value + unsigned bin = current->bin(); + // hook it into the new structure + current->m_next = m_values[bin]; + m_values[bin] = current; + } + } + // now delete the old structure + delete[] old_values; + } + + // the loading is the average number of elements per bin + // this simplifies to the total elements divided by the number of bins + + template + float hash::loading(void) const + { + return (float)m_size / (float)m_bins; + } + + // remove all elements from the table + + template + void hash::erase(void) + { + // unhook the list elements and destroy them + for (unsigned i = 0; i < m_bins; i++) + { + hash_element* current = m_values[i]; + while(current) + { + hash_element* next = current->m_next; + delete current; + current = next; + } + m_values[i] = 0; + } + m_size = 0; + } + + // test for whether a key is present in the table + + template + bool hash::present(const K& key) const + { + return find(key) != end(); + } + + template + TYPENAME hash::size_type hash::count(const K& key) const + { + return present() ? 1 : 0; + } + + // add a key and data element to the table - defined in terms of the general-purpose pair insert function + + template + TYPENAME hash::iterator hash::insert(const K& key, const T& data) + { + return insert(std::pair(key,data)).first; + } + + // insert a key/data pair into the table + // this removes any old value with the same key since there is no multihash functionality + + template + std::pair::iterator, bool> hash::insert(const std::pair& value) + { + // if auto-rehash is enabled, implement the auto-rehash before inserting the new value + // the table is rehashed if this insertion makes the loading exceed 1.0 + if (m_rehash && (m_size >= m_rehash)) rehash(); + // calculate the new hash value + unsigned hash_value_full = H()(value.first); + unsigned bin = hash_value_full % m_bins; + bool inserted = true; + // unhook any previous value with this key + // this has been inlined from erase(key) so that the hash value is not calculated twice + hash_element* previous = 0; + for (hash_element* current = m_values[bin]; current; previous = current, current = current->m_next) + { + // first check the full stored hash value + if (current->m_hash != hash_value_full) continue; + + // next try the equality operator + if (!E()(current->m_value.first, value.first)) continue; + + // unhook this value and destroy it + if (previous) + previous->m_next = current->m_next; + else + m_values[bin] = current->m_next; + delete current; + m_size--; + + // we've overwritten a previous value + inserted = false; + + // assume there can only be one match so we can give up now + break; + } + // now hook in a new list element at the start of the list for this hash value + hash_element* new_item = new hash_element(this, value, hash_value_full); + new_item->m_next = m_values[bin]; + m_values[bin] = new_item; + // increment the size count + m_size++; + // construct an iterator from the list node, and return whether inserted + return std::make_pair(hash_iterator >(new_item), inserted); + } + + // insert a key with an empty data field ready to be filled in later + + template + TYPENAME hash::iterator hash::insert(const K& key) + { + return insert(key,T()); + } + + // remove a key from the table - return true if the key was found and removed, false if it wasn't present + + template + unsigned hash::erase(const K& key) + { + unsigned hash_value_full = H()(key); + unsigned bin = hash_value_full % m_bins; + // scan the list for an element with this key + // need to keep a previous pointer because the lists are single-linked + hash_element* previous = 0; + for (hash_element* current = m_values[bin]; current; previous = current, current = current->m_next) + { + // first check the full stored hash value + if (current->m_hash != hash_value_full) continue; + + // next try the equality operator + if (!E()(current->m_value.first, key)) continue; + + // found this key, so unhook the element from the list + if (previous) + previous->m_next = current->m_next; + else + m_values[bin] = current->m_next; + // destroy it + delete current; + // remember to maintain the size count + m_size--; + return 1; + } + return 0; + } + + // remove an element from the hash table using an iterator (std::map equivalent) + template + TYPENAME hash::iterator hash::erase(TYPENAME hash::iterator it) + { + // work out what the next iterator is in order to return it later + TYPENAME hash::iterator next(it); + ++next; + // we now need to find where this item is - made difficult by the use of + // single-linked lists which means I have to search through the bin from + // the top in order to unlink from the list. + unsigned hash_value_full = it.node()->m_hash; + unsigned bin = hash_value_full % m_bins; + // scan the list for this element + // need to keep a previous pointer because the lists are single-linked + hash_element* previous = 0; + for (hash_element* current = m_values[bin]; current; previous = current, current = current->m_next) + { + // direct test on the address of the element + if (current != it.node()) continue; + // found this iterator, so unhook the element from the list + if (previous) + previous->m_next = current->m_next; + else + m_values[bin] = current->m_next; + // destroy it + delete current; + current = 0; + // remember to maintain the size count + m_size--; + break; + } + return next; + } + + template + void hash::clear(void) + { + erase(); + } + + // search for a key in the table and return an iterator to it + // if the search fails, returns an end() iterator + + template + TYPENAME hash::const_iterator hash::find(const K& key) const + { + // scan the list for this key's hash value for the element with a matching key + unsigned hash_value_full = H()(key); + unsigned bin = hash_value_full % m_bins; + for (hash_element* current = m_values[bin]; current; current = current->m_next) + { + if (current->m_hash == hash_value_full && E()(current->m_value.first, key)) + return hash_iterator >(current); + } + return end(); + } + + template + TYPENAME hash::iterator hash::find(const K& key) + { + // scan the list for this key's hash value for the element with a matching key + unsigned hash_value_full = H()(key); + unsigned bin = hash_value_full % m_bins; + for (hash_element* current = m_values[bin]; current; current = current->m_next) + { + if (current->m_hash == hash_value_full && E()(current->m_value.first, key)) + return hash_iterator >(current); + } + return end(); + } + + // table lookup by key using the index operator[], returning a reference to the data field, not an iterator + // this is rather like the std::map's [] operator + // the difference is that I have a const and non-const version + // the const version will not create the element if not present already, but the non-const version will + // the non-const version is compatible with the behaviour of the map + + template + const T& hash::operator[] (const K& key) const throw(std::out_of_range) + { + // this const version cannot change the hash, so has to raise an exception if the key is missing + hash_iterator > found = find(key); + if (found == end()) + throw std::out_of_range("key not found in stlplus::hash::operator[]"); + return found->second; + } + + template + T& hash::operator[] (const K& key) + { + // this non-const version can change the hash, so creates a new element if the key is missing + hash_iterator > found = find(key); + if (found == end()) + found = insert(key); + return found->second; + } + + // iterators + + template + TYPENAME hash::const_iterator hash::begin(void) const + { + // find the first element + for (unsigned bin = 0; bin < m_bins; bin++) + if (m_values[bin]) + return hash_iterator >(m_values[bin]); + // if the hash is empty, return the end iterator + return end(); + } + + template + TYPENAME hash::iterator hash::begin(void) + { + // find the first element + for (unsigned bin = 0; bin < m_bins; bin++) + if (m_values[bin]) + return hash_iterator >(m_values[bin]); + // if the hash is empty, return the end iterator + return end(); + } + + template + TYPENAME hash::const_iterator hash::end(void) const + { + return hash_iterator >(this); + } + + template + TYPENAME hash::iterator hash::end(void) + { + return hash_iterator >(this); + } + + template + void hash::debug_report(std::ostream& str) const + { + // calculate some stats first + unsigned occupied = 0; + unsigned min_in_bin = m_size; + unsigned max_in_bin = 0; + for (unsigned i = 0; i < m_bins; i++) + { + if (m_values[i]) occupied++; + unsigned count = 0; + for (hash_element* item = m_values[i]; item; item = item->m_next) count++; + if (count > max_in_bin) max_in_bin = count; + if (count < min_in_bin) min_in_bin = count; + } + // now print the table + str << "------------------------------------------------------------------------" << std::endl; + str << "| size: " << m_size << std::endl; + str << "| bins: " << m_bins << std::endl; + str << "| loading: " << loading() << " "; + if (m_rehash) + str << "auto-rehash at " << m_rehash << std::endl; + else + str << "manual rehash" << std::endl; + str << "| occupied: " << occupied + << std::fixed << " (" << (100.0*(float)occupied/(float)m_bins) << "%)" << std::scientific + << ", min = " << min_in_bin << ", max = " << max_in_bin << std::endl; + str << "|-----------------------------------------------------------------------" << std::endl; + str << "| bin 0 1 2 3 4 5 6 7 8 9" << std::endl; + str << "| ---------------------------------------------------------------"; + for (unsigned j = 0; j < m_bins; j++) + { + if (j % 10 == 0) + { + str << std::endl; + str << "| " << std::setw(6) << std::right << (j/10*10) << std::left << " |"; + } + unsigned count = 0; + for (hash_element* item = m_values[j]; item; item = item->m_next) count++; + if (!count) + str << " ."; + else + str << std::setw(6) << std::right << count << std::left; + } + str << std::endl; + str << "------------------------------------------------------------------------" << std::endl; + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/containers/matrix.hpp b/OTLib/containers/matrix.hpp new file mode 100644 index 000000000..ab6cce1ba --- /dev/null +++ b/OTLib/containers/matrix.hpp @@ -0,0 +1,63 @@ +#ifndef STLPLUS_MATRIX +#define STLPLUS_MATRIX +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// General-purpose 2D matrix data structure + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + + template class matrix + { + public: + matrix(unsigned rows = 0, unsigned cols = 0, const T& fill = T()) throw(); + ~matrix(void) throw(); + + matrix(const matrix&) throw(); + matrix& operator =(const matrix&) throw(); + + void resize(unsigned rows, unsigned cols, const T& fill = T()) throw(); + + unsigned rows(void) const throw(); + unsigned columns(void) const throw(); + + void erase(const T& fill = T()) throw(); + void erase(unsigned row, unsigned col, const T& fill = T()) throw(std::out_of_range); + void insert(unsigned row, unsigned col, const T&) throw(std::out_of_range); + const T& item(unsigned row, unsigned col) const throw(std::out_of_range); + T& item(unsigned row, unsigned col) throw(std::out_of_range); + const T& operator()(unsigned row, unsigned col) const throw(std::out_of_range); + T& operator()(unsigned row, unsigned col) throw(std::out_of_range); + + void fill(const T& item = T()) throw(); + void fill_column(unsigned col, const T& item = T()) throw(std::out_of_range); + void fill_row(unsigned row, const T& item = T()) throw(std::out_of_range); + void fill_leading_diagonal(const T& item = T()) throw(); + void fill_trailing_diagonal(const T& item = T()) throw(); + void make_identity(const T& one, const T& zero = T()) throw(); + + void transpose(void) throw(); + + private: + unsigned m_rows; + unsigned m_cols; + T** m_data; + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "matrix.tpp" +#endif diff --git a/OTLib/containers/matrix.tpp b/OTLib/containers/matrix.tpp new file mode 100644 index 000000000..6bb651157 --- /dev/null +++ b/OTLib/containers/matrix.tpp @@ -0,0 +1,215 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + + template + matrix::matrix(unsigned rows, unsigned cols, const T& fill) throw() + { + m_rows = 0; + m_cols = 0; + m_data = 0; + resize(rows,cols,fill); + } + + template + matrix::~matrix(void) throw() + { + for (unsigned row = 0; row < m_rows; row++) + delete[] m_data[row]; + delete[] m_data; + } + + template + matrix::matrix(const matrix& r) throw() + { + m_rows = 0; + m_cols = 0; + m_data = 0; + *this = r; + } + + template + matrix& matrix::operator =(const matrix& right) throw() + { + // clear the old values + for (unsigned row = 0; row < m_rows; row++) + delete[] m_data[row]; + delete[] m_data; + m_rows = 0; + m_cols = 0; + m_data = 0; + // now reconstruct with the new + resize(right.m_rows, right.m_cols); + for (unsigned row = 0; row < m_rows; row++) + for (unsigned col = 0; col < m_cols; col++) + m_data[row][col] = right.m_data[row][col]; + return *this; + } + + template + void matrix::resize(unsigned rows, unsigned cols, const T& fill) throw() + { + // a grid is an array of rows, where each row is an array of T + // a zero-row or zero-column matrix has a null grid + // TODO - make this exception-safe - new could throw here and that would cause a memory leak + T** new_grid = 0; + if (rows && cols) + { + new_grid = new T*[rows]; + for (unsigned row = 0; row < rows; row++) + { + new_grid[row] = new T[cols]; + // copy old items to the new grid but only within the bounds of the intersection of the old and new grids + // fill the rest of the grid with the initial value + for (unsigned col = 0; col < cols; col++) + if (row < m_rows && col < m_cols) + new_grid[row][col] = m_data[row][col]; + else + new_grid[row][col] = fill; + } + } + // destroy the old grid + for (unsigned row = 0; row < m_rows; row++) + delete[] m_data[row]; + delete[] m_data; + // move the new data into the matrix + m_data = new_grid; + m_rows = rows; + m_cols = cols; + } + + template + unsigned matrix::rows(void) const throw() + { + return m_rows; + } + + template + unsigned matrix::columns(void) const throw() + { + return m_cols; + } + + template + void matrix::erase(const T& fill) throw() + { + for (unsigned row = 0; row < m_rows; row++) + for (unsigned col = 0; col < m_cols; col++) + insert(row,col,fill); + } + + template + void matrix::erase(unsigned row, unsigned col, const T& fill) throw(std::out_of_range) + { + insert(row,col,fill); + } + + template + void matrix::insert(unsigned row, unsigned col, const T& element) throw(std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::insert row"); + if (col >= m_cols) throw std::out_of_range("matrix::insert col"); + m_data[row][col] = element; + } + + template + const T& matrix::item(unsigned row, unsigned col) const throw(std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::item row"); + if (col >= m_cols) throw std::out_of_range("matrix::item col"); + return m_data[row][col]; + } + + template + T& matrix::item(unsigned row, unsigned col) throw(std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::item row"); + if (col >= m_cols) throw std::out_of_range("matrix::item col"); + return m_data[row][col]; + } + + template + const T& matrix::operator()(unsigned row, unsigned col) const throw(std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::operator() row"); + if (col >= m_cols) throw std::out_of_range("matrix::operator() col"); + return m_data[row][col]; + } + + template + T& matrix::operator()(unsigned row, unsigned col) throw(std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::operator() row"); + if (col >= m_cols) throw std::out_of_range("matrix::operator() col"); + return m_data[row][col]; + } + + template + void matrix::fill(const T& item) throw() + { + erase(item); + } + + template + void matrix::fill_column(unsigned col, const T& item) throw (std::out_of_range) + { + if (col >= m_cols) throw std::out_of_range("matrix::fill_column"); + for (unsigned row = 0; row < m_rows; row++) + insert(row, col, item); + } + + template + void matrix::fill_row(unsigned row, const T& item) throw (std::out_of_range) + { + if (row >= m_rows) throw std::out_of_range("matrix::fill_row"); + for (unsigned col = 0; col < m_cols; col++) + insert(row, col, item); + } + + template + void matrix::fill_leading_diagonal(const T& item) throw() + { + for (unsigned i = 0; i < m_cols && i < m_rows; i++) + insert(i, i, item); + } + + template + void matrix::fill_trailing_diagonal(const T& item) throw() + { + for (unsigned i = 0; i < m_cols && i < m_rows; i++) + insert(i, m_cols-i-1, item); + } + + template + void matrix::make_identity(const T& one, const T& zero) throw() + { + fill(zero); + fill_leading_diagonal(one); + } + + template + void matrix::transpose(void) throw() + { + // no gain in manipulating this, since building a new matrix is no less efficient + matrix transposed(columns(), rows()); + for (unsigned row = 0; row < rows(); row++) + for (unsigned col = 0; col < columns(); col++) + transposed.insert(col,row,item(row,col)); + // TODO - avoid an extra copy by swapping the member data here + *this = transposed; + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/containers/ntree.hpp b/OTLib/containers/ntree.hpp new file mode 100644 index 000000000..029965638 --- /dev/null +++ b/OTLib/containers/ntree.hpp @@ -0,0 +1,399 @@ +#ifndef STLPLUS_NTREE +#define STLPLUS_NTREE +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// A templated n-ary tree data structure. STL-like but the definition of +// iterators is really only applicable to one-dimensional structures. I use +// iterators to access tree nodes, but there is no increment or decrement +// operators for them. I also define prefix and postfix traversal iterators +// which do have increment. + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" +#include "safe_iterator.hpp" + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // Internals + + template class ntree_node; + template class ntree; + template class ntree_iterator; + template class ntree_prefix_iterator; + template class ntree_postfix_iterator; + + //////////////////////////////////////////////////////////////////////////////// + // Iterators + + // Simple iterators which are just used as pointers to tree nodes. These have + // no increment or decrement operations defined. An uninitialised iterator is + // null - similarly, if you ask for the root of an empty tree or the parent of + // the root node then you get a null iterator. + + template + class ntree_iterator : public safe_iterator,ntree_node > + { + public: + // local type definitions + // an iterator points to an object whilst a const_iterator points to a const object + typedef ntree_iterator iterator; + typedef ntree_iterator const_iterator; + typedef ntree_iterator this_iterator; + typedef TRef reference; + typedef TPtr pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + ntree_iterator(void); + ~ntree_iterator(void); + + // Type conversion methods allow const_iterator and iterator to be converted + const_iterator constify(void) const; + iterator deconstify(void) const; + + // tests useful for putting iterators into other STL structures and for testing whether iteration has completed + bool operator == (const this_iterator& r) const; + bool operator != (const this_iterator& r) const; + bool operator < (const this_iterator& r) const; + + // access the node data - a const_iterator gives you a const element, an iterator a non-const element + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + friend class ntree; + friend class ntree_prefix_iterator; + friend class ntree_postfix_iterator; + + public: + // Note: I had to make this public to get round a problem implementing persistence - it should be private + // you cannot create a valid iterator except by calling an ntree method that returns one + // constructor used by ntree to create a non-null iterator + explicit ntree_iterator(ntree_node* node); + // constructor used by ntree to create an end iterator + explicit ntree_iterator(const ntree* owner); + // used to create an alias of an iterator + explicit ntree_iterator(const safe_iterator, ntree_node >& iterator); + }; + + // Traversal iterators are like iterators but they have increment operators (++) + // - prefix_iterator visits the nodes of the tree in prefix order + // - postfix_iterator visits the nodes of the tree in postfix order. + // There is no such thing as infix order for an n-ary tree and you cannot + // traverse backwards with these iterators. These follow the STL convention in + // that you iterate from a begin to an end - in this case ntree exports + // prefix_begin()/prefix_end() and postfix_begin()/postfix_end(). You can + // simplify these iterators to the basic iterator above for functions that + // require a simple iterator. + + template + class ntree_prefix_iterator + { + public: + typedef ntree_prefix_iterator iterator; + typedef ntree_prefix_iterator const_iterator; + typedef ntree_prefix_iterator this_iterator; + typedef ntree_iterator simple_iterator; + typedef TRef reference; + typedef TPtr pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + ntree_prefix_iterator(void); + ~ntree_prefix_iterator(void); + + // tests + // a null iterator is one that has not been initialised with a value yet + // i.e. you just declared it but didn't assign to it + bool null(void) const; + // an end iterator is one that points to the end element of the list of nodes + // in STL conventions this is one past the last valid element and must not be dereferenced + bool end(void) const; + // a valid iterator is one that can be dereferenced + // i.e. non-null and non-end + bool valid(void) const; + + // Type conversion methods allow const_iterator and iterator to be converted + // convert an iterator/const_iterator to a const_iterator + const_iterator constify(void) const; + iterator deconstify(void) const; + + // generate a simple iterator from a traversal iterator + ntree_iterator simplify(void) const; + + // tests useful for putting iterators into other STL structures and for testing whether iteration has completed + bool operator == (const this_iterator& r) const; + bool operator != (const this_iterator& r) const; + bool operator < (const this_iterator& r) const; + + // increment/decrement operators used to step through the set of all nodes in a graph + // it is only legal to increment a valid iterator + // pre-increment + this_iterator& operator ++ (void) + throw(null_dereference,end_dereference); + // post-increment + this_iterator operator ++ (int) + throw(null_dereference,end_dereference); + + // access the node data - a const_iterator gives you a const element, an iterator a non-const element + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + friend class ntree; + friend class ntree_iterator; + + private: + ntree_iterator m_iterator; + + explicit ntree_prefix_iterator(const ntree_iterator& i); + const ntree_iterator& get_iterator(void) const; + ntree_iterator& get_iterator(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + + template + class ntree_postfix_iterator + { + public: + typedef ntree_postfix_iterator iterator; + typedef ntree_postfix_iterator const_iterator; + typedef ntree_postfix_iterator this_iterator; + typedef ntree_iterator simple_iterator; + typedef TRef reference; + typedef TPtr pointer; + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + ntree_postfix_iterator(void); + ~ntree_postfix_iterator(void); + + // tests + // a null iterator is one that has not been initialised with a value yet + // i.e. you just declared it but didn't assign to it + bool null(void) const; + // an end iterator is one that points to the end element of the list of nodes + // in STL conventions this is one past the last valid element and must not be dereferenced + bool end(void) const; + // a valid iterator is one that can be dereferenced + // i.e. non-null and non-end + bool valid(void) const; + + // Type conversion methods allow const_iterator and iterator to be converted + // convert an iterator/const_iterator to a const_iterator + const_iterator constify(void) const; + iterator deconstify(void) const; + + // generate a simple iterator from a traversal iterator + ntree_iterator simplify(void) const; + + // tests useful for putting iterators into other STL structures and for testing whether iteration has completed + bool operator == (const this_iterator& r) const; + bool operator != (const this_iterator& r) const; + bool operator < (const this_iterator& r) const; + + // increment/decrement operators used to step through the set of all nodes in a graph + // it is only legal to increment a valid iterator + // pre-increment + this_iterator& operator ++ (void) + throw(null_dereference,end_dereference); + // post-increment + this_iterator operator ++ (int) + throw(null_dereference,end_dereference); + + // access the node data - a const_iterator gives you a const element, an iterator a non-const element + // it is illegal to dereference an invalid (i.e. null or end) iterator + reference operator*(void) const + throw(null_dereference,end_dereference); + pointer operator->(void) const + throw(null_dereference,end_dereference); + + friend class ntree; + friend class ntree_iterator; + + private: + ntree_iterator m_iterator; + + explicit ntree_postfix_iterator(const ntree_iterator& i); + const ntree_iterator& get_iterator(void) const; + ntree_iterator& get_iterator(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + // The Ntree class + //////////////////////////////////////////////////////////////////////////////// + + template + class ntree + { + public: + // STL-like typedefs for the types and iterators + typedef T value_type; + + typedef ntree_iterator iterator; + typedef ntree_iterator const_iterator; + + typedef ntree_prefix_iterator prefix_iterator; + typedef ntree_prefix_iterator const_prefix_iterator; + + typedef ntree_postfix_iterator postfix_iterator; + typedef ntree_postfix_iterator const_postfix_iterator; + + ////////////////////////////////////////////////////////////////////////////// + // Constructors, destructors and copies + + ntree(void); + ~ntree(void); + + // copy constructor and assignment both copy the tree + ntree(const ntree&); + ntree& operator=(const ntree&); + + ////////////////////////////////////////////////////////////////////////////// + // size tests + + // tests on whole tree + bool empty(void) const; + unsigned size(void) const; + + // tests for number of nodes in subtree starting at node + unsigned size(const const_iterator& node) const + throw(wrong_object,null_dereference,end_dereference); + unsigned size(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + + // test for depth of tree from root to node + unsigned depth(const const_iterator& node) const + throw(wrong_object,null_dereference,end_dereference); + unsigned depth(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + + ////////////////////////////////////////////////////////////////////////////// + // direct traversal + + const_iterator root(void) const; + iterator root(void); + + unsigned children(const const_iterator& node) const + throw(wrong_object,null_dereference,end_dereference); + unsigned children(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + + const_iterator child(const const_iterator& node, unsigned child) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + iterator child(const iterator& node, unsigned child) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + const_iterator parent(const const_iterator& node) const + throw(wrong_object,null_dereference,end_dereference); + iterator parent(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + + ////////////////////////////////////////////////////////////////////////////// + // iterator traversal + + const_prefix_iterator prefix_begin(void) const; + prefix_iterator prefix_begin(void); + const_prefix_iterator prefix_end(void) const; + prefix_iterator prefix_end(void); + + const_postfix_iterator postfix_begin(void) const; + postfix_iterator postfix_begin(void); + const_postfix_iterator postfix_end(void) const; + postfix_iterator postfix_end(void); + + ////////////////////////////////////////////////////////////////////////////// + // modification + + // discard previous contents and create a new root node + iterator insert(const T&); + // add a new child inserted into the node's children at the specified place + iterator insert(const iterator& node, unsigned child, const T&) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + // shortcut for insert at the end i.e. tree.insert(node, node.children(), value) + iterator insert(const iterator& node, const T&) + throw(wrong_object,null_dereference,end_dereference); + // old name for the above + iterator append(const iterator& node, const T&) + throw(wrong_object,null_dereference,end_dereference); + + // discard previous contents and copy the tree + iterator insert(const ntree&); + // add a copy of the tree as a new child inserted into the node's children at the specified place + iterator insert(const iterator& node, unsigned child, const ntree&) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + // shortcut for insert at the end i.e. tree.insert(node, node.children(), value) + iterator insert(const iterator& node, const ntree&) + throw(wrong_object,null_dereference,end_dereference); + // old name for the above + iterator append(const iterator& node, const ntree&) + throw(wrong_object,null_dereference,end_dereference); + + // discard previous contents and move the tree without copying + // invalidates all iterators to the old tree + iterator move(ntree&); + // move the tree to become the designated child + // invalidates all iterators to the old tree + iterator move(const iterator& node, unsigned child, ntree&) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + // shortcut for move to the last child i.e. node.move(node, node.children(), value) + iterator move(const iterator& node, ntree&) + throw(wrong_object,null_dereference,end_dereference); + + // replace the node with the new value, pushing the old node down to make it the child + // returns the iterator to the new, pushed node + iterator push(const iterator& node, const T&) + throw(wrong_object,null_dereference,end_dereference); + // erases the specified child, moving its children up to become the node's children + void pop(const iterator& node, unsigned child) + throw(wrong_object,null_dereference,end_dereference); + + // erase the whole tree + void erase(void); + // erase the node and all its children + void erase(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + // erase the specified child + void erase(const iterator& node, unsigned child) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + // get a copy of the tree as a tree + ntree subtree(void); + // get a copy of the subtree as a tree with the specified node as root + ntree subtree(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + // get a copy of the subtree as a tree with the specified child as root + ntree subtree(const iterator& node, unsigned child) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + // move the whole tree to make a new tree + ntree cut(void); + // move the subtree to make a new tree with the specified node as root + ntree cut(const iterator& node) + throw(wrong_object,null_dereference,end_dereference); + // move the subtree to make a new tree with the specified child as root + ntree cut(const iterator& node, unsigned child) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range); + + ////////////////////////////////////////////////////////////////////////////// + + private: + ntree_node* m_root; + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "ntree.tpp" +#endif diff --git a/OTLib/containers/ntree.tpp b/OTLib/containers/ntree.tpp new file mode 100644 index 000000000..9236327ce --- /dev/null +++ b/OTLib/containers/ntree.tpp @@ -0,0 +1,962 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // ntree_node + + template + class ntree_node + { + public: + master_iterator, ntree_node > m_master; + T m_data; + ntree_node* m_parent; + std::vector*> m_children; + + public: + ntree_node(const ntree* owner, const T& data = T()) : + m_master(owner,this), m_data(data), m_parent(0) + { + } + + void change_owner(const ntree* owner) + { + m_master.change_owner(owner); + for (TYPENAME std::vector*>::iterator i = m_children.begin(); i != m_children.end(); i++) + (*i)->change_owner(owner); + } + + ~ntree_node(void) + { + m_parent = 0; + for (TYPENAME std::vector*>::iterator i = m_children.begin(); i != m_children.end(); i++) + delete *i; + } + + }; + + template + static ntree_node* ntree_copy(const ntree* new_owner, ntree_node* root) + { + if (!root) return 0; + ntree_node* new_tree = new ntree_node(new_owner, root->m_data); + for (TYPENAME std::vector*>::iterator i = root->m_children.begin(); i != root->m_children.end(); i++) + { + ntree_node* new_child = ntree_copy(new_owner, *i); + new_tree->m_children.push_back(new_child); + new_child->m_parent = new_tree; + } + return new_tree; + } + + template + static unsigned ntree_size(ntree_node* root) + { + if (!root) return 0; + unsigned result = 1; + for (TYPENAME std::vector*>::iterator i = root->m_children.begin(); i != root->m_children.end(); i++) + result += ntree_size(*i); + return result; + } + + template + static unsigned ntree_depth(ntree_node* root) + { + unsigned depth = 0; + for (ntree_node* i = root; i; i = i->m_parent) + depth++; + return depth; + } + + //////////////////////////////////////////////////////////////////////////////// + // ntree_iterator + + // constructor to create a null iterator - you must assign a valid value to this iterator before using it + template + ntree_iterator::ntree_iterator(void) + { + } + + // used to create an alias of an iterator + template + ntree_iterator::ntree_iterator(const safe_iterator, ntree_node >& iterator) : + safe_iterator,ntree_node >(iterator) + { + } + + // constructor used by ntree to create a non-null iterator + template + ntree_iterator::ntree_iterator(ntree_node* node) : + safe_iterator,ntree_node >(node->m_master) + { + } + + // constructor used by ntree to create an end iterator + template + ntree_iterator::ntree_iterator(const ntree* owner) : + safe_iterator,ntree_node >(owner) + { + } + + // destructor + template + ntree_iterator::~ntree_iterator(void) + { + } + + template + TYPENAME ntree_iterator::const_iterator ntree_iterator::constify(void) const + { + return ntree_iterator(*this); + } + + template + TYPENAME ntree_iterator::iterator ntree_iterator::deconstify(void) const + { + return ntree_iterator(*this); + } + + template + bool ntree_iterator::operator == (const TYPENAME ntree_iterator::this_iterator& r) const + { + return equal(r); + } + + template + bool ntree_iterator::operator != (const TYPENAME ntree_iterator::this_iterator& r) const + { + return !operator==(r); + } + + template + bool ntree_iterator::operator < (const TYPENAME ntree_iterator::this_iterator& r) const + { + return compare(r) < 0; + } + + template + TYPENAME ntree_iterator::reference ntree_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + this->assert_valid(); + return this->node()->m_data; + } + + template + TYPENAME ntree_iterator::pointer ntree_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return &(operator*()); + } + + //////////////////////////////////////////////////////////////////////////////// + // ntree_prefix_iterator + + template + ntree_prefix_iterator::ntree_prefix_iterator(void) + { + } + + template + ntree_prefix_iterator::~ntree_prefix_iterator(void) + { + } + + template + ntree_prefix_iterator::ntree_prefix_iterator(const ntree_iterator& i) : + m_iterator(i) + { + // this is initialised with the root node + // which is also the first node in prefix traversal order + } + + template + bool ntree_prefix_iterator::null(void) const + { + return m_iterator.null(); + } + + template + bool ntree_prefix_iterator::end(void) const + { + return m_iterator.end(); + } + + template + bool ntree_prefix_iterator::valid(void) const + { + return m_iterator.valid(); + } + + template + TYPENAME ntree_prefix_iterator::const_iterator ntree_prefix_iterator::constify(void) const + { + return ntree_prefix_iterator(m_iterator); + } + + template + TYPENAME ntree_prefix_iterator::iterator ntree_prefix_iterator::deconstify(void) const + { + return ntree_prefix_iterator(m_iterator); + } + + template + ntree_iterator ntree_prefix_iterator::simplify(void) const + { + return m_iterator; + } + + template + bool ntree_prefix_iterator::operator == (const TYPENAME ntree_prefix_iterator::this_iterator& r) const + { + return m_iterator == r.m_iterator; + } + + template + bool ntree_prefix_iterator::operator != (const TYPENAME ntree_prefix_iterator::this_iterator& r) const + { + return m_iterator != r.m_iterator; + } + + template + bool ntree_prefix_iterator::operator < (const TYPENAME ntree_prefix_iterator::this_iterator& r) const + { + return m_iterator < r.m_iterator; + } + + template + TYPENAME ntree_prefix_iterator::this_iterator& ntree_prefix_iterator::operator ++ (void) + throw(null_dereference,end_dereference) + { + // pre-increment operator + // algorithm: if there are any children, visit child 0, otherwise, go to + // parent and deduce which child the start node was of that parent - if + // there are further children, go into the next one. Otherwise, go up the + // tree and test again for further children. Return null if there are no + // further nodes + m_iterator.assert_valid(); + ntree_node* old_node = m_iterator.node(); + if (!old_node->m_children.empty()) + { + // simply take the first child of this node + m_iterator.set(old_node->m_children[0]->m_master); + } + else + { + // this loop walks up the parent pointers + // either it will walk off the top and exit or a new node will be found and the loop will exit + for (;;) + { + // go up a level + ntree_node* parent = old_node->m_parent; + if (!parent) + { + // we've walked off the top of the tree, so return end + m_iterator.set_end(); + break; + } + else + { + // otherwise walk down the next child - if there is one + // find which index the old node was relative to this node + TYPENAME std::vector*>::iterator found = + std::find(parent->m_children.begin(), parent->m_children.end(), old_node); + // if this was found, then see if there is another and if so return that + found++; + if (found != parent->m_children.end()) + { + // visit the next child + m_iterator.set((*found)->m_master); + break; + } + else + { + // keep going up + old_node = parent; + } + } + } + } + return *this; + } + + template + TYPENAME ntree_prefix_iterator::this_iterator ntree_prefix_iterator::operator ++ (int) + throw(null_dereference,end_dereference) + { + // post-increment is defined in terms of the pre-increment + ntree_prefix_iterator result(*this); + ++(*this); + return result; + } + + template + TYPENAME ntree_prefix_iterator::reference ntree_prefix_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + return m_iterator.operator*(); + } + + template + TYPENAME ntree_prefix_iterator::pointer ntree_prefix_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return m_iterator.operator->(); + } + + template + const ntree_iterator& ntree_prefix_iterator::get_iterator(void) const + { + return m_iterator; + } + + template + ntree_iterator& ntree_prefix_iterator::get_iterator(void) + { + return m_iterator; + } + + //////////////////////////////////////////////////////////////////////////////// + // ntree_postfix_iterator + + template + ntree_postfix_iterator::ntree_postfix_iterator(void) + { + } + + template + ntree_postfix_iterator::~ntree_postfix_iterator(void) + { + } + + template + ntree_postfix_iterator::ntree_postfix_iterator(const ntree_iterator& i) : + m_iterator(i) + { + // this is initialised with the root node + // initially traverse to the first node to be visited + if (m_iterator.valid()) + { + ntree_node* node = m_iterator.node(); + while (!node->m_children.empty()) + node = node->m_children[0]; + m_iterator.set(node->m_master); + } + } + + template + bool ntree_postfix_iterator::null(void) const + { + return m_iterator.null(); + } + + template + bool ntree_postfix_iterator::end(void) const + { + return m_iterator.end(); + } + + template + bool ntree_postfix_iterator::valid(void) const + { + return m_iterator.valid(); + } + + template + TYPENAME ntree_postfix_iterator::const_iterator ntree_postfix_iterator::constify(void) const + { + return ntree_postfix_iterator(m_iterator); + } + + template + TYPENAME ntree_postfix_iterator::iterator ntree_postfix_iterator::deconstify(void) const + { + return ntree_postfix_iterator(m_iterator); + } + + template + ntree_iterator ntree_postfix_iterator::simplify(void) const + { + return m_iterator; + } + + template + bool ntree_postfix_iterator::operator == (const TYPENAME ntree_postfix_iterator::this_iterator& r) const + { + return m_iterator == r.m_iterator; + } + + template + bool ntree_postfix_iterator::operator != (const TYPENAME ntree_postfix_iterator::this_iterator& r) const + { + return m_iterator != r.m_iterator; + } + + template + bool ntree_postfix_iterator::operator < (const TYPENAME ntree_postfix_iterator::this_iterator& r) const + { + return m_iterator < r.m_iterator; + } + + template + TYPENAME ntree_postfix_iterator::this_iterator& ntree_postfix_iterator::operator ++ (void) + throw(null_dereference,end_dereference) + { + // pre-increment operator + // algorithm: this node has been visited, therefore all children must have + // already been visited. So go to parent. Return null if the parent is null. + // Otherwise deduce which child the start node was of that parent - if there + // are further children, go into the next one and then walk down any + // subsequent first-child pointers to the bottom. Otherwise, if there are no + // children then the parent node is the next in the traversal. + m_iterator.assert_valid(); + // go up a level + ntree_node* old_node = m_iterator.node(); + ntree_node* parent = old_node->m_parent; + if (!parent) + { + // we've walked off the top of the tree, so return end + m_iterator.set_end(); + } + else + { + // otherwise find which index the old node was relative to this node + TYPENAME std::vector*>::iterator found = + std::find(parent->m_children.begin(), parent->m_children.end(), old_node); + // if this was found, then see if there is another + found++; + if (found != parent->m_children.end()) + { + // if so traverse to it and walk down the leftmost child pointers to the bottom of the new sub-tree + ntree_node* new_node = *found; + while (!new_node->m_children.empty()) + new_node = new_node->m_children[0]; + m_iterator.set(new_node->m_master); + } + else + { + // the parent's children have all been visited - so the parent is visited + m_iterator.set(parent->m_master); + } + } + return *this; + } + + template + TYPENAME ntree_postfix_iterator::this_iterator ntree_postfix_iterator::operator ++ (int) + throw(null_dereference,end_dereference) + { + // post-increment is defined in terms of the pre-increment + ntree_postfix_iterator result(*this); + ++(*this); + return result; + } + + template + TYPENAME ntree_postfix_iterator::reference ntree_postfix_iterator::operator*(void) const + throw(null_dereference,end_dereference) + { + return m_iterator.operator*(); + } + + template + TYPENAME ntree_postfix_iterator::pointer ntree_postfix_iterator::operator->(void) const + throw(null_dereference,end_dereference) + { + return m_iterator.operator->(); + } + + template + const ntree_iterator& ntree_postfix_iterator::get_iterator(void) const + { + return m_iterator; + } + + template + ntree_iterator& ntree_postfix_iterator::get_iterator(void) + { + return m_iterator; + } + + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + // ntree + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + + template + ntree::ntree(void) : m_root(0) + { + } + + template + ntree::~ntree(void) + { + if (m_root) delete m_root; + } + + template + ntree::ntree(const ntree& r) : m_root(0) + { + *this = r; + } + + template + ntree& ntree::operator=(const ntree& r) + { + if (m_root) delete m_root; + m_root = ntree_copy(this, r.m_root); + return *this; + } + + template + bool ntree::empty(void) const + { + return m_root == 0; + } + + template + unsigned ntree::size(void) const + { + return ntree_size(m_root); + } + + template + unsigned ntree::size(const TYPENAME ntree::const_iterator& i) const + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return ntree_size(i.node()); + } + + template + unsigned ntree::size(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return ntree_size(i.node()); + } + + template + unsigned ntree::depth(const TYPENAME ntree::const_iterator& i) const + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return ntree_depth(i.node()); + } + + template + unsigned ntree::depth(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return ntree_depth(i.node()); + } + + template + TYPENAME ntree::const_iterator ntree::root(void) const + { + if (!m_root) return ntree_iterator(this); + return ntree_iterator(m_root); + } + + template + TYPENAME ntree::iterator ntree::root(void) + { + if (!m_root) return ntree_iterator(this); + return ntree_iterator(m_root); + } + + template + unsigned ntree::children(const TYPENAME ntree::const_iterator& i) const + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return i.node()->m_children.size(); + } + + template + unsigned ntree::children(const ntree_iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + return i.node()->m_children.size(); + } + + template + TYPENAME ntree::const_iterator ntree::child(const TYPENAME ntree::const_iterator& i, unsigned child) const + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + i.assert_valid(this); + if (child >= children(i)) throw std::out_of_range("stlplus::ntree"); + return ntree_iterator(i.node()->m_children[child]); + } + + template + TYPENAME ntree::iterator ntree::child(const TYPENAME ntree::iterator& i, unsigned child) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + i.assert_valid(this); + if (child >= children(i)) throw std::out_of_range("stlplus::ntree"); + return ntree_iterator(i.node()->m_children[child]); + } + + template + TYPENAME ntree::const_iterator ntree::parent(const TYPENAME ntree::const_iterator& i) const + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + ntree_node* parent = i.node()->m_parent; + if (!parent) return ntree_iterator(this); + return ntree_iterator(parent); + } + + template + TYPENAME ntree::iterator ntree::parent(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + i.assert_valid(this); + ntree_node* parent = i.node()->m_parent; + if (!parent) return ntree_iterator(this); + return ntree_iterator(parent); + } + + template + TYPENAME ntree::const_prefix_iterator ntree::prefix_begin(void) const + { + return ntree_prefix_iterator(root()); + } + + template + TYPENAME ntree::prefix_iterator ntree::prefix_begin(void) + { + return ntree_prefix_iterator(root()); + } + + template + TYPENAME ntree::const_prefix_iterator ntree::prefix_end(void) const + { + return ntree_prefix_iterator(ntree_iterator(this)); + } + + template + TYPENAME ntree::prefix_iterator ntree::prefix_end(void) + { + return ntree_prefix_iterator(ntree_iterator(this)); + } + + template + TYPENAME ntree::const_postfix_iterator ntree::postfix_begin(void) const + { + return ntree_postfix_iterator(root()); + } + + template + TYPENAME ntree::postfix_iterator ntree::postfix_begin(void) + { + return ntree_postfix_iterator(root()); + } + + template + TYPENAME ntree::const_postfix_iterator ntree::postfix_end(void) const + { + return ntree_postfix_iterator(ntree_iterator(this)); + } + + template + TYPENAME ntree::postfix_iterator ntree::postfix_end(void) + { + return ntree_postfix_iterator(ntree_iterator(this)); + } + + template + TYPENAME ntree::iterator ntree::insert(const T& data) + { + // insert a new node as the root + erase(); + m_root = new ntree_node(this,data); + return ntree_iterator(m_root); + } + + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, unsigned offset, const T& data) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + // if i is the end iterator, this means insert a new root + // if (i.end()) + // return insert(data); + // otherwise, insert a new child + i.assert_valid(this); + if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); + ntree_node* new_node = new ntree_node(this,data); + i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); + new_node->m_parent = i.node(); + return ntree_iterator(new_node); + } + + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, const T& data) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), data); + } + + template + TYPENAME ntree::iterator ntree::append(const TYPENAME ntree::iterator& i, const T& data) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), data); + } + + template + TYPENAME ntree::iterator ntree::insert(const ntree& tree) + { + // insert a whole tree as root + erase(); + m_root = ntree_copy(this, tree.m_root); + return ntree_iterator(m_root); + } + + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, unsigned offset, const ntree& tree) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + // insert a whole tree as a child of i + i.assert_valid(this); + if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); + ntree_node* new_node = ntree_copy(this, tree.m_root); + i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); + new_node->m_parent = i.node(); + return ntree_iterator(new_node); + } + + template + TYPENAME ntree::iterator ntree::insert(const TYPENAME ntree::iterator& i, const ntree& tree) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), tree); + } + + template + TYPENAME ntree::iterator ntree::append(const TYPENAME ntree::iterator& i, const ntree& tree) + throw(wrong_object,null_dereference,end_dereference) + { + return insert(i, children(i), tree); + } + + template + TYPENAME ntree::iterator ntree::move(ntree& tree) + { + // insert a whole tree as root, removing it from source + erase(); + m_root = tree.m_root; + tree.m_root = 0; + if (m_root) m_root->change_owner(this); + return ntree_iterator(m_root); + } + + template + TYPENAME ntree::iterator ntree::move(const TYPENAME ntree::iterator& i, unsigned offset, ntree& tree) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + // insert a whole tree as a child of i + i.assert_valid(this); + if (offset > children(i)) throw std::out_of_range("stlplus::ntree"); + ntree_node* new_node = tree.m_root; + tree.m_root = 0; + if (new_node) new_node->change_owner(this); + i.node()->m_children.insert(i.node()->m_children.begin()+offset,new_node); + new_node->m_parent = i.node(); + return ntree_iterator(new_node); + } + + template + TYPENAME ntree::iterator ntree::move(const TYPENAME ntree::iterator& i, ntree& tree) + throw(wrong_object,null_dereference,end_dereference) + { + return move(i, children(i), tree); + } + + template + TYPENAME ntree::iterator ntree::push(const TYPENAME ntree::iterator& node, const T& data) + throw(wrong_object,null_dereference,end_dereference) + { + // insert a new node to replace the existing node in the tree + // making the original node the child of the new node + // i.e. (node) becomes (new)->(node) + // afterwards, the iterator still points to the old node, now the child + // returns the iterator to the new node + node.assert_valid(this); + ntree_node* new_node = new ntree_node(this,data); + if (node.node() == m_root) + { + // pushing the root node + m_root = new_node; + new_node->m_parent = 0; + } + else + { + // pushing a sub-node + *(std::find(node.node()->m_parent->m_children.begin(), node.node()->m_parent->m_children.end(), node.node())) = new_node; + new_node->m_parent = node.node()->m_parent; + } + // link up the old node as the child of the new node + new_node->m_children.insert(new_node->m_children.begin(),node.node()); + node.node()->m_parent = new_node; + return ntree_iterator(new_node); + } + + template + void ntree::pop(const TYPENAME ntree::iterator& parent, unsigned offset) + throw(wrong_object,null_dereference,end_dereference) + { + // inverse of push + // removes the specified child of the parent node, adding its children to the parent node at the same offset + parent.assert_valid(this); + ntree_node* node = parent.node(); + if (offset >= node->m_children.size()) throw std::out_of_range("stlplus::ntree"); + // move the grandchildren first + ntree_node* child = parent.node()->m_children[offset]; + while (!child->m_children.empty()) + { + // remove the last grandchild and insert into node just after the child to be removed + ntree_node* grandchild = child->m_children[child->m_children.size()-1]; + child->m_children.pop_back(); + node->m_children.insert(node->m_children.begin()+offset+1, grandchild); + grandchild->m_parent = node; + } + // now remove the child + node->m_children.erase(node->m_children.begin()+offset); + delete child; + } + + template + void ntree::erase(void) + { + // erase the whole tree + erase(root()); + } + + template + void ntree::erase(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + if (!i.end()) + { + // erase this node and its subtree + // do this by erasing this child of its parent + // handle the case of erasing the root + i.assert_valid(this); + ntree_node* node = i.node(); + if (node == m_root) + { + delete m_root; + m_root = 0; + } + else + { + ntree_node* parent = node->m_parent; + // impossible for parent to be null - should assert this + TYPENAME std::vector*>::iterator found = + std::find(parent->m_children.begin(), parent->m_children.end(), node); + // impossible for find to fail - should assert this + parent->m_children.erase(found); + delete node; + } + } + } + + template + void ntree::erase(const TYPENAME ntree::iterator& i, unsigned offset) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + erase(child(i, offset)); + } + + template + ntree ntree::subtree(void) + { + return subtree(root()); + } + + template + ntree ntree::subtree(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + ntree result; + if (!i.end()) + { + i.assert_valid(this); + result.m_root = ntree_copy(&result, i.node()); + } + return result; + } + + template + ntree ntree::subtree(const TYPENAME ntree::iterator& i, unsigned offset) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + return subtree(child(i, offset)); + } + + template + ntree ntree::cut(void) + { + return cut(root()); + } + + template + ntree ntree::cut(const TYPENAME ntree::iterator& i) + throw(wrong_object,null_dereference,end_dereference) + { + ntree result; + if (!i.end()) + { + i.assert_valid(this); + ntree_node* node = i.node(); + if (node == m_root) + { + result.m_root = m_root; + m_root = 0; + } + else + { + ntree_node* parent = node->m_parent; + // impossible for parent to be null - should assert this + TYPENAME std::vector*>::iterator found = + std::find(parent->m_children.begin(), parent->m_children.end(), node); + // impossible for find to fail - should assert this + result.m_root = *found; + parent->m_children.erase(found); + } + if (result.m_root) + { + result.m_root->m_parent = 0; + result.m_root->set_new_owner(&result); + } + } + return result; + } + + template + ntree ntree::cut(const TYPENAME ntree::iterator& i, unsigned offset) + throw(wrong_object,null_dereference,end_dereference,std::out_of_range) + { + return cut(child(i, offset)); + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/containers/safe_iterator.hpp b/OTLib/containers/safe_iterator.hpp new file mode 100644 index 000000000..6d8b56356 --- /dev/null +++ b/OTLib/containers/safe_iterator.hpp @@ -0,0 +1,155 @@ +#ifndef STLPLUS_SAFE_ITERATOR +#define STLPLUS_SAFE_ITERATOR +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// The STLplus safe_iterator superclasses. This implements the STLplus safe +// iterator principles. Data structures can then be built using subclasses +// of safe_iterator for their iterator objects and they will inherit the +// safe iterator behaviour. + +// The data structure must contain a master iterator for each node in the +// structure. When an iterator is returned to the user, it must be created +// by the master iterator. When a node is removed from the data structure, +// its master iterator is destroyed. This sets all iterators pointing to the +// master iterator to end iterators. + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // internals + + template + class safe_iterator_body; + + template + class safe_iterator; + + //////////////////////////////////////////////////////////////////////////////// + // Master Iterator + // Create one of these in each node in the data structure + // Generate iterators by obtaining a safe-iterator object from the master iterator + //////////////////////////////////////////////////////////////////////////////// + + template + class master_iterator + { + public: + + // construct a valid master iterator connected to the node + master_iterator(const O* owner, N* node) throw(); + + // destructor - disconnects all iterators from the node + ~master_iterator(void) throw(); + + // dereference + N* node(void) const throw(); + const O* owner(void) const throw(); + + // when you move a node from one owner to another, call this on the node's master iterator + // this effectively moves all other iterators to the node so that they are owned by the new owner too + void change_owner(const O* owner) throw(); + + friend class safe_iterator; + private: + master_iterator(const master_iterator&) throw(); + master_iterator& operator=(const master_iterator&) throw(); + safe_iterator_body* m_body; + }; + + //////////////////////////////////////////////////////////////////////////////// + // Safe Iterator + //////////////////////////////////////////////////////////////////////////////// + + template + class safe_iterator + { + public: + + // construct a null iterator + safe_iterator(void) throw(); + + // construct a valid iterator by aliasing from the owner node's master iterator + safe_iterator(const master_iterator&) throw(); + + // copy constructor does aliasing + safe_iterator(const safe_iterator&) throw(); + + // alias an iterator by assignment + safe_iterator& operator=(const safe_iterator&) throw(); + + // destructor + ~safe_iterator(void) throw(); + + // reassignment to another node used in increment/decrement operation + void set(const master_iterator&) throw(); + + // dereference + N* node(void) const throw(); + const O* owner(void) const throw(); + + // change to a null iterator - i.e. one that does not belong to any object + // this does not affect any other iterators pointing to the same node + void set_null(void) throw(); + + //////////////////////////////////////////////////////////////////////////////// + // operations for clients that do not have a master end iterator + // alternatively, have a master end iterator as part of the container + // and call constructor(master_end) or set(master_end) + + // construct an end iterator + safe_iterator(const O* owner) throw(); + + // change to an end iterator - e.g. as a result of incrementing off the end + void set_end(void) throw(); + + //////////////////////////////////////////////////////////////////////////////// + // tests + + // comparison + bool equal(const safe_iterator& right) const throw(); + int compare(const safe_iterator& right) const throw(); + + // a null iterator is one that has not been initialised with a value yet + // i.e. you just declared it but didn't assign to it + bool null(void) const throw(); + + // an end iterator is one that points to the end element of the list of nodes + // in STL conventions this is one past the last valid element and must not be dereferenced + bool end(void) const throw(); + + // a valid iterator is one that can be dereferenced + // i.e. non-null and non-end + bool valid(void) const throw(); + + // check the rules for a valid iterator that can be dereferenced + // optionally also check that the iterator is owned by the owner + void assert_valid(void) const throw(null_dereference,end_dereference); + void assert_valid(const O* owner) const throw(wrong_object,null_dereference,end_dereference); + // assert the rules for a non-null iterator - i.e. valid or end, values that occur in increment operations + void assert_non_null(void) const throw(null_dereference); + // assert that this iterator is owned by this container + void assert_owner(const O* owner) const throw(wrong_object); + + //////////////////////////////////////////////////////////////////////////////// + + friend class master_iterator; + private: + safe_iterator_body* m_body; + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "safe_iterator.tpp" +#endif diff --git a/OTLib/containers/safe_iterator.tpp b/OTLib/containers/safe_iterator.tpp new file mode 100644 index 000000000..4bbf9b8b1 --- /dev/null +++ b/OTLib/containers/safe_iterator.tpp @@ -0,0 +1,357 @@ +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // body class implements the aliasing behaviour + + template + class safe_iterator_body + { + private: + const O* m_owner; + N* m_node; + unsigned m_count; + + public: + + safe_iterator_body(const O* owner, N* node) throw() : + m_owner(owner), m_node(node), m_count(1) + { + } + + ~safe_iterator_body(void) throw() + { + m_owner = 0; + m_node = 0; + } + + unsigned count(void) const + { + return m_count; + } + + void increment(void) + { + ++m_count; + } + + bool decrement(void) + { + --m_count; + return m_count == 0; + } + + N* node(void) const throw() + { + return m_node; + } + + const O* owner(void) const throw() + { + return m_owner; + } + + void change_owner(const O* owner) + { + m_owner = owner; + } + + bool equal(const safe_iterator_body* right) const throw() + { + return m_node == right->m_node; + } + + int compare(const safe_iterator_body* right) const throw() + { + if (m_node == right->m_node) return 0; + return (m_node < right->m_node) ? -1 : 1; + } + + bool null(void) const throw() + { + return m_owner == 0; + } + + bool end(void) const throw() + { + return m_owner != 0 && m_node == 0; + } + + bool valid(void) const throw() + { + return m_owner != 0 && m_node != 0; + } + + void set_end(void) throw() + { + m_node = 0; + } + + void set_null(void) throw() + { + m_owner = 0; + m_node = 0; + } + + void assert_valid(void) const throw(null_dereference,end_dereference) + { + if (null()) + throw null_dereference("stlplus::safe_iterator: dereferencing null iterator"); + if (end()) + throw end_dereference("stlplus::safe_iterator: dereferencing end iterator"); + } + + void assert_non_null(void) const throw(null_dereference) + { + if (null()) + throw null_dereference("stlplus::safe_iterator: dereferencing null iterator"); + } + + void assert_owner(const O* owner) const throw(wrong_object) + { + if (owner != m_owner) + throw wrong_object("stlplus::safe_iterator: using iterator with wrong object"); + } + }; + + + //////////////////////////////////////////////////////////////////////////////// + // Master Iterator + //////////////////////////////////////////////////////////////////////////////// + + // construct a valid iterator + template + master_iterator::master_iterator(const O* owner, N* node) throw() : + m_body(new safe_iterator_body(owner,node)) + { + } + + // destructor - disconnect all iterators from the node + // this usually happens when the node is deleted and must invalidate all aliases + template + master_iterator::~master_iterator(void) throw() + { + m_body->set_end(); + if(m_body->decrement()) + { + delete m_body; + m_body = 0; + } + } + + // dereference + template + N* master_iterator::node(void) const throw() + { + return m_body->node(); + } + + template + const O* master_iterator::owner(void) const throw() + { + return m_body->owner(); + } + + // when you move a node from one owner to another, call this on the node's iterator + // this effectively moves all iterators to the node so that they are owned by the new owner too + template + void master_iterator::change_owner(const O* owner) throw() + { + m_body->change_owner(owner); + } + + //////////////////////////////////////////////////////////////////////////////// + // Safe Iterator + //////////////////////////////////////////////////////////////////////////////// + + // construct a null iterator + // later assignment of a valid iterator to this is done by using step + template + safe_iterator::safe_iterator(void) throw() : + m_body(new safe_iterator_body(0,0)) + { + } + + // construct a valid iterator by aliasing from the owner node's master iterator + template + safe_iterator::safe_iterator(const master_iterator& r) throw() : + m_body(0) + { + m_body = r.m_body; + m_body->increment(); + } + + // construct a valid iterator by aliasing from the owner node's master iterator + template + safe_iterator::safe_iterator(const safe_iterator& r) throw() : + m_body(0) + { + m_body = r.m_body; + m_body->increment(); + } + + // assignment implements dealiasing followed by aliasing + template + safe_iterator& safe_iterator::operator=(const safe_iterator& r) throw() + { + if (m_body != r.m_body) + { + if (m_body->decrement()) + delete m_body; + m_body = r.m_body; + m_body->increment(); + } + return *this; + } + + // destructor - implements dealiasing + template + safe_iterator::~safe_iterator(void) throw() + { + if(m_body->decrement()) + { + delete m_body; + m_body = 0; + } + } + + + // increment/decrement operation + // implements dealiasing followed by aliasing + template + void safe_iterator::set(const master_iterator& r) throw() + { + if (m_body != r.m_body) + { + if (m_body->decrement()) + delete m_body; + m_body = r.m_body; + m_body->increment(); + } + } + + // dereference + template + N* safe_iterator::node(void) const throw() + { + return m_body->node(); + } + + template + const O* safe_iterator::owner(void) const throw() + { + return m_body->owner(); + } + + // change to a null iterator - i.e. one that doees not belong to any object + // this does not affect any other iterators pointing to the same node + template + void safe_iterator::set_null(void) throw() + { + if (m_body->count() == 1) + { + // no aliases, so just make this null + m_body->set_null(); + } + else + { + // create a new body which is null so as not to affect any other aliases + m_body->decrement(); + m_body = new safe_iterator_body(0,0); + } + } + + //////////////////////////////////////////////////////////////////////////////// + // operations for clients that do not have a master end iterator + // alternatively, have a master end iterator as part of the container + // and call constructor(master_end) or step(master_end) + + // construct an end iterator + template + safe_iterator::safe_iterator(const O* owner) throw() : + m_body(new safe_iterator_body(owner,0)) + { + } + + // change to an end iterator - e.g. as a result of incrementing off the end + template + void safe_iterator::set_end(void) throw() + { + if (m_body->count() == 1) + { + // no aliases, so just make this an end iterator + m_body->set_end(); + } + else + { + // create a new body which is null so as not to affect any other aliases + m_body->decrement(); + m_body = new safe_iterator_body(owner(),0); + } + } + + //////////////////////////////////////////////////////////////////////////////// + // tests + + // comparison + template + bool safe_iterator::equal(const safe_iterator& right) const throw() + { + if (m_body == right.m_body) return true; + return m_body->equal(right.m_body); + } + + template + int safe_iterator::compare(const safe_iterator& right) const throw() + { + return m_body->compare(right.m_body); + } + + // a null iterator is one that has not been initialised with a value yet + template + bool safe_iterator::null(void) const throw() + { + return m_body->null(); + } + + // an end iterator is one that points to the end element of the list of nodes + template + bool safe_iterator::end(void) const throw() + { + return m_body->end(); + } + + // a valid iterator is one that can be dereferenced + template + bool safe_iterator::valid(void) const throw() + { + return m_body->valid(); + } + + // check the rules for a valid iterator that can be dereferenced + template + void safe_iterator::assert_valid(void) const throw(null_dereference,end_dereference) + { + m_body->assert_valid(); + } + + template + void safe_iterator::assert_valid(const O* owner) const throw(wrong_object,null_dereference,end_dereference) + { + m_body->assert_valid(); + m_body->assert_owner(owner); + } + + template + void safe_iterator::assert_non_null(void) const throw(null_dereference) + { + m_body->assert_non_null(); + } + + template + void safe_iterator::assert_owner(const O* owner) const throw(wrong_object) + { + m_body->assert_owner(owner); + } + +} // end namespace stlplus diff --git a/OTLib/containers/simple_ptr.hpp b/OTLib/containers/simple_ptr.hpp new file mode 100644 index 000000000..ffe2c8afe --- /dev/null +++ b/OTLib/containers/simple_ptr.hpp @@ -0,0 +1,282 @@ +#ifndef STLPLUS_SIMPLE_PTR +#define STLPLUS_SIMPLE_PTR +//////////////////////////////////////////////////////////////////////////////// + +// Author: Daniel Milton +// Copyright: (c) Daniel Milton 2002 onwards +// License: BSD License, see ../docs/license.html + +// A smart pointer is a memory-managing pointer to an object. If you like, it +// is a zero-dimensional container. + +// Assignment of smart pointers result in multiple aliases of the same object. +// The term alias is used to differentiate from conventional pointers because +// the semantics are different. + +// Aliases can be turned into copies if the pointed-to class supports copying. + +// These simple_ptr classes from DJDM have slightly different semantics than +// the smart_ptr classes of AJR. There are no cross-pointer side effects +// that occur when the pointer is cleared. The clear() function is effectively +// equivalent to the clear_unique() function of the smart_ptr. The only way +// that a "referenced" object will be deleted is if all simple_ptr's that +// reference the object are cleared (by deletion, manual clearing or reassignment). + +// Also, the simple pointer cannot contain a reference to a shared null pointer +// (which occurs as a side-effect of clearing a multiply referenced object in +// the smart_ptr classes). Which means that if you have a null simple_ptr, then +// the assignment of any other null simple_ptr will NOT reassign the reference of +// any other simple_ptr. Hence, the simple_ptr class acts a little more like a +// normal pointer (with fewer side effects), with the added bonus of containment. + +// Due to the way that the simple_ptr contains the data, it also allows the +// addition of various casting functions, while still keeping the managed data +// containment functionality of the underlying object. This means that you can +// have two simple_ptr's of different template types, both pointing to the same +// data (if the differing template types are derivatives of each other). + +// The base class is simple_ptr_base which defines the common interface. Then +// there are three subclasses which have the same interface but different copy +// semantics: + +// - simple_ptr for simple types and classes which have copy constructors +// - simple_ptr_clone for polymorphic class hierarchies which are copied using a clone method +// - simple_ptr_nocopy for any class that cannot or should not be copied + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" +#include "copy_functors.hpp" +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // Base class + //////////////////////////////////////////////////////////////////////////////// + + template + class simple_ptr_base + { + public: + ////////////////////////////////////////////////////////////////////////////// + // member type definitions + + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; + typedef C value_copy; + + ////////////////////////////////////////////////////////////////////////////// + // constructors and destructors + + // create a null pointer + simple_ptr_base(void); + + // create a pointer containing a dynamically created object + // Note: the object must be allocated *by the user* with new + // constructor form - must be called in the form smart_ptr_base x(new type(args)) + explicit simple_ptr_base(T* data); + + // copy constructor implements aliasing so no copy is made + // note that the copy constructor should NOT be explicit, as this breaks + // the returning of pointer objects from functions (at least within GCC 4.4) + simple_ptr_base(const simple_ptr_base& r); + + // assignment operator - required, else the output of GCC suffers segmentation faults + simple_ptr_base& operator=(const simple_ptr_base& r); + + // destructor decrements the reference count and delete only when the last reference is destroyed + ~simple_ptr_base(void); + + ////////////////////////////////////////////////////////////////////////////// + // logical tests to see if there is anything contained in the pointer since it can be null + + // there are two forms:explicit and implicit + // implicit: if(!r) or if(r) + // explicit: if(r.null()) or if(r.present()) + operator bool(void) const; + bool operator!(void) const; + bool present(void) const; + bool null(void) const; + + ////////////////////////////////////////////////////////////////////////////// + // dereference operators and functions + + // dereference the smart pointer to get the object - use in the form *p1 + T& operator*(void) throw(null_dereference); + const T& operator*(void) const throw(null_dereference); + + // used as a prefix to a member access to the contained object e.g. p1->print() calls T::print() + T* operator->(void) throw(null_dereference); + const T* operator->(void) const throw(null_dereference); + + ////////////////////////////////////////////////////////////////////////////// + // explicit function forms of the above assignment and dereference operators + + // get the value + T& value(void) throw(null_dereference); + const T& value(void) const throw(null_dereference); + + // set the pointer + // deletes the previous pointer and adopts the passed pointer instead + // Note: the object must be allocated *by the user* with new + // Warning: it is very easy to break the memory management with this operation + void set(T* data = 0); + // get the pointer + T* pointer(void); + const T* pointer(void) const; + + ////////////////////////////////////////////////////////////////////////////// + // functions to manage aliases + + // make this an alias of the passed object + void alias(const simple_ptr_base&); + + // test whether two pointers point to the same object(known as aliasing the object) + // used in the form if(a.aliases(b)) + bool aliases(const simple_ptr_base&) const; + + // find the number of aliases - used when you need to know whether an + // object is still referred to from elsewhere (rare!) + unsigned alias_count(void) const; + + // clear the reference to the object, but only delete the object if there are no + // other references to that object. Hence, this does not affect other pointers + // that are pointing to the same object. + void clear(void); + + // This is just an alias of the clear() function, provided for completeness of + // the interface when acting as a replacement for the smart_ptr classes + void clear_unique(void); + + ////////////////////////////////////////////////////////////////////////////// + // functions that involve copying + + // these functions use the copy functor passed as the template parameter C + // to copy the object with the right copy semantics. If the copy functor + // is no_copy, an exception will be thrown. + + // create a pointer containing a *copy* of the object using the template parameter C + // this copy is taken because the pointer class maintains a dynamically allocated object + // and the T& may not be (usually is not) dynamically allocated + explicit simple_ptr_base(const T& data) throw(illegal_copy); + + // set the value - note that this does a copy using the C template parameter + void set_value(const T& data) throw(illegal_copy); + + // make this pointer unique with respect to any other references to the same object + // if this pointer is already unique, it does nothing - otherwise it copies the object + void make_unique(void) throw(illegal_copy); + + // make this pointer a unique copy of the parameter + // useful for expressions like p1.copy(p2) which makes p1 a pointer to a unique copy of the contents of p2 + void copy(const simple_ptr_base&) throw(illegal_copy); + + ////////////////////////////////////////////////////////////////////////////// + + protected: + T* m_pointer; + unsigned* m_count; + + public: + // internal use only - had to make them public because they need to be + // accessed by routines that could not be made friends + // can't have a handle due to the way the simple pointer stores it's data + // in separate counter and pointer objects + unsigned* _count(void) const; + T* _pointer(void) const; + void _make_alias(T* pointer, unsigned* count); + + private: + void increment(void); + bool decrement(void); + }; + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr for simple types and classes which have copy constructors + + template + class simple_ptr : public simple_ptr_base > + { + public: + simple_ptr(void) {} + explicit simple_ptr(const T& data) : simple_ptr_base >(data) {} + explicit simple_ptr(T* data) : simple_ptr_base >(data) {} + simple_ptr& operator=(const T& data) {set_value(data); return *this;} + simple_ptr& operator=(T* data) {set(data); return *this;} + ~simple_ptr(void) {} + +#ifdef STLPLUS_MEMBER_TEMPLATES + // functions that involve casting + // moved from base class for two main reasons, though the second is a feature of the first: + + // 1. GCC cannot cast the previous base result of simple_ptr_base > + // as a simple_ptr even though it used to look like a duck and quack like a duck. + // I think it was really complaining that the copy class was not guaranteed to be the same. + + // 2. Within the cast routines, one pointer type tried accessing private data of the other + // pointer type and even though they are really the same type, was not allowed. Because + // of this, the "private" function _make_alias is utilised to get the same result. + + // By having the cast functions in each derived class, you are guaranteed to use the same + // copy class - no question. GCC is ok with this. + + template simple_ptr dyn_cast(void) const; + template simple_ptr stat_cast(void) const; + template simple_ptr cast(void) const; +#endif + }; + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_clone for polymorphic class hierarchies which have a clone method + + template + class simple_ptr_clone : public simple_ptr_base > + { + public: + simple_ptr_clone(void) {} + explicit simple_ptr_clone(const T& data) : simple_ptr_base >(data) {} + explicit simple_ptr_clone(T* data) : simple_ptr_base >(data) {} + simple_ptr_clone& operator=(const T& data) {set_value(data); return *this;} + simple_ptr_clone& operator=(T* data) {set(data); return *this;} + ~simple_ptr_clone(void) {} + +#ifdef STLPLUS_MEMBER_TEMPLATES + // functions that involve casting + // moved from base class - see simple_ptr above + template simple_ptr_clone dyn_cast(void) const; + template simple_ptr_clone stat_cast(void) const; + template simple_ptr_clone cast(void) const; +#endif +}; + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_nocopy for any class that cannot or should not be copied + + template + class simple_ptr_nocopy : public simple_ptr_base > + { + public: + simple_ptr_nocopy(void) {} + explicit simple_ptr_nocopy(T* data) : simple_ptr_base >(data) {} + simple_ptr_nocopy& operator=(T* data) {set(data); return *this;} + ~simple_ptr_nocopy(void) {} + +#ifdef STLPLUS_MEMBER_TEMPLATES + // functions that involve casting + // moved from base class - see simple_ptr above + template simple_ptr_nocopy dyn_cast(void) const; + template simple_ptr_nocopy stat_cast(void) const; + template simple_ptr_nocopy cast(void) const; +#endif + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "simple_ptr.tpp" +#endif diff --git a/OTLib/containers/simple_ptr.tpp b/OTLib/containers/simple_ptr.tpp new file mode 100644 index 000000000..4b08ffe83 --- /dev/null +++ b/OTLib/containers/simple_ptr.tpp @@ -0,0 +1,395 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Daniel Milton +// Copyright: (c) Daniel Milton 2002 onwards + +//////////////////////////////////////////////////////////////////////////////// + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_base class + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // constructors, assignments and destructors + + // create a null pointer + template + simple_ptr_base::simple_ptr_base(void) : + m_pointer(0), + m_count(new unsigned(1)) + { + } + + // create a pointer containing a *copy* of the object pointer + template + simple_ptr_base::simple_ptr_base(const T& data) throw(illegal_copy) : + m_pointer(C()(data)), + m_count(new unsigned(1)) + { + } + + // create a pointer containing a dynamically created object + // Note: the object must be allocated *by the user* with new + // constructor form - must be called in the form simple_ptr x(new type(args)) + template + simple_ptr_base::simple_ptr_base(T* data) : + m_pointer(data), + m_count(new unsigned(1)) + { + } + + // copy constructor implements counted referencing - no copy is made + template + simple_ptr_base::simple_ptr_base(const simple_ptr_base& r) : + m_pointer(r.m_pointer), + m_count(r.m_count) + { + increment(); + } + + // assignment operator - required, else the output of GCC suffers segmentation faults + template + simple_ptr_base& simple_ptr_base::operator=(const simple_ptr_base& r) + { + alias(r); + return *this; + } + + // destructor decrements the reference count and delete only when the last reference is destroyed + template + simple_ptr_base::~simple_ptr_base(void) + { + if(decrement()) + { + delete m_pointer; + delete m_count; + } + } + + ////////////////////////////////////////////////////////////////////////////// + // logical tests to see if there is anything contained in the pointer since it can be null + + template + bool simple_ptr_base::null(void) const + { + return m_pointer==0; + } + + template + bool simple_ptr_base::present(void) const + { + return m_pointer!=0; + } + + template + bool simple_ptr_base::operator!(void) const + { + return m_pointer==0; + } + + template + simple_ptr_base::operator bool(void) const + { + return m_pointer!=0; + } + + ////////////////////////////////////////////////////////////////////////////// + // dereference operators and functions + + template + T& simple_ptr_base::operator*(void) throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::operator*"); + return *m_pointer; + } + + template + const T& simple_ptr_base::operator*(void) const throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::operator*"); + return *m_pointer; + } + + template + T* simple_ptr_base::operator->(void) throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::operator->"); + return m_pointer; + } + + template + const T* simple_ptr_base::operator->(void) const throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::operator->"); + return m_pointer; + } + + ////////////////////////////////////////////////////////////////////////////// + // explicit function forms of the above assignment dereference operators + + template + void simple_ptr_base::set_value(const T& data) throw(illegal_copy) + { + set(C()(data)); + } + + template + T& simple_ptr_base::value(void) throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::value"); + return *m_pointer; + } + + template + const T& simple_ptr_base::value(void) const throw(null_dereference) + { + if (!m_pointer) throw null_dereference("null pointer dereferenced in simple_ptr::value"); + return *m_pointer; + } + + template + void simple_ptr_base::set(T* data) + { + unsigned& count = *m_count; + if (count<=1) + delete m_pointer; + else + { + --count; + m_count = new unsigned(1); + } + m_pointer = data; + } + + template + T* simple_ptr_base::pointer(void) + { + return m_pointer; + } + + template + const T* simple_ptr_base::pointer(void) const + { + return m_pointer; + } + + //////////////////////////////////////////////////////////////////////////////// + // functions to manage counted referencing + + template + void simple_ptr_base::increment(void) + { + ++(*m_count); + } + + template + bool simple_ptr_base::decrement(void) + { + unsigned& count = *m_count; + --count; + return count == 0; + } + + // make this an alias of the passed object + template + void simple_ptr_base::alias(const simple_ptr_base& r) + { + // make it alias-copy safe - this means that I don't try to do the + // assignment if r is either the same object or an alias of it + if (m_pointer==r.m_pointer) return; + if(decrement()) { + delete m_pointer; + delete m_count; + } + m_pointer = r.m_pointer; + m_count = r.m_count; + increment(); + } + + template + bool simple_ptr_base::aliases(const simple_ptr_base& r) const + { + return m_count == r.m_count; + } + + template + unsigned simple_ptr_base::alias_count(void) const + { + return *m_count; + } + + template + void simple_ptr_base::clear(void) + { + set(0); + } + + template + void simple_ptr_base::clear_unique(void) + { + set(0); // no difference between clear and clear_unique with the simple_ptr + } + + template + void simple_ptr_base::make_unique(void) throw(illegal_copy) + { + unsigned& count = *m_count; + if (count <= 1) return; + --count; + if (m_pointer) m_pointer = C()(*m_pointer); + m_count = new unsigned(1); + } + + template + void simple_ptr_base::copy(const simple_ptr_base& data) throw(illegal_copy) + { + alias(data); + make_unique(); + } + + // internal function for distinguishing unique simple_ptr objects + // used for example in persistence routines + + template + unsigned* simple_ptr_base::_count(void) const + { + return m_count; + } + + template + T* simple_ptr_base::_pointer(void) const + { + return m_pointer; + } + + template + void simple_ptr_base::_make_alias(T* pointer, unsigned* count) + { + // make it alias-copy safe - this means that I don't try to do the + // assignment if r is either the same object or an alias of it + if (m_count != count) + { + if(decrement()) + { + delete m_pointer; + delete m_count; + } + m_pointer = pointer; + m_count = count; + increment(); + } + } + + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr simple_ptr::dyn_cast(void) const { + simple_ptr rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr simple_ptr::stat_cast(void) const { + simple_ptr rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr simple_ptr::cast(void) const { + simple_ptr rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_clone class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr_clone simple_ptr_clone::dyn_cast(void) const { + simple_ptr_clone rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_clone simple_ptr_clone::stat_cast(void) const { + simple_ptr_clone rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_clone simple_ptr_clone::cast(void) const { + simple_ptr_clone rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + + //////////////////////////////////////////////////////////////////////////////// + // simple_ptr_nocopy class + //////////////////////////////////////////////////////////////////////////////// + +#ifdef STLPLUS_MEMBER_TEMPLATES + + template + template + simple_ptr_nocopy simple_ptr_nocopy::dyn_cast(void) const { + simple_ptr_nocopy rtn; + T2* p = dynamic_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_nocopy simple_ptr_nocopy::stat_cast(void) const { + simple_ptr_nocopy rtn; + T2* p = static_cast(this->m_pointer); + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + + template + template + simple_ptr_nocopy simple_ptr_nocopy::cast(void) const { + simple_ptr_nocopy rtn; + T2* p = (T2*)this->m_pointer; + if (p) rtn._make_alias(p, this->m_count); + return rtn; + } + +#endif + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/containers/smart_ptr.hpp b/OTLib/containers/smart_ptr.hpp new file mode 100644 index 000000000..18b496e5a --- /dev/null +++ b/OTLib/containers/smart_ptr.hpp @@ -0,0 +1,221 @@ +#ifndef STLPLUS_SMART_PTR +#define STLPLUS_SMART_PTR +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// A smart pointer is a memory-managing pointer to an object. If you like, it +// is a zero-dimensional container. + +// Assignment of smart pointers result in multiple aliases of the same object. +// The term alias is used to differentiate from conventional pointers because +// the semantics are different. + +// Aliases can be turned into copies if the pointed-to class supports copying. + +// The base class is smart_ptr_base which defines the common interface. Then +// there are three subclasses which have the same interface but different copy +// semantics: + +// - smart_ptr for simple types and classes which have copy constructors +// - smart_ptr_clone for polymorphic class hierarchies which are copied using a clone method +// - smart_ptr_nocopy for any class that cannot or should not be copied + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" +#include "exceptions.hpp" +#include "copy_functors.hpp" +#include +#include + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // internals + + template class smart_ptr_holder; + + //////////////////////////////////////////////////////////////////////////////// + // Base class + //////////////////////////////////////////////////////////////////////////////// + + template + class smart_ptr_base + { + public: + ////////////////////////////////////////////////////////////////////////////// + // member type definitions + + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; + typedef C value_copy; + + ////////////////////////////////////////////////////////////////////////////// + // constructors and destructors + + // create a null pointer + smart_ptr_base(void); + + // create a pointer containing a dynamically created object + // Note: the object must be allocated *by the user* with new + // constructor form - must be called in the form smart_ptr_base x(new type(args)) + explicit smart_ptr_base(T* data); + + // copy constructor implements aliasing so no copy is made + // note that the copy constructor should NOT be explicit, as this breaks + // the returning of pointer objects from functions (at least within GCC 4.4) + smart_ptr_base(const smart_ptr_base& r); + + // assignment operator - required, else the output of GCC suffers segmentation faults + smart_ptr_base& operator=(const smart_ptr_base& r); + + // destructor decrements the reference count and delete only when the last reference is destroyed + ~smart_ptr_base(void); + + ////////////////////////////////////////////////////////////////////////////// + // logical tests to see if there is anything contained in the pointer since it can be null + + // there are two forms:explicit and implicit + // implicit: if(!r) or if(r) + // explicit: if(r.null()) or if(r.present()) + operator bool(void) const; + bool operator!(void) const; + bool present(void) const; + bool null(void) const; + + ////////////////////////////////////////////////////////////////////////////// + // dereference operators and functions + + // dereference the smart pointer to get the object - use in the form *p1 + T& operator*(void) throw(null_dereference); + const T& operator*(void) const throw(null_dereference); + + // used as a prefix to a member access to the contained object e.g. p1->print() calls T::print() + T* operator->(void) throw(null_dereference); + const T* operator->(void) const throw(null_dereference); + + ////////////////////////////////////////////////////////////////////////////// + // explicit function forms of the above assignment and dereference operators + + // get the value + T& value(void) throw(null_dereference); + const T& value(void) const throw(null_dereference); + + // set the pointer + // deletes the previous pointer and adopts the passed pointer instead + // Note: the object must be allocated *by the user* with new + // Warning: it is very easy to break the memory management with this operation + void set(T* data = 0); + // get the pointer + T* pointer(void); + const T* pointer(void) const; + + ////////////////////////////////////////////////////////////////////////////// + // functions to manage aliases + + // make this an alias of the passed object + void alias(const smart_ptr_base&); + + // test whether two pointers point to the same object(known as aliasing the object) + // used in the form if(a.aliases(b)) + bool aliases(const smart_ptr_base&) const; + + // find the number of aliases - used when you need to know whether an + // object is still referred to from elsewhere (rare!) + unsigned alias_count(void) const; + + // delete the object and make the pointer null - does not make it unique + // first, so all other pointers to this will be null too + void clear(void); + + // make the pointer unique and null in one step - does not affect other + // pointers that were pointing to the same object + void clear_unique(void); + + ////////////////////////////////////////////////////////////////////////////// + // functions that involve copying + + // these functions use the copy functor passed as the template parameter C + // to copy the object with the right copy semantics. If the copy functor + // is no_copy, an exception will be thrown. + + // create a pointer containing a *copy* of the object using the template parameter C + // this copy is taken because the pointer class maintains a dynamically allocated object + // and the T& may not be (usually is not) dynamically allocated + explicit smart_ptr_base(const T& data) throw(illegal_copy); + + // set the value - note that this does a copy using the C template parameter + void set_value(const T& data) throw(illegal_copy); + + // make this pointer unique with respect to any other references to the same object + // if this pointer is already unique, it does nothing - otherwise it copies the object + void make_unique(void) throw(illegal_copy); + + // make this pointer a unique copy of the parameter + // useful for expressions like p1.copy(p2) which makes p1 a pointer to a unique copy of the contents of p2 + void copy(const smart_ptr_base&) throw(illegal_copy); + + protected: + smart_ptr_holder* m_holder; + + public: + // internal use only - had to make them public because they need to be + // accessed by routines that could not be made friends + smart_ptr_holder* _handle(void) const; + void _make_alias(smart_ptr_holder* handle); + }; + + //////////////////////////////////////////////////////////////////////////////// + // smart_ptr for simple types and classes which have copy constructors + + template + class smart_ptr : public smart_ptr_base > + { + public: + smart_ptr(void) {} + explicit smart_ptr(const T& data) : smart_ptr_base >(data) {} + explicit smart_ptr(T* data) : smart_ptr_base >(data) {} + smart_ptr& operator=(const T& data) {set_value(data); return *this;} + smart_ptr& operator=(T* data) {set(data); return *this;} + ~smart_ptr(void) {} + }; + + //////////////////////////////////////////////////////////////////////////////// + // smart_ptr_clone for polymorphic class hierarchies which have a clone method + + template + class smart_ptr_clone : public smart_ptr_base > + { + public: + smart_ptr_clone(void) {} + explicit smart_ptr_clone(const T& data) : smart_ptr_base >(data) {} + explicit smart_ptr_clone(T* data) : smart_ptr_base >(data) {} + smart_ptr_clone& operator=(const T& data) {set_value(data); return *this;} + smart_ptr_clone& operator=(T* data) {set(data); return *this;} + ~smart_ptr_clone(void) {} + }; + + //////////////////////////////////////////////////////////////////////////////// + // smart_ptr_nocopy for any class that cannot or should not be copied + + template + class smart_ptr_nocopy : public smart_ptr_base > + { + public: + smart_ptr_nocopy(void) {} + explicit smart_ptr_nocopy(T* data) : smart_ptr_base >(data) {} + smart_ptr_nocopy& operator=(T* data) {set(data); return *this;} + ~smart_ptr_nocopy(void) {} + }; + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "smart_ptr.tpp" +#endif diff --git a/OTLib/containers/smart_ptr.tpp b/OTLib/containers/smart_ptr.tpp new file mode 100644 index 000000000..880b69a07 --- /dev/null +++ b/OTLib/containers/smart_ptr.tpp @@ -0,0 +1,345 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // internal holder data structure + //////////////////////////////////////////////////////////////////////////////// + + template + class smart_ptr_holder + { + private: + unsigned m_count; + T* m_data; + + // make these private to disallow copying because the holder doesn't know how to copy + smart_ptr_holder(const smart_ptr_holder& s) : + m_count(0), m_data(0) + { + } + + smart_ptr_holder& operator=(const smart_ptr_holder& s) + { + return *this; + } + + public: + smart_ptr_holder(T* p = 0) : + m_count(1), m_data(p) + { + } + + ~smart_ptr_holder(void) + { + clear(); + } + + unsigned count(void) const + { + return m_count; + } + + void increment(void) + { + ++m_count; + } + + bool decrement(void) + { + --m_count; + return m_count == 0; + } + + bool null(void) + { + return m_data == 0; + } + + void clear(void) + { + if(m_data) + delete m_data; + m_data = 0; + } + + void set(T* p = 0) + { + clear(); + m_data = p; + } + + T*& pointer(void) + { + return m_data; + } + + const T* pointer(void) const + { + return m_data; + } + + T& value(void) + { + return *m_data; + } + + const T& value(void) const + { + return *m_data; + } + }; + + //////////////////////////////////////////////////////////////////////////////// + // smart_ptr_base class + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + // constructors, assignments and destructors + + // create a null pointer + template + smart_ptr_base::smart_ptr_base(void) : + m_holder(new smart_ptr_holder) + { + } + + // create a pointer containing a *copy* of the object pointer + template + smart_ptr_base::smart_ptr_base(const T& data) throw(illegal_copy) : + m_holder(new smart_ptr_holder) + { + m_holder->set(C()(data)); + } + + // create a pointer containing a dynamically created object + // Note: the object must be allocated *by the user* with new + // constructor form - must be called in the form smart_ptr x(new type(args)) + template + smart_ptr_base::smart_ptr_base(T* data) : + m_holder(new smart_ptr_holder) + { + m_holder->set(data); + } + + // copy constructor implements counted referencing - no copy is made + template + smart_ptr_base::smart_ptr_base(const smart_ptr_base& r) : + m_holder(0) + { + m_holder = r.m_holder; + m_holder->increment(); + } + + // assignment operator - required, else the output of GCC suffers segmentation faults + template + smart_ptr_base& smart_ptr_base::operator=(const smart_ptr_base& r) + { + alias(r); + return *this; + } + + // destructor decrements the reference count and delete only when the last reference is destroyed + template + smart_ptr_base::~smart_ptr_base(void) + { + if(m_holder->decrement()) + delete m_holder; + } + + ////////////////////////////////////////////////////////////////////////////// + // logical tests to see if there is anything contained in the pointer since it can be null + + template + bool smart_ptr_base::null(void) const + { + return m_holder->null(); + } + + template + bool smart_ptr_base::present(void) const + { + return !m_holder->null(); + } + + template + bool smart_ptr_base::operator!(void) const + { + return m_holder->null(); + } + + template + smart_ptr_base::operator bool(void) const + { + return !m_holder->null(); + } + + ////////////////////////////////////////////////////////////////////////////// + // dereference operators and functions + + template + T& smart_ptr_base::operator*(void) throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::operator*"); + return m_holder->value(); + } + + template + const T& smart_ptr_base::operator*(void) const throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::operator*"); + return m_holder->value(); + } + + template + T* smart_ptr_base::operator->(void) throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::operator->"); + return m_holder->pointer(); + } + + template + const T* smart_ptr_base::operator->(void) const throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::operator->"); + return m_holder->pointer(); + } + + ////////////////////////////////////////////////////////////////////////////// + // explicit function forms of the above assignment dereference operators + + template + void smart_ptr_base::set_value(const T& data) throw(illegal_copy) + { + m_holder->set(C()(data)); + } + + template + T& smart_ptr_base::value(void) throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::value"); + return m_holder->value(); + } + + template + const T& smart_ptr_base::value(void) const throw(null_dereference) + { + if (m_holder->null()) throw null_dereference("null pointer dereferenced in smart_ptr::value"); + return m_holder->value(); + } + + template + void smart_ptr_base::set(T* data) + { + m_holder->set(data); + } + + template + T* smart_ptr_base::pointer(void) + { + return m_holder->pointer(); + } + + template + const T* smart_ptr_base::pointer(void) const + { + return m_holder->pointer(); + } + + //////////////////////////////////////////////////////////////////////////////// + // functions to manage counted referencing + + // make this an alias of the passed object + template + void smart_ptr_base::alias(const smart_ptr_base& r) + { + _make_alias(r.m_holder); + } + + template + bool smart_ptr_base::aliases(const smart_ptr_base& r) const + { + return m_holder == r.m_holder; + } + + template + unsigned smart_ptr_base::alias_count(void) const + { + return m_holder->count(); + } + + template + void smart_ptr_base::clear(void) + { + m_holder->clear(); + } + + template + void smart_ptr_base::clear_unique(void) + { + if (m_holder->count() == 1) + m_holder->clear(); + else + { + m_holder->decrement(); + m_holder = 0; + m_holder = new smart_ptr_holder; + } + } + + template + void smart_ptr_base::make_unique(void) throw(illegal_copy) + { + if (m_holder->count() > 1) + { + smart_ptr_holder* old_holder = m_holder; + m_holder->decrement(); + m_holder = 0; + m_holder = new smart_ptr_holder; + if (old_holder->pointer()) + m_holder->set(C()(old_holder->value())); + } + } + + template + void smart_ptr_base::copy(const smart_ptr_base& data) throw(illegal_copy) + { + alias(data); + make_unique(); + } + + // internal function for distinguishing unique smart_ptr objects + // used for example in persistence routines + + template + smart_ptr_holder* smart_ptr_base::_handle(void) const + { + return m_holder; + } + + template + void smart_ptr_base::_make_alias(smart_ptr_holder* r_holder) + { + // make it alias-copy safe - this means that I don't try to do the + // assignment if r is either the same object or an alias of it + if (m_holder != r_holder) + { + if (m_holder->decrement()) + delete m_holder; + m_holder = r_holder; + m_holder->increment(); + } + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/containers/triple.hpp b/OTLib/containers/triple.hpp new file mode 100644 index 000000000..2b1908709 --- /dev/null +++ b/OTLib/containers/triple.hpp @@ -0,0 +1,56 @@ +#ifndef STLPLUS_TRIPLE +#define STLPLUS_TRIPLE +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton, from an original by Dan Milton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +// Similar to the STL pair but with three elements + +//////////////////////////////////////////////////////////////////////////////// +#include "containers_fixes.hpp" + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // the triple class + + template + struct triple + { + typedef T1 first_type; + typedef T2 second_type; + typedef T3 third_type; + + T1 first; + T2 second; + T3 third; + + triple(void); + triple(const T1& p1, const T2& p2, const T3& p3); + triple(const triple& t2); + }; + + //////////////////////////////////////////////////////////////////////////////// + // creation + + template + triple make_triple(const T1& first, const T2& second, const T3& third); + + //////////////////////////////////////////////////////////////////////////////// + // comparison + + template + bool operator == (const triple& left, const triple& right); + template + bool operator < (const triple& left, const triple& right); + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + +#include "triple.tpp" +#endif diff --git a/OTLib/containers/triple.tpp b/OTLib/containers/triple.tpp new file mode 100644 index 000000000..50c2d7072 --- /dev/null +++ b/OTLib/containers/triple.tpp @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////////////////////////// + +// Author: Andy Rushton, from an original by Dan Milton +// Copyright: (c) Southampton University 1999-2004 +// (c) Andy Rushton 2004 onwards +// License: BSD License, see ../docs/license.html + +//////////////////////////////////////////////////////////////////////////////// + +namespace stlplus +{ + + //////////////////////////////////////////////////////////////////////////////// + // the triple class + + template + triple::triple(void) : + first(), second(), third() + { + } + + template + triple::triple(const T1& p1, const T2& p2, const T3& p3) : + first(p1), second(p2), third(p3) + { + } + + template + triple::triple(const triple& t2) : + first(t2.first), second(t2.second), third(t2.third) + { + } + + //////////////////////////////////////////////////////////////////////////////// + // creation + + template + triple make_triple(const T1& first, const T2& second, const T3& third) + { + return triple(first,second,third); + } + + //////////////////////////////////////////////////////////////////////////////// + // comparison + + template + bool operator == (const triple& left, const triple& right) + { + // triples are equal if all elements are equal + return left.first == right.first && left.second == right.second && left.third == right.third; + } + + template + bool operator < (const triple& left, const triple& right) + { + // use the < operator on each element + return left.first < right.first ? true : + right.first < left.first ? false : + left.second < right.second ? true : + right.second < left.second ? false : + left.third < right.third; + } + + //////////////////////////////////////////////////////////////////////////////// + +} // end namespace stlplus + diff --git a/OTLib/easyzlib.c b/OTLib/easyzlib.c new file mode 100644 index 000000000..ff0191214 --- /dev/null +++ b/OTLib/easyzlib.c @@ -0,0 +1,8081 @@ +/* easyzlib.c implementation + + easyzlib release 1.0 + Copyright (C) 2008 First Objective Software, Inc. All rights reserved + This entire notice must be retained in this source code + Redistributing this source code requires written permission + This software is provided "as is", with no warranty. + Latest fixes enhancements and documentation at www.firstobject.com + + Wrapper for zlib 1.2.3, see copyright below + This is a modified version of zlib, modified as follows: + - All zlib code (including zlib headers) is in this one source file + - Removed conditional generation of header files (tree.h inftrees.h crc32.h) + - Removed DLL related directives (ZLIB_DLL ZEXPORT ZEXTERN ZLIB_WINAPI) + - Removed "GZIP" functionality (gzFile NO_GZIP NO_GZCOMPRESS) + - Removed dummy declaration workaround for certain compilers (NO_DUMMY_DECL) + - New simple wrapper functions have ez prefix + - Disabled three Level 4 warnings warnings for Visual C++ +*/ + +#include "easyzlib.h" + +#if defined(_MSC_VER) +#pragma warning(disable:4127) // conditional expression is constant +#pragma warning(disable:4131) // uses old-style declarator +#pragma warning(disable:4244) // conversion from 'int ' to 'unsigned short ', possible loss of data +#endif + +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +/* +int deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +int deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +int deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +int inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +int inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +int inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + +/* +int deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +int deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +int deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +int deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +int deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +int deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +uLong deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +int deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +int deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +int inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +int inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +int inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +int inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +int inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +int inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +int inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +int inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +int inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +int inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +int compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +int compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +uLong compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +int uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +uLong adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +uLong adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +uLong crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +uLong crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +int deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +int inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +int deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +int inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +int inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +const char * zError OF((int)); +int inflateSyncPoint OF((z_streamp z)); +const uLongf * get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + + +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + + +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ +#ifndef ANDROID + fprintf(stderr, "%s\n", m); +#endif + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ + +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + + +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + +#endif + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +#endif /* !defined(STDC) */ +} + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { +#ifndef ANDROID + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); +#endif + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} + +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { +#ifndef ANDROID + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); +#endif + do { +#ifndef ANDROID + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); +#else + match++; start++; +#endif + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { +#ifndef ANDROID + fprintf(stderr,"\\[%d,%d]", start-match, length); +#endif + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); + + +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; + +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); + +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * get_crc_table() +{ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define CRC_DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define CRC_DO8 CRC_DO1; CRC_DO1; CRC_DO1; CRC_DO1; CRC_DO1; CRC_DO1; CRC_DO1; CRC_DO1 + +/* ========================================================================= */ +unsigned long crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + CRC_DO8; + len -= 8; + } + if (len) do { + CRC_DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* easy zlib functions + if destination buffer is not large enough, destination length set to required length +*/ +int ezcompress( unsigned char* pDest, long* pnDestLen, const unsigned char* pSrc, long nSrcLen ) +{ + z_stream stream; + int err; + + int nExtraChunks; + uInt destlen; + + stream.next_in = (Bytef*)pSrc; + stream.avail_in = (uInt)nSrcLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != nSrcLen) return Z_BUF_ERROR; +#endif + destlen = (uInt)*pnDestLen; + if ((uLong)destlen != (uLong)*pnDestLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); + if (err != Z_OK) return err; + + nExtraChunks = 0; + do { + stream.next_out = pDest; + stream.avail_out = destlen; + err = deflate(&stream, Z_FINISH); + if (err == Z_STREAM_END ) + break; + if (err != Z_OK) { + deflateEnd(&stream); + return err; + } + nExtraChunks += 1; + } while (stream.avail_out == 0); + + *pnDestLen = stream.total_out; + + err = deflateEnd(&stream); + if (err != Z_OK) return err; + + return nExtraChunks ? Z_BUF_ERROR : Z_OK; +} + +int ezuncompress( unsigned char* pDest, long* pnDestLen, const unsigned char* pSrc, long nSrcLen ) +{ + z_stream stream; + int err; + + int nExtraChunks; + uInt destlen; + + stream.next_in = (Bytef*)pSrc; + stream.avail_in = (uInt)nSrcLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != (uLong)nSrcLen) return Z_BUF_ERROR; + + destlen = (uInt)*pnDestLen; + if ((uLong)destlen != (uLong)*pnDestLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + nExtraChunks = 0; + do { + stream.next_out = pDest; + stream.avail_out = destlen; + err = inflate(&stream, Z_FINISH); + if (err == Z_STREAM_END ) + break; + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + err = Z_DATA_ERROR; + if (err != Z_BUF_ERROR) { + inflateEnd(&stream); + return err; + } + nExtraChunks += 1; + } while (stream.avail_out == 0); + + *pnDestLen = stream.total_out; + + err = inflateEnd(&stream); + if (err != Z_OK) return err; + + return nExtraChunks ? Z_BUF_ERROR : Z_OK; +} + diff --git a/OTLib/easyzlib.h b/OTLib/easyzlib.h new file mode 100644 index 000000000..7574298d8 --- /dev/null +++ b/OTLib/easyzlib.h @@ -0,0 +1,107 @@ +/* easyzlib.h header + + easyzlib release 1.0 + Copyright (C) 2008 First Objective Software, Inc. All rights reserved + This entire notice must be retained in this source code + Redistributing this source code requires written permission + This software is provided "as is", with no warranty. + Latest fixes enhancements and documentation at www.firstobject.com +*/ + +#ifndef _EASYZLIB_H +#define _EASYZLIB_H + +/* Return codes */ +#define EZ_STREAM_ERROR (-2) +#define EZ_DATA_ERROR (-3) +#define EZ_MEM_ERROR (-4) +#define EZ_BUF_ERROR (-5) + +/* Calculate maximum compressed length from uncompressed length */ +#define EZ_COMPRESSMAXDESTLENGTH(n) (n+(((n)/1000)+1)+12) + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +int ezcompress( unsigned char* pDest, long* pnDestLen, const unsigned char* pSrc, long nSrcLen ); +int ezuncompress( unsigned char* pDest, long* pnDestLen, const unsigned char* pSrc, long nSrcLen ); + +#ifdef __cplusplus +} + +struct ezbuffer +{ + ezbuffer() { Init(); }; + ezbuffer( int n ) { Init(); Alloc(n); }; + ~ezbuffer() { Release(); }; + unsigned char* Alloc( int n ) { if (nSize.1% + 12 */ + unsigned char pTempDest[EZ_CHECKLENGTH]; + long nTempLen = EZ_CHECKLENGTH; + int nErr = ezcompress( pTempDest, &nTempLen, (const unsigned char*)MCD_2PCSZ(strSrc), nSrcLen ); + bufDest.Alloc( nTempLen ); + nErr = ezcompress( bufDest.pBuf, &bufDest.nLen, (const unsigned char*)MCD_2PCSZ(strSrc), nSrcLen ); + return nErr; +} + +int ezuncompress( MCD_STR& strDest, const ezbuffer& bufSrc ) +{ + unsigned char pTempDest[EZ_CHECKLENGTH]; + long nTempLen = EZ_CHECKLENGTH; + int nErr = ezuncompress( pTempDest, &nTempLen, bufSrc.pBuf, bufSrc.nLen ); + int nDestStrLen = nTempLen / sizeof(MCD_CHAR); + MCD_CHAR* p = MCD_GETBUFFER(strDest,nDestStrLen); + nErr = ezuncompress( (unsigned char*)p, &nTempLen, bufSrc.pBuf, bufSrc.nLen ); + MCD_RELEASEBUFFER(strDest,p,nDestStrLen); + return nErr; +} + +#endif /* MCD_STR */ + +#endif /* __cplusplus */ + +#endif /* _EASYZLIB_H */ diff --git a/OTLib/irrxml/CXMLReaderImpl.h b/OTLib/irrxml/CXMLReaderImpl.h new file mode 100755 index 000000000..d5409b63c --- /dev/null +++ b/OTLib/irrxml/CXMLReaderImpl.h @@ -0,0 +1,797 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine" and the "irrXML" project. +// For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h + +#ifndef __ICXML_READER_IMPL_H_INCLUDED__ +#define __ICXML_READER_IMPL_H_INCLUDED__ + +#include "irrXML.h" +#include "irrString.h" +#include "irrArray.h" +#include "fast_atof.h" + +#ifdef _DEBUG +#define IRR_DEBUGPRINT(x) printf((x)); +#else // _DEBUG +#define IRR_DEBUGPRINT(x) +#endif // _DEBUG + + +namespace irr +{ +namespace io +{ + + +//! implementation of the IrrXMLReader +template +class CXMLReaderImpl : public IIrrXMLReader +{ +public: + + //! Constructor + CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) + : TextData(0), P(0), TextBegin(0), TextSize(0), CurrentNodeType(EXN_NONE), + SourceFormat(ETF_ASCII), TargetFormat(ETF_ASCII) + { + if (!callback) + return; + + storeTargetFormat(); + + // read whole xml file + + readFile(callback); + + // clean up + + if (deleteCallBack) + delete callback; + + // create list with special characters + + createSpecialCharacterList(); + + // set pointer to text begin + P = TextBegin; + } + + + //! Destructor + virtual ~CXMLReaderImpl() + { + delete [] TextData; + } + + + //! Reads forward to the next xml node. + //! \return Returns false, if there was no further node. + virtual bool read() + { + // if not end reached, parse the node + if (P && (unsigned int)(P - TextBegin) < TextSize - 1 && *P != 0) + { + parseCurrentNode(); + return true; + } + + _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; + return false; + } + + + //! Returns the type of the current XML node. + virtual EXML_NODE getNodeType() const + { + return CurrentNodeType; + } + + + //! Returns attribute count of the current XML node. + virtual int getAttributeCount() const + { + return Attributes.size(); + } + + + //! Returns name of an attribute. + virtual const char_type* getAttributeName(int idx) const + { + if (idx < 0 || idx >= (int)Attributes.size()) + return 0; + + return Attributes[idx].Name.c_str(); + } + + + //! Returns the value of an attribute. + virtual const char_type* getAttributeValue(int idx) const + { + if (idx < 0 || idx >= (int)Attributes.size()) + return 0; + + return Attributes[idx].Value.c_str(); + } + + + //! Returns the value of an attribute. + virtual const char_type* getAttributeValue(const char_type* name) const + { + const SAttribute* attr = getAttributeByName(name); + if (!attr) + return 0; + + return attr->Value.c_str(); + } + + + //! Returns the value of an attribute + virtual const char_type* getAttributeValueSafe(const char_type* name) const + { + const SAttribute* attr = getAttributeByName(name); + if (!attr) + return EmptyString.c_str(); + + return attr->Value.c_str(); + } + + + + //! Returns the value of an attribute as integer. + int getAttributeValueAsInt(const char_type* name) const + { + return (int)getAttributeValueAsFloat(name); + } + + + //! Returns the value of an attribute as integer. + int getAttributeValueAsInt(int idx) const + { + return (int)getAttributeValueAsFloat(idx); + } + + + //! Returns the value of an attribute as float. + float getAttributeValueAsFloat(const char_type* name) const + { + const SAttribute* attr = getAttributeByName(name); + if (!attr) + return 0; + + core::stringc c = attr->Value.c_str(); + return core::fast_atof(c.c_str()); + } + + + //! Returns the value of an attribute as float. + float getAttributeValueAsFloat(int idx) const + { + const char_type* attrvalue = getAttributeValue(idx); + if (!attrvalue) + return 0; + + core::stringc c = attrvalue; + return core::fast_atof(c.c_str()); + } + + + //! Returns the name of the current node. + virtual const char_type* getNodeName() const + { + return NodeName.c_str(); + } + + + //! Returns data of the current node. + virtual const char_type* getNodeData() const + { + return NodeName.c_str(); + } + + + //! Returns if an element is an empty element, like + virtual bool isEmptyElement() const + { + return IsEmptyElement; + } + + //! Returns format of the source xml file. + virtual ETEXT_FORMAT getSourceFormat() const + { + return SourceFormat; + } + + //! Returns format of the strings returned by the parser. + virtual ETEXT_FORMAT getParserFormat() const + { + return TargetFormat; + } + +private: + + // Reads the current xml node + void parseCurrentNode() + { + char_type* start = P; + + // more forward until '<' found + while(*P != L'<' && *P) + ++P; + + if (!*P) + return; + + if (P - start > 0) + { + // we found some text, store it + if (setText(start, P)) + return; + } + + ++P; + + // based on current token, parse and report next element + switch(*P) + { + case L'/': + parseClosingXMLElement(); + break; + case L'?': + ignoreDefinition(); + break; + case L'!': + if (!parseCDATA()) + parseComment(); + break; + default: + parseOpeningXMLElement(); + break; + } + } + + + //! sets the state that text was found. Returns true if set should be set + bool setText(char_type* start, char_type* end) + { + // check if text is more than 2 characters, and if not, check if there is + // only white space, so that this text won't be reported + if (end - start < 3) + { + char_type* p = start; + for(; p != end; ++p) + if (!isWhiteSpace(*p)) + break; + + if (p == end) + return false; + } + + // set current text to the parsed text, and replace xml special characters + core::string s(start, (int)(end - start)); + NodeName = replaceSpecialCharacters(s); + + // current XML node type is text + CurrentNodeType = EXN_TEXT; + + return true; + } + + + + //! ignores an xml definition like + void ignoreDefinition() + { + CurrentNodeType = EXN_UNKNOWN; + + // move until end marked with '>' reached + while(*P != L'>') + ++P; + + ++P; + } + + + //! parses a comment + void parseComment() + { + CurrentNodeType = EXN_COMMENT; + P += 1; + + char_type *pCommentBegin = P; + + int count = 1; + + // move until end of comment reached + while(count) + { + if (*P == L'>') + --count; + else + if (*P == L'<') + ++count; + + ++P; + } + + P -= 3; + NodeName = core::string(pCommentBegin+2, (int)(P - pCommentBegin-2)); + P += 3; + } + + + //! parses an opening xml element and reads attributes + void parseOpeningXMLElement() + { + CurrentNodeType = EXN_ELEMENT; + IsEmptyElement = false; + Attributes.clear(); + + // find name + const char_type* startName = P; + + // find end of element + while(*P != L'>' && !isWhiteSpace(*P)) + ++P; + + const char_type* endName = P; + + // find Attributes + while(*P != L'>') + { + if (isWhiteSpace(*P)) + ++P; + else + { + if (*P != L'/') + { + // we've got an attribute + + // read the attribute names + const char_type* attributeNameBegin = P; + + while(!isWhiteSpace(*P) && *P != L'=') + ++P; + + const char_type* attributeNameEnd = P; + ++P; + + // read the attribute value + // check for quotes and single quotes, thx to murphy + while( (*P != L'\"') && (*P != L'\'') && *P) + ++P; + + if (!*P) // malformatted xml file + return; + + const char_type attributeQuoteChar = *P; + + ++P; + const char_type* attributeValueBegin = P; + + while(*P != attributeQuoteChar && *P) + ++P; + + if (!*P) // malformatted xml file + return; + + const char_type* attributeValueEnd = P; + ++P; + + SAttribute attr; + attr.Name = core::string(attributeNameBegin, + (int)(attributeNameEnd - attributeNameBegin)); + + core::string s(attributeValueBegin, + (int)(attributeValueEnd - attributeValueBegin)); + + attr.Value = replaceSpecialCharacters(s); + Attributes.push_back(attr); + } + else + { + // tag is closed directly + ++P; + IsEmptyElement = true; + break; + } + } + } + + // check if this tag is closing directly + if (endName > startName && *(endName-1) == L'/') + { + // directly closing tag + IsEmptyElement = true; + endName--; + } + + NodeName = core::string(startName, (int)(endName - startName)); + + ++P; + } + + + //! parses an closing xml tag + void parseClosingXMLElement() + { + CurrentNodeType = EXN_ELEMENT_END; + IsEmptyElement = false; + Attributes.clear(); + + ++P; + const char_type* pBeginClose = P; + + while(*P != L'>') + ++P; + + NodeName = core::string(pBeginClose, (int)(P - pBeginClose)); + ++P; + } + + //! parses a possible CDATA section, returns false if begin was not a CDATA section + bool parseCDATA() + { + if (*(P+1) != L'[') + return false; + + CurrentNodeType = EXN_CDATA; + + // skip '' && + (*(P-1) == L']') && + (*(P-2) == L']')) + { + cDataEnd = P - 2; + } + + ++P; + } + + if ( cDataEnd ) + NodeName = core::string(cDataBegin, (int)(cDataEnd - cDataBegin)); + else + NodeName = ""; + + return true; + } + + + // structure for storing attribute-name pairs + struct SAttribute + { + core::string Name; + core::string Value; + }; + + // finds a current attribute by name, returns 0 if not found + const SAttribute* getAttributeByName(const char_type* name) const + { + if (!name) + return 0; + + core::string n = name; + + for (int i=0; i<(int)Attributes.size(); ++i) + if (Attributes[i].Name == n) + return &Attributes[i]; + + return 0; + } + + // replaces xml special characters in a string and creates a new one + core::string replaceSpecialCharacters( + core::string& origstr) + { + int pos = origstr.findFirst(L'&'); + int oldPos = 0; + + if (pos == -1) + return origstr; + + core::string newstr; + + while(pos != -1 && pos < origstr.size()-2) + { + // check if it is one of the special characters + + int specialChar = -1; + for (int i=0; i<(int)SpecialCharacters.size(); ++i) + { + const char_type* p = &origstr.c_str()[pos]+1; + + if (equalsn(&SpecialCharacters[i][1], p, SpecialCharacters[i].size()-1)) + { + specialChar = i; + break; + } + } + + if (specialChar != -1) + { + newstr.append(origstr.subString(oldPos, pos - oldPos)); + newstr.append(SpecialCharacters[specialChar][0]); + pos += SpecialCharacters[specialChar].size(); + } + else + { + newstr.append(origstr.subString(oldPos, pos - oldPos + 1)); + pos += 1; + } + + // find next & + oldPos = pos; + pos = origstr.findNext(L'&', pos); + } + + if (oldPos < origstr.size()-1) + newstr.append(origstr.subString(oldPos, origstr.size()-oldPos)); + + return newstr; + } + + + + //! reads the xml file and converts it into the wanted character format. + bool readFile(IFileReadCallBack* callback) + { + int size = callback->getSize(); + size += 4; // We need two terminating 0's at the end. + // For ASCII we need 1 0's, for UTF-16 2, for UTF-32 4. + + char* data8 = new char[size]; + + if (!callback->read(data8, size-4)) + { + delete [] data8; + return false; + } + + // add zeros at end + + data8[size-1] = 0; + data8[size-2] = 0; + data8[size-3] = 0; + data8[size-4] = 0; + + char16* data16 = reinterpret_cast(data8); + char32* data32 = reinterpret_cast(data8); + + // now we need to convert the data to the desired target format + // based on the byte order mark. + + const unsigned char UTF8[] = {0xEF, 0xBB, 0xBF}; // 0xEFBBBF; + const int UTF16_BE = 0xFFFE; + const int UTF16_LE = 0xFEFF; + const int UTF32_BE = 0xFFFE0000; + const int UTF32_LE = 0x0000FEFF; + + // check source for all utf versions and convert to target data format + + if (size >= 4 && data32[0] == (char32)UTF32_BE) + { + // UTF-32, big endian + SourceFormat = ETF_UTF32_BE; + convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header + } + else + if (size >= 4 && data32[0] == (char32)UTF32_LE) + { + // UTF-32, little endian + SourceFormat = ETF_UTF32_LE; + convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header + } + else + if (size >= 2 && data16[0] == UTF16_BE) + { + // UTF-16, big endian + SourceFormat = ETF_UTF16_BE; + convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header + } + else + if (size >= 2 && data16[0] == UTF16_LE) + { + // UTF-16, little endian + SourceFormat = ETF_UTF16_LE; + convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header + } + else + if (size >= 3 && data8[0] == UTF8[0] && data8[1] == UTF8[1] && data8[2] == UTF8[2]) + { + // UTF-8 + SourceFormat = ETF_UTF8; + convertTextData(data8+3, data8, size); // data8+3 because we need to skip the header + } + else + { + // ASCII + SourceFormat = ETF_ASCII; + convertTextData(data8, data8, size); + } + + return true; + } + + + //! converts the text file into the desired format. + //! \param source: begin of the text (without byte order mark) + //! \param pointerToStore: pointer to text data block which can be + //! stored or deleted based on the nesessary conversion. + //! \param sizeWithoutHeader: Text size in characters without header + template + void convertTextData(src_char_type* source, char* pointerToStore, int sizeWithoutHeader) + { + // convert little to big endian if necessary + if (sizeof(src_char_type) > 1 && + isLittleEndian(TargetFormat) != isLittleEndian(SourceFormat)) + convertToLittleEndian(source); + + // check if conversion is necessary: + if (sizeof(src_char_type) == sizeof(char_type)) + { + // no need to convert + TextBegin = (char_type*)source; + TextData = (char_type*)pointerToStore; + TextSize = sizeWithoutHeader; + } + else + { + // convert source into target data format. + // TODO: implement a real conversion. This one just + // copies bytes. This is a problem when there are + // unicode symbols using more than one character. + + TextData = new char_type[sizeWithoutHeader]; + + for (int i=0; i + void convertToLittleEndian(src_char_type* t) + { + if (sizeof(src_char_type) == 4) + { + // 32 bit + + while(*t) + { + *t = ((*t & 0xff000000) >> 24) | + ((*t & 0x00ff0000) >> 8) | + ((*t & 0x0000ff00) << 8) | + ((*t & 0x000000ff) << 24); + ++t; + } + } + else + { + // 16 bit + + while(*t) + { + *t = (*t >> 8) | (*t << 8); + ++t; + } + } + } + + //! returns if a format is little endian + inline bool isLittleEndian(ETEXT_FORMAT f) + { + return f == ETF_ASCII || + f == ETF_UTF8 || + f == ETF_UTF16_LE || + f == ETF_UTF32_LE; + } + + + //! returns true if a character is whitespace + inline bool isWhiteSpace(char_type c) + { + return (c==' ' || c=='\t' || c=='\n' || c=='\r'); + } + + + //! generates a list with xml special characters + void createSpecialCharacterList() + { + // list of strings containing special symbols, + // the first character is the special character, + // the following is the symbol string without trailing &. + + SpecialCharacters.push_back("&"); + SpecialCharacters.push_back("gt;"); + SpecialCharacters.push_back("\"quot;"); + SpecialCharacters.push_back("'apos;"); + + } + + + //! compares the first n characters of the strings + bool equalsn(const char_type* str1, const char_type* str2, int len) + { + int i; + for(i=0; str1[i] && str2[i] && i < len; ++i) + if (str1[i] != str2[i]) + return false; + + // if one (or both) of the strings was smaller then they + // are only equal if they have the same lenght + return (i == len) || (str1[i] == 0 && str2[i] == 0); + } + + + //! stores the target text format + void storeTargetFormat() + { + // get target format. We could have done this using template specialization, + // but VisualStudio 6 don't like it and we want to support it. + + switch(sizeof(char_type)) + { + case 1: + TargetFormat = ETF_UTF8; + break; + case 2: + TargetFormat = ETF_UTF16_LE; + break; + case 4: + TargetFormat = ETF_UTF32_LE; + break; + default: + TargetFormat = ETF_ASCII; // should never happen. + } + } + + + // instance variables: + + char_type* TextData; // data block of the text file + char_type* P; // current point in text to parse + char_type* TextBegin; // start of text to parse + unsigned int TextSize; // size of text to parse in characters, not bytes + + EXML_NODE CurrentNodeType; // type of the currently parsed node + ETEXT_FORMAT SourceFormat; // source format of the xml file + ETEXT_FORMAT TargetFormat; // output format of this parser + + core::string NodeName; // name of the node currently in + core::string EmptyString; // empty string to be returned by getSafe() methods + + bool IsEmptyElement; // is the currently parsed node empty? + + core::array< core::string > SpecialCharacters; // see createSpecialCharacterList() + + core::array Attributes; // attributes of current element + +}; // end CXMLReaderImpl + + +} // end namespace +} // end namespace + +#endif diff --git a/OTLib/irrxml/fast_atof.h b/OTLib/irrxml/fast_atof.h new file mode 100755 index 000000000..da5c65f75 --- /dev/null +++ b/OTLib/irrxml/fast_atof.h @@ -0,0 +1,139 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine" and the "irrXML" project. +// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h + +#ifndef __FAST_A_TO_F_H_INCLUDED__ +#define __FAST_A_TO_F_H_INCLUDED__ + +#include +#include + +namespace irr +{ +namespace core +{ + +const float fast_atof_table[] = { + 0.f, + 0.1f, + 0.01f, + 0.001f, + 0.0001f, + 0.00001f, + 0.000001f, + 0.0000001f, + 0.00000001f, + 0.000000001f, + 0.0000000001f, + 0.00000000001f, + 0.000000000001f, + 0.0000000000001f, + 0.00000000000001f, + 0.000000000000001f + }; + +//! Provides a fast function for converting a string into a float, +//! about 6 times faster than atof in win32. +// If you find any bugs, please send them to me, niko (at) irrlicht3d.org. +inline char* fast_atof_move(char* c, float& out) +{ + bool inv = false; + char *t; + float f; + + if (*c=='-') + { + c++; + inv = true; + } + + f = (float)strtol(c, &t, 10); + + c = t; + + if (*c == '.') + { + c++; + + float pl = (float)strtol(c, &t, 10); + pl *= fast_atof_table[t-c]; + + f += pl; + + c = t; + + if (*c == 'e') + { + ++c; + float exp = (float)strtol(c, &t, 10); + f *= (float)pow(10.0f, exp); + c = t; + } + } + + if (inv) + f *= -1.0f; + + out = f; + return c; +} + +//! Provides a fast function for converting a string into a float, +//! about 6 times faster than atof in win32. +// If you find any bugs, please send them to me, niko (at) irrlicht3d.org. +inline const char* fast_atof_move_const(const char* c, float& out) +{ + bool inv = false; + char *t; + float f; + + if (*c=='-') + { + c++; + inv = true; + } + + f = (float)strtol(c, &t, 10); + + c = t; + + if (*c == '.') + { + c++; + + float pl = (float)strtol(c, &t, 10); + pl *= fast_atof_table[t-c]; + + f += pl; + + c = t; + + if (*c == 'e') + { + ++c; + f32 exp = (f32)strtol(c, &t, 10); + f *= (f32)powf(10.0f, exp); + c = t; + } + } + + if (inv) + f *= -1.0f; + + out = f; + return c; +} + + +inline float fast_atof(const char* c) +{ + float ret; + fast_atof_move_const(c, ret); + return ret; +} + +} // end namespace core +}// end namespace irr + +#endif + diff --git a/OTLib/irrxml/heapsort.h b/OTLib/irrxml/heapsort.h new file mode 100755 index 000000000..4395119df --- /dev/null +++ b/OTLib/irrxml/heapsort.h @@ -0,0 +1,73 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#ifndef __IRR_HEAPSORT_H_INCLUDED__ +#define __IRR_HEAPSORT_H_INCLUDED__ + +#include "irrTypes.h" + +namespace irr +{ +namespace core +{ + +//! Sinks an element into the heap. +template +inline void heapsink(T*array, s32 element, s32 max) +{ + while ((element<<1) < max) // there is a left child + { + s32 j = (element<<1); + + if (j+1 < max && array[j] < array[j+1]) + j = j+1; // take right child + + if (array[element] < array[j]) + { + T t = array[j]; // swap elements + array[j] = array[element]; + array[element] = t; + element = j; + } + else + return; + } +} + + +//! Sorts an array with size 'size' using heapsort. +template +inline void heapsort(T* array_, s32 size) +{ + // for heapsink we pretent this is not c++, where + // arrays start with index 0. So we decrease the array pointer, + // the maximum always +2 and the element always +1 + + T* virtualArray = array_ - 1; + s32 virtualSize = size + 2; + s32 i; + + // build heap + + for (i=((size-1)/2); i>=0; --i) + heapsink(virtualArray, i+1, virtualSize-1); + + // sort array + + for (i=size-1; i>=0; --i) + { + T t = array_[0]; + array_[0] = array_[i]; + array_[i] = t; + heapsink(virtualArray, 1, i + 1); + } +} + +} // end namespace core +} // end namespace irr + + + +#endif + diff --git a/OTLib/irrxml/irrArray.h b/OTLib/irrxml/irrArray.h new file mode 100755 index 000000000..ad8aa4611 --- /dev/null +++ b/OTLib/irrxml/irrArray.h @@ -0,0 +1,444 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine" and the "irrXML" project. +// For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h + +#ifndef __IRR_ARRAY_H_INCLUDED__ +#define __IRR_ARRAY_H_INCLUDED__ + +#include "irrTypes.h" +#include "heapsort.h" + +namespace irr +{ +namespace core +{ + +//! Self reallocating template array (like stl vector) with additional features. +/** Some features are: Heap sorting, binary search methods, easier debugging. +*/ +template +class array +{ + +public: + + array() + : data(0), allocated(0), used(0), + free_when_destroyed(true), is_sorted(true) + { + } + + //! Constructs a array and allocates an initial chunk of memory. + //! \param start_count: Amount of elements to allocate. + array(u32 start_count) + : data(0), used(0), allocated(0), + free_when_destroyed(true), is_sorted(true) + { + reallocate(start_count); + } + + + //! Copy constructor + array(const array& other) + : data(0) + { + *this = other; + } + + + + //! Destructor. Frees allocated memory, if set_free_when_destroyed + //! was not set to false by the user before. + ~array() + { + if (free_when_destroyed) + delete [] data; + } + + + + //! Reallocates the array, make it bigger or smaller. + //! \param new_size: New size of array. + void reallocate(u32 new_size) + { + T* old_data = data; + + data = new T[new_size]; + allocated = new_size; + + s32 end = used < new_size ? used : new_size; + for (s32 i=0; i allocated) + { + // reallocate(used * 2 +1); + // this doesn't work if the element is in the same array. So + // we'll copy the element first to be sure we'll get no data + // corruption + + T e; + e = element; // copy element + reallocate(used * 2 +1); // increase data block + data[used++] = e; // push_back + is_sorted = false; + return; + } + + data[used++] = element; + is_sorted = false; + } + + + //! Adds an element at the front of the array. If the array is to small to + //! add this new element, the array is made bigger. Please note that this + //! is slow, because the whole array needs to be copied for this. + //! \param element: Element to add at the back of the array. + void push_front(const T& element) + { + if (used + 1 > allocated) + reallocate(used * 2 +1); + + for (int i=(int)used; i>0; --i) + data[i] = data[i-1]; + + data[0] = element; + is_sorted = false; + ++used; + } + + + //! Insert item into array at specified position. Please use this + //! only if you know what you are doing (possible performance loss). + //! The preferred method of adding elements should be push_back(). + //! \param element: Element to be inserted + //! \param index: Where position to insert the new element. + void insert(const T& element, u32 index=0) + { + _IRR_DEBUG_BREAK_IF(index>used) // access violation + + if (used + 1 > allocated) + reallocate(used * 2 +1); + + for (u32 i=used++; i>index; i--) + data[i] = data[i-1]; + + data[index] = element; + is_sorted = false; + } + + + + + //! Clears the array and deletes all allocated memory. + void clear() + { + delete [] data; + data = 0; + used = 0; + allocated = 0; + is_sorted = true; + } + + + + //! Sets pointer to new array, using this as new workspace. + //! \param newPointer: Pointer to new array of elements. + //! \param size: Size of the new array. + void set_pointer(T* newPointer, u32 size) + { + delete [] data; + data = newPointer; + allocated = size; + used = size; + is_sorted = false; + } + + + + //! Sets if the array should delete the memory it used. + //! \param f: If true, the array frees the allocated memory in its + //! destructor, otherwise not. The default is true. + void set_free_when_destroyed(bool f) + { + free_when_destroyed = f; + } + + + + //! Sets the size of the array. + //! \param usedNow: Amount of elements now used. + void set_used(u32 usedNow) + { + if (allocated < usedNow) + reallocate(usedNow); + + used = usedNow; + } + + + + //! Assignement operator + void operator=(const array& other) + { + if (data) + delete [] data; + + //if (allocated < other.allocated) + if (other.allocated == 0) + data = 0; + else + data = new T[other.allocated]; + + used = other.used; + free_when_destroyed = other.free_when_destroyed; + is_sorted = other.is_sorted; + allocated = other.allocated; + + for (u32 i=0; i=used) // access violation + + return data[index]; + } + + + + //! Direct access operator + const T& operator [](u32 index) const + { + _IRR_DEBUG_BREAK_IF(index>=used) // access violation + + return data[index]; + } + + //! Gets last frame + const T& getLast() const + { + _IRR_DEBUG_BREAK_IF(!used) // access violation + + return data[used-1]; + } + + //! Gets last frame + T& getLast() + { + _IRR_DEBUG_BREAK_IF(!used) // access violation + + return data[used-1]; + } + + + //! Returns a pointer to the array. + //! \return Pointer to the array. + T* pointer() + { + return data; + } + + + + //! Returns a const pointer to the array. + //! \return Pointer to the array. + const T* const_pointer() const + { + return data; + } + + + + //! Returns size of used array. + //! \return Size of elements in the array. + u32 size() const + { + return used; + } + + + + //! Returns amount memory allocated. + //! \return Returns amount of memory allocated. The amount of bytes + //! allocated would be allocated_size() * sizeof(ElementsUsed); + u32 allocated_size() const + { + return allocated; + } + + + + //! Returns true if array is empty + //! \return True if the array is empty, false if not. + bool empty() const + { + return used == 0; + } + + + + //! Sorts the array using heapsort. There is no additional memory waste and + //! the algorithm performs (O) n log n in worst case. + void sort() + { + if (is_sorted || used<2) + return; + + heapsort(data, used); + is_sorted = true; + } + + + + //! Performs a binary search for an element, returns -1 if not found. + //! The array will be sorted before the binary search if it is not + //! already sorted. + //! \param element: Element to search for. + //! \return Returns position of the searched element if it was found, + //! otherwise -1 is returned. + s32 binary_search(const T& element) + { + return binary_search(element, 0, used-1); + } + + + + //! Performs a binary search for an element, returns -1 if not found. + //! The array will be sorted before the binary search if it is not + //! already sorted. + //! \param element: Element to search for. + //! \param left: First left index + //! \param right: Last right index. + //! \return Returns position of the searched element if it was found, + //! otherwise -1 is returned. + s32 binary_search(const T& element, s32 left, s32 right) + { + if (!used) + return -1; + + sort(); + + s32 m; + + do + { + m = (left+right)>>1; + + if (element < data[m]) + right = m - 1; + else + left = m + 1; + + } while((element < data[m] || data[m] < element) && left<=right); + + // this last line equals to: + // " while((element != array[m]) && left<=right);" + // but we only want to use the '<' operator. + // the same in next line, it is "(element == array[m])" + + if (!(element < data[m]) && !(data[m] < element)) + return m; + + return -1; + } + + + //! Finds an element in linear time, which is very slow. Use + //! binary_search for faster finding. Only works if =operator is implemented. + //! \param element: Element to search for. + //! \return Returns position of the searched element if it was found, + //! otherwise -1 is returned. + s32 linear_search(T& element) + { + for (u32 i=0; i=0; --i) + if (data[i] == element) + return (s32)i; + + return -1; + } + + + + //! Erases an element from the array. May be slow, because all elements + //! following after the erased element have to be copied. + //! \param index: Index of element to be erased. + void erase(u32 index) + { + _IRR_DEBUG_BREAK_IF(index>=used || index<0) // access violation + + for (u32 i=index+1; i=used || index<0 || count<1 || index+count>used) // access violation + + for (u32 i=index+count; i and string work both with unicode AND ascii, +so you can assign unicode to string and ascii to string +(and the other way round) if your ever would want to. +Note that the conversation between both is not done using an encoding. + +Known bugs: +Special characters like '', '' and '' are ignored in the +methods make_upper, make_lower and equals_ignore_case. +*/ +template +class string +{ +public: + + //! Default constructor + string() + : array(0), allocated(1), used(1) + { + array = new T[1]; + array[0] = 0x0; + } + + + + //! Constructor + string(const string& other) + : array(0), allocated(0), used(0) + { + *this = other; + } + + + //! Constructs a string from an int + string(int number) + : allocated(0), used(0), array(0) + { + // store if negative and make positive + + bool negative = false; + if (number < 0) + { + number *= -1; + negative = true; + } + + // temporary buffer for 16 numbers + + c8 tmpbuf[16]; + tmpbuf[15] = 0; + s32 idx = 15; + + // special case '0' + + if (!number) + { + tmpbuf[14] = '0'; + *this = &tmpbuf[14]; + return; + } + + // add numbers + + while(number && idx) + { + idx--; + tmpbuf[idx] = (c8)('0' + (number % 10)); + number = number / 10; + } + + // add sign + + if (negative) + { + idx--; + tmpbuf[idx] = '-'; + } + + *this = &tmpbuf[idx]; + } + + + + //! Constructor for copying a string from a pointer with a given lenght + template + string(const B* c, s32 lenght) + : array(0), allocated(0), used(0) + { + if (!c) + return; + + allocated = used = lenght+1; + array = new T[used]; + + for (s32 l = 0; l + string(const B* c) + : array(0), allocated(0), used(0) + { + *this = c; + } + + + + //! destructor + ~string() + { + delete [] array; + } + + + + //! Assignment operator + string& operator=(const string& other) + { + if (this == &other) + return *this; + + delete [] array; + allocated = used = other.size()+1; + array = new T[used]; + + const T* p = other.c_str(); + for (s32 i=0; i + string& operator=(const B* c) + { + if (!c) + { + if (!array) + { + array = new T[1]; + allocated = 1; + used = 1; + } + array[0] = 0x0; + return *this; + } + + if ((void*)c == (void*)array) + return *this; + + s32 len = 0; + const B* p = c; + while(*p) + { + ++len; + ++p; + } + + // we'll take the old string for a while, because the new string could be + // a part of the current string. + T* oldArray = array; + + allocated = used = len+1; + array = new T[used]; + + for (s32 l = 0; l operator+(const string& other) + { + string str(*this); + str.append(other); + + return str; + } + + //! Add operator for strings, ascii and unicode + template + string operator+(const B* c) + { + string str(*this); + str.append(c); + + return str; + } + + + + //! Direct access operator + T& operator [](const s32 index) const + { + _IRR_DEBUG_BREAK_IF(index>=used) // bad index + + return array[index]; + } + + + //! Comparison operator + bool operator ==(const T* str) const + { + int i; + for(i=0; array[i] && str[i]; ++i) + if (array[i] != str[i]) + return false; + + return !array[i] && !str[i]; + } + + + + //! Comparison operator + bool operator ==(const string& other) const + { + for(s32 i=0; array[i] && other.array[i]; ++i) + if (array[i] != other.array[i]) + return false; + + return used == other.used; + } + + + + //! Is smaller operator + bool operator <(const string& other) const + { + for(s32 i=0; array[i] && other.array[i]; ++i) + if (array[i] != other.array[i]) + return (array[i] < other.array[i]); + + return used < other.used; + } + + + + //! Equals not operator + bool operator !=(const string& other) const + { + return !(*this == other); + } + + + + //! Returns length of string + /** \return Returns length of the string in characters. */ + s32 size() const + { + return used-1; + } + + + + //! Returns character string + /** \return Returns pointer to C-style zero terminated string. */ + const T* c_str() const + { + return array; + } + + + + //! Makes the string lower case. + void make_lower() + { + const T A = (T)'A'; + const T Z = (T)'Z'; + const T diff = (T)'a' - A; + + for (s32 i=0; i=A && array[i]<=Z) + array[i] += diff; + } + } + + + + //! Makes the string upper case. + void make_upper() + { + const T a = (T)'a'; + const T z = (T)'z'; + const T diff = (T)'A' - a; + + for (s32 i=0; i=a && array[i]<=z) + array[i] += diff; + } + } + + + + //! Compares the string ignoring case. + /** \param other: Other string to compare. + \return Returns true if the string are equal ignoring case. */ + bool equals_ignore_case(const string& other) const + { + for(s32 i=0; array[i] && other[i]; ++i) + if (toLower(array[i]) != toLower(other[i])) + return false; + + return used == other.used; + } + + + //! compares the first n characters of the strings + bool equalsn(const string& other, int len) + { + int i; + for(i=0; array[i] && other[i] && i < len; ++i) + if (array[i] != other[i]) + return false; + + // if one (or both) of the strings was smaller then they + // are only equal if they have the same lenght + return (i == len) || (used == other.used); + } + + + //! compares the first n characters of the strings + bool equalsn(const T* str, int len) + { + int i; + for(i=0; array[i] && str[i] && i < len; ++i) + if (array[i] != str[i]) + return false; + + // if one (or both) of the strings was smaller then they + // are only equal if they have the same lenght + return (i == len) || (array[i] == 0 && str[i] == 0); + } + + + //! Appends a character to this string + /** \param character: Character to append. */ + void append(T character) + { + if (used + 1 > allocated) + reallocate((s32)used + 1); + + used += 1; + + array[used-2] = character; + array[used-1] = 0; + } + + //! Appends a string to this string + /** \param other: String to append. */ + void append(const string& other) + { + --used; + + s32 len = other.size(); + + if (used + len + 1 > allocated) + reallocate((s32)used + (s32)len + 1); + + for (s32 l=0; l& other, s32 length) + { + s32 len = other.size(); + + if (len < length) + { + append(other); + return; + } + + len = length; + --used; + + if (used + len > allocated) + reallocate((s32)used + (s32)len); + + for (s32 l=0; l + s32 findFirstCharNotInList(B* c, int count) const + { + for (int i=0; i + s32 findLastCharNotInList(B* c, int count) const + { + for (int i=used-2; i>=0; --i) + { + int j; + for (j=0; j=0; --i) + if (array[i] == c) + return i; + + return -1; + } + + + //! Returns a substring + //! \param begin: Start of substring. + //! \param length: Length of substring. + string subString(s32 begin, s32 length) + { + if (length <= 0) + return string(""); + + string o; + o.reserve(length+1); + + for (s32 i=0; i& other) + { + append(other); + } + + void operator += (int i) + { + append(string(i)); + } + + //! replaces all characters of a special type with another one + void replace(T toReplace, T replaceWith) + { + for (s32 i=0; i=used || index<0) // access violation + + for (int i=index+1; i=(T)'A' && t<=(T)'Z') + return t + ((T)'a' - (T)'A'); + else + return t; + } + + //! Reallocate the array, make it bigger or smaler + void reallocate(s32 new_size) + { + T* old_array = array; + + array = new T[new_size]; + allocated = new_size; + + s32 amount = used < new_size ? used : new_size; + for (s32 i=0; i stringc; + +//! Typedef for wide character strings +typedef string stringw; + +} // end namespace core +} // end namespace irr + +#endif + diff --git a/OTLib/irrxml/irrTypes.h b/OTLib/irrxml/irrTypes.h new file mode 100755 index 000000000..aa2254d1c --- /dev/null +++ b/OTLib/irrxml/irrTypes.h @@ -0,0 +1,101 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#ifndef __IRR_TYPES_H_INCLUDED__ +#define __IRR_TYPES_H_INCLUDED__ + +namespace irr +{ + +//! 8 bit unsigned variable. +/** This is a typedef for unsigned char, it ensures portability of the engine. */ +typedef unsigned char u8; + +//! 8 bit signed variable. +/** This is a typedef for signed char, it ensures portability of the engine. */ +typedef signed char s8; + +//! 8 bit character variable. +/** This is a typedef for char, it ensures portability of the engine. */ +typedef char c8; + + + +//! 16 bit unsigned variable. +/** This is a typedef for unsigned short, it ensures portability of the engine. */ +typedef unsigned short u16; + +//! 16 bit signed variable. +/** This is a typedef for signed short, it ensures portability of the engine. */ +typedef signed short s16; + + + +//! 32 bit unsigned variable. +/** This is a typedef for unsigned int, it ensures portability of the engine. */ +typedef unsigned int u32; + +//! 32 bit signed variable. +/** This is a typedef for signed int, it ensures portability of the engine. */ +typedef signed int s32; + + + +// 64 bit signed variable. +// This is a typedef for __int64, it ensures portability of the engine. +// This type is currently not used by the engine and not supported by compilers +// other than Microsoft Compilers, so it is outcommented. +//typedef __int64 s64; + + + +//! 32 bit floating point variable. +/** This is a typedef for float, it ensures portability of the engine. */ +typedef float f32; + +//! 64 bit floating point variable. +/** This is a typedef for double, it ensures portability of the engine. */ +typedef double f64; + + +} // end namespace + + +// define the wchar_t type if not already built in. +#ifdef _MSC_VER +#ifndef _WCHAR_T_DEFINED +//! A 16 bit wide character type. +/** + Defines the wchar_t-type. + In VS6, its not possible to tell + the standard compiler to treat wchar_t as a built-in type, and + sometimes we just don't want to include the huge stdlib.h or wchar.h, + so we'll use this. +*/ +typedef unsigned short wchar_t; +#define _WCHAR_T_DEFINED +#endif // wchar is not defined +#endif // microsoft compiler + +//! define a break macro for debugging only in Win32 mode. +#if defined(WIN32) && defined(_MSC_VER) && defined(_DEBUG) +#define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_asm int 3} +#else +#define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) +#endif + +//! Defines a small statement to work around a microsoft compiler bug. +/** The microsft compiler 7.0 - 7.1 has a bug: +When you call unmanaged code that returns a bool type value of false from managed code, +the return value may appear as true. See +http://support.microsoft.com/default.aspx?kbid=823071 for details. +Compiler version defines: VC6.0 : 1200, VC7.0 : 1300, VC7.1 : 1310, VC8.0 : 1400*/ +#if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER > 1299) && (_MSC_VER < 1400) +#define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX __asm mov eax,100 +#else +#define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX +#endif // _IRR_MANAGED_MARSHALLING_BUGFIX + +#endif // __IRR_TYPES_H_INCLUDED__ + diff --git a/OTLib/irrxml/irrXML.cpp b/OTLib/irrxml/irrXML.cpp new file mode 100755 index 000000000..aa0f2d765 --- /dev/null +++ b/OTLib/irrxml/irrXML.cpp @@ -0,0 +1,170 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine" and the "irrXML" project. +// For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h + +#include + +#include "irrXML.h" +#include "irrString.h" +#include "irrArray.h" +#include "fast_atof.h" +#include "CXMLReaderImpl.h" + +namespace irr +{ +namespace io +{ + +//! Implementation of the file read callback for ordinary files +class CFileReadCallBack : public IFileReadCallBack +{ +public: + + //! construct from filename + CFileReadCallBack(const char* filename) + : File(0), Size(0), Close(true) + { + // open file +#ifdef _WIN32 + errno_t err = fopen_s(&File, filename, "rb"); +#else + File = fopen(filename, "rb"); +#endif + + if (File) + getFileSize(); + } + + //! construct from FILE pointer + CFileReadCallBack(FILE* file) + : File(file), Size(0), Close(false) + { + if (File) + getFileSize(); + } + + //! destructor + virtual ~CFileReadCallBack() + { + if (Close && File) +//#ifdef _WIN32 +// fclose_s(File); +//#else + fclose(File); +//#endif + } + + //! Reads an amount of bytes from the file. + virtual int read(void* buffer, unsigned sizeToRead) + { + if (!File) + return 0; + +#ifdef _WIN32 // dest buf, dest size, element size, count, file + return (int)fread_s(buffer, sizeToRead+1, 1, sizeToRead, File); +#else + return (int)fread(buffer, 1, sizeToRead, File); +#endif + } + + //! Returns size of file in bytes + virtual int getSize() + { + return Size; + } + +private: + + //! retrieves the file size of the open file + void getFileSize() + { +//#ifdef _WIN32 +// fseek_s(File, 0, SEEK_END); +//#else + fseek(File, 0, SEEK_END); +//#endif + + Size = ftell(File); +//#ifdef _WIN32 +// fseek_s(File, 0, SEEK_SET); +//#else + fseek(File, 0, SEEK_SET); +//#endif + } + + FILE* File; + int Size; + bool Close; + +}; // end class CFileReadCallBack + + + +// FACTORY FUNCTIONS: + + +//! Creates an instance of an UFT-8 or ASCII character xml parser. +IrrXMLReader* createIrrXMLReader(const char* filename) +{ + return new CXMLReaderImpl(new CFileReadCallBack(filename)); +} + + +//! Creates an instance of an UFT-8 or ASCII character xml parser. +IrrXMLReader* createIrrXMLReader(FILE* file) +{ + return new CXMLReaderImpl(new CFileReadCallBack(file)); +} + + +//! Creates an instance of an UFT-8 or ASCII character xml parser. +IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback) +{ + return new CXMLReaderImpl(callback, false); +} + + +//! Creates an instance of an UTF-16 xml parser. +IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename) +{ + return new CXMLReaderImpl(new CFileReadCallBack(filename)); +} + + +//! Creates an instance of an UTF-16 xml parser. +IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file) +{ + return new CXMLReaderImpl(new CFileReadCallBack(file)); +} + + +//! Creates an instance of an UTF-16 xml parser. +IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback) +{ + return new CXMLReaderImpl(callback, false); +} + + +//! Creates an instance of an UTF-32 xml parser. +IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename) +{ + return new CXMLReaderImpl(new CFileReadCallBack(filename)); +} + + +//! Creates an instance of an UTF-32 xml parser. +IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file) +{ + return new CXMLReaderImpl(new CFileReadCallBack(file)); +} + + +//! Creates an instance of an UTF-32 xml parser. +IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback) +{ + return new CXMLReaderImpl(callback, false); +} + + +} // end namespace io +} // end namespace irr diff --git a/OTLib/irrxml/irrXML.h b/OTLib/irrxml/irrXML.h new file mode 100755 index 000000000..c8ed2f0d2 --- /dev/null +++ b/OTLib/irrxml/irrXML.h @@ -0,0 +1,540 @@ +// Copyright (C) 2002-2005 Nikolaus Gebhardt +// This file is part of the "Irrlicht Engine" and the "irrXML" project. +// For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h + +#ifndef __IRR_XML_H_INCLUDED__ +#define __IRR_XML_H_INCLUDED__ + +#include + +/** \mainpage irrXML 1.2 API documentation +
+ + \section intro Introduction + + Welcome to the irrXML API documentation. + Here you'll find any information you'll need to develop applications with + irrXML. If you look for a tutorial on how to start, take a look at the \ref irrxmlexample, + at the homepage of irrXML at xml.irrlicht3d.org + or into the SDK in the directory \example. + + irrXML is intended to be a high speed and easy-to-use XML Parser for C++, and + this documentation is an important part of it. If you have any questions or + suggestions, just send a email to the author of the engine, Nikolaus Gebhardt + (niko (at) irrlicht3d.org). For more informations about this parser, see \ref history. + + \section features Features + + irrXML provides forward-only, read-only + access to a stream of non validated XML data. It was fully implemented by + Nikolaus Gebhardt. Its current features are: + + - It it fast as lighting and has very low memory usage. It was + developed with the intention of being used in 3D games, as it already has been. + - irrXML is very small: It only consists of 60 KB of code and can be added easily + to your existing project. + - Of course, it is platform independent and works with lots of compilers. + - It is able to parse ASCII, UTF-8, UTF-16 and UTF-32 text files, both in + little and big endian format. + - Independent of the input file format, the parser can return all strings in ASCII, UTF-8, + UTF-16 and UTF-32 format. + - With its optional file access abstraction it has the advantage that it can read not + only from files but from any type of data (memory, network, ...). For example when + used with the Irrlicht Engine, it directly reads from compressed .zip files. + - Just like the Irrlicht Engine for which it was originally created, it is extremely easy + to use. + - It has no external dependencies, it does not even need the STL. + + Although irrXML has some strenghts, it currently also has the following limitations: + + - The input xml file is not validated and assumed to be correct. + + \section irrxmlexample Example + + The following code demonstrates the basic usage of irrXML. A simple xml + file like this is parsed: + \code + + + + + + Welcome to the Mesh Viewer of the "Irrlicht Engine". + + + \endcode + + The code for parsing this file would look like this: + \code + #include + using namespace irr; // irrXML is located in the namespace irr::io + using namespace io; + + #include // we use STL strings to store data in this example + + void main() + { + // create the reader using one of the factory functions + + IrrXMLReader* xml = createIrrXMLReader("config.xml"); + + // strings for storing the data we want to get out of the file + std::string modelFile; + std::string messageText; + std::string caption; + + // parse the file until end reached + + while(xml && xml->read()) + { + switch(xml->getNodeType()) + { + case EXN_TEXT: + // in this xml file, the only text which occurs is the messageText + messageText = xml->getNodeData(); + break; + case EXN_ELEMENT: + { + if (!strcmp("model", xml->getNodeName())) + modelFile = xml->getAttributeValue("file"); + else + if (!strcmp("messageText", xml->getNodeName())) + caption = xml->getAttributeValue("caption"); + } + break; + } + } + + // delete the xml parser after usage + delete xml; + } + \endcode + + \section howto How to use + + Simply add the source files in the /src directory of irrXML to your project. Done. + + \section license License + + The irrXML license is based on the zlib license. Basicly, this means you can do with + irrXML whatever you want: + + Copyright (C) 2002-2005 Nikolaus Gebhardt + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + + \section history History + + As lots of references in this documentation and the source show, this xml + parser has originally been a part of the + Irrlicht Engine. But because + the parser has become very useful with the latest release, people asked for a + separate version of it, to be able to use it in non Irrlicht projects. With + irrXML 1.0, this has now been done. +*/ + +namespace irr +{ +namespace io +{ + //! Enumeration of all supported source text file formats + enum ETEXT_FORMAT + { + //! ASCII, file without byte order mark, or not a text file + ETF_ASCII, + + //! UTF-8 format + ETF_UTF8, + + //! UTF-16 format, big endian + ETF_UTF16_BE, + + //! UTF-16 format, little endian + ETF_UTF16_LE, + + //! UTF-32 format, big endian + ETF_UTF32_BE, + + //! UTF-32 format, little endian + ETF_UTF32_LE, + }; + + + //! Enumeration for all xml nodes which are parsed by IrrXMLReader + enum EXML_NODE + { + //! No xml node. This is usually the node if you did not read anything yet. + EXN_NONE, + + //! A xml element, like + EXN_ELEMENT, + + //! End of an xml element, like + EXN_ELEMENT_END, + + //! Text within a xml element: this is the text. + EXN_TEXT, + + //! An xml comment like <!-- I am a comment --> or a DTD definition. + EXN_COMMENT, + + //! An xml cdata section like <![CDATA[ this is some CDATA ]]> + EXN_CDATA, + + //! Unknown element. + EXN_UNKNOWN + }; + + //! Callback class for file read abstraction. + /** With this, it is possible to make the xml parser read in other things + than just files. The Irrlicht engine is using this for example to + read xml from compressed .zip files. To make the parser read in + any other data, derive a class from this interface, implement the + two methods to read your data and give a pointer to an instance of + your implementation when calling createIrrXMLReader(), + createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ + class IFileReadCallBack + { + public: + + //! virtual destructor + virtual ~IFileReadCallBack() {}; + + //! Reads an amount of bytes from the file. + /** \param buffer: Pointer to buffer where to read bytes will be written to. + \param sizeToRead: Amount of bytes to read from the file. + \return Returns how much bytes were read. */ + virtual int read(void* buffer, unsigned sizeToRead) = 0; + + //! Returns size of file in bytes + virtual int getSize() = 0; + }; + + //! Empty class to be used as parent class for IrrXMLReader. + /** If you need another class as base class for the xml reader, you can do this by creating + the reader using for example new CXMLReaderImpl(yourcallback); + The Irrlicht Engine for example needs IUnknown as base class for every object to + let it automaticly reference countend, hence it replaces IXMLBase with IUnknown. + See irrXML.cpp on how this can be done in detail. */ + class IXMLBase + { + }; + + //! Interface providing easy read access to a XML file. + /** You can create an instance of this reader using one of the factory functions + createIrrXMLReader(), createIrrXMLReaderUTF16() and createIrrXMLReaderUTF32(). + If using the parser from the Irrlicht Engine, please use IFileSystem::createXMLReader() + instead. + For a detailed intro how to use the parser, see \ref irrxmlexample and \ref features. + + The typical usage of this parser looks like this: + \code + #include + using namespace irr; // irrXML is located in the namespace irr::io + using namespace io; + + void main() + { + // create the reader using one of the factory functions + IrrXMLReader* xml = createIrrXMLReader("config.xml"); + + if (xml == 0) + return; // file could not be opened + + // parse the file until end reached + while(xml->read()) + { + // based on xml->getNodeType(), do something. + } + + // delete the xml parser after usage + delete xml; + } + \endcode + See \ref irrxmlexample for a more detailed example. + */ + template + class IIrrXMLReader : public super_class + { + public: + + //! Destructor + virtual ~IIrrXMLReader() {}; + + //! Reads forward to the next xml node. + /** \return Returns false, if there was no further node. */ + virtual bool read() = 0; + + //! Returns the type of the current XML node. + virtual EXML_NODE getNodeType() const = 0; + + //! Returns attribute count of the current XML node. + /** This is usually + non null if the current node is EXN_ELEMENT, and the element has attributes. + \return Returns amount of attributes of this xml node. */ + virtual int getAttributeCount() const = 0; + + //! Returns name of an attribute. + /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. + \return Name of the attribute, 0 if an attribute with this index does not exist. */ + virtual const char_type* getAttributeName(int idx) const = 0; + + //! Returns the value of an attribute. + /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. + \return Value of the attribute, 0 if an attribute with this index does not exist. */ + virtual const char_type* getAttributeValue(int idx) const = 0; + + //! Returns the value of an attribute. + /** \param name: Name of the attribute. + \return Value of the attribute, 0 if an attribute with this name does not exist. */ + virtual const char_type* getAttributeValue(const char_type* name) const = 0; + + //! Returns the value of an attribute in a safe way. + /** Like getAttributeValue(), but does not + return 0 if the attribute does not exist. An empty string ("") is returned then. + \param name: Name of the attribute. + \return Value of the attribute, and "" if an attribute with this name does not exist */ + virtual const char_type* getAttributeValueSafe(const char_type* name) const = 0; + + //! Returns the value of an attribute as integer. + /** \param name Name of the attribute. + \return Value of the attribute as integer, and 0 if an attribute with this name does not exist or + the value could not be interpreted as integer. */ + virtual int getAttributeValueAsInt(const char_type* name) const = 0; + + //! Returns the value of an attribute as integer. + /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. + \return Value of the attribute as integer, and 0 if an attribute with this index does not exist or + the value could not be interpreted as integer. */ + virtual int getAttributeValueAsInt(int idx) const = 0; + + //! Returns the value of an attribute as float. + /** \param name: Name of the attribute. + \return Value of the attribute as float, and 0 if an attribute with this name does not exist or + the value could not be interpreted as float. */ + virtual float getAttributeValueAsFloat(const char_type* name) const = 0; + + //! Returns the value of an attribute as float. + /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. + \return Value of the attribute as float, and 0 if an attribute with this index does not exist or + the value could not be interpreted as float. */ + virtual float getAttributeValueAsFloat(int idx) const = 0; + + //! Returns the name of the current node. + /** Only non null, if the node type is EXN_ELEMENT. + \return Name of the current node or 0 if the node has no name. */ + virtual const char_type* getNodeName() const = 0; + + //! Returns data of the current node. + /** Only non null if the node has some + data and it is of type EXN_TEXT or EXN_UNKNOWN. */ + virtual const char_type* getNodeData() const = 0; + + //! Returns if an element is an empty element, like + virtual bool isEmptyElement() const = 0; + + //! Returns format of the source xml file. + /** It is not necessary to use + this method because the parser will convert the input file format + to the format wanted by the user when creating the parser. This + method is useful to get/display additional informations. */ + virtual ETEXT_FORMAT getSourceFormat() const = 0; + + //! Returns format of the strings returned by the parser. + /** This will be UTF8 for example when you created a parser with + IrrXMLReaderUTF8() and UTF32 when it has been created using + IrrXMLReaderUTF32. It should not be necessary to call this + method and only exists for informational purposes. */ + virtual ETEXT_FORMAT getParserFormat() const = 0; + }; + + + //! defines the utf-16 type. + /** Not using wchar_t for this because + wchar_t has 16 bit on windows and 32 bit on other operating systems. */ + typedef unsigned short char16; + + //! defines the utf-32 type. + /** Not using wchar_t for this because + wchar_t has 16 bit on windows and 32 bit on other operating systems. */ + typedef unsigned long char32; + + //! A UTF-8 or ASCII character xml parser. + /** This means that all character data will be returned in 8 bit ASCII or UTF-8 by this parser. + The file to read can be in any format, it will be converted to UTF-8 if it is not + in this format. + Create an instance of this with createIrrXMLReader(); + See IIrrXMLReader for description on how to use it. */ + typedef IIrrXMLReader IrrXMLReader; + + //! A UTF-16 xml parser. + /** This means that all character data will be returned in UTF-16 by this parser. + The file to read can be in any format, it will be converted to UTF-16 if it is not + in this format. + Create an instance of this with createIrrXMLReaderUTF16(); + See IIrrXMLReader for description on how to use it. */ + typedef IIrrXMLReader IrrXMLReaderUTF16; + + //! A UTF-32 xml parser. + /** This means that all character data will be returned in UTF-32 by this parser. + The file to read can be in any format, it will be converted to UTF-32 if it is not + in this format. + Create an instance of this with createIrrXMLReaderUTF32(); + See IIrrXMLReader for description on how to use it. */ + typedef IIrrXMLReader IrrXMLReaderUTF32; + + + //! Creates an instance of an UFT-8 or ASCII character xml parser. + /** This means that all character data will be returned in 8 bit ASCII or UTF-8. + The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReaderUTF8() instead. + \param filename: Name of file to be opened. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReader* createIrrXMLReader(const char* filename); + + //! Creates an instance of an UFT-8 or ASCII character xml parser. + /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can + be in any format, it will be converted to UTF-8 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReaderUTF8() instead. + \param file: Pointer to opened file, must have been opened in binary mode, e.g. + using fopen("foo.bar", "wb"); The file will not be closed after it has been read. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReader* createIrrXMLReader(FILE* file); + + //! Creates an instance of an UFT-8 or ASCII character xml parser. + /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can + be in any format, it will be converted to UTF-8 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReaderUTF8() instead. + \param callback: Callback for file read abstraction. Implement your own + callback to make the xml parser read in other things than just files. See + IFileReadCallBack for more information about this. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); + + //! Creates an instance of an UFT-16 xml parser. + /** This means that + all character data will be returned in UTF-16. The file to read can + be in any format, it will be converted to UTF-16 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param filename: Name of file to be opened. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); + + //! Creates an instance of an UFT-16 xml parser. + /** This means that all character data will be returned in UTF-16. The file to read can + be in any format, it will be converted to UTF-16 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param file: Pointer to opened file, must have been opened in binary mode, e.g. + using fopen("foo.bar", "wb"); The file will not be closed after it has been read. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); + + //! Creates an instance of an UFT-16 xml parser. + /** This means that all character data will be returned in UTF-16. The file to read can + be in any format, it will be converted to UTF-16 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param callback: Callback for file read abstraction. Implement your own + callback to make the xml parser read in other things than just files. See + IFileReadCallBack for more information about this. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); + + + //! Creates an instance of an UFT-32 xml parser. + /** This means that all character data will be returned in UTF-32. The file to read can + be in any format, it will be converted to UTF-32 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param filename: Name of file to be opened. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); + + //! Creates an instance of an UFT-32 xml parser. + /** This means that all character data will be returned in UTF-32. The file to read can + be in any format, it will be converted to UTF-32 if it is not in this format. + if you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param file: Pointer to opened file, must have been opened in binary mode, e.g. + using fopen("foo.bar", "wb"); The file will not be closed after it has been read. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); + + //! Creates an instance of an UFT-32 xml parser. + /** This means that + all character data will be returned in UTF-32. The file to read can + be in any format, it will be converted to UTF-32 if it is not in this format. + If you are using the Irrlicht Engine, it is better not to use this function but + IFileSystem::createXMLReader() instead. + \param callback: Callback for file read abstraction. Implement your own + callback to make the xml parser read in other things than just files. See + IFileReadCallBack for more information about this. + \return Returns a pointer to the created xml parser. This pointer should be + deleted using 'delete' after no longer needed. Returns 0 if an error occured + and the file could not be opened. */ + IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); + + + /*! \file irrxml.h + \brief Header file of the irrXML, the Irrlicht XML parser. + + This file includes everything needed for using irrXML, + the XML parser of the Irrlicht Engine. To use irrXML, + you only need to include this file in your project: + + \code + #include + \endcode + + It is also common to use the two namespaces in which irrXML is included, + directly after #including irrXML.h: + + \code + #include + using namespace irr; + using namespace io; + \endcode + */ + +} // end namespace io +} // end namespace irr + +#endif // __IRR_XML_H_INCLUDED__ + diff --git a/OTLib/mkcert.c b/OTLib/mkcert.c new file mode 100644 index 000000000..02a6369ee --- /dev/null +++ b/OTLib/mkcert.c @@ -0,0 +1,186 @@ +/* Certificate creation. Demonstrates some certificate related +* operations. +*/ + + +#include +#include + +#ifdef _WIN32 // Including this so it'll be above the openssl/ssl.h +#include // So there won't be a conflict with WinCrypt.h due to Windows sucking +#endif + +#include +#include + +#include +#include +#include + +#ifndef OPENSSL_NO_ENGINE +#include +#endif + +int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days); +int add_ext(X509 *cert, int nid, char *value); + + +/* +int main(int argc, char **argv) + { + BIO *bio_err; + X509 *x509=NULL; + EVP_PKEY *pkey=NULL; + + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + + bio_err=BIO_new_fp(stderr, BIO_NOCLOSE); + + mkcert(&x509,&pkey,512,0,365); + + RSA_print_fp(stdout,pkey->pkey.rsa,0); + X509_print_fp(stdout,x509); + + PEM_write_PrivateKey(stdout,pkey,NULL,NULL,0,NULL, NULL); + PEM_write_X509(stdout,x509); + + X509_free(x509); + EVP_PKEY_free(pkey); + +#ifndef OPENSSL_NO_ENGINE + ENGINE_cleanup(); +#endif + CRYPTO_cleanup_all_ex_data(); + + CRYPTO_mem_leaks(bio_err); + BIO_free(bio_err); + return(0); + } + */ + + + +static void callback(int p, int n, void *arg) + { + char c='B'; + + if (p == 0) c='.'; + if (p == 1) c='+'; + if (p == 2) c='*'; + if (p == 3) c='\n'; + fputc(c,stderr); + } + + +int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days) + { + X509 *x; + EVP_PKEY *pk; + RSA *rsa; + X509_NAME *name=NULL; + + if ((pkeyp == NULL) || (*pkeyp == NULL)) + { + if ((pk=EVP_PKEY_new()) == NULL) + { + abort(); + return(0); + } + } + else + pk= *pkeyp; + + if ((x509p == NULL) || (*x509p == NULL)) + { + if ((x=X509_new()) == NULL) + goto err; + } + else + x= *x509p; + + rsa=RSA_generate_key(bits,RSA_F4,callback,NULL); + if (!EVP_PKEY_assign_RSA(pk,rsa)) + { + abort(); + goto err; + } + rsa=NULL; + + X509_set_version(x,2); + ASN1_INTEGER_set(X509_get_serialNumber(x),serial); + X509_gmtime_adj(X509_get_notBefore(x),0); + X509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*days); + X509_set_pubkey(x,pk); + + name=X509_get_subject_name(x); + + /* This function creates and adds the entry, working out the + * correct string type and performing checks on its length. + * Normally we'd check the return value for errors... + */ + X509_NAME_add_entry_by_txt(name,"C", + MBSTRING_ASC, "UK", -1, -1, 0); + X509_NAME_add_entry_by_txt(name,"CN", + MBSTRING_ASC, "OpenSSL Group", -1, -1, 0); + + /* Its self signed so set the issuer name to be the same as the + * subject. + */ + X509_set_issuer_name(x,name); + + /* Add various extensions: standard extensions */ + add_ext(x, NID_basic_constraints, "critical,CA:TRUE"); + add_ext(x, NID_key_usage, "critical,keyCertSign,cRLSign"); + + add_ext(x, NID_subject_key_identifier, "hash"); + + /* Some Netscape specific extensions */ + add_ext(x, NID_netscape_cert_type, "sslCA"); + + add_ext(x, NID_netscape_comment, "example comment extension"); + + +#ifdef CUSTOM_EXT + /* Maybe even add our own extension based on existing */ + { + int nid; + nid = OBJ_create("1.2.3.4", "MyAlias", "My Test Alias Extension"); + X509V3_EXT_add_alias(nid, NID_netscape_comment); + add_ext(x, nid, "example comment alias"); + } +#endif + + if (!X509_sign(x,pk,EVP_md5())) + goto err; + + *x509p=x; + *pkeyp=pk; + return(1); +err: + return(0); + } + +/* Add extension using V3 code: we can set the config file as NULL + * because we wont reference any other sections. + */ + +int add_ext(X509 *cert, int nid, char *value) + { + X509_EXTENSION *ex; + X509V3_CTX ctx; + /* This sets the 'context' of the extensions. */ + /* No configuration database */ + X509V3_set_ctx_nodb(&ctx); + /* Issuer and subject certs: both the target since it is self signed, + * no request and no CRL + */ + X509V3_set_ctx(&ctx, cert, cert, NULL, NULL, 0); + ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value); + if (!ex) + return 0; + + X509_add_ext(cert,ex,-1); + X509_EXTENSION_free(ex); + return 1; + } + diff --git a/OTLib/simpleini/ConvertUTF.c b/OTLib/simpleini/ConvertUTF.c new file mode 100755 index 000000000..4351b153b --- /dev/null +++ b/OTLib/simpleini/ConvertUTF.c @@ -0,0 +1,539 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Source code file. + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Sept 2001: fixed const & error conditions per + mods suggested by S. Parent & A. Lillich. + June 2002: Tim Dodd added detection and handling of incomplete + source sequences, enhanced error detection, added casts + to eliminate compiler warnings. + July 2003: slight mods to back out aggressive FFFE detection. + Jan 2004: updated switches in from-UTF8 conversions. + Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. + + See the header file "ConvertUTF.h" for complete documentation. + +------------------------------------------------------------------------ */ + + +#include "ConvertUTF.h" +#ifdef CVTUTF_DEBUG +#include +#endif + +static const int halfShift = 10; /* used for shifting by 10 bits */ + +static const UTF32 halfBase = 0x0010000UL; +static const UTF32 halfMask = 0x3FFUL; + +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF +#define false 0 +#define true 1 + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_LEGAL_UTF32) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + --source; /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + if (target >= targetEnd) { + source = oldSource; /* Back up source pointer! */ + result = targetExhausted; break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG +if (result == sourceIllegal) { + fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); + fflush(stderr); +} +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is + * left as-is for anyone who may want to do such conversion, which was + * allowed in earlier algorithms. + */ +static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... etc.). Remember that sequencs + * for *legal* UTF-8 will be 4 or fewer bytes total. + */ +static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. + * Constants have been gathered. Loops & conditionals have been removed as + * much as possible for efficiency, in favor of drop-through switches. + * (See "Note A" at the bottom of the file for equivalent code.) + * If your compiler supports it, the "isLegalUTF8" call can be turned + * into an inline function. + */ + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + UTF32 ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + source = oldSource; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from ConvertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ + +static Boolean isLegalUTF8(const UTF8 *source, int length) { + UTF8 a; + const UTF8 *srcptr = source+length; + switch (length) { + default: return false; + /* Everything else falls through when "true"... */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 2: if ((a = (*--srcptr)) > 0xBF) return false; + + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return false; break; + case 0xED: if (a > 0x9F) return false; break; + case 0xF0: if (a < 0x90) return false; break; + case 0xF4: if (a > 0x8F) return false; break; + default: if (a < 0x80) return false; + } + + case 1: if (*source >= 0x80 && *source < 0xC2) return false; + } + if (*source > 0xF4) return false; + return true; +} + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return false; + } + return isLegalUTF8(source, length); +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= (extraBytesToRead+1); /* return to the start */ + break; /* Bail out; shouldn't continue */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + if (flags == strictConversion ) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* + * Figure out how many bytes the result will require. Turn any + * illegally large UTF32 things (> Plane 17) into replacement chars. + */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + result = sourceIllegal; + } + + target += bytesToWrite; + if (target > targetEnd) { + --source; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF32* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; + case 4: ch += *source++; ch <<= 6; + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up the source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_LEGAL_UTF32) { + /* + * UTF-16 surrogate values are illegal in UTF-32, and anything + * over Plane 17 (> 0x10FFFF) is illegal. + */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = ch; + } + } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ + result = sourceIllegal; + *target++ = UNI_REPLACEMENT_CHAR; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- + + Note A. + The fall-through switches in UTF-8 reading code save a + temp variable, some decrements & conditionals. The switches + are equivalent to the following loop: + { + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); + } + In UTF-8 writing code, the switches on "bytesToWrite" are + similarly unrolled loops. + + --------------------------------------------------------------------- */ diff --git a/OTLib/simpleini/ConvertUTF.h b/OTLib/simpleini/ConvertUTF.h new file mode 100755 index 000000000..f1230ee99 --- /dev/null +++ b/OTLib/simpleini/ConvertUTF.h @@ -0,0 +1,149 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Header file. + + Several funtions are included here, forming a complete set of + conversions between the three formats. UTF-7 is not included + here, but is handled in a separate source file. + + Each of these routines takes pointers to input buffers and output + buffers. The input buffers are const. + + Each routine converts the text between *sourceStart and sourceEnd, + putting the result into the buffer between *targetStart and + targetEnd. Note: the end pointers are *after* the last item: e.g. + *(sourceEnd - 1) is the last item. + + The return result indicates whether the conversion was successful, + and if not, whether the problem was in the source or target buffers. + (Only the first encountered problem is indicated.) + + After the conversion, *sourceStart and *targetStart are both + updated to point to the end of last text successfully converted in + the respective buffers. + + Input parameters: + sourceStart - pointer to a pointer to the source buffer. + The contents of this are modified on return so that + it points at the next thing to be converted. + targetStart - similarly, pointer to pointer to the target buffer. + sourceEnd, targetEnd - respectively pointers to the ends of the + two buffers, for overflow checking only. + + These conversion functions take a ConversionFlags argument. When this + flag is set to strict, both irregular sequences and isolated surrogates + will cause an error. When the flag is set to lenient, both irregular + sequences and isolated surrogates are converted. + + Whether the flag is strict or lenient, all illegal sequences will cause + an error return. This includes sequences such as: , , + or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code + must check for illegal sequences. + + When the flag is set to lenient, characters over 0x10FFFF are converted + to the replacement character; otherwise (when the flag is set to strict) + they constitute an error. + + Output parameters: + The value "sourceIllegal" is returned from some routines if the input + sequence is malformed. When "sourceIllegal" is returned, the source + value will point to the illegal value that caused the problem. E.g., + in UTF-8 when a sequence is malformed, it points to the start of the + malformed sequence. + + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- + The following 4 definitions are compiler-specific. + The C standard does not guarantee that wchar_t has at least + 16 bits, so wchar_t is no less portable than unsigned short! + All should be unsigned values to avoid sign extension during + bit mask & shift operations. +------------------------------------------------------------------------ */ + +typedef unsigned int UTF32; /* at least 32 bits */ +typedef unsigned short UTF16; /* at least 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ +typedef unsigned char Boolean; /* 0 or 1 */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +/* This is for C++ and does no harm in C */ +#ifdef __cplusplus +extern "C" { +#endif + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + +#ifdef __cplusplus +} +#endif + +/* --------------------------------------------------------------------- */ diff --git a/OTLib/simpleini/Makefile b/OTLib/simpleini/Makefile new file mode 100755 index 000000000..a04b5e36e --- /dev/null +++ b/OTLib/simpleini/Makefile @@ -0,0 +1,28 @@ +CC=g++ +CFLAGS=-Wall +CPPFLAGS=-Wall + +OBJS=testsi.o test1.o snippets.o ConvertUTF.o + +help: + @echo This makefile is just for the test program \(use \"make clean all test\"\) + @echo Just include the SimpleIni.h header file to use it. + +all: $(OBJS) + $(CC) -o testsi $(OBJS) + +clean: + rm -f core *.o testsi + +data: + sed 's/\r\n$$/\n/g' < test1-expected.ini > unix.out + mv unix.out test1-expected.ini + +test: testsi + ./testsi -u -m -l test1-input.ini > test1-blah.ini + diff test1-output.ini test1-expected.ini + +install: + @echo No install required. Just include the SimpleIni.h header file to use it. + +testsi.o test1.o snippets.o : SimpleIni.h diff --git a/OTLib/simpleini/SimpleIni.h b/OTLib/simpleini/SimpleIni.h new file mode 100755 index 000000000..441108217 --- /dev/null +++ b/OTLib/simpleini/SimpleIni.h @@ -0,0 +1,3374 @@ +/** @mainpage + + +
Library SimpleIni +
File SimpleIni.h +
Author Brodie Thiesfield [code at jellycan dot com] +
Source http://code.jellycan.com/simpleini/ +
Version 4.14 +
+ + Jump to the @link CSimpleIniTempl CSimpleIni @endlink interface documentation. + + @section intro INTRODUCTION + + This component allows an INI-style configuration file to be used on both + Windows and Linux/Unix. It is fast, simple and source code using this + component will compile unchanged on either OS. + + + @section features FEATURES + + - MIT Licence allows free use in all software (including GPL and commercial) + - multi-platform (Windows 95/98/ME/NT/2K/XP/2003, Windows CE, Linux, Unix) + - loading and saving of INI-style configuration files + - configuration files can have any newline format on all platforms + - liberal acceptance of file format + - key/values with no section + - removal of whitespace around sections, keys and values + - support for multi-line values (values with embedded newline characters) + - optional support for multiple keys with the same name + - optional case-insensitive sections and keys (for ASCII characters only) + - saves files with sections and keys in the same order as they were loaded + - preserves comments on the file, section and keys where possible. + - supports both char or wchar_t programming interfaces + - supports both MBCS (system locale) and UTF-8 file encodings + - system locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file + - support for non-ASCII characters in section, keys, values and comments + - support for non-standard character types or file encodings + via user-written converter classes + - support for adding/modifying values programmatically + - compiles cleanly in the following compilers: + - Windows/VC6 (warning level 3) + - Windows/VC.NET 2003 (warning level 4) + - Windows/VC 2005 (warning level 4) + - Linux/gcc (-Wall) + + + @section usage USAGE SUMMARY + + -# Define the appropriate symbol for the converter you wish to use and + include the SimpleIni.h header file. If no specific converter is defined + then the default converter is used. The default conversion mode uses + SI_CONVERT_WIN32 on Windows and SI_CONVERT_GENERIC on all other + platforms. If you are using ICU then SI_CONVERT_ICU is supported on all + platforms. + -# Declare an instance the appropriate class. Note that the following + definitions are just shortcuts for commonly used types. Other types + (PRUnichar, unsigned short, unsigned char) are also possible. + +
Interface Case-sensitive Load UTF-8 Load MBCS Typedef +
SI_CONVERT_GENERIC +
char No Yes Yes #1 CSimpleIniA +
char Yes Yes Yes CSimpleIniCaseA +
wchar_t No Yes Yes CSimpleIniW +
wchar_t Yes Yes Yes CSimpleIniCaseW +
SI_CONVERT_WIN32 +
char No No #2 Yes CSimpleIniA +
char Yes Yes Yes CSimpleIniCaseA +
wchar_t No Yes Yes CSimpleIniW +
wchar_t Yes Yes Yes CSimpleIniCaseW +
SI_CONVERT_ICU +
char No Yes Yes CSimpleIniA +
char Yes Yes Yes CSimpleIniCaseA +
UChar No Yes Yes CSimpleIniW +
UChar Yes Yes Yes CSimpleIniCaseW +
+ #1 On Windows you are better to use CSimpleIniA with SI_CONVERT_WIN32.
+ #2 Only affects Windows. On Windows this uses MBCS functions and + so may fold case incorrectly leading to uncertain results. + -# Call LoadData() or LoadFile() to load and parse the INI configuration file + -# Access and modify the data of the file using the following functions + +
GetAllSections Return all section names +
GetAllKeys Return all key names within a section +
GetAllValues Return all values within a section & key +
GetSection Return all key names and values in a section +
GetSectionSize Return the number of keys in a section +
GetValue Return a value for a section & key +
SetValue Add or update a value for a section & key +
Delete Remove a section, or a key from a section +
+ -# Call Save() or SaveFile() to save the INI configuration data + + @section iostreams IO STREAMS + + SimpleIni supports reading from and writing to STL IO streams. Enable this + by defining SI_SUPPORT_IOSTREAMS before including the SimpleIni.h header + file. Ensure that if the streams are backed by a file (e.g. ifstream or + ofstream) then the flag ios_base::binary has been used when the file was + opened. + + @section multiline MULTI-LINE VALUES + + Values that span multiple lines are created using the following format. + +
+        key = <<
+
+    Note the following:
+    - The text used for ENDTAG can be anything and is used to find
+      where the multi-line text ends.
+    - The newline after ENDTAG in the start tag, and the newline
+      before ENDTAG in the end tag is not included in the data value.
+    - The ending tag must be on it's own line with no whitespace before
+      or after it.
+    - The multi-line value is modified at load so that each line in the value
+      is delimited by a single '\\n' character on all platforms. At save time
+      it will be converted into the newline format used by the current
+      platform.
+
+    @section comments COMMENTS
+
+    Comments are preserved in the file within the following restrictions:
+    - Every file may have a single "file comment". It must start with the
+      first character in the file, and will end with the first non-comment
+      line in the file.
+    - Every section may have a single "section comment". It will start
+      with the first comment line following the file comment, or the last
+      data entry. It ends at the beginning of the section.
+    - Every key may have a single "key comment". This comment will start
+      with the first comment line following the section start, or the file
+      comment if there is no section name.
+    - Comments are set at the time that the file, section or key is first
+      created. The only way to modify a comment on a section or a key is to
+      delete that entry and recreate it with the new comment. There is no
+      way to change the file comment.
+
+    @section save SAVE ORDER
+
+    The sections and keys are written out in the same order as they were
+    read in from the file. Sections and keys added to the data after the
+    file has been loaded will be added to the end of the file when it is
+    written. There is no way to specify the location of a section or key
+    other than in first-created, first-saved order.
+
+    @section notes NOTES
+
+    - To load UTF-8 data on Windows 95, you need to use Microsoft Layer for
+      Unicode, or SI_CONVERT_GENERIC, or SI_CONVERT_ICU.
+    - When using SI_CONVERT_GENERIC, ConvertUTF.c must be compiled and linked.
+    - When using SI_CONVERT_ICU, ICU header files must be on the include
+      path and icuuc.lib must be linked in.
+    - To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,
+      you should use SI_CONVERT_GENERIC.
+    - The collation (sorting) order used for sections and keys returned from
+      iterators is NOT DEFINED. If collation order of the text is important
+      then it should be done yourself by either supplying a replacement
+      SI_STRLESS class, or by sorting the strings external to this library.
+    - Usage of the  header on Windows can be disabled by defining
+      SI_NO_MBCS. This is defined automatically on Windows CE platforms.
+
+    @section contrib CONTRIBUTIONS
+    
+    - 2010/05/03: Tobias Gehrig: added GetDoubleValue()
+
+    @section licence MIT LICENCE
+
+    The licence text below is the boilerplate "MIT Licence" used from:
+    http://www.opensource.org/licenses/mit-license.php
+
+    Copyright (c) 2006-2008, Brodie Thiesfield
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is furnished
+    to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef INCLUDED_SimpleIni_h
+#define INCLUDED_SimpleIni_h
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// Disable these warnings in MSVC:
+//  4127 "conditional expression is constant" as the conversion classes trigger
+//  it with the statement if (sizeof(SI_CHAR) == sizeof(char)). This test will
+//  be optimized away in a release build.
+//  4503 'insert' : decorated name length exceeded, name was truncated
+//  4702 "unreachable code" as the MS STL header causes it in release mode.
+//  Again, the code causing the warning will be cleaned up by the compiler.
+//  4786 "identifier truncated to 256 characters" as this is thrown hundreds
+//  of times VC6 as soon as STL is used.
+#ifdef _MSC_VER
+# pragma warning (push)
+# pragma warning (disable: 4127 4503 4702 4786)
+#endif
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#ifdef SI_SUPPORT_IOSTREAMS
+# include 
+#endif // SI_SUPPORT_IOSTREAMS
+
+#ifdef _DEBUG
+# ifndef assert
+#  include 
+# endif
+# define SI_ASSERT(x)   assert(x)
+#else
+# define SI_ASSERT(x)
+#endif
+
+enum SI_Error {
+    SI_OK       =  0,   //!< No error
+    SI_UPDATED  =  1,   //!< An existing value was updated
+    SI_INSERTED =  2,   //!< A new value was inserted
+
+    // note: test for any error with (retval < 0)
+    SI_FAIL     = -1,   //!< Generic failure
+    SI_NOMEM    = -2,   //!< Out of memory error
+    SI_FILE     = -3    //!< File error (see errno for detail error)
+};
+
+#define SI_UTF8_SIGNATURE     "\xEF\xBB\xBF"
+
+#ifdef _WIN32
+# define SI_NEWLINE_A   "\r\n"
+# define SI_NEWLINE_W   L"\r\n"
+#else // !_WIN32
+# define SI_NEWLINE_A   "\n"
+# define SI_NEWLINE_W   L"\n"
+#endif // _WIN32
+
+#if defined(SI_CONVERT_ICU)
+# include 
+#endif
+
+#if defined(_WIN32)
+# define SI_HAS_WIDE_FILE
+# define SI_WCHAR_T     wchar_t
+#elif defined(SI_CONVERT_ICU)
+# define SI_HAS_WIDE_FILE
+# define SI_WCHAR_T     UChar
+#endif
+
+
+// ---------------------------------------------------------------------------
+//                              MAIN TEMPLATE CLASS
+// ---------------------------------------------------------------------------
+
+/** Simple INI file reader.
+
+    This can be instantiated with the choice of unicode or native characterset,
+    and case sensitive or insensitive comparisons of section and key names.
+    The supported combinations are pre-defined with the following typedefs:
+
+    
+        
Interface Case-sensitive Typedef +
char No CSimpleIniA +
char Yes CSimpleIniCaseA +
wchar_t No CSimpleIniW +
wchar_t Yes CSimpleIniCaseW +
+ + Note that using other types for the SI_CHAR is supported. For instance, + unsigned char, unsigned short, etc. Note that where the alternative type + is a different size to char/wchar_t you may need to supply new helper + classes for SI_STRLESS and SI_CONVERTER. + */ +template +class CSimpleIniTempl +{ +public: + /** key entry */ + struct Entry { + const SI_CHAR * pItem; + const SI_CHAR * pComment; + int nOrder; + + Entry(const SI_CHAR * a_pszItem = NULL, int a_nOrder = 0) + : pItem(a_pszItem) + , pComment(NULL) + , nOrder(a_nOrder) + { } + Entry(const SI_CHAR * a_pszItem, const SI_CHAR * a_pszComment, int a_nOrder) + : pItem(a_pszItem) + , pComment(a_pszComment) + , nOrder(a_nOrder) + { } + Entry(const Entry & rhs) { operator=(rhs); } + Entry & operator=(const Entry & rhs) { + pItem = rhs.pItem; + pComment = rhs.pComment; + nOrder = rhs.nOrder; + return *this; + } + +#if defined(_MSC_VER) && _MSC_VER <= 1200 + /** STL of VC6 doesn't allow me to specify my own comparator for list::sort() */ + bool operator<(const Entry & rhs) const { return LoadOrder()(*this, rhs); } + bool operator>(const Entry & rhs) const { return LoadOrder()(rhs, *this); } +#endif + + /** Strict less ordering by name of key only */ + struct KeyOrder : std::binary_function { + bool operator()(const Entry & lhs, const Entry & rhs) const { + const static SI_STRLESS isLess = SI_STRLESS(); + return isLess(lhs.pItem, rhs.pItem); + } + }; + + /** Strict less ordering by order, and then name of key */ + struct LoadOrder : std::binary_function { + bool operator()(const Entry & lhs, const Entry & rhs) const { + if (lhs.nOrder != rhs.nOrder) { + return lhs.nOrder < rhs.nOrder; + } + return KeyOrder()(lhs.pItem, rhs.pItem); + } + }; + }; + + /** map keys to values */ + typedef std::multimap TKeyVal; + + /** map sections to key/value map */ + typedef std::map TSection; + + /** set of dependent string pointers. Note that these pointers are + dependent on memory owned by CSimpleIni. + */ + typedef std::list TNamesDepend; + + /** interface definition for the OutputWriter object to pass to Save() + in order to output the INI file data. + */ + class OutputWriter { + public: + OutputWriter() { } + virtual ~OutputWriter() { } + virtual void Write(const char * a_pBuf) = 0; + private: + OutputWriter(const OutputWriter &); // disable + OutputWriter & operator=(const OutputWriter &); // disable + }; + + /** OutputWriter class to write the INI data to a file */ + class FileWriter : public OutputWriter { + FILE * m_file; + public: + FileWriter(FILE * a_file) : m_file(a_file) { } + void Write(const char * a_pBuf) { + fputs(a_pBuf, m_file); + } + private: + FileWriter(const FileWriter &); // disable + FileWriter & operator=(const FileWriter &); // disable + }; + + /** OutputWriter class to write the INI data to a string */ + class StringWriter : public OutputWriter { + std::string & m_string; + public: + StringWriter(std::string & a_string) : m_string(a_string) { } + void Write(const char * a_pBuf) { + m_string.append(a_pBuf); + } + private: + StringWriter(const StringWriter &); // disable + StringWriter & operator=(const StringWriter &); // disable + }; + +#ifdef SI_SUPPORT_IOSTREAMS + /** OutputWriter class to write the INI data to an ostream */ + class StreamWriter : public OutputWriter { + std::ostream & m_ostream; + public: + StreamWriter(std::ostream & a_ostream) : m_ostream(a_ostream) { } + void Write(const char * a_pBuf) { + m_ostream << a_pBuf; + } + private: + StreamWriter(const StreamWriter &); // disable + StreamWriter & operator=(const StreamWriter &); // disable + }; +#endif // SI_SUPPORT_IOSTREAMS + + /** Characterset conversion utility class to convert strings to the + same format as is used for the storage. + */ + class Converter : private SI_CONVERTER { + public: + Converter(bool a_bStoreIsUtf8) : SI_CONVERTER(a_bStoreIsUtf8) { + m_scratch.resize(1024); + } + Converter(const Converter & rhs) { operator=(rhs); } + Converter & operator=(const Converter & rhs) { + m_scratch = rhs.m_scratch; + return *this; + } + bool ConvertToStore(const SI_CHAR * a_pszString) { + size_t uLen = SizeToStore(a_pszString); + if (uLen == (size_t)(-1)) { + return false; + } + while (uLen > m_scratch.size()) { + m_scratch.resize(m_scratch.size() * 2); + } + return SI_CONVERTER::ConvertToStore( + a_pszString, + const_cast(m_scratch.data()), + m_scratch.size()); + } + const char * Data() { return m_scratch.data(); } + private: + std::string m_scratch; + }; + +public: + /*-----------------------------------------------------------------------*/ + + /** Default constructor. + + @param a_bIsUtf8 See the method SetUnicode() for details. + @param a_bMultiKey See the method SetMultiKey() for details. + @param a_bMultiLine See the method SetMultiLine() for details. + */ + CSimpleIniTempl( + bool a_bIsUtf8 = false, + bool a_bMultiKey = false, + bool a_bMultiLine = false + ); + + /** Destructor */ + ~CSimpleIniTempl(); + + /** Deallocate all memory stored by this object */ + void Reset(); + + /** Has any data been loaded */ + bool IsEmpty() const { return m_data.empty(); } + + /*-----------------------------------------------------------------------*/ + /** @{ @name Settings */ + + /** Set the storage format of the INI data. This affects both the loading + and saving of the INI data using all of the Load/Save API functions. + This value cannot be changed after any INI data has been loaded. + + If the file is not set to Unicode (UTF-8), then the data encoding is + assumed to be the OS native encoding. This encoding is the system + locale on Linux/Unix and the legacy MBCS encoding on Windows NT/2K/XP. + If the storage format is set to Unicode then the file will be loaded + as UTF-8 encoded data regardless of the native file encoding. If + SI_CHAR == char then all of the char* parameters take and return UTF-8 + encoded data regardless of the system locale. + + \param a_bIsUtf8 Assume UTF-8 encoding for the source? + */ + void SetUnicode(bool a_bIsUtf8 = true) { + if (!m_pData) m_bStoreIsUtf8 = a_bIsUtf8; + } + + /** Get the storage format of the INI data. */ + bool IsUnicode() const { return m_bStoreIsUtf8; } + + /** Should multiple identical keys be permitted in the file. If set to false + then the last value encountered will be used as the value of the key. + If set to true, then all values will be available to be queried. For + example, with the following input: + +
+        [section]
+        test=value1
+        test=value2
+        
+ + Then with SetMultiKey(true), both of the values "value1" and "value2" + will be returned for the key test. If SetMultiKey(false) is used, then + the value for "test" will only be "value2". This value may be changed + at any time. + + \param a_bAllowMultiKey Allow multi-keys in the source? + */ + void SetMultiKey(bool a_bAllowMultiKey = true) { + m_bAllowMultiKey = a_bAllowMultiKey; + } + + /** Get the storage format of the INI data. */ + bool IsMultiKey() const { return m_bAllowMultiKey; } + + /** Should data values be permitted to span multiple lines in the file. If + set to false then the multi-line construct << + SI_CHAR FORMAT + char same format as when loaded (MBCS or UTF-8) + wchar_t UTF-8 + other UTF-8 + + + Note that comments from the original data is preserved as per the + documentation on comments. The order of the sections and values + from the original file will be preserved. + + Any data prepended or appended to the output device must use the the + same format (MBCS or UTF-8). You may use the GetConverter() method to + convert text to the correct format regardless of the output format + being used by SimpleIni. + + To add a BOM to UTF-8 data, write it out manually at the very beginning + like is done in SaveFile when a_bUseBOM is true. + + @param a_oOutput Output writer to write the data to. + + @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in + UTF-8 format. If it is not UTF-8 then this value is + ignored. Do not set this to true if anything has + already been written to the OutputWriter. + + @return SI_Error See error definitions + */ + SI_Error Save( + OutputWriter & a_oOutput, + bool a_bAddSignature = false + ) const; + +#ifdef SI_SUPPORT_IOSTREAMS + /** Save the INI data to an ostream. See Save() for details. + + @param a_ostream String to have the INI data appended to. + + @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in + UTF-8 format. If it is not UTF-8 then this value is + ignored. Do not set this to true if anything has + already been written to the stream. + + @return SI_Error See error definitions + */ + SI_Error Save( + std::ostream & a_ostream, + bool a_bAddSignature = false + ) const + { + StreamWriter writer(a_ostream); + return Save(writer, a_bAddSignature); + } +#endif // SI_SUPPORT_IOSTREAMS + + /** Append the INI data to a string. See Save() for details. + + @param a_sBuffer String to have the INI data appended to. + + @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in + UTF-8 format. If it is not UTF-8 then this value is + ignored. Do not set this to true if anything has + already been written to the string. + + @return SI_Error See error definitions + */ + SI_Error Save( + std::string & a_sBuffer, + bool a_bAddSignature = false + ) const + { + StringWriter writer(a_sBuffer); + return Save(writer, a_bAddSignature); + } + + /*-----------------------------------------------------------------------*/ + /** @} + @{ @name Accessing INI Data */ + + /** Retrieve all section names. The list is returned as an STL vector of + names and can be iterated or searched as necessary. Note that the + sort order of the returned strings is NOT DEFINED. You can sort + the names into the load order if desired. Search this file for ".sort" + for an example. + + NOTE! This structure contains only pointers to strings. The actual + string data is stored in memory owned by CSimpleIni. Ensure that the + CSimpleIni object is not destroyed or Reset() while these pointers + are in use! + + @param a_names Vector that will receive all of the section + names. See note above! + */ + void GetAllSections( + TNamesDepend & a_names + ) const; + + /** Retrieve all unique key names in a section. The sort order of the + returned strings is NOT DEFINED. You can sort the names into the load + order if desired. Search this file for ".sort" for an example. Only + unique key names are returned. + + NOTE! This structure contains only pointers to strings. The actual + string data is stored in memory owned by CSimpleIni. Ensure that the + CSimpleIni object is not destroyed or Reset() while these strings + are in use! + + @param a_pSection Section to request data for + @param a_names List that will receive all of the key + names. See note above! + + @return true Section was found. + @return false Matching section was not found. + */ + bool GetAllKeys( + const SI_CHAR * a_pSection, + TNamesDepend & a_names + ) const; + + /** Retrieve all values for a specific key. This method can be used when + multiple keys are both enabled and disabled. Note that the sort order + of the returned strings is NOT DEFINED. You can sort the names into + the load order if desired. Search this file for ".sort" for an example. + + NOTE! The returned values are pointers to string data stored in memory + owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed + or Reset while you are using this pointer! + + @param a_pSection Section to search + @param a_pKey Key to search for + @param a_values List to return if the key is not found + + @return true Key was found. + @return false Matching section/key was not found. + */ + bool GetAllValues( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + TNamesDepend & a_values + ) const; + + /** Query the number of keys in a specific section. Note that if multiple + keys are enabled, then this value may be different to the number of + keys returned by GetAllKeys. + + @param a_pSection Section to request data for + + @return -1 Section does not exist in the file + @return >=0 Number of keys in the section + */ + int GetSectionSize( + const SI_CHAR * a_pSection + ) const; + + /** Retrieve all key and value pairs for a section. The data is returned + as a pointer to an STL map and can be iterated or searched as + desired. Note that multiple entries for the same key may exist when + multiple keys have been enabled. + + NOTE! This structure contains only pointers to strings. The actual + string data is stored in memory owned by CSimpleIni. Ensure that the + CSimpleIni object is not destroyed or Reset() while these strings + are in use! + + @param a_pSection Name of the section to return + @return boolean Was a section matching the supplied + name found. + */ + const TKeyVal * GetSection( + const SI_CHAR * a_pSection + ) const; + + /** Retrieve the value for a specific key. If multiple keys are enabled + (see SetMultiKey) then only the first value associated with that key + will be returned, see GetAllValues for getting all values with multikey. + + NOTE! The returned value is a pointer to string data stored in memory + owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed + or Reset while you are using this pointer! + + @param a_pSection Section to search + @param a_pKey Key to search for + @param a_pDefault Value to return if the key is not found + @param a_pHasMultiple Optionally receive notification of if there are + multiple entries for this key. + + @return a_pDefault Key was not found in the section + @return other Value of the key + */ + const SI_CHAR * GetValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + const SI_CHAR * a_pDefault = NULL, + bool * a_pHasMultiple = NULL + ) const; + + /** Retrieve a numeric value for a specific key. If multiple keys are enabled + (see SetMultiKey) then only the first value associated with that key + will be returned, see GetAllValues for getting all values with multikey. + + @param a_pSection Section to search + @param a_pKey Key to search for + @param a_nDefault Value to return if the key is not found + @param a_pHasMultiple Optionally receive notification of if there are + multiple entries for this key. + + @return a_nDefault Key was not found in the section + @return other Value of the key + */ + long GetLongValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + long a_nDefault = 0, + bool * a_pHasMultiple = NULL + ) const; + + /** Retrieve a numeric value for a specific key. If multiple keys are enabled + (see SetMultiKey) then only the first value associated with that key + will be returned, see GetAllValues for getting all values with multikey. + + @param a_pSection Section to search + @param a_pKey Key to search for + @param a_nDefault Value to return if the key is not found + @param a_pHasMultiple Optionally receive notification of if there are + multiple entries for this key. + + @return a_nDefault Key was not found in the section + @return other Value of the key + */ + double GetDoubleValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + double a_nDefault = 0, + bool * a_pHasMultiple = NULL + ) const; + + /** Retrieve a boolean value for a specific key. If multiple keys are enabled + (see SetMultiKey) then only the first value associated with that key + will be returned, see GetAllValues for getting all values with multikey. + + Strings starting with "t", "y", "on" or "1" are returned as logically true. + Strings starting with "f", "n", "of" or "0" are returned as logically false. + For all other values the default is returned. Character comparisons are + case-insensitive. + + @param a_pSection Section to search + @param a_pKey Key to search for + @param a_bDefault Value to return if the key is not found + @param a_pHasMultiple Optionally receive notification of if there are + multiple entries for this key. + + @return a_nDefault Key was not found in the section + @return other Value of the key + */ + bool GetBoolValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bDefault = false, + bool * a_pHasMultiple = NULL + ) const; + + /** Add or update a section or value. This will always insert + when multiple keys are enabled. + + @param a_pSection Section to add or update + @param a_pKey Key to add or update. Set to NULL to + create an empty section. + @param a_pValue Value to set. Set to NULL to create an + empty section. + @param a_pComment Comment to be associated with the section or the + key. If a_pKey is NULL then it will be associated + with the section, otherwise the key. Note that a + comment may be set ONLY when the section or key is + first created (i.e. when this function returns the + value SI_INSERTED). If you wish to create a section + with a comment then you need to create the section + separately to the key. The comment string must be + in full comment form already (have a comment + character starting every line). + @param a_bForceReplace Should all existing values in a multi-key INI + file be replaced with this entry. This option has + no effect if not using multi-key files. The + difference between Delete/SetValue and SetValue + with a_bForceReplace = true, is that the load + order and comment will be preserved this way. + + @return SI_Error See error definitions + @return SI_UPDATED Value was updated + @return SI_INSERTED Value was inserted + */ + SI_Error SetValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + const SI_CHAR * a_pValue, + const SI_CHAR * a_pComment = NULL, + bool a_bForceReplace = false + ) + { + return AddEntry(a_pSection, a_pKey, a_pValue, a_pComment, a_bForceReplace, true); + } + + /** Add or update a numeric value. This will always insert + when multiple keys are enabled. + + @param a_pSection Section to add or update + @param a_pKey Key to add or update. + @param a_nValue Value to set. + @param a_pComment Comment to be associated with the key. See the + notes on SetValue() for comments. + @param a_bUseHex By default the value will be written to the file + in decimal format. Set this to true to write it + as hexadecimal. + @param a_bForceReplace Should all existing values in a multi-key INI + file be replaced with this entry. This option has + no effect if not using multi-key files. The + difference between Delete/SetLongValue and + SetLongValue with a_bForceReplace = true, is that + the load order and comment will be preserved this + way. + + @return SI_Error See error definitions + @return SI_UPDATED Value was updated + @return SI_INSERTED Value was inserted + */ + SI_Error SetLongValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + long a_nValue, + const SI_CHAR * a_pComment = NULL, + bool a_bUseHex = false, + bool a_bForceReplace = false + ); + + /** Add or update a double value. This will always insert + when multiple keys are enabled. + + @param a_pSection Section to add or update + @param a_pKey Key to add or update. + @param a_nValue Value to set. + @param a_pComment Comment to be associated with the key. See the + notes on SetValue() for comments. + @param a_bForceReplace Should all existing values in a multi-key INI + file be replaced with this entry. This option has + no effect if not using multi-key files. The + difference between Delete/SetDoubleValue and + SetDoubleValue with a_bForceReplace = true, is that + the load order and comment will be preserved this + way. + + @return SI_Error See error definitions + @return SI_UPDATED Value was updated + @return SI_INSERTED Value was inserted + */ + SI_Error SetDoubleValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + double a_nValue, + const SI_CHAR * a_pComment = NULL, + bool a_bForceReplace = false + ); + + /** Add or update a boolean value. This will always insert + when multiple keys are enabled. + + @param a_pSection Section to add or update + @param a_pKey Key to add or update. + @param a_bValue Value to set. + @param a_pComment Comment to be associated with the key. See the + notes on SetValue() for comments. + @param a_bForceReplace Should all existing values in a multi-key INI + file be replaced with this entry. This option has + no effect if not using multi-key files. The + difference between Delete/SetBoolValue and + SetBoolValue with a_bForceReplace = true, is that + the load order and comment will be preserved this + way. + + @return SI_Error See error definitions + @return SI_UPDATED Value was updated + @return SI_INSERTED Value was inserted + */ + SI_Error SetBoolValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bValue, + const SI_CHAR * a_pComment = NULL, + bool a_bForceReplace = false + ); + + /** Delete an entire section, or a key from a section. Note that the + data returned by GetSection is invalid and must not be used after + anything has been deleted from that section using this method. + Note when multiple keys is enabled, this will delete all keys with + that name; there is no way to selectively delete individual key/values + in this situation. + + @param a_pSection Section to delete key from, or if + a_pKey is NULL, the section to remove. + @param a_pKey Key to remove from the section. Set to + NULL to remove the entire section. + @param a_bRemoveEmpty If the section is empty after this key has + been deleted, should the empty section be + removed? + + @return true Key or section was deleted. + @return false Key or section was not found. + */ + bool Delete( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bRemoveEmpty = false + ); + + /*-----------------------------------------------------------------------*/ + /** @} + @{ @name Converter */ + + /** Return a conversion object to convert text to the same encoding + as is used by the Save(), SaveFile() and SaveString() functions. + Use this to prepare the strings that you wish to append or prepend + to the output INI data. + */ + Converter GetConverter() const { + return Converter(m_bStoreIsUtf8); + } + + /*-----------------------------------------------------------------------*/ + /** @} */ + +private: + // copying is not permitted + CSimpleIniTempl(const CSimpleIniTempl &); // disabled + CSimpleIniTempl & operator=(const CSimpleIniTempl &); // disabled + + /** Parse the data looking for a file comment and store it if found. + */ + SI_Error FindFileComment( + SI_CHAR *& a_pData, + bool a_bCopyStrings + ); + + /** Parse the data looking for the next valid entry. The memory pointed to + by a_pData is modified by inserting NULL characters. The pointer is + updated to the current location in the block of text. + */ + bool FindEntry( + SI_CHAR *& a_pData, + const SI_CHAR *& a_pSection, + const SI_CHAR *& a_pKey, + const SI_CHAR *& a_pVal, + const SI_CHAR *& a_pComment + ) const; + + /** Add the section/key/value to our data. + + @param a_pSection Section name. Sections will be created if they + don't already exist. + @param a_pKey Key name. May be NULL to create an empty section. + Existing entries will be updated. New entries will + be created. + @param a_pValue Value for the key. + @param a_pComment Comment to be associated with the section or the + key. If a_pKey is NULL then it will be associated + with the section, otherwise the key. This must be + a string in full comment form already (have a + comment character starting every line). + @param a_bForceReplace Should all existing values in a multi-key INI + file be replaced with this entry. This option has + no effect if not using multi-key files. The + difference between Delete/AddEntry and AddEntry + with a_bForceReplace = true, is that the load + order and comment will be preserved this way. + @param a_bCopyStrings Should copies of the strings be made or not. + If false then the pointers will be used as is. + */ + SI_Error AddEntry( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + const SI_CHAR * a_pValue, + const SI_CHAR * a_pComment, + bool a_bForceReplace, + bool a_bCopyStrings + ); + + /** Is the supplied character a whitespace character? */ + inline bool IsSpace(SI_CHAR ch) const { + return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'); + } + + /** Does the supplied character start a comment line? */ + inline bool IsComment(SI_CHAR ch) const { + return (ch == ';' || ch == '#'); + } + + + /** Skip over a newline character (or characters) for either DOS or UNIX */ + inline void SkipNewLine(SI_CHAR *& a_pData) const { + a_pData += (*a_pData == '\r' && *(a_pData+1) == '\n') ? 2 : 1; + } + + /** Make a copy of the supplied string, replacing the original pointer */ + SI_Error CopyString(const SI_CHAR *& a_pString); + + /** Delete a string from the copied strings buffer if necessary */ + void DeleteString(const SI_CHAR * a_pString); + + /** Internal use of our string comparison function */ + bool IsLess(const SI_CHAR * a_pLeft, const SI_CHAR * a_pRight) const { + const static SI_STRLESS isLess = SI_STRLESS(); + return isLess(a_pLeft, a_pRight); + } + + bool IsMultiLineTag(const SI_CHAR * a_pData) const; + bool IsMultiLineData(const SI_CHAR * a_pData) const; + bool LoadMultiLineText( + SI_CHAR *& a_pData, + const SI_CHAR *& a_pVal, + const SI_CHAR * a_pTagName, + bool a_bAllowBlankLinesInComment = false + ) const; + bool IsNewLineChar(SI_CHAR a_c) const; + + bool OutputMultiLineText( + OutputWriter & a_oOutput, + Converter & a_oConverter, + const SI_CHAR * a_pText + ) const; + +private: + /** Copy of the INI file data in our character format. This will be + modified when parsed to have NULL characters added after all + interesting string entries. All of the string pointers to sections, + keys and values point into this block of memory. + */ + SI_CHAR * m_pData; + + /** Length of the data that we have stored. Used when deleting strings + to determine if the string is stored here or in the allocated string + buffer. + */ + size_t m_uDataLen; + + /** File comment for this data, if one exists. */ + const SI_CHAR * m_pFileComment; + + /** Parsed INI data. Section -> (Key -> Value). */ + TSection m_data; + + /** This vector stores allocated memory for copies of strings that have + been supplied after the file load. It will be empty unless SetValue() + has been called. + */ + TNamesDepend m_strings; + + /** Is the format of our datafile UTF-8 or MBCS? */ + bool m_bStoreIsUtf8; + + /** Are multiple values permitted for the same key? */ + bool m_bAllowMultiKey; + + /** Are data values permitted to span multiple lines? */ + bool m_bAllowMultiLine; + + /** Should spaces be written out surrounding the equals sign? */ + bool m_bSpaces; + + /** Next order value, used to ensure sections and keys are output in the + same order that they are loaded/added. + */ + int m_nOrder; +}; + +// --------------------------------------------------------------------------- +// IMPLEMENTATION +// --------------------------------------------------------------------------- + +template +CSimpleIniTempl::CSimpleIniTempl( + bool a_bIsUtf8, + bool a_bAllowMultiKey, + bool a_bAllowMultiLine + ) + : m_pData(0) + , m_uDataLen(0) + , m_pFileComment(NULL) + , m_bStoreIsUtf8(a_bIsUtf8) + , m_bAllowMultiKey(a_bAllowMultiKey) + , m_bAllowMultiLine(a_bAllowMultiLine) + , m_bSpaces(true) + , m_nOrder(0) +{ } + +template +CSimpleIniTempl::~CSimpleIniTempl() +{ + Reset(); +} + +template +void +CSimpleIniTempl::Reset() +{ + // remove all data + delete[] m_pData; + m_pData = NULL; + m_uDataLen = 0; + m_pFileComment = NULL; + if (!m_data.empty()) { + m_data.erase(m_data.begin(), m_data.end()); + } + + // remove all strings + if (!m_strings.empty()) { + typename TNamesDepend::iterator i = m_strings.begin(); + for (; i != m_strings.end(); ++i) { + delete[] const_cast(i->pItem); + } + m_strings.erase(m_strings.begin(), m_strings.end()); + } +} + +template +SI_Error +CSimpleIniTempl::LoadFile( + const char * a_pszFile + ) +{ + FILE * fp = NULL; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + fopen_s(&fp, a_pszFile, "rb"); +#else // !__STDC_WANT_SECURE_LIB__ + fp = fopen(a_pszFile, "rb"); +#endif // __STDC_WANT_SECURE_LIB__ + if (!fp) { + return SI_FILE; + } + SI_Error rc = LoadFile(fp); + fclose(fp); + return rc; +} + +#ifdef SI_HAS_WIDE_FILE +template +SI_Error +CSimpleIniTempl::LoadFile( + const SI_WCHAR_T * a_pwszFile + ) +{ +#ifdef _WIN32 + FILE * fp = NULL; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + _wfopen_s(&fp, a_pwszFile, L"rb"); +#else // !__STDC_WANT_SECURE_LIB__ + fp = _wfopen(a_pwszFile, L"rb"); +#endif // __STDC_WANT_SECURE_LIB__ + if (!fp) return SI_FILE; + SI_Error rc = LoadFile(fp); + fclose(fp); + return rc; +#else // !_WIN32 (therefore SI_CONVERT_ICU) + char szFile[256]; + u_austrncpy(szFile, a_pwszFile, sizeof(szFile)); + return LoadFile(szFile); +#endif // _WIN32 +} +#endif // SI_HAS_WIDE_FILE + +template +SI_Error +CSimpleIniTempl::LoadFile( + FILE * a_fpFile + ) +{ + // load the raw file data + int retval = fseek(a_fpFile, 0, SEEK_END); + if (retval != 0) { + return SI_FILE; + } + long lSize = ftell(a_fpFile); + if (lSize < 0) { + return SI_FILE; + } + if (lSize == 0) { + return SI_OK; + } + char * pData = new char[lSize]; + if (!pData) { + return SI_NOMEM; + } + fseek(a_fpFile, 0, SEEK_SET); + size_t uRead = fread(pData, sizeof(char), lSize, a_fpFile); + if (uRead != (size_t) lSize) { + delete[] pData; + return SI_FILE; + } + + // convert the raw data to unicode + SI_Error rc = LoadData(pData, uRead); + delete[] pData; + return rc; +} + +template +SI_Error +CSimpleIniTempl::LoadData( + const char * a_pData, + size_t a_uDataLen + ) +{ + SI_CONVERTER converter(m_bStoreIsUtf8); + + if (a_uDataLen == 0) { + return SI_OK; + } + + // consume the UTF-8 BOM if it exists + if (m_bStoreIsUtf8 && a_uDataLen >= 3) { + if (memcmp(a_pData, SI_UTF8_SIGNATURE, 3) == 0) { + a_pData += 3; + a_uDataLen -= 3; + } + } + + // determine the length of the converted data + size_t uLen = converter.SizeFromStore(a_pData, a_uDataLen); + if (uLen == (size_t)(-1)) { + return SI_FAIL; + } + + // allocate memory for the data, ensure that there is a NULL + // terminator wherever the converted data ends + SI_CHAR * pData = new SI_CHAR[uLen+1]; + if (!pData) { + return SI_NOMEM; + } + memset(pData, 0, sizeof(SI_CHAR)*(uLen+1)); + + // convert the data + if (!converter.ConvertFromStore(a_pData, a_uDataLen, pData, uLen)) { + delete[] pData; + return SI_FAIL; + } + + // parse it + const static SI_CHAR empty = 0; + SI_CHAR * pWork = pData; + const SI_CHAR * pSection = ∅ + const SI_CHAR * pItem = NULL; + const SI_CHAR * pVal = NULL; + const SI_CHAR * pComment = NULL; + + // We copy the strings if we are loading data into this class when we + // already have stored some. + bool bCopyStrings = (m_pData != NULL); + + // find a file comment if it exists, this is a comment that starts at the + // beginning of the file and continues until the first blank line. + SI_Error rc = FindFileComment(pWork, bCopyStrings); + if (rc < 0) return rc; + + // add every entry in the file to the data table + while (FindEntry(pWork, pSection, pItem, pVal, pComment)) { + rc = AddEntry(pSection, pItem, pVal, pComment, false, bCopyStrings); + if (rc < 0) return rc; + } + + // store these strings if we didn't copy them + if (bCopyStrings) { + delete[] pData; + } + else { + m_pData = pData; + m_uDataLen = uLen+1; + } + + return SI_OK; +} + +#ifdef SI_SUPPORT_IOSTREAMS +template +SI_Error +CSimpleIniTempl::LoadData( + std::istream & a_istream + ) +{ + std::string strData; + char szBuf[512]; + do { + a_istream.get(szBuf, sizeof(szBuf), '\0'); + strData.append(szBuf); + } + while (a_istream.good()); + return LoadData(strData); +} +#endif // SI_SUPPORT_IOSTREAMS + +template +SI_Error +CSimpleIniTempl::FindFileComment( + SI_CHAR *& a_pData, + bool a_bCopyStrings + ) +{ + // there can only be a single file comment + if (m_pFileComment) { + return SI_OK; + } + + // Load the file comment as multi-line text, this will modify all of + // the newline characters to be single \n chars + if (!LoadMultiLineText(a_pData, m_pFileComment, NULL, false)) { + return SI_OK; + } + + // copy the string if necessary + if (a_bCopyStrings) { + SI_Error rc = CopyString(m_pFileComment); + if (rc < 0) return rc; + } + + return SI_OK; +} + +template +bool +CSimpleIniTempl::FindEntry( + SI_CHAR *& a_pData, + const SI_CHAR *& a_pSection, + const SI_CHAR *& a_pKey, + const SI_CHAR *& a_pVal, + const SI_CHAR *& a_pComment + ) const +{ + a_pComment = NULL; + + SI_CHAR * pTrail = NULL; + while (*a_pData) { + // skip spaces and empty lines + while (*a_pData && IsSpace(*a_pData)) { + ++a_pData; + } + if (!*a_pData) { + break; + } + + // skip processing of comment lines but keep a pointer to + // the start of the comment. + if (IsComment(*a_pData)) { + LoadMultiLineText(a_pData, a_pComment, NULL, true); + continue; + } + + // process section names + if (*a_pData == '[') { + // skip leading spaces + ++a_pData; + while (*a_pData && IsSpace(*a_pData)) { + ++a_pData; + } + + // find the end of the section name (it may contain spaces) + // and convert it to lowercase as necessary + a_pSection = a_pData; + while (*a_pData && *a_pData != ']' && !IsNewLineChar(*a_pData)) { + ++a_pData; + } + + // if it's an invalid line, just skip it + if (*a_pData != ']') { + continue; + } + + // remove trailing spaces from the section + pTrail = a_pData - 1; + while (pTrail >= a_pSection && IsSpace(*pTrail)) { + --pTrail; + } + ++pTrail; + *pTrail = 0; + + // skip to the end of the line + ++a_pData; // safe as checked that it == ']' above + while (*a_pData && !IsNewLineChar(*a_pData)) { + ++a_pData; + } + + a_pKey = NULL; + a_pVal = NULL; + return true; + } + + // find the end of the key name (it may contain spaces) + // and convert it to lowercase as necessary + a_pKey = a_pData; + while (*a_pData && *a_pData != '=' && !IsNewLineChar(*a_pData)) { + ++a_pData; + } + + // if it's an invalid line, just skip it + if (*a_pData != '=') { + continue; + } + + // empty keys are invalid + if (a_pKey == a_pData) { + while (*a_pData && !IsNewLineChar(*a_pData)) { + ++a_pData; + } + continue; + } + + // remove trailing spaces from the key + pTrail = a_pData - 1; + while (pTrail >= a_pKey && IsSpace(*pTrail)) { + --pTrail; + } + ++pTrail; + *pTrail = 0; + + // skip leading whitespace on the value + ++a_pData; // safe as checked that it == '=' above + while (*a_pData && !IsNewLineChar(*a_pData) && IsSpace(*a_pData)) { + ++a_pData; + } + + // find the end of the value which is the end of this line + a_pVal = a_pData; + while (*a_pData && !IsNewLineChar(*a_pData)) { + ++a_pData; + } + + // remove trailing spaces from the value + pTrail = a_pData - 1; + if (*a_pData) { // prepare for the next round + SkipNewLine(a_pData); + } + while (pTrail >= a_pVal && IsSpace(*pTrail)) { + --pTrail; + } + ++pTrail; + *pTrail = 0; + + // check for multi-line entries + if (m_bAllowMultiLine && IsMultiLineTag(a_pVal)) { + // skip the "<<<" to get the tag that will end the multiline + const SI_CHAR * pTagName = a_pVal + 3; + return LoadMultiLineText(a_pData, a_pVal, pTagName); + } + + // return the standard entry + return true; + } + + return false; +} + +template +bool +CSimpleIniTempl::IsMultiLineTag( + const SI_CHAR * a_pVal + ) const +{ + // check for the "<<<" prefix for a multi-line entry + if (*a_pVal++ != '<') return false; + if (*a_pVal++ != '<') return false; + if (*a_pVal++ != '<') return false; + return true; +} + +template +bool +CSimpleIniTempl::IsMultiLineData( + const SI_CHAR * a_pData + ) const +{ + // data is multi-line if it has any of the following features: + // * whitespace prefix + // * embedded newlines + // * whitespace suffix + + // empty string + if (!*a_pData) { + return false; + } + + // check for prefix + if (IsSpace(*a_pData)) { + return true; + } + + // embedded newlines + while (*a_pData) { + if (IsNewLineChar(*a_pData)) { + return true; + } + ++a_pData; + } + + // check for suffix + if (IsSpace(*--a_pData)) { + return true; + } + + return false; +} + +template +bool +CSimpleIniTempl::IsNewLineChar( + SI_CHAR a_c + ) const +{ + return (a_c == '\n' || a_c == '\r'); +} + +template +bool +CSimpleIniTempl::LoadMultiLineText( + SI_CHAR *& a_pData, + const SI_CHAR *& a_pVal, + const SI_CHAR * a_pTagName, + bool a_bAllowBlankLinesInComment + ) const +{ + // we modify this data to strip all newlines down to a single '\n' + // character. This means that on Windows we need to strip out some + // characters which will make the data shorter. + // i.e. LINE1-LINE1\r\nLINE2-LINE2\0 will become + // LINE1-LINE1\nLINE2-LINE2\0 + // The pDataLine entry is the pointer to the location in memory that + // the current line needs to start to run following the existing one. + // This may be the same as pCurrLine in which case no move is needed. + SI_CHAR * pDataLine = a_pData; + SI_CHAR * pCurrLine; + + // value starts at the current line + a_pVal = a_pData; + + // find the end tag. This tag must start in column 1 and be + // followed by a newline. No whitespace removal is done while + // searching for this tag. + SI_CHAR cEndOfLineChar = *a_pData; + for(;;) { + // if we are loading comments then we need a comment character as + // the first character on every line + if (!a_pTagName && !IsComment(*a_pData)) { + // if we aren't allowing blank lines then we're done + if (!a_bAllowBlankLinesInComment) { + break; + } + + // if we are allowing blank lines then we only include them + // in this comment if another comment follows, so read ahead + // to find out. + SI_CHAR * pCurr = a_pData; + int nNewLines = 0; + while (IsSpace(*pCurr)) { + if (IsNewLineChar(*pCurr)) { + ++nNewLines; + SkipNewLine(pCurr); + } + else { + ++pCurr; + } + } + + // we have a comment, add the blank lines to the output + // and continue processing from here + if (IsComment(*pCurr)) { + for (; nNewLines > 0; --nNewLines) *pDataLine++ = '\n'; + a_pData = pCurr; + continue; + } + + // the comment ends here + break; + } + + // find the end of this line + pCurrLine = a_pData; + while (*a_pData && !IsNewLineChar(*a_pData)) ++a_pData; + + // move this line down to the location that it should be if necessary + if (pDataLine < pCurrLine) { + size_t nLen = (size_t) (a_pData - pCurrLine); + memmove(pDataLine, pCurrLine, nLen * sizeof(SI_CHAR)); + pDataLine[nLen] = '\0'; + } + + // end the line with a NULL + cEndOfLineChar = *a_pData; + *a_pData = 0; + + // if are looking for a tag then do the check now. This is done before + // checking for end of the data, so that if we have the tag at the end + // of the data then the tag is removed correctly. + if (a_pTagName && + (!IsLess(pDataLine, a_pTagName) && !IsLess(a_pTagName, pDataLine))) + { + break; + } + + // if we are at the end of the data then we just automatically end + // this entry and return the current data. + if (!cEndOfLineChar) { + return true; + } + + // otherwise we need to process this newline to ensure that it consists + // of just a single \n character. + pDataLine += (a_pData - pCurrLine); + *a_pData = cEndOfLineChar; + SkipNewLine(a_pData); + *pDataLine++ = '\n'; + } + + // if we didn't find a comment at all then return false + if (a_pVal == a_pData) { + a_pVal = NULL; + return false; + } + + // the data (which ends at the end of the last line) needs to be + // null-terminated BEFORE before the newline character(s). If the + // user wants a new line in the multi-line data then they need to + // add an empty line before the tag. + *--pDataLine = '\0'; + + // if looking for a tag and if we aren't at the end of the data, + // then move a_pData to the start of the next line. + if (a_pTagName && cEndOfLineChar) { + SI_ASSERT(IsNewLineChar(cEndOfLineChar)); + *a_pData = cEndOfLineChar; + SkipNewLine(a_pData); + } + + return true; +} + +template +SI_Error +CSimpleIniTempl::CopyString( + const SI_CHAR *& a_pString + ) +{ + size_t uLen = 0; + if (sizeof(SI_CHAR) == sizeof(char)) { + uLen = strlen((const char *)a_pString); + } + else if (sizeof(SI_CHAR) == sizeof(wchar_t)) { + uLen = wcslen((const wchar_t *)a_pString); + } + else { + for ( ; a_pString[uLen]; ++uLen) /*loop*/ ; + } + ++uLen; // NULL character + SI_CHAR * pCopy = new SI_CHAR[uLen]; + if (!pCopy) { + return SI_NOMEM; + } + memcpy(pCopy, a_pString, sizeof(SI_CHAR)*uLen); + m_strings.push_back(pCopy); + a_pString = pCopy; + return SI_OK; +} + +template +SI_Error +CSimpleIniTempl::AddEntry( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + const SI_CHAR * a_pValue, + const SI_CHAR * a_pComment, + bool a_bForceReplace, + bool a_bCopyStrings + ) +{ + SI_Error rc; + bool bInserted = false; + + SI_ASSERT(!a_pComment || IsComment(*a_pComment)); + + // if we are copying strings then make a copy of the comment now + // because we will need it when we add the entry. + if (a_bCopyStrings && a_pComment) { + rc = CopyString(a_pComment); + if (rc < 0) return rc; + } + + // create the section entry if necessary + typename TSection::iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + // if the section doesn't exist then we need a copy as the + // string needs to last beyond the end of this function + if (a_bCopyStrings) { + rc = CopyString(a_pSection); + if (rc < 0) return rc; + } + + // only set the comment if this is a section only entry + Entry oSection(a_pSection, ++m_nOrder); + if (a_pComment && (!a_pKey || !a_pValue)) { + oSection.pComment = a_pComment; + } + + typename TSection::value_type oEntry(oSection, TKeyVal()); + typedef typename TSection::iterator SectionIterator; + std::pair i = m_data.insert(oEntry); + iSection = i.first; + bInserted = true; + } + if (!a_pKey || !a_pValue) { + // section only entries are specified with pItem and pVal as NULL + return bInserted ? SI_INSERTED : SI_UPDATED; + } + + // check for existence of the key + TKeyVal & keyval = iSection->second; + typename TKeyVal::iterator iKey = keyval.find(a_pKey); + + // remove all existing entries but save the load order and + // comment of the first entry + int nLoadOrder = ++m_nOrder; + if (iKey != keyval.end() && m_bAllowMultiKey && a_bForceReplace) { + const SI_CHAR * pComment = NULL; + while (iKey != keyval.end() && !IsLess(a_pKey, iKey->first.pItem)) { + if (iKey->first.nOrder < nLoadOrder) { + nLoadOrder = iKey->first.nOrder; + pComment = iKey->first.pComment; + } + ++iKey; + } + if (pComment) { + DeleteString(a_pComment); + a_pComment = pComment; + CopyString(a_pComment); + } + Delete(a_pSection, a_pKey); + iKey = keyval.end(); + } + + // make string copies if necessary + bool bForceCreateNewKey = m_bAllowMultiKey && !a_bForceReplace; + if (a_bCopyStrings) { + if (bForceCreateNewKey || iKey == keyval.end()) { + // if the key doesn't exist then we need a copy as the + // string needs to last beyond the end of this function + // because we will be inserting the key next + rc = CopyString(a_pKey); + if (rc < 0) return rc; + } + + // we always need a copy of the value + rc = CopyString(a_pValue); + if (rc < 0) return rc; + } + + // create the key entry + if (iKey == keyval.end() || bForceCreateNewKey) { + Entry oKey(a_pKey, nLoadOrder); + if (a_pComment) { + oKey.pComment = a_pComment; + } + typename TKeyVal::value_type oEntry(oKey, static_cast(NULL)); + iKey = keyval.insert(oEntry); + bInserted = true; + } + iKey->second = a_pValue; + return bInserted ? SI_INSERTED : SI_UPDATED; +} + +template +const SI_CHAR * +CSimpleIniTempl::GetValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + const SI_CHAR * a_pDefault, + bool * a_pHasMultiple + ) const +{ + if (a_pHasMultiple) { + *a_pHasMultiple = false; + } + if (!a_pSection || !a_pKey) { + return a_pDefault; + } + typename TSection::const_iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + return a_pDefault; + } + typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey); + if (iKeyVal == iSection->second.end()) { + return a_pDefault; + } + + // check for multiple entries with the same key + if (m_bAllowMultiKey && a_pHasMultiple) { + typename TKeyVal::const_iterator iTemp = iKeyVal; + if (++iTemp != iSection->second.end()) { + if (!IsLess(a_pKey, iTemp->first.pItem)) { + *a_pHasMultiple = true; + } + } + } + + return iKeyVal->second; +} + +template +long +CSimpleIniTempl::GetLongValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + long a_nDefault, + bool * a_pHasMultiple + ) const +{ + // return the default if we don't have a value + const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple); + if (!pszValue || !*pszValue) return a_nDefault; + + // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII + char szValue[64] = { 0 }; + SI_CONVERTER c(m_bStoreIsUtf8); + if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) { + return a_nDefault; + } + + // handle the value as hex if prefaced with "0x" + long nValue = a_nDefault; + char * pszSuffix = szValue; + if (szValue[0] == '0' && (szValue[1] == 'x' || szValue[1] == 'X')) { + if (!szValue[2]) return a_nDefault; + nValue = strtol(&szValue[2], &pszSuffix, 16); + } + else { + nValue = strtol(szValue, &pszSuffix, 10); + } + + // any invalid strings will return the default value + if (*pszSuffix) { + return a_nDefault; + } + + return nValue; +} + +template +SI_Error +CSimpleIniTempl::SetLongValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + long a_nValue, + const SI_CHAR * a_pComment, + bool a_bUseHex, + bool a_bForceReplace + ) +{ + // use SetValue to create sections + if (!a_pSection || !a_pKey) return SI_FAIL; + + // convert to an ASCII string + char szInput[64]; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + sprintf_s(szInput, a_bUseHex ? "0x%lx" : "%ld", a_nValue); +#else // !__STDC_WANT_SECURE_LIB__ + sprintf(szInput, a_bUseHex ? "0x%lx" : "%ld", a_nValue); +#endif // __STDC_WANT_SECURE_LIB__ + + // convert to output text + SI_CHAR szOutput[64]; + SI_CONVERTER c(m_bStoreIsUtf8); + c.ConvertFromStore(szInput, strlen(szInput) + 1, + szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); + + // actually add it + return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); +} + +template +double +CSimpleIniTempl::GetDoubleValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + double a_nDefault, + bool * a_pHasMultiple + ) const +{ + // return the default if we don't have a value + const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple); + if (!pszValue || !*pszValue) return a_nDefault; + + // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII + char szValue[64] = { 0 }; + SI_CONVERTER c(m_bStoreIsUtf8); + if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) { + return a_nDefault; + } + + char * pszSuffix = NULL; + double nValue = strtod(szValue, &pszSuffix); + + // any invalid strings will return the default value + if (!pszSuffix || *pszSuffix) { + return a_nDefault; + } + + return nValue; +} + +template +SI_Error +CSimpleIniTempl::SetDoubleValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + double a_nValue, + const SI_CHAR * a_pComment, + bool a_bForceReplace + ) +{ + // use SetValue to create sections + if (!a_pSection || !a_pKey) return SI_FAIL; + + // convert to an ASCII string + char szInput[64]; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + sprintf_s(szInput, "%f", a_nValue); +#else // !__STDC_WANT_SECURE_LIB__ + sprintf(szInput, "%f", a_nValue); +#endif // __STDC_WANT_SECURE_LIB__ + + // convert to output text + SI_CHAR szOutput[64]; + SI_CONVERTER c(m_bStoreIsUtf8); + c.ConvertFromStore(szInput, strlen(szInput) + 1, + szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); + + // actually add it + return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); +} + +template +bool +CSimpleIniTempl::GetBoolValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bDefault, + bool * a_pHasMultiple + ) const +{ + // return the default if we don't have a value + const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, NULL, a_pHasMultiple); + if (!pszValue || !*pszValue) return a_bDefault; + + // we only look at the minimum number of characters + switch (pszValue[0]) { + case 't': case 'T': // true + case 'y': case 'Y': // yes + case '1': // 1 (one) + return true; + + case 'f': case 'F': // false + case 'n': case 'N': // no + case '0': // 0 (zero) + return false; + + case 'o': case 'O': + if (pszValue[1] == 'n' || pszValue[1] == 'N') return true; // on + if (pszValue[1] == 'f' || pszValue[1] == 'F') return false; // off + break; + } + + // no recognized value, return the default + return a_bDefault; +} + +template +SI_Error +CSimpleIniTempl::SetBoolValue( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bValue, + const SI_CHAR * a_pComment, + bool a_bForceReplace + ) +{ + // use SetValue to create sections + if (!a_pSection || !a_pKey) return SI_FAIL; + + // convert to an ASCII string + const char * pszInput = a_bValue ? "true" : "false"; + + // convert to output text + SI_CHAR szOutput[64]; + SI_CONVERTER c(m_bStoreIsUtf8); + c.ConvertFromStore(pszInput, strlen(pszInput) + 1, + szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); + + // actually add it + return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); +} + +template +bool +CSimpleIniTempl::GetAllValues( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + TNamesDepend & a_values + ) const +{ + a_values.clear(); + + if (!a_pSection || !a_pKey) { + return false; + } + typename TSection::const_iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + return false; + } + typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey); + if (iKeyVal == iSection->second.end()) { + return false; + } + + // insert all values for this key + a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder)); + if (m_bAllowMultiKey) { + ++iKeyVal; + while (iKeyVal != iSection->second.end() && !IsLess(a_pKey, iKeyVal->first.pItem)) { + a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder)); + ++iKeyVal; + } + } + + return true; +} + +template +int +CSimpleIniTempl::GetSectionSize( + const SI_CHAR * a_pSection + ) const +{ + if (!a_pSection) { + return -1; + } + + typename TSection::const_iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + return -1; + } + const TKeyVal & section = iSection->second; + + // if multi-key isn't permitted then the section size is + // the number of keys that we have. + if (!m_bAllowMultiKey || section.empty()) { + return (int) section.size(); + } + + // otherwise we need to count them + int nCount = 0; + const SI_CHAR * pLastKey = NULL; + typename TKeyVal::const_iterator iKeyVal = section.begin(); + for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n) { + if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) { + ++nCount; + pLastKey = iKeyVal->first.pItem; + } + } + return nCount; +} + +template +const typename CSimpleIniTempl::TKeyVal * +CSimpleIniTempl::GetSection( + const SI_CHAR * a_pSection + ) const +{ + if (a_pSection) { + typename TSection::const_iterator i = m_data.find(a_pSection); + if (i != m_data.end()) { + return &(i->second); + } + } + return 0; +} + +template +void +CSimpleIniTempl::GetAllSections( + TNamesDepend & a_names + ) const +{ + a_names.clear(); + typename TSection::const_iterator i = m_data.begin(); + for (int n = 0; i != m_data.end(); ++i, ++n ) { + a_names.push_back(i->first); + } +} + +template +bool +CSimpleIniTempl::GetAllKeys( + const SI_CHAR * a_pSection, + TNamesDepend & a_names + ) const +{ + a_names.clear(); + + if (!a_pSection) { + return false; + } + + typename TSection::const_iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + return false; + } + + const TKeyVal & section = iSection->second; + const SI_CHAR * pLastKey = NULL; + typename TKeyVal::const_iterator iKeyVal = section.begin(); + for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n ) { + if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) { + a_names.push_back(iKeyVal->first); + pLastKey = iKeyVal->first.pItem; + } + } + + return true; +} + +template +SI_Error +CSimpleIniTempl::SaveFile( + const char * a_pszFile, + bool a_bAddSignature + ) const +{ + FILE * fp = NULL; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + fopen_s(&fp, a_pszFile, "wb"); +#else // !__STDC_WANT_SECURE_LIB__ + fp = fopen(a_pszFile, "wb"); +#endif // __STDC_WANT_SECURE_LIB__ + if (!fp) return SI_FILE; + SI_Error rc = SaveFile(fp, a_bAddSignature); + fclose(fp); + return rc; +} + +#ifdef SI_HAS_WIDE_FILE +template +SI_Error +CSimpleIniTempl::SaveFile( + const SI_WCHAR_T * a_pwszFile, + bool a_bAddSignature + ) const +{ +#ifdef _WIN32 + FILE * fp = NULL; +#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE + _wfopen_s(&fp, a_pwszFile, L"wb"); +#else // !__STDC_WANT_SECURE_LIB__ + fp = _wfopen(a_pwszFile, L"wb"); +#endif // __STDC_WANT_SECURE_LIB__ + if (!fp) return SI_FILE; + SI_Error rc = SaveFile(fp, a_bAddSignature); + fclose(fp); + return rc; +#else // !_WIN32 (therefore SI_CONVERT_ICU) + char szFile[256]; + u_austrncpy(szFile, a_pwszFile, sizeof(szFile)); + return SaveFile(szFile, a_bAddSignature); +#endif // _WIN32 +} +#endif // SI_HAS_WIDE_FILE + +template +SI_Error +CSimpleIniTempl::SaveFile( + FILE * a_pFile, + bool a_bAddSignature + ) const +{ + FileWriter writer(a_pFile); + return Save(writer, a_bAddSignature); +} + +template +SI_Error +CSimpleIniTempl::Save( + OutputWriter & a_oOutput, + bool a_bAddSignature + ) const +{ + Converter convert(m_bStoreIsUtf8); + + // add the UTF-8 signature if it is desired + if (m_bStoreIsUtf8 && a_bAddSignature) { + a_oOutput.Write(SI_UTF8_SIGNATURE); + } + + // get all of the sections sorted in load order + TNamesDepend oSections; + GetAllSections(oSections); +#if defined(_MSC_VER) && _MSC_VER <= 1200 + oSections.sort(); +#elif defined(__BORLANDC__) + oSections.sort(Entry::LoadOrder()); +#else + oSections.sort(typename Entry::LoadOrder()); +#endif + + // write the file comment if we have one + bool bNeedNewLine = false; + if (m_pFileComment) { + if (!OutputMultiLineText(a_oOutput, convert, m_pFileComment)) { + return SI_FAIL; + } + bNeedNewLine = true; + } + + // iterate through our sections and output the data + typename TNamesDepend::const_iterator iSection = oSections.begin(); + for ( ; iSection != oSections.end(); ++iSection ) { + // write out the comment if there is one + if (iSection->pComment) { + if (bNeedNewLine) { + a_oOutput.Write(SI_NEWLINE_A); + a_oOutput.Write(SI_NEWLINE_A); + } + if (!OutputMultiLineText(a_oOutput, convert, iSection->pComment)) { + return SI_FAIL; + } + bNeedNewLine = false; + } + + if (bNeedNewLine) { + a_oOutput.Write(SI_NEWLINE_A); + a_oOutput.Write(SI_NEWLINE_A); + bNeedNewLine = false; + } + + // write the section (unless there is no section name) + if (*iSection->pItem) { + if (!convert.ConvertToStore(iSection->pItem)) { + return SI_FAIL; + } + a_oOutput.Write("["); + a_oOutput.Write(convert.Data()); + a_oOutput.Write("]"); + a_oOutput.Write(SI_NEWLINE_A); + } + + // get all of the keys sorted in load order + TNamesDepend oKeys; + GetAllKeys(iSection->pItem, oKeys); +#if defined(_MSC_VER) && _MSC_VER <= 1200 + oKeys.sort(); +#elif defined(__BORLANDC__) + oKeys.sort(Entry::LoadOrder()); +#else + oKeys.sort(typename Entry::LoadOrder()); +#endif + + // write all keys and values + typename TNamesDepend::const_iterator iKey = oKeys.begin(); + for ( ; iKey != oKeys.end(); ++iKey) { + // get all values for this key + TNamesDepend oValues; + GetAllValues(iSection->pItem, iKey->pItem, oValues); + + typename TNamesDepend::const_iterator iValue = oValues.begin(); + for ( ; iValue != oValues.end(); ++iValue) { + // write out the comment if there is one + if (iValue->pComment) { + a_oOutput.Write(SI_NEWLINE_A); + if (!OutputMultiLineText(a_oOutput, convert, iValue->pComment)) { + return SI_FAIL; + } + } + + // write the key + if (!convert.ConvertToStore(iKey->pItem)) { + return SI_FAIL; + } + a_oOutput.Write(convert.Data()); + + // write the value + if (!convert.ConvertToStore(iValue->pItem)) { + return SI_FAIL; + } + a_oOutput.Write(m_bSpaces ? " = " : "="); + if (m_bAllowMultiLine && IsMultiLineData(iValue->pItem)) { + // multi-line data needs to be processed specially to ensure + // that we use the correct newline format for the current system + a_oOutput.Write("<<pItem)) { + return SI_FAIL; + } + a_oOutput.Write("END_OF_TEXT"); + } + else { + a_oOutput.Write(convert.Data()); + } + a_oOutput.Write(SI_NEWLINE_A); + } + } + + bNeedNewLine = true; + } + + return SI_OK; +} + +template +bool +CSimpleIniTempl::OutputMultiLineText( + OutputWriter & a_oOutput, + Converter & a_oConverter, + const SI_CHAR * a_pText + ) const +{ + const SI_CHAR * pEndOfLine; + SI_CHAR cEndOfLineChar = *a_pText; + while (cEndOfLineChar) { + // find the end of this line + pEndOfLine = a_pText; + for (; *pEndOfLine && *pEndOfLine != '\n'; ++pEndOfLine) /*loop*/ ; + cEndOfLineChar = *pEndOfLine; + + // temporarily null terminate, convert and output the line + *const_cast(pEndOfLine) = 0; + if (!a_oConverter.ConvertToStore(a_pText)) { + return false; + } + *const_cast(pEndOfLine) = cEndOfLineChar; + a_pText += (pEndOfLine - a_pText) + 1; + a_oOutput.Write(a_oConverter.Data()); + a_oOutput.Write(SI_NEWLINE_A); + } + return true; +} + +template +bool +CSimpleIniTempl::Delete( + const SI_CHAR * a_pSection, + const SI_CHAR * a_pKey, + bool a_bRemoveEmpty + ) +{ + if (!a_pSection) { + return false; + } + + typename TSection::iterator iSection = m_data.find(a_pSection); + if (iSection == m_data.end()) { + return false; + } + + // remove a single key if we have a keyname + if (a_pKey) { + typename TKeyVal::iterator iKeyVal = iSection->second.find(a_pKey); + if (iKeyVal == iSection->second.end()) { + return false; + } + + // remove any copied strings and then the key + typename TKeyVal::iterator iDelete; + do { + iDelete = iKeyVal++; + + DeleteString(iDelete->first.pItem); + DeleteString(iDelete->second); + iSection->second.erase(iDelete); + } + while (iKeyVal != iSection->second.end() + && !IsLess(a_pKey, iKeyVal->first.pItem)); + + // done now if the section is not empty or we are not pruning away + // the empty sections. Otherwise let it fall through into the section + // deletion code + if (!a_bRemoveEmpty || !iSection->second.empty()) { + return true; + } + } + else { + // delete all copied strings from this section. The actual + // entries will be removed when the section is removed. + typename TKeyVal::iterator iKeyVal = iSection->second.begin(); + for ( ; iKeyVal != iSection->second.end(); ++iKeyVal) { + DeleteString(iKeyVal->first.pItem); + DeleteString(iKeyVal->second); + } + } + + // delete the section itself + DeleteString(iSection->first.pItem); + m_data.erase(iSection); + + return true; +} + +template +void +CSimpleIniTempl::DeleteString( + const SI_CHAR * a_pString + ) +{ + // strings may exist either inside the data block, or they will be + // individually allocated and stored in m_strings. We only physically + // delete those stored in m_strings. + if (a_pString < m_pData || a_pString >= m_pData + m_uDataLen) { + typename TNamesDepend::iterator i = m_strings.begin(); + for (;i != m_strings.end(); ++i) { + if (a_pString == i->pItem) { + delete[] const_cast(i->pItem); + m_strings.erase(i); + break; + } + } + } +} + +// --------------------------------------------------------------------------- +// CONVERSION FUNCTIONS +// --------------------------------------------------------------------------- + +// Defines the conversion classes for different libraries. Before including +// SimpleIni.h, set the converter that you wish you use by defining one of the +// following symbols. +// +// SI_CONVERT_GENERIC Use the Unicode reference conversion library in +// the accompanying files ConvertUTF.h/c +// SI_CONVERT_ICU Use the IBM ICU conversion library. Requires +// ICU headers on include path and icuuc.lib +// SI_CONVERT_WIN32 Use the Win32 API functions for conversion. + +#if !defined(SI_CONVERT_GENERIC) && !defined(SI_CONVERT_WIN32) && !defined(SI_CONVERT_ICU) +# ifdef _WIN32 +# define SI_CONVERT_WIN32 +# else +# define SI_CONVERT_GENERIC +# endif +#endif + +/** + * Generic case-sensitive less than comparison. This class returns numerically + * ordered ASCII case-sensitive text for all possible sizes and types of + * SI_CHAR. + */ +template +struct SI_GenericCase { + bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { + long cmp; + for ( ;*pLeft && *pRight; ++pLeft, ++pRight) { + cmp = (long) *pLeft - (long) *pRight; + if (cmp != 0) { + return cmp < 0; + } + } + return *pRight != 0; + } +}; + +/** + * Generic ASCII case-insensitive less than comparison. This class returns + * numerically ordered ASCII case-insensitive text for all possible sizes + * and types of SI_CHAR. It is not safe for MBCS text comparison where + * ASCII A-Z characters are used in the encoding of multi-byte characters. + */ +template +struct SI_GenericNoCase { + inline SI_CHAR locase(SI_CHAR ch) const { + return (ch < 'A' || ch > 'Z') ? ch : (ch - 'A' + 'a'); + } + bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { + long cmp; + for ( ;*pLeft && *pRight; ++pLeft, ++pRight) { + cmp = (long) locase(*pLeft) - (long) locase(*pRight); + if (cmp != 0) { + return cmp < 0; + } + } + return *pRight != 0; + } +}; + +/** + * Null conversion class for MBCS/UTF-8 to char (or equivalent). + */ +template +class SI_ConvertA { + bool m_bStoreIsUtf8; +protected: + SI_ConvertA() { } +public: + SI_ConvertA(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { } + + /* copy and assignment */ + SI_ConvertA(const SI_ConvertA & rhs) { operator=(rhs); } + SI_ConvertA & operator=(const SI_ConvertA & rhs) { + m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8; + return *this; + } + + /** Calculate the number of SI_CHAR required for converting the input + * from the storage format. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @return Number of SI_CHAR required by the string when + * converted. If there are embedded NULL bytes in the + * input data, only the string up and not including + * the NULL byte will be converted. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeFromStore( + const char * a_pInputData, + size_t a_uInputDataLen) + { + (void)a_pInputData; + SI_ASSERT(a_uInputDataLen != (size_t) -1); + + // ASCII/MBCS/UTF-8 needs no conversion + return a_uInputDataLen; + } + + /** Convert the input string from the storage format to SI_CHAR. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @param a_pOutputData Pointer to the output buffer to received the + * converted data. + * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. + * @return true if all of the input data was successfully + * converted. + */ + bool ConvertFromStore( + const char * a_pInputData, + size_t a_uInputDataLen, + SI_CHAR * a_pOutputData, + size_t a_uOutputDataSize) + { + // ASCII/MBCS/UTF-8 needs no conversion + if (a_uInputDataLen > a_uOutputDataSize) { + return false; + } + memcpy(a_pOutputData, a_pInputData, a_uInputDataLen); + return true; + } + + /** Calculate the number of char required by the storage format of this + * data. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated string to calculate the number of + * bytes required to be converted to storage format. + * @return Number of bytes required by the string when + * converted to storage format. This size always + * includes space for the terminating NULL character. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeToStore( + const SI_CHAR * a_pInputData) + { + // ASCII/MBCS/UTF-8 needs no conversion + return strlen((const char *)a_pInputData) + 1; + } + + /** Convert the input string to the storage format of this data. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated source string to convert. All of + * the data will be converted including the + * terminating NULL character. + * @param a_pOutputData Pointer to the buffer to receive the converted + * string. + * @param a_uOutputDataSize Size of the output buffer in char. + * @return true if all of the input data, including the + * terminating NULL character was successfully + * converted. + */ + bool ConvertToStore( + const SI_CHAR * a_pInputData, + char * a_pOutputData, + size_t a_uOutputDataSize) + { + // calc input string length (SI_CHAR type and size independent) + size_t uInputLen = strlen((const char *)a_pInputData) + 1; + if (uInputLen > a_uOutputDataSize) { + return false; + } + + // ascii/UTF-8 needs no conversion + memcpy(a_pOutputData, a_pInputData, uInputLen); + return true; + } +}; + + +// --------------------------------------------------------------------------- +// SI_CONVERT_GENERIC +// --------------------------------------------------------------------------- +#ifdef SI_CONVERT_GENERIC + +#define SI_Case SI_GenericCase +#define SI_NoCase SI_GenericNoCase + +#include +#include "ConvertUTF.h" + +/** + * Converts UTF-8 to a wchar_t (or equivalent) using the Unicode reference + * library functions. This can be used on all platforms. + */ +template +class SI_ConvertW { + bool m_bStoreIsUtf8; +protected: + SI_ConvertW() { } +public: + SI_ConvertW(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { } + + /* copy and assignment */ + SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } + SI_ConvertW & operator=(const SI_ConvertW & rhs) { + m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8; + return *this; + } + + /** Calculate the number of SI_CHAR required for converting the input + * from the storage format. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @return Number of SI_CHAR required by the string when + * converted. If there are embedded NULL bytes in the + * input data, only the string up and not including + * the NULL byte will be converted. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeFromStore( + const char * a_pInputData, + size_t a_uInputDataLen) + { + SI_ASSERT(a_uInputDataLen != (size_t) -1); + + if (m_bStoreIsUtf8) { + // worst case scenario for UTF-8 to wchar_t is 1 char -> 1 wchar_t + // so we just return the same number of characters required as for + // the source text. + return a_uInputDataLen; + } + else { + return mbstowcs(NULL, a_pInputData, a_uInputDataLen); + } + } + + /** Convert the input string from the storage format to SI_CHAR. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @param a_pOutputData Pointer to the output buffer to received the + * converted data. + * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. + * @return true if all of the input data was successfully + * converted. + */ + bool ConvertFromStore( + const char * a_pInputData, + size_t a_uInputDataLen, + SI_CHAR * a_pOutputData, + size_t a_uOutputDataSize) + { + if (m_bStoreIsUtf8) { + // This uses the Unicode reference implementation to do the + // conversion from UTF-8 to wchar_t. The required files are + // ConvertUTF.h and ConvertUTF.c which should be included in + // the distribution but are publically available from unicode.org + // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/ + ConversionResult retval; + const UTF8 * pUtf8 = (const UTF8 *) a_pInputData; + if (sizeof(wchar_t) == sizeof(UTF32)) { + UTF32 * pUtf32 = (UTF32 *) a_pOutputData; + retval = ConvertUTF8toUTF32( + &pUtf8, pUtf8 + a_uInputDataLen, + &pUtf32, pUtf32 + a_uOutputDataSize, + lenientConversion); + } + else if (sizeof(wchar_t) == sizeof(UTF16)) { + UTF16 * pUtf16 = (UTF16 *) a_pOutputData; + retval = ConvertUTF8toUTF16( + &pUtf8, pUtf8 + a_uInputDataLen, + &pUtf16, pUtf16 + a_uOutputDataSize, + lenientConversion); + } + return retval == conversionOK; + } + else { + size_t retval = mbstowcs(a_pOutputData, + a_pInputData, a_uOutputDataSize); + return retval != (size_t)(-1); + } + } + + /** Calculate the number of char required by the storage format of this + * data. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated string to calculate the number of + * bytes required to be converted to storage format. + * @return Number of bytes required by the string when + * converted to storage format. This size always + * includes space for the terminating NULL character. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeToStore( + const SI_CHAR * a_pInputData) + { + if (m_bStoreIsUtf8) { + // worst case scenario for wchar_t to UTF-8 is 1 wchar_t -> 6 char + size_t uLen = 0; + while (a_pInputData[uLen]) { + ++uLen; + } + return (6 * uLen) + 1; + } + else { + size_t uLen = wcstombs(NULL, a_pInputData, 0); + if (uLen == (size_t)(-1)) { + return uLen; + } + return uLen + 1; // include NULL terminator + } + } + + /** Convert the input string to the storage format of this data. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated source string to convert. All of + * the data will be converted including the + * terminating NULL character. + * @param a_pOutputData Pointer to the buffer to receive the converted + * string. + * @param a_uOutputDataSize Size of the output buffer in char. + * @return true if all of the input data, including the + * terminating NULL character was successfully + * converted. + */ + bool ConvertToStore( + const SI_CHAR * a_pInputData, + char * a_pOutputData, + size_t a_uOutputDataSize + ) + { + if (m_bStoreIsUtf8) { + // calc input string length (SI_CHAR type and size independent) + size_t uInputLen = 0; + while (a_pInputData[uInputLen]) { + ++uInputLen; + } + ++uInputLen; // include the NULL char + + // This uses the Unicode reference implementation to do the + // conversion from wchar_t to UTF-8. The required files are + // ConvertUTF.h and ConvertUTF.c which should be included in + // the distribution but are publically available from unicode.org + // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/ + ConversionResult retval; + UTF8 * pUtf8 = (UTF8 *) a_pOutputData; + if (sizeof(wchar_t) == sizeof(UTF32)) { + const UTF32 * pUtf32 = (const UTF32 *) a_pInputData; + retval = ConvertUTF32toUTF8( + &pUtf32, pUtf32 + uInputLen, + &pUtf8, pUtf8 + a_uOutputDataSize, + lenientConversion); + } + else if (sizeof(wchar_t) == sizeof(UTF16)) { + const UTF16 * pUtf16 = (const UTF16 *) a_pInputData; + retval = ConvertUTF16toUTF8( + &pUtf16, pUtf16 + uInputLen, + &pUtf8, pUtf8 + a_uOutputDataSize, + lenientConversion); + } + return retval == conversionOK; + } + else { + size_t retval = wcstombs(a_pOutputData, + a_pInputData, a_uOutputDataSize); + return retval != (size_t) -1; + } + } +}; + +#endif // SI_CONVERT_GENERIC + + +// --------------------------------------------------------------------------- +// SI_CONVERT_ICU +// --------------------------------------------------------------------------- +#ifdef SI_CONVERT_ICU + +#define SI_Case SI_GenericCase +#define SI_NoCase SI_GenericNoCase + +#include + +/** + * Converts MBCS/UTF-8 to UChar using ICU. This can be used on all platforms. + */ +template +class SI_ConvertW { + const char * m_pEncoding; + UConverter * m_pConverter; +protected: + SI_ConvertW() : m_pEncoding(NULL), m_pConverter(NULL) { } +public: + SI_ConvertW(bool a_bStoreIsUtf8) : m_pConverter(NULL) { + m_pEncoding = a_bStoreIsUtf8 ? "UTF-8" : NULL; + } + + /* copy and assignment */ + SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } + SI_ConvertW & operator=(const SI_ConvertW & rhs) { + m_pEncoding = rhs.m_pEncoding; + m_pConverter = NULL; + return *this; + } + ~SI_ConvertW() { if (m_pConverter) ucnv_close(m_pConverter); } + + /** Calculate the number of UChar required for converting the input + * from the storage format. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to UChar. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @return Number of UChar required by the string when + * converted. If there are embedded NULL bytes in the + * input data, only the string up and not including + * the NULL byte will be converted. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeFromStore( + const char * a_pInputData, + size_t a_uInputDataLen) + { + SI_ASSERT(a_uInputDataLen != (size_t) -1); + + UErrorCode nError; + + if (!m_pConverter) { + nError = U_ZERO_ERROR; + m_pConverter = ucnv_open(m_pEncoding, &nError); + if (U_FAILURE(nError)) { + return (size_t) -1; + } + } + + nError = U_ZERO_ERROR; + ucnv_resetToUnicode(m_pConverter); + int32_t nLen = ucnv_toUChars(m_pConverter, NULL, 0, + a_pInputData, (int32_t) a_uInputDataLen, &nError); + if (nError != U_BUFFER_OVERFLOW_ERROR) { + return (size_t) -1; + } + + return (size_t) nLen; + } + + /** Convert the input string from the storage format to UChar. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to UChar. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @param a_pOutputData Pointer to the output buffer to received the + * converted data. + * @param a_uOutputDataSize Size of the output buffer in UChar. + * @return true if all of the input data was successfully + * converted. + */ + bool ConvertFromStore( + const char * a_pInputData, + size_t a_uInputDataLen, + UChar * a_pOutputData, + size_t a_uOutputDataSize) + { + UErrorCode nError; + + if (!m_pConverter) { + nError = U_ZERO_ERROR; + m_pConverter = ucnv_open(m_pEncoding, &nError); + if (U_FAILURE(nError)) { + return false; + } + } + + nError = U_ZERO_ERROR; + ucnv_resetToUnicode(m_pConverter); + ucnv_toUChars(m_pConverter, + a_pOutputData, (int32_t) a_uOutputDataSize, + a_pInputData, (int32_t) a_uInputDataLen, &nError); + if (U_FAILURE(nError)) { + return false; + } + + return true; + } + + /** Calculate the number of char required by the storage format of this + * data. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated string to calculate the number of + * bytes required to be converted to storage format. + * @return Number of bytes required by the string when + * converted to storage format. This size always + * includes space for the terminating NULL character. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeToStore( + const UChar * a_pInputData) + { + UErrorCode nError; + + if (!m_pConverter) { + nError = U_ZERO_ERROR; + m_pConverter = ucnv_open(m_pEncoding, &nError); + if (U_FAILURE(nError)) { + return (size_t) -1; + } + } + + nError = U_ZERO_ERROR; + ucnv_resetFromUnicode(m_pConverter); + int32_t nLen = ucnv_fromUChars(m_pConverter, NULL, 0, + a_pInputData, -1, &nError); + if (nError != U_BUFFER_OVERFLOW_ERROR) { + return (size_t) -1; + } + + return (size_t) nLen + 1; + } + + /** Convert the input string to the storage format of this data. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated source string to convert. All of + * the data will be converted including the + * terminating NULL character. + * @param a_pOutputData Pointer to the buffer to receive the converted + * string. + * @param a_pOutputDataSize Size of the output buffer in char. + * @return true if all of the input data, including the + * terminating NULL character was successfully + * converted. + */ + bool ConvertToStore( + const UChar * a_pInputData, + char * a_pOutputData, + size_t a_uOutputDataSize) + { + UErrorCode nError; + + if (!m_pConverter) { + nError = U_ZERO_ERROR; + m_pConverter = ucnv_open(m_pEncoding, &nError); + if (U_FAILURE(nError)) { + return false; + } + } + + nError = U_ZERO_ERROR; + ucnv_resetFromUnicode(m_pConverter); + ucnv_fromUChars(m_pConverter, + a_pOutputData, (int32_t) a_uOutputDataSize, + a_pInputData, -1, &nError); + if (U_FAILURE(nError)) { + return false; + } + + return true; + } +}; + +#endif // SI_CONVERT_ICU + + +// --------------------------------------------------------------------------- +// SI_CONVERT_WIN32 +// --------------------------------------------------------------------------- +#ifdef SI_CONVERT_WIN32 + +#define SI_Case SI_GenericCase + +// Windows CE doesn't have errno or MBCS libraries +#ifdef _WIN32_WCE +# ifndef SI_NO_MBCS +# define SI_NO_MBCS +# endif +#endif + +#include +#ifdef SI_NO_MBCS +# define SI_NoCase SI_GenericNoCase +#else // !SI_NO_MBCS +/** + * Case-insensitive comparison class using Win32 MBCS functions. This class + * returns a case-insensitive semi-collation order for MBCS text. It may not + * be safe for UTF-8 text returned in char format as we don't know what + * characters will be folded by the function! Therefore, if you are using + * SI_CHAR == char and SetUnicode(true), then you need to use the generic + * SI_NoCase class instead. + */ +#include +template +struct SI_NoCase { + bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { + if (sizeof(SI_CHAR) == sizeof(char)) { + return _mbsicmp((const unsigned char *)pLeft, + (const unsigned char *)pRight) < 0; + } + if (sizeof(SI_CHAR) == sizeof(wchar_t)) { + return _wcsicmp((const wchar_t *)pLeft, + (const wchar_t *)pRight) < 0; + } + return SI_GenericNoCase()(pLeft, pRight); + } +}; +#endif // SI_NO_MBCS + +/** + * Converts MBCS and UTF-8 to a wchar_t (or equivalent) on Windows. This uses + * only the Win32 functions and doesn't require the external Unicode UTF-8 + * conversion library. It will not work on Windows 95 without using Microsoft + * Layer for Unicode in your application. + */ +template +class SI_ConvertW { + UINT m_uCodePage; +protected: + SI_ConvertW() { } +public: + SI_ConvertW(bool a_bStoreIsUtf8) { + m_uCodePage = a_bStoreIsUtf8 ? CP_UTF8 : CP_ACP; + } + + /* copy and assignment */ + SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } + SI_ConvertW & operator=(const SI_ConvertW & rhs) { + m_uCodePage = rhs.m_uCodePage; + return *this; + } + + /** Calculate the number of SI_CHAR required for converting the input + * from the storage format. The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @return Number of SI_CHAR required by the string when + * converted. If there are embedded NULL bytes in the + * input data, only the string up and not including + * the NULL byte will be converted. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeFromStore( + const char * a_pInputData, + size_t a_uInputDataLen) + { + SI_ASSERT(a_uInputDataLen != (size_t) -1); + + int retval = MultiByteToWideChar( + m_uCodePage, 0, + a_pInputData, (int) a_uInputDataLen, + 0, 0); + return (size_t)(retval > 0 ? retval : -1); + } + + /** Convert the input string from the storage format to SI_CHAR. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData Data in storage format to be converted to SI_CHAR. + * @param a_uInputDataLen Length of storage format data in bytes. This + * must be the actual length of the data, including + * NULL byte if NULL terminated string is required. + * @param a_pOutputData Pointer to the output buffer to received the + * converted data. + * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. + * @return true if all of the input data was successfully + * converted. + */ + bool ConvertFromStore( + const char * a_pInputData, + size_t a_uInputDataLen, + SI_CHAR * a_pOutputData, + size_t a_uOutputDataSize) + { + int nSize = MultiByteToWideChar( + m_uCodePage, 0, + a_pInputData, (int) a_uInputDataLen, + (wchar_t *) a_pOutputData, (int) a_uOutputDataSize); + return (nSize > 0); + } + + /** Calculate the number of char required by the storage format of this + * data. The storage format is always UTF-8. + * + * @param a_pInputData NULL terminated string to calculate the number of + * bytes required to be converted to storage format. + * @return Number of bytes required by the string when + * converted to storage format. This size always + * includes space for the terminating NULL character. + * @return -1 cast to size_t on a conversion error. + */ + size_t SizeToStore( + const SI_CHAR * a_pInputData) + { + int retval = WideCharToMultiByte( + m_uCodePage, 0, + (const wchar_t *) a_pInputData, -1, + 0, 0, 0, 0); + return (size_t) (retval > 0 ? retval : -1); + } + + /** Convert the input string to the storage format of this data. + * The storage format is always UTF-8 or MBCS. + * + * @param a_pInputData NULL terminated source string to convert. All of + * the data will be converted including the + * terminating NULL character. + * @param a_pOutputData Pointer to the buffer to receive the converted + * string. + * @param a_pOutputDataSize Size of the output buffer in char. + * @return true if all of the input data, including the + * terminating NULL character was successfully + * converted. + */ + bool ConvertToStore( + const SI_CHAR * a_pInputData, + char * a_pOutputData, + size_t a_uOutputDataSize) + { + int retval = WideCharToMultiByte( + m_uCodePage, 0, + (const wchar_t *) a_pInputData, -1, + a_pOutputData, (int) a_uOutputDataSize, 0, 0); + return retval > 0; + } +}; + +#endif // SI_CONVERT_WIN32 + + +// --------------------------------------------------------------------------- +// TYPE DEFINITIONS +// --------------------------------------------------------------------------- + +typedef CSimpleIniTempl,SI_ConvertA > CSimpleIniA; +typedef CSimpleIniTempl,SI_ConvertA > CSimpleIniCaseA; + +#if defined(SI_CONVERT_ICU) +typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniW; +typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniCaseW; +#else +typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniW; +typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniCaseW; +#endif + +#ifdef _UNICODE +# define CSimpleIni CSimpleIniW +# define CSimpleIniCase CSimpleIniCaseW +# define SI_NEWLINE SI_NEWLINE_W +#else // !_UNICODE +# define CSimpleIni CSimpleIniA +# define CSimpleIniCase CSimpleIniCaseA +# define SI_NEWLINE SI_NEWLINE_A +#endif // _UNICODE + +#ifdef _MSC_VER +# pragma warning (pop) +#endif + +#endif // INCLUDED_SimpleIni_h + diff --git a/OTLib/simpleini/SimpleIni.sln b/OTLib/simpleini/SimpleIni.sln new file mode 100755 index 000000000..6fd8a736d --- /dev/null +++ b/OTLib/simpleini/SimpleIni.sln @@ -0,0 +1,29 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimpleIni", "SimpleIni.vcproj", "{C23240A6-AA9D-4827-AF06-C98E97CA6DFB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Debug Unicode = Debug Unicode + Release = Release + Release Unicode = Release Unicode + EndGlobalSection + GlobalSection(ProjectDependencies) = postSolution + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Debug.ActiveCfg = Debug|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Debug.Build.0 = Debug|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Debug Unicode.ActiveCfg = Debug Unicode|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Debug Unicode.Build.0 = Debug Unicode|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Release.ActiveCfg = Release|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Release.Build.0 = Release|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Release Unicode.ActiveCfg = Release Unicode|Win32 + {C23240A6-AA9D-4827-AF06-C98E97CA6DFB}.Release Unicode.Build.0 = Release Unicode|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/OTLib/simpleini/SimpleIni.vcproj b/OTLib/simpleini/SimpleIni.vcproj new file mode 100755 index 000000000..e5ee0db38 --- /dev/null +++ b/OTLib/simpleini/SimpleIni.vcproj @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OTLib/simpleini/ini.syn b/OTLib/simpleini/ini.syn new file mode 100755 index 000000000..718c56078 --- /dev/null +++ b/OTLib/simpleini/ini.syn @@ -0,0 +1,36 @@ +; Syntax file for ini files - contributed by Brodie Thiesfield +; +; Suggested Colors: +; Comments (;#) Comments, Comments 2 Green +; Sections Characters Red +; Values Strings Blue + +C=1 + +[Syntax] +Namespace1 = 6 +IgnoreCase = Yes +KeyWordLength = 1 +BracketChars = +OperatorChars = +PreprocStart = +SyntaxStart = +SyntaxEnd = +HexPrefix = +CommentStart = +CommentEnd = +CommentStartAlt = +CommentEndAlt = +SingleComment = # +SingleCommentCol = +SingleCommentAlt = ; +SingleCommentColAlt = +SingleCommentEsc = +StringsSpanLines = No +StringStart = +StringEnd = +StringAlt = = +StringEsc = +CharStart = [ +CharEnd = ] +CharEsc = diff --git a/OTLib/simpleini/package.cmd b/OTLib/simpleini/package.cmd new file mode 100755 index 000000000..f46da2c1d --- /dev/null +++ b/OTLib/simpleini/package.cmd @@ -0,0 +1,26 @@ +set VERSION=4.14 + +set SEVENZIP="C:\Program Files\7-Zip\7z.exe" + +FOR /F "tokens=*" %%G IN ('DIR /AD /B /S Debug*') DO ( + DEL /S /Q "%%G" + RD "%%G" +) +FOR /F "tokens=*" %%G IN ('DIR /AD /B /S Release*') DO ( + DEL /S /Q "%%G" + RD "%%G" +) +DEL /Q "SimpleIni.ncb" +ATTRIB -H "SimpleIni.suo" +DEL /Q "SimpleIni.suo" +DEL /Q "SimpleIni.opt" +DEL /Q testsi-out*.ini +DEL /Q test1-blah.ini +DEL /Q test1-output.ini +START "Generate documentation" /WAIT "C:\Program Files (x86)\doxygen\bin\doxygen.exe" SimpleIni.doxy +cd .. +del simpleini-%VERSION%.zip +%SEVENZIP% a -tzip -r- -x!simpleini\.svn simpleini-%VERSION%.zip simpleini\* +del simpleini-doc.zip +%SEVENZIP% a -tzip -r simpleini-doc.zip simpleini-doc\* +cd simpleini diff --git a/OTLib/simpleini/simpleini.doxy b/OTLib/simpleini/simpleini.doxy new file mode 100755 index 000000000..6a2722113 --- /dev/null +++ b/OTLib/simpleini/simpleini.doxy @@ -0,0 +1,1321 @@ +# Doxyfile 1.5.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = SimpleIni + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = D:/src/simpleini-doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class " \ + "The $name widget " \ + "The $name file " \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then 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 part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = "D:/src/simpleini/ " + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +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 support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct (or union) is +# documented as struct with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code where the coding convention is that all structs are +# typedef'ed and only the typedef is referenced never the struct's name. + +TYPEDEF_HIDES_STRUCT = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be extracted +# and appear in the documentation as a namespace called 'anonymous_namespace{file}', +# where file will be replaced with the base name of the file that contains the anonymous +# namespace. By default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file($line) : $text " + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = D:/src/simpleini/SimpleIni.h + +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. 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 = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH +# then you must also enable this option. If you don't then doxygen will produce +# a warning and turn it on anyway + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +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 +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = SI_HAS_WIDE_FILE \ + SI_SUPPORT_IOSTREAMS + +# 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 macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +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 = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the number +# of direct children of the root node in a graph is already larger than +# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 1000 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/OTLib/simpleini/simpleini.dsp b/OTLib/simpleini/simpleini.dsp new file mode 100755 index 000000000..97c386af7 --- /dev/null +++ b/OTLib/simpleini/simpleini.dsp @@ -0,0 +1,178 @@ +# Microsoft Developer Studio Project File - Name="simpleini" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=simpleini - Win32 Debug Unicode +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "simpleini.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "simpleini.mak" CFG="simpleini - Win32 Debug Unicode" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "simpleini - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "simpleini - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "simpleini - Win32 Debug Unicode" (based on "Win32 (x86) Console Application") +!MESSAGE "simpleini - Win32 Release Unicode" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "simpleini - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0xc09 /d "NDEBUG" +# ADD RSC /l 0xc09 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/testsi.exe" + +!ELSEIF "$(CFG)" == "simpleini - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "simpleini___Win32_Debug" +# PROP BASE Intermediate_Dir "simpleini___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# SUBTRACT CPP /Fr /YX +# ADD BASE RSC /l 0xc09 /d "_DEBUG" +# ADD RSC /l 0xc09 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/testsi.exe" /pdbtype:sept + +!ELSEIF "$(CFG)" == "simpleini - Win32 Debug Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug Unicode" +# PROP BASE Intermediate_Dir "Debug Unicode" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug Unicode" +# PROP Intermediate_Dir "Debug Unicode" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "SI_USE_GENERIC_CONVERSION" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0xc09 /d "_DEBUG" +# ADD RSC /l 0xc09 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug Unicode/testsi.exe" /pdbtype:sept + +!ELSEIF "$(CFG)" == "simpleini - Win32 Release Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release Unicode" +# PROP BASE Intermediate_Dir "Release Unicode" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release Unicode" +# PROP Intermediate_Dir "Release Unicode" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "SI_USE_GENERIC_CONVERSION" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0xc09 /d "NDEBUG" +# ADD RSC /l 0xc09 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release Unicode/testsi.exe" + +!ENDIF + +# Begin Target + +# Name "simpleini - Win32 Release" +# Name "simpleini - Win32 Debug" +# Name "simpleini - Win32 Debug Unicode" +# Name "simpleini - Win32 Release Unicode" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\snippets.cpp +# End Source File +# Begin Source File + +SOURCE=.\test1.cpp +# End Source File +# Begin Source File + +SOURCE=.\testsi.cpp +# End Source File +# End Group +# Begin Group "Library Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\SimpleIni.h +# End Source File +# End Group +# Begin Group "Generic Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\ConvertUTF.c +# End Source File +# Begin Source File + +SOURCE=.\ConvertUTF.h +# End Source File +# End Group +# End Target +# End Project diff --git a/OTLib/simpleini/simpleini.dsw b/OTLib/simpleini/simpleini.dsw new file mode 100755 index 000000000..2d593edbd --- /dev/null +++ b/OTLib/simpleini/simpleini.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "simpleini"=.\simpleini.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/OTLib/simpleini/snippets.cpp b/OTLib/simpleini/snippets.cpp new file mode 100755 index 000000000..646f4ff8e --- /dev/null +++ b/OTLib/simpleini/snippets.cpp @@ -0,0 +1,123 @@ +// File: snippets.cpp +// Library: SimpleIni +// Author: Brodie Thiesfield +// Source: http://code.jellycan.com/simpleini/ +// +// Snippets that are used on the website + +#ifdef _WIN32 +# pragma warning(disable: 4786) +#endif + +#ifndef _WIN32 +# include +#endif +#include + +#define SI_SUPPORT_IOSTREAMS +#include "SimpleIni.h" + +bool +snippets( + const char * a_pszFile, + bool a_bIsUtf8, + bool a_bUseMultiKey, + bool a_bUseMultiLine + ) +{ + // LOADING DATA + + // load from a data file + CSimpleIniA ini(a_bIsUtf8, a_bUseMultiKey, a_bUseMultiLine); + SI_Error rc = ini.LoadFile(a_pszFile); + if (rc < 0) return false; + + // load from a string + std::string strData; + rc = ini.LoadData(strData.c_str(), strData.size()); + if (rc < 0) return false; + + // GETTING SECTIONS AND KEYS + + // get all sections + CSimpleIniA::TNamesDepend sections; + ini.GetAllSections(sections); + + // get all keys in a section + CSimpleIniA::TNamesDepend keys; + ini.GetAllKeys("section-name", keys); + + // GETTING VALUES + + // get the value of a key + const char * pszValue = ini.GetValue("section-name", + "key-name", NULL /*default*/); + + // get the value of a key which may have multiple + // values. If bHasMultipleValues is true, then just + // one value has been returned + bool bHasMultipleValues; + pszValue = ini.GetValue("section-name", "key-name", + NULL /*default*/, &bHasMultipleValues); + + // get all values of a key with multiple values + CSimpleIniA::TNamesDepend values; + ini.GetAllValues("section-name", "key-name", values); + + // sort the values into the original load order +#if defined(_MSC_VER) && _MSC_VER <= 1200 + /** STL of VC6 doesn't allow me to specify my own comparator for list::sort() */ + values.sort(); +#else + values.sort(CSimpleIniA::Entry::LoadOrder()); +#endif + + // output all of the items + CSimpleIniA::TNamesDepend::const_iterator i; + for (i = values.begin(); i != values.end(); ++i) { + printf("key-name = '%s'\n", i->pItem); + } + + // MODIFYING DATA + + // adding a new section + rc = ini.SetValue("new-section", NULL, NULL); + if (rc < 0) return false; + printf("section: %s\n", rc == SI_INSERTED ? + "inserted" : "updated"); + + // adding a new key ("new-section" will be added + // automatically if it doesn't already exist. + rc = ini.SetValue("new-section", "new-key", "value"); + if (rc < 0) return false; + printf("key: %s\n", rc == SI_INSERTED ? + "inserted" : "updated"); + + // changing the value of a key + rc = ini.SetValue("section", "key", "updated-value"); + if (rc < 0) return false; + printf("key: %s\n", rc == SI_INSERTED ? + "inserted" : "updated"); + + // DELETING DATA + + // deleting a key from a section. Optionally the entire + // section may be deleted if it is now empty. + ini.Delete("section-name", "key-name", + true /*delete the section if empty*/); + + // deleting an entire section and all keys in it + ini.Delete("section-name", NULL); + + // SAVING DATA + + // save the data to a string + rc = ini.Save(strData); + if (rc < 0) return false; + + // save the data back to the file + rc = ini.SaveFile(a_pszFile); + if (rc < 0) return false; + + return true; +} diff --git a/OTLib/simpleini/test.cmd b/OTLib/simpleini/test.cmd new file mode 100755 index 000000000..f5d64ea6b --- /dev/null +++ b/OTLib/simpleini/test.cmd @@ -0,0 +1,24 @@ +@echo off + +Debug\testsi.exe -u -m -l test1-input.ini > test1-blah.ini +fc test1-expected.ini test1-output.ini +if errorlevel 1 goto error + +"Debug Unicode\testsi.exe" -u -m -l test1-input.ini > test1-blah.ini +fc test1-expected.ini test1-output.ini +if errorlevel 1 goto error + +Release\testsi.exe -u -m -l test1-input.ini > test1-blah.ini +fc test1-expected.ini test1-output.ini +if errorlevel 1 goto error + +"Release Unicode\testsi.exe" -u -m -l test1-input.ini > test1-blah.ini +fc test1-expected.ini test1-output.ini +if errorlevel 1 goto error + +exit /b 0 + +:error +echo Failed during test run. Output file doesn't match expected file. +pause +exit /b 1 diff --git a/OTLib/simpleini/test1-expected.ini b/OTLib/simpleini/test1-expected.ini new file mode 100755 index 000000000..d8a484cef --- /dev/null +++ b/OTLib/simpleini/test1-expected.ini @@ -0,0 +1,82 @@ +; testsi-UTF8-std.ini : standard UTF-8 test file for SimpleIni automated testing +; +; The number after a section or key is the order that it is defined in this file +; to make it easier to see if it has been written out correctly. This file should +; be loaded with Unicode / MultiKey / MultiLine turned on. + + + +; This comment should be joined on to the one below it about the key +; with no section. + +; Key with no section +lonely-key = nosection +another = nosection either + + +; This should be joined with the comment below about japanese. +; Another line which will be un-indented. + +; This is a section of keys showing the word Japanese in different syllabies. +[ordered-1] +a-1 = blah + +; this is in kanji +japanese-2 = 日本語 + +; this is in hiragana +japanese-3 = にほんご + +; this is in katakana +japanese-4 = ニホンゴ + +; this is in romaji +japanese-5 = nihongo + +; kanji as the key +日本語-6 = japanese + + +[multi-2] + +; value a +test = a + +; value b +test = b + +; value c +test = c + +; value d +test = d + + +[multiline-3] + +; This is obviously a multi-line entry +multiline-1 = << +// Source: http://code.jellycan.com/simpleini/ +// +// Automated testing for SimpleIni streams + +#ifdef _WIN32 +# pragma warning(disable: 4786) +#endif + +#ifdef _WIN32 +# define DELETE_FILE DeleteFileA +#else +# include +# define DELETE_FILE unlink +#endif +#include + +#define SI_SUPPORT_IOSTREAMS +#include "SimpleIni.h" + +class Test +{ + std::string m_strTest; + +public: + Test(const char * a_pszName) + : m_strTest(a_pszName) + { + printf("%s: test starting\n", m_strTest.c_str()); + } + + bool Success() + { + printf("%s: test succeeded\n", m_strTest.c_str()); + return false; + } + + bool Failure(const char * pszReason) + { + printf("%s: test FAILED (%s)\n", m_strTest.c_str(), pszReason); + return false; + } +}; + +bool FileComparisonTest(const char * a_pszFile1, const char * a_pszFile2) { + // ensure that the two files are the same + try { + std::string strFile1, strFile2; + + char szBuf[1024]; + FILE * fp = NULL; + +#if __STDC_WANT_SECURE_LIB__ + fopen_s(&fp, a_pszFile1, "rb"); +#else + fp = fopen(a_pszFile1, "rb"); +#endif + if (!fp) throw false; + while (!feof(fp)) { + size_t n = fread(szBuf, 1, sizeof(szBuf), fp); + strFile1.append(szBuf, n); + } + fclose(fp); + + fp = NULL; +#if __STDC_WANT_SECURE_LIB__ + fopen_s(&fp, a_pszFile2, "rb"); +#else + fp = fopen(a_pszFile2, "rb"); +#endif + if (!fp) throw false; + while (!feof(fp)) { + size_t n = fread(szBuf, 1, sizeof(szBuf), fp); + strFile2.append(szBuf, n); + } + fclose(fp); + + if (strFile1 != strFile2) throw false; + } + catch (...) { + return false; + } + + return true; +} + +bool FileLoadTest(const char * a_pszFile1, const char * a_pszFile2) { + // ensure that the two files load into simpleini the same + CSimpleIniA ini(true, true, true); + bool b; + try { + ini.Reset(); + if (ini.LoadFile(a_pszFile1) < 0) throw "Load failed for file 1"; + if (ini.SaveFile("test1.ini") < 0) throw "Save failed for file 1"; + + ini.Reset(); + if (ini.LoadFile(a_pszFile2) < 0) throw "Load failed for file 2"; + if (ini.SaveFile("test2.ini") < 0) throw "Save failed for file 2"; + + b = FileComparisonTest("test1.ini", "test2.ini"); + DELETE_FILE("test1.ini"); + DELETE_FILE("test2.ini"); + if (!b) throw "File comparison failed in FileLoadTest"; + } + catch (...) { + return false; + } + + return true; +} + +bool TestStreams() +{ + const char * rgszTestFile[3] = { + "test1-input.ini", + "test1-output.ini", + "test1-expected.ini" + }; + + Test oTest("TestStreams"); + + CSimpleIniA ini; + ini.SetUnicode(true); + ini.SetMultiKey(true); + ini.SetMultiLine(true); + + // load the file + try { + std::ifstream instream; + instream.open(rgszTestFile[0], std::ifstream::in | std::ifstream::binary); + if (ini.LoadData(instream) < 0) throw false; + instream.close(); + } + catch (...) { + return oTest.Failure("Failed to load file"); + } + + // standard contents test + //if (!StandardContentsTest(ini, oTest)) { + // return false; + //} + + // save the file + try { + std::ofstream outfile; + outfile.open(rgszTestFile[1], std::ofstream::out | std::ofstream::binary); + if (ini.Save(outfile, true) < 0) throw false; + outfile.close(); + } + catch (...) { + return oTest.Failure("Failed to save file"); + } + + // file comparison test + if (!FileComparisonTest(rgszTestFile[1], rgszTestFile[2])) { + return oTest.Failure("Failed file comparison"); + } + if (!FileLoadTest(rgszTestFile[1], rgszTestFile[2])) { + return oTest.Failure("Failed file load comparison"); + } + + return oTest.Success(); +} diff --git a/OTLib/simpleini/testsi-EUCJP.ini b/OTLib/simpleini/testsi-EUCJP.ini new file mode 100755 index 000000000..ee9e9873e --- /dev/null +++ b/OTLib/simpleini/testsi-EUCJP.ini @@ -0,0 +1,52 @@ +; test file for SimpleIni + +nosection=ok +NOSECTION=still ok + whitespace = ok + +[standard] +foo=foo1 +standard-1=foo +ܸ=ok1 + +[Standard] +Foo=foo2 +standard-2=foo +ܸ=ok2 + + [ Whitespace ] + +a= + +[ whitespace in section name ] + whitespace in key name = whitespace in value name + +; comments + ; more comments + +invalid +=invalid +====invalid + +[Japanese] +nihongo = ܸ +ܸ = ܸ + +[ܸ] +nihongo = ܸ +ܸ = ܸ + +[] +more=no section name + + + +[MultiLine] +single = This is a single line. +multi = << +// Source: http://code.jellycan.com/simpleini/ +// +// Demo of usage + +#ifdef _WIN32 +# pragma warning(disable: 4786) +#endif + +#include +#include +#include + +#define SI_SUPPORT_IOSTREAMS +#if defined(SI_SUPPORT_IOSTREAMS) && !defined(_UNICODE) +# include +#endif + +//#define SI_CONVERT_GENERIC +//#define SI_CONVERT_ICU +//#define SI_CONVERT_WIN32 +#include "SimpleIni.h" + +#ifdef SI_CONVERT_ICU +// if converting using ICU then we need the ICU library +# pragma comment(lib, "icuuc.lib") +#endif + +#ifdef _WIN32 +# include +#else // !_WIN32 +# define TCHAR char +# define _T(x) x +# define _tprintf printf +# define _tmain main +#endif // _WIN32 + +static void +Test( + CSimpleIni & ini + ) +{ + const TCHAR *pszSection = 0; + const TCHAR *pItem = 0; + const TCHAR *pszVal = 0; + + // get the value of the key "foo" in section "standard" + bool bHasMulti; + pszVal = ini.GetValue(_T("standard"), _T("foo"), 0, &bHasMulti); + _tprintf(_T("\n-- Value of standard::foo is '%s' (hasMulti = %d)\n"), + pszVal ? pszVal : _T("(null)"), bHasMulti); + + // set the value of the key "foo" in section "standard" + ini.SetValue(_T("standard"), _T("foo"), _T("wibble")); + pszVal = ini.GetValue(_T("standard"), _T("foo"), 0, &bHasMulti); + _tprintf(_T("\n-- Value of standard::foo is '%s' (hasMulti = %d)\n"), + pszVal ? pszVal : _T("(null)"), bHasMulti); + + // get all values of the key "foo" in section "standard" + CSimpleIni::TNamesDepend values; + if (ini.GetAllValues(_T("standard"), _T("foo"), values)) { + _tprintf(_T("\n-- Values of standard::foo are:\n")); + CSimpleIni::TNamesDepend::const_iterator i = values.begin(); + for (; i != values.end(); ++i) { + pszVal = i->pItem; + _tprintf(_T(" -> '%s'\n"), pszVal); + } + } + + // get the size of the section [standard] + _tprintf(_T("\n-- Number of keys in section [standard] = %d\n"), + ini.GetSectionSize(_T("standard"))); + + // delete the key "foo" in section "standard" + ini.Delete(_T("standard"), _T("foo")); + pszVal = ini.GetValue(_T("standard"), _T("foo"), 0); + _tprintf(_T("\n-- Value of standard::foo is now '%s'\n"), + pszVal ? pszVal : _T("(null)")); + + // get the size of the section [standard] + _tprintf(_T("\n-- Number of keys in section [standard] = %d\n"), + ini.GetSectionSize(_T("standard"))); + + // get the list of all key names for the section "standard" + _tprintf(_T("\n-- Dumping keys of section: [standard]\n")); + CSimpleIni::TNamesDepend keys; + ini.GetAllKeys(_T("standard"), keys); + + // dump all of the key names + CSimpleIni::TNamesDepend::const_iterator iKey = keys.begin(); + for ( ; iKey != keys.end(); ++iKey ) { + pItem = iKey->pItem; + _tprintf(_T("Key: %s\n"), pItem); + } + + // add a decimal value + ini.SetLongValue(_T("integer"), _T("dec"), 42, NULL, false); + ini.SetLongValue(_T("integer"), _T("hex"), 42, NULL, true); + + // add some bool values + ini.SetBoolValue(_T("bool"), _T("t"), true); + ini.SetBoolValue(_T("bool"), _T("f"), false); + + // get the values back + assert(42 == ini.GetLongValue(_T("integer"), _T("dec"))); + assert(42 == ini.GetLongValue(_T("integer"), _T("hex"))); + assert(true == ini.GetBoolValue(_T("bool"), _T("t"))); + assert(false == ini.GetBoolValue(_T("bool"), _T("f"))); + + // delete the section "standard" + ini.Delete(_T("standard"), NULL); + _tprintf(_T("\n-- Number of keys in section [standard] = %d\n"), + ini.GetSectionSize(_T("standard"))); + + // iterate through every section in the file + _tprintf(_T("\n-- Dumping all sections\n")); + CSimpleIni::TNamesDepend sections; + ini.GetAllSections(sections); + CSimpleIni::TNamesDepend::const_iterator iSection = sections.begin(); + for ( ; iSection != sections.end(); ++iSection ) { + pszSection = iSection->pItem; + + // print the section name + printf("\n"); + if (*pszSection) { + _tprintf(_T("[%s]\n"), pszSection); + } + + // if there are keys and values... + const CSimpleIni::TKeyVal * pSectionData = ini.GetSection(pszSection); + if (pSectionData) { + // iterate over all keys and dump the key name and value + CSimpleIni::TKeyVal::const_iterator iKeyVal = pSectionData->begin(); + for ( ;iKeyVal != pSectionData->end(); ++iKeyVal) { + pItem = iKeyVal->first.pItem; + pszVal = iKeyVal->second; + _tprintf(_T("%s=%s\n"), pItem, pszVal); + } + } + } +} + +#if defined(SI_SUPPORT_IOSTREAMS) && !defined(_UNICODE) +static bool +TestStreams( + const TCHAR * a_pszFile, + bool a_bIsUtf8, + bool a_bUseMultiKey, + bool a_bUseMultiLine + ) +{ + // load the file + CSimpleIni ini(a_bIsUtf8, a_bUseMultiKey, a_bUseMultiLine); + _tprintf(_T("Loading file: %s\n"), a_pszFile); + std::ifstream instream; + instream.open(a_pszFile, std::ifstream::in | std::ifstream::binary); + SI_Error rc = ini.LoadData(instream); + instream.close(); + if (rc < 0) { + printf("Failed to open file.\n"); + return false; + } + + Test(ini); + + // save the file (simple) + _tprintf(_T("\n-- Saving file to: testsi-out-streams.ini\n")); + std::ofstream outstream; + outstream.open("testsi-out-streams.ini", std::ofstream::out | std::ofstream::binary); + ini.Save(outstream); + outstream.close(); + + return true; +} +#endif // SI_SUPPORT_IOSTREAMS + +static bool +TestFile( + const TCHAR * a_pszFile, + bool a_bIsUtf8, + bool a_bUseMultiKey, + bool a_bUseMultiLine + ) +{ + // load the file + CSimpleIni ini(a_bIsUtf8, a_bUseMultiKey, a_bUseMultiLine); + _tprintf(_T("Loading file: %s\n"), a_pszFile); + SI_Error rc = ini.LoadFile(a_pszFile); + if (rc < 0) { + printf("Failed to open file.\n"); + return false; + } + + // run the tests + Test(ini); + + // save the file (simple) + _tprintf(_T("\n-- Saving file to: testsi-out.ini\n")); + ini.SaveFile("testsi-out.ini"); + + // save the file (with comments) + // Note: to save the file and add a comment to the beginning, use + // code such as the following. + _tprintf(_T("\n-- Saving file to: testsi-out-comment.ini\n")); + FILE * fp = NULL; +#if __STDC_WANT_SECURE_LIB__ + fopen_s(&fp, "testsi-out-comment.ini", "wb"); +#else + fp = fopen("testsi-out-comment.ini", "wb"); +#endif + if (fp) { + CSimpleIni::FileWriter writer(fp); + if (a_bIsUtf8) { + writer.Write(SI_UTF8_SIGNATURE); + } + + // add a string to the file in the correct text format + CSimpleIni::Converter convert = ini.GetConverter(); + convert.ConvertToStore(_T("; output from testsi.cpp test program") + SI_NEWLINE SI_NEWLINE); + writer.Write(convert.Data()); + + ini.Save(writer, false); + fclose(fp); + } + + return true; +} + +static bool +ParseCommandLine( + int argc, + TCHAR * argv[], + const TCHAR * & a_pszFile, + bool & a_bIsUtf8, + bool & a_bUseMultiKey, + bool & a_bUseMultiLine + ) +{ + a_pszFile = 0; + a_bIsUtf8 = false; + a_bUseMultiKey = false; + a_bUseMultiLine = false; + for (--argc; argc > 0; --argc) { + if (argv[argc][0] == '-') { + switch (argv[argc][1]) { + case TCHAR('u'): + a_bIsUtf8 = true; + break; + case TCHAR('m'): + a_bUseMultiKey = true; + break; + case TCHAR('l'): + a_bUseMultiLine = true; + break; + } + } + else { + a_pszFile = argv[argc]; + } + } + if (!a_pszFile) { + _tprintf( + _T("Usage: testsi [-u] [-m] [-l] iniFile\n") + _T(" -u Load file as UTF-8 (Default is to use system locale)\n") + _T(" -m Enable multiple keys\n") + _T(" -l Enable multiple line values\n") + ); + return false; + } + + return true; +} + +extern bool TestStreams(); + +int +_tmain( + int argc, + TCHAR * argv[] + ) +{ + setlocale(LC_ALL, ""); + + // start of automated testing... + TestStreams(); + + // parse the command line + const TCHAR * pszFile; + bool bIsUtf8, bUseMultiKey, bUseMultiLine; + if (!ParseCommandLine(argc, argv, pszFile, bIsUtf8, bUseMultiKey, bUseMultiLine)) { + return 1; + } + + // run the test + if (!TestFile(pszFile, bIsUtf8, bUseMultiKey, bUseMultiLine)) { + return 1; + } +#if defined(SI_SUPPORT_IOSTREAMS) && !defined(_UNICODE) + if (!TestStreams(pszFile, bIsUtf8, bUseMultiKey, bUseMultiLine)) { + return 1; + } +#endif + + return 0; +} + diff --git a/PUBKEY-FellowTraveler.asc b/PUBKEY-FellowTraveler.asc new file mode 100644 index 000000000..d3e073675 --- /dev/null +++ b/PUBKEY-FellowTraveler.asc @@ -0,0 +1,64 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 + +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 +=6+N5 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/README.md b/README.md new file mode 100644 index 000000000..22e949d4d --- /dev/null +++ b/README.md @@ -0,0 +1,192 @@ + +WHAT IS 'Open Transactions' ? +==================================== + +Open-Transactions is a solid, easy-to-use, Financial Crypto and Digital Cash LIBRARY, including a working SERVER, API, CLI, and TEST-GUI. + +## WHAT DOES IT DO? + +Screenshots (of the TEST GUI): +https://github.com/FellowTraveler/Moneychanger + + * Open-Transactions allows users to issue and manipulate digital assets. Users may create many pseudonyms (public keys), each of which may own asset accounts of various types. Users can transfer digital assets securely between accounts (even a server cannot change balances or forge transactions.) Users can also operate "cash-only" (without accounts) for maximum anonymity. + * Open-Transactions supports a range of financial instruments, such as cheques, vouchers, and untraceable digital cash. These are all analogous to the same financial instruments that we all use at normal banks today. Everyone already has an intuitive understanding of these financial instruments, because we use them regularly in our normal daily lives. + * Open-Transactions also implements higher-level, contract-based transactions such as payment plans and markets with trades. The markets on Open-Transactions support market orders, limit orders, fill-or-kill orders, day orders, stop orders, and stop limits, just like trading on a real market. OT also supports basket currencies. + * All of this is accomplished in such a way that all parties are able to prove, at all times, which transactions have cleared and which instruments are authorized, without having to store their entire transaction history, but instead by merely keeping the last signed receipt. + * Without the special mechanism that makes this possible, all parties would otherwise be forced to store all receipts forever, just to prove their story in the event of a dispute. (Any system where parties cannot "prove their story" will eventually break down and fail.) Thankfully, this is not a problem in Open-Transactions, which proves everything using only the last signed receipt. + +The real beauty of Open-Transactions is the as-yet-unwritten future of new ideas that you can build with it, and the future liberty and security of your children that you can help to protect by doing so, in a very real and tangible way. + +## IS IT CENTRALIZED? + + The vision is not of a central server that you must trust. + Rather, the vision is of federated servers you don't have to trust. + +==================================== + +## RESOURCES + +Video Walkthru: +Part 1: http://vimeo.com/28141679 +Part 2: http://vimeo.com/28142096 + +Radio Interview: +Part 1: http://agoristradio.com/?p=234 +Part 2: http://agoristradio.com/?p=246 + +Mailing list: +open-transactions-subscribe@rayservers.com + +Diagrams: +Architecture Overview: http://opentransact.nevermeta.com/OT%20Diagram.jpg + +Fully-Anonymous (cash only): http://opentransact.nevermeta.com/OT-Anon-CashOnly.jpg + +Pseudo-Anonymous (using accounts): http://opentransact.nevermeta.com/OT-Pseudonym-Instruments.jpg + +==================================== + +Please see the project page: +http://github.com/FellowTraveler/Open-Transactions/wiki + +Downloads: +Core: http://github.com/FellowTraveler/Open-Transactions/downloads +GUI: http://github.com/FellowTraveler/Moneychanger/downloads + +Use cases: +http://github.com/FellowTraveler/Open-Transactions/wiki/Use-Cases + +FAQ: +http://github.com/FellowTraveler/Open-Transactions/wiki/FAQ + +Business cases: +http://github.com/FellowTraveler/Open-Transactions/wiki/Business-Cases + +Release notes: +http://github.com/FellowTraveler/Open-Transactions/wiki/Release-Notes + + +THIS IS ONLY EXPERIMENTAL SOFTWARE AND IS NOT YET READY FOR PRIME TIME. + + +"Seeking developers to contribute by writing client software and +doing other integrations! I will support you on the OT API. Let's +make this happen!" -Fellow Traveler + + +==================================== + + +The server itself is a transaction processor in the cypherpunk +tradition. In more detail: + +-- Many financial instruments are supported: Users can write +cheques, purchase cashier's cheques ('vouchers'), and withdraw in +untraceable digital cash. The software uses Chaumian-style, blinded +tokens courtesy of the Lucre library by Ben Laurie. + +-- It's like PGP FOR MONEY. The idea is to have many cash +algorithms, not just Lucre. I'd like to add Chaum's version, Brands' +version, etc. So that, just like PGP, the software should support as +many of the top algorithms as possible, and make it easy to swap +them out when necessary. + +-- User accounts are pseudonymous. A user account is a public key. +(This is like PKTP.) You can open as many user accounts as you want. +Full anonymity is possible only for 'cash-only' transactions (where +users only perform token exchanges), whereas pseudonymity means that +transactions can be linked to the key that signed them. (While the +real life identity of the owner is hidden, continuity of reputation +becomes possible when using pseudonyms.) + +-- ANY USER CAN ISSUE new digital currencies and digital asset +types, by uploading the new currency contract to the server. (This +functionality is comparable to Ricardo, the transaction server by +IanG.) + +-- No Account History. Client and server are able to conduct +transactions, and agree on current holdings, via signed receipts, +without the need to store any transaction history (beyond the +last receipt itself.) See Bill St. Clair's excellent Truledger +(http://truledger.com/) for another example of this concept. + +-- The server cannot forge your signature, and thus cannot change +your balance without your signed permission, (since it can't falsify +any receipt.) The server is likewise on the hook with the issuer, for +the same reason. This is because the receipt IS the account, and +because the server cannot sign the receipt until you have signed it +first--and the server cannot forge your signature. + +-- Open Transactions also features MARKETS. Any two asset types can +be traded against each other. The markets are full-featured and +include LIMIT ORDERS, STOP ORDERS, FILL-or-KILL orders, DAY orders +(date ranges), and stop limits. + +-- Open Transactions also supports BASKET CURRENCIES. Users can +define their own, and the server handles the process of exchanging +in and out of basket accounts. Baskets are treated by the software +like any other asset type, (you can open accounts, transfer funds, +withdraw cash, write cheques, and even trade basket currencies on +markets.) + +-- Open Transactions also supports PAYMENT PLANS. Users can sign +contracts with each other, and the server will carry out the terms +and implement the payment plan. (A future goal is to issue new asset +types based on revenue from payment plans--so they can also be +traded on markets.) + +-- CONTRACTS, in general, are very important to Open Transactions; +they are the building block of the entire library. Open Transactions +uses a Ricardian-style contract, and all the various instruments, +data files, and messages resemble PGP-signed XML files. All objects +serialize to a string. + +-- The philosophy of the software is based around the SEPARATION OF +POWERS (issuers and transaction servers being separate entities -- +See Loom for another example of this.) as well as the DISTRIBUTION +OF RISK. For example, assets of a single type can be distributed +across many many servers, AND a certain asset type can also be +distributed across multiple issuers (via basket currencies.) + +-- Future (possible or planned) instruments include: +Interest-bearing bonds, dividend-paying stocks, real bills, and +collateralized debt obligations. These features aren't available yet, +but they are easy to add given the existing OT infrastructure. + +-- All communications are secured with OpenSSL. All messages are +also signed and encrypted. All transactions require signatures from +relevant parties including the server. + +-- Open Transactions is free software (GNU), written in C++, +object-oriented, and includes a high-level API in Java, Ruby, +Python, C, D, C++, Obj-C, C#, Lisp, Perl, PHP, and Tcl. (Also +supporting JRuby, Jython, and any other language available on the +JVM.) + +-- The software is fully cross-platform: Linux, Mac OS X, FreeBSD, +Android, and Windows are supported with makefiles, project files, +and instructions. + +-- The library is transfer-protocol neutral as well as storage +neutral, and could be utilized across a variety of different +transfer protocols and storage systems. The current test server and +client use the ZeroMQ library for messages, and a storage abstraction +is employed to make it easy for you to swap in any storage method +you need. (Filesystem by default, but you can store anywhere.) + +The intention is for this software to be integrated as many places +as possible... Games, digital cash wallets, distributed data stores, +secure voip apps, anonymous bit torrent networks, mixnets, +remailers, nym servers, etc. There are many other potential uses. + +IT IS ONLY BY MAKING THIS SORT OF SOFTWARE PART OF THE FABRIC OF +OUR INFRASTRUCTURE ITSELF, THAT WE FINALLY ACCOMPLISH ASSURANCE FOR +OUR POSTERITY. BE WARNED: THE TIME IS SHORT. + +This product includes software developed by Ben Laurie for use in +the Lucre project. + + + + + diff --git a/docs/LICENSE-AND-CREDITS.txt b/docs/LICENSE-AND-CREDITS.txt new file mode 100644 index 000000000..d66061644 --- /dev/null +++ b/docs/LICENSE-AND-CREDITS.txt @@ -0,0 +1,2059 @@ +Moneychanger v0.06 +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + + * M O N E Y C H A N G E R + * + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * Open Transactions: + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * OFFICIAL PROJECT WIKI: + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more + * details. + +-----BEGIN PGP SIGNATURE----- +wsFVAwUBTbFZUwMIAO35UbuOAQjDRBAAmIUJBi5/WC1KpI4TNAWdQNh6g59qYS6w +SI6mTMbnP0DUVOrmJdNR7/n1sRlnWzyjKLcKkRtXwRWGC+jE16jijxek9Ome5Qid +bDqjHSuFvqnsD3+0tbENf+kVrbAReU3YvWk+xFvVc6I2NpS+lEIdjHIWm85jSmew +Ydx+4KpELkO59thkcKgSYsTSyTP3l9GOTtJlq45XiamoEvso4jFUC1y5KMQsz1KH +DTE32m5FPZqJqUw9loAmrni3dIMpXKC5yLhdqSMXHK0MAPEIexsuaZjrjKJQSjwV +eDjwJcMn2WZVvcIr9IEoKEU/2j9wHNZv5Xuj78A/78AkjqEUwrY1M9ht0r/QbusW +ZT7MlxNCq4DFstrjyKi03yZQGR+m8eJFHE7GvF8Vzg/ap0/CUJzeoXg5wACXGfJj +k6y8ZBriQO08JECki2sy6oTitDoi7FmzgAIxPGB1qA4HMur/LuzrxAj2V7XkZQlk +VfAda6Ff9bmStNut+zbsQ0pnIeL/URwWifI8Wq81c7DEIvA5SH/bU9Hws1FMO8PU +BcDmzadU+syJBTxoP/mHZcLfwHDhcZyBeHX7sHfpHweEunzWjcHjqVCutQMO4dii +yrsc64WTfAqd4s12SfKMgVFLeL/FUYH7MNqpfgjgwX5co817m9VvCntU6njIuYtV +6+G/TuSViH8= +=/jIC +-----END PGP SIGNATURE----- + **************************************************************/ + + + + + + + +Open Transactions v0.72b +(Scroll to the bottom to see the complete AGPLv3.) +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (Darwin) + +iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki +hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K +7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F +R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U +GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU +BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp +Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 +0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX +5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH +RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s +DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O +qg/U8uXzgLQuLbFxBjyr +=utx2 +-----END PGP SIGNATURE----- +**************************************************************/ + + + + + +SIGNED PUBLIC KEY FOR AUTHOR. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Public key for "FellowTraveler", author: + +- -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: PGP Desktop 10.0.1 + + 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 + =6+N5 + -----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.10 (Darwin) + +iQIcBAEBCAAGBQJNsWCWAAoJEAMIAO35UbuOv3kP/Rd6UekX27+rHiMPfo8vN1Iz +cjXg3o7J4BWsppZQppT4r1ZmZ6ftVXDxfSeR22kWQeU7IjNjDKcQ8Vh0P1x/DHva +YczzHzQsiGGCWVzCyJyh8ENreS0mFAM6RqAP7HwOE+5iJstSatN5EHd0Om+QQvKJ +xdSe8pct6y4NjhfjXm1bfIV4suadQodFw4qp3h3LfVypPEeiGD0ohAJ2l7zO/bE3 +xNxvvj/WLfqyxVVc1pip7CzNNJTr+bQI1hh3nFXTElH+zu/YXvob4NPySruh98wE +PxzFnZ+Nl0n13+sfUW/tdI2xYWo7IZ34Ft2SjCy3He9rSLE5keke3loT8r50tu3J +pfpwDUHXAJO6nQFMbiAIEc/n+B42s8AvQ/PNmQA1/JcdlQaeBA2+k/ursOPSajDb +sTjsqsBsp5AYXAIJUbvzDDIz/2gzRcZjXaj+P9YfH00gJ2ZmKM1gTLWFrYRURIW7 +dRLUMY6HvDtyjAlO9LnvuwbdBU6jQb9EaE7FOQuO4LG62Rh9irHo3j7/FjJZkllj +g7Ypjamz9+U/5Jt2V7ivvmPbZ/IGu5dA2bw3Pqf0LtTMGqiLQWFmXLRlZ44DPv6Q +MvrCHCsSZB/Dgb4A8vZYFLbY2kzqf+g1ra4qWkKQFyNkwCbSU1p1xj2rnrRmWwSf +kLZLksZLPzcxEHdPh6YV +=/Nb5 +-----END PGP SIGNATURE----- + + + + +A few relevant notes, followed by contributor credits: + + +"The silver is mine, and the gold is mine, says the LORD of hosts." +Haggai 2:8 + +"By your wisdom and your understanding you have made wealth for + yourself, and have gathered gold and silver into your treasuries" +Ezekiel 28:4 + +"Precious treasure and oil are in a wise man's dwelling, + but a foolish man devours it." +Proverbs 21:20 + +"Because you say, 'I am rich, and increased with goods, and I need nothing,' + and you know not that you are wretched, and miserable, and poor, and blind, + and naked... +"I counsel you to buy from me gold refined by fire, so that you may be rich, + and white garments so that you may clothe yourself and the shame of your + nakedness may not be seen, and salve to anoint your eyes, + so that you may see." +Rev. 3:17-18 + +"Say to the children of Israel, I am the LORD, + and I will bring you out from under the burdens of the Egyptians, + and I will rid you out of their bondage, + and I will redeem you with a stretched out arm, + and with great judgments. + And I will take you to me for a people, + and I will be to you a God: + and you shall know that I am the LORD your God, + which brings you out from under the burdens of the Egyptians. + And I will bring you in unto the land, + concerning which I did swear to give it to Abraham, to Isaac, and to Jacob; + and I will give it you for an heritage: I am the LORD." +Exodus 6:6-9 + +"After the doings of the land of Egypt, + (where you lived before), you shall not do: + and after the doings of the land of Canaan, + (where I am bringing you), you shall not do: + neither shall you walk in their ordinances. + You shall do MY judgments, and keep MY ordinances, + to walk in them: I am the LORD your God. + You shall therefore keep my statutes, and my judgments: + which if a man does, he shall live in them: I am the LORD." +Leviticus 18:1-5 + +"Except the LORD build the house, they labor in vain that build it: + except the LORD keep the city, the watchman wakes in vain." +Psalms 127 + +"Do what is right and good in the Lord's sight, + so all will go well with you." +Deuteronomy 6:18 + +"Hate evil, and love good, + and establish justice in the courts." +Amos 5:15 + +"Justice, and only justice, you shall follow, that you may live and + inherit the land that the Lord your God is giving you." +Deuteronomy 16:20 + +"Select capable men, + from all the people, + men who fear God, + trustworthy men who hate dishonest gain, + and appoint them as officials over thousands, + hundreds, fifties and tens." +Exodus 18:21 + +"Let every soul be subject unto the higher powers. + For there is no power but of God: + the powers that be are ordained of God. + Whosoever therefore resists the power, resists the ordinance of God: + and they that resist shall receive to themselves condemnation. + For rulers are not a terror to good works, but to the evil. + Will you then not be afraid of the power? + Do that which is good, and you shall have praise of the same: + For he is the minister of God to you for good. + But if you do that which is evil, be afraid; + for he bears not the sword in vain: + for he is the minister of God, + a revenger to execute wrath upon him that does evil. + Therefore you must be subject, not only for wrath, + but also for conscience sake." +Romans 13:1-5 + +"Woe to those... + who justify the wicked for a bribe, + and take away the rights of the innocent." +Isaiah 5:23 + +"Woe unto those who decree unrighteous decrees, and + write grievousness which they have prescribed;" +Isaiah 10:1 + +"And David said to God, +'Wasn't it I who commanded the people to be numbered? + I am the one who has sinned, and done evil indeed'" +1 Chronicles 21:17a + +"Woe to those who scheme iniquity, + who work out evil on their beds! + When morning comes, they do it, + (for it is in the power of their hands.) + They covet fields and then seize them, + and houses, and take them away. + They rob a man and his house, + a man and his inheritance." +Micah 2:1-2 + +"Then came also publicans to be baptized, and said unto Him, + 'Master, what shall we do?' + And He said to them, + 'Exact no more than that which is appointed you.' + And the soldiers likewise demanded of Him, saying, + 'And what shall we do?' + And He said to them, + 'Do violence to no man, + neither accuse any falsely; + and be content with your wages.'" +Luke 3:12-14 + +"Do not pervert justice; + do not show partiality to the poor + or favoritism to the strong, + but judge your neighbor fairly." +Leviticus 19:15 + +"You shall not go after the majority to do evil. + Neither shall you testify in a matter of strife + to incline after the majority to pervert justice." +Exodus 23:2 + +"You shall not accept a bribe, + for a bribe blinds the eyes of the wise, + and subverts the cause of the righteous." +Deuteronomy 16:19 + +"You shall not lend upon usury to thy brother; + usury of money, usury of victuals, + usury of any thing that is lent upon usury: + Unto a stranger you may lend upon usury; + but unto your brother you shall not lend upon usury: + that the LORD your God may bless you in all that you set your hand to + in the land you go to possess." +Deuteronomy 23:19-20 + +"You shall not have different weights in your bag, a great and a small. + You shall not have different measures in your house, a great and a small. + But you shall have a perfect and just weight, a perfect and just measure + you shall have: That your days may be lengthened in the land which the + LORD your God gives you." +Deuteronomy 25:13 + +"You shall not steal." +Exodus 20:15 + +"Different weights, and different measures, both of them are alike + abomination to the LORD." +Proverbs 20:10 + + He overturned the tables of the money-lenders, + and the benches of those selling doves. + "It is written," he said to them, + "'My house will be called a house of prayer,' (1) + but you are making it a 'den of thieves'." (2) +Matthew 21:12b-13, 1. Isaiah 56:7, 2. Jeremiah 7:11 + +"The rich rule over the poor, and the borrower is servant to the lender." +Proverbs 22:7 + +"Be not deceived; God is not mocked: for whatsoever a man sows, + he shall also reap." +Galatians 6:7 + +"You are bought with a price; be you not the servants of men." +1 Corinthians 7:23 + +"You cannot serve both God and Mammon." +Luke 16:13 + +"Now the Lord is the Spirit, + and where the Spirit of the Lord is, there is liberty." +2 Corinthians 3:17 + +"Proclaim liberty throughout all the land unto all its inhabitants." +Leviticus 25:10 + +"From any tree of the garden you may eat freely;" +Genesis 2:16a + +"So in everything, do unto others what you would have them do unto you, +for this sums up the Law and the Prophets." +-Jesus Christ, Matthew 7:12 + +"We must obey God rather than men." +Acts 5:29 + +"For the LORD is our judge; + the LORD is our lawgiver; + the LORD is our king." +Isaiah 33:22 + +"And it shall come to pass, if you listen diligently + to the voice of the Lord your God, + to observe and to do all his commandments + which I command you today, + that the Lord your God will set you on high, + above all nations of the earth" +Deuteronomy 28:1 + +"Righteousness exalts a nation." +Proverbs 14:34 + +"Tell the righteous it will be well with them, + for they will enjoy the fruit of their labor." +Isaiah 3:10 + +"A righteous man knows the rights of the poor; + a wicked man does not understand such knowledge." +Proverbs 29:7 + +"Is it not lawful for me to do what I wish with my own things?" +-Jesus Christ, Matthew 20:15 + +"The man who looks intently into the perfect law that gives freedom, + and continues to do this, not forgetting what he has heard, but doing it, + he will be blessed in what he does." +James 1:25 + +"Whoever hears these words of mine and puts them into practice, + he is like a wise man, who built his house upon a rock: + and the rain descended, + and the floods came, + and the winds blew, + and beat upon that house; + yet it fell not: + for it was founded upon a rock." +Matthew 7:24-25 + +"Observe and hear all these words which I command you, that it may + go well with you, and with your children after you forever, + when you do that which is good and right + in the sight of the LORD your God." +Deuteronomy 12:28-32 + +"It is for freedom that Christ has set us free. Stand firm, then, + and do not let yourselves be burdened again by a yoke of slavery." +-Galatians 5:1 + +"Whoever hears these words of mine and fails to do them, + he is like a foolish man who built his house upon the sand, + and the rain descended, + and the rivers came, + and the winds blew, + and they dashed against that house; + and it fell -- and its fall was great." +Matthew 7:26-27 + +"My people are destroyed for lack of knowledge: + because you have rejected knowledge, + I will also reject you, + that you shall be no priest to me: + seeing you have forgotten the law of your God, + I will also forget your children." +Hosea 4:6 + +"Come now you rich, + weep and howl for your miseries + which are coming upon you. + Your riches have rotted + Your gold and your silver have rusted + and their rust will be a witness against you. + It is in the last days that you have stored up your treasure! + Behold, the pay of the laborers who mowed your fields + (which has been withheld by you) + cries out against you, + and the outcry of those who did the harvesting + has reached the ears of the Lord of the Sabbath. + You have lived luxuriously on the earth, + and led a life of wanton pleasure. + You have fattened your hearts in a day of slaughter. + You have condemned and murdered the righteous man;" +James 5:1-6 + +"'...And you had turned, and had done right in my sight, in + proclaiming liberty, every man to his neighbor; and you had made a + covenant before me in the house which is called by my name. +"'But you turned and polluted my name, and caused every man his + servant, and every man his handmaid, whom you had set at liberty, to + return, and brought them into subjection, to be your servants and + handmaids. +"'Therefore,' (thus says the Lord) 'You have not hearkened unto me, + in proclaiming a liberty, every one to his brother, and every man to his + neighbor: behold, I proclaim a liberty for you, says the Lord, to the + sword, to the pestilence, and to the famine; and I will make you to be + removed into all the kingdoms of the earth.'" +Jeremiah 34:15-17 + +"Now it shall come to pass in the latter days + that the mountain of the LORD's house + shall be established on the top of the mountains, + and shall be exalted above the hills; + and all nations shall flow to it. + Many people shall come and say: + 'Come, and let us go up to the mountain of the Lord, + to the house of the God of Jacob; + He will teach us His ways, + and we shall walk in His paths.' + For out of Zion shall go forth the law, + and the word of the Lord from Jerusalem." +Isaiah 2:2-3 + +"In the last days... everyone will + sit under their own vine, + and under their own fig tree, + and no one will make them afraid, + for the LORD Almighty has spoken." +Micah 4:1-4 + +"Because the creature itself also shall be delivered + from the bondage of corruption + into the glorious liberty of the children of God." +Romans 8:21 + + + +Thomas Paine wrote in COMMON SENSE: + +Government by kings was first introduced into the world by the +Heathens, from whom the children of Israel copied the custom. It was +the most prosperous invention the Devil ever set on foot for the +promotion of idolatry. The Heathens paid divine honors to their +deceased kings, and the Christian world hath improved on the plan by +doing the same to their living ones. + +How impious is the title of sacred majesty applied to a worm, who in +the midst of his splendor is crumbling into dust! + +As the exalting one man so greatly above the rest cannot be +justified on the equal rights of nature, so neither can it be +defended on the authority of scripture; for the will of the +Almighty, as declared by Gideon and the prophet Samuel, expressly +disapproves of government by kings. + +All anti-monarchial parts of scripture have been very smoothly +glossed over in monarchial governments, but they undoubtedly merit +the attention of countries which have their governments yet to form. +Render unto Caesar the things which are Caesar's is the scriptural +doctrine of courts, yet it is no support of monarchial government, +for the Jews at that time were without a king, and in a state of +vassalage to the Romans. + +Near three thousand years passed away from the Mosaic account of the +creation, till the Jews under a national delusion requested a king. +Till then their form of government (except in extraordinary cases, +where the Almighty interposed) was a kind of republic administered +by a judge and the elders of the tribes. Kings they had none, and it +was held sinful to acknowledge any being under that title but the +Lords of Hosts. + +And when a man seriously reflects on the idolatrous homage which is +paid to the persons of kings he need not wonder, that the Almighty, +ever jealous of his honor, should disapprove of a form of government +which so impiously invades the prerogative of heaven. +... +The children of Israel being oppressed by the Midianites, Gideon +marched against them with a small army, and victory, through the +divine interposition, decided in his favor. The Jews, elate with +success, and attributing it to the generalship of Gideon, proposed +making him a king, saying, "Rule thou over us, thou and thy son and +thy son's son." + +Here was temptation in its fullest extent; not a kingdom only, but +an hereditary one, but Gideon in the piety of his soul replied, "I +will not rule over you, neither shall my son rule over you, THE LORD +SHALL RULE OVER YOU." + +Words need not be more explicit; Gideon doth not decline the honor +but denies their right to give it; neither doth he compliment them +with invented declarations of his thanks, but in the positive style +of a prophet charges them with disaffection to their proper +sovereign, the King of Heaven. + +About one hundred and thirty years after this, they fell again into +the same error. The hankering which the Jews had for the idolatrous +customs of the Heathens, is something exceedingly unaccountable; but +so it was, that laying hold of the misconduct of Samuel's two sons, +who were entrusted with some secular concerns, they came in an +abrupt and clamorous manner to Samuel, saying, "Behold thou art old +and thy sons walk not in thy ways, now make us a king to judge us +like all the other nations." + +And here we cannot but observe that their motives were bad, viz., +that they might be like unto other nations, i.e., the Heathen, +whereas their true glory laid in being as much unlike them as +possible. But the thing displeased Samuel when they said, give us a +king to judge us; and Samuel prayed unto the Lord, and the Lord said +unto Samuel, "Listen to the voice of the people in all that they say +to you, for they have not rejected you, but they have rejected me, +THEN I SHOULD NOT REIGN OVER THEM. According to all the works which +they have done since the day; wherewith they brought them up out of +Egypt, even unto this day; wherewith they have forsaken me and served +other Gods; so do they also unto you. + +"Now therefore hearken unto their voice, howbeit, protest solemnly +unto them and show them the manner of the king that shall reign over +them," i.e., not of any particular king, but the general manner of +the kings of the earth, whom Israel was so eagerly copying after. +And notwithstanding the great distance of time and difference of +manners, the character is still in fashion. + +And Samuel told all the words of the Lord unto the people, that +asked of him a king. And he said, "This shall be the manner of the +king that shall reign over you: + +"He will take your sons and appoint them for himself for his +chariots, and to be his horsemen, and some shall run before his +chariots [this description agrees with the present mode of +impressing men] and he will appoint him captains over thousands and +captains over fifties, and will set them to ear his ground and to +reap his harvest, and to make his instruments of war, and +instruments of his chariots; and he will take your daughters to be +confectionaries and to be cooks and to be bakers [this describes the +expense and luxury as well as the oppression of kings] and he will +take your fields and your olive yards, even the best of them, and +give them to his servants; and he will take the tenth of your seed, +and of your vineyards, and give them to his officers and to his +servants [by which we see that bribery, corruption, and favoritism +are the standing vices of kings] and he will take the tenth of your +men servants, and your maid servants, and your goodliest young men +and your asses, and put them to his work; and he will take the tenth +of your sheep, ---and ye shall be his servants--- and ye shall cry +out in that day because of your king which ye shall have chosen, AND +THE LORD WILL NOT HEAR YOU IN THAT DAY." + +This accounts for the continuation of monarchy; neither do the +characters of the few good kings which have lived since, either +sanctify the title, or blot out the sinfulness of the origin; the +high encomium given of David takes no notice of him officially as a +king, but only as a man after God's own heart. + +Nevertheless the People refused to obey the voice of Samuel, and +they said, "Nay, but we will have a king over us, that we may be like +all the nations, and that our king may judge us, and go out before +us and fight our battles." + +Samuel continued to reason with them, but to no purpose; he set +before them their ingratitude, but all would not avail; and seeing +them fully bent on their folly, he cried out, "I will call unto the +Lord, and he shall send thunder and rain [which then was a +punishment, being the time of wheat harvest] that ye may perceive +and see that your wickedness is great which ye have done in the +sight of the Lord, IN ASKING YOU A KING." + +So Samuel called unto the Lord, and the Lord sent thunder and rain +that day, and all the people greatly feared the Lord and Samuel. And +all the people said unto Samuel, "Pray for thy servants unto the Lord +thy God that we die not, for WE HAVE ADDED UNTO OUR SINS THIS EVIL, +TO ASK A KING." + +These portions of scripture are direct and positive. They admit of +no equivocal construction. That the Almighty hath here entered his +protest against monarchial government is true, or the scripture is +false. And a man hath good reason to believe that there is as much +of kingcraft, as priestcraft in withholding the scripture from the +public in Popish countries. For monarchy in every instance is the +Popery of government. + + + + + +----------------------------------------------------------------- + + + + + + + + More detailed credits regarding the other contributors: + + + + + * ==================================================================== + * + * LUCRE -- Anonymous Electronic Tokens v1.8 + * Copyright (c) 1999, 2000, 2009 Ben Laurie. All rights reserved. + * + * OFFICIAL SITE: http://anoncvs.aldigital.co.uk/lucre/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * 4. The name "Lucre" must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 5. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR + * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + + + +/*************************************************************************** + +www.OpenSSL.org (Crypto library) + +(Open Transactions does not actually contain the OpenSSL code, but merely +links to it. Nevertheless, these credits are provided in respect of the people +who worked on the project.) + +OpenSSL is based on the excellent SSLeay library developed by Eric A. Young and Tim J. Hudson. +The OpenSSL toolkit is licensed under a Apache-style licence which basically means that you are +free to get and use it for commercial and non-commercial purposes. + +The current OpenSSL core team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Mark J. Cox mark@openssl.org mark@awe.com UK +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK +Ben Laurie ben@openssl.org ben@algroup.co.uk UK + +The current OpenSSL development team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location Key ID +Mark J. Cox mark@openssl.org mark@awe.com UK 49A563D9 +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE 26BB437D +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK F295C759 +Lutz Jänicke jaenicke@openssl.org lutz@lutz-jaenicke.de DE 9C58A66D +Nils Larsch nils@openssl.org nils@larsch.net DE +Ben Laurie ben@openssl.org ben@algroup.co.uk UK 2118CF83 +Richard Levitte levitte@openssl.org richard@levitte.org SE F709453B +Bodo Möller bodo@openssl.org bmoeller@acm.org DE 5A6A9B85 +Ulf Möller ulf@openssl.org mail@ulfm.de DE +Andy Polyakov appro@openssl.org appro@fy.chalmers.se SE +Geoff Thorpe geoff@openssl.org geoff@geoffthorpe.net QC + +OpenSSL Emeritae - old members now off doing other things (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Holger Reif holger@openssl.org holger@reif.net DE +Paul C. Sutton paul@openssl.org paul@awe.com UK + +*/ + + + +/********************************************************************* + + * easyzlib release 1.0 --- (Compression) + * + * Copyright (C) 2008 First Objective Software, Inc. (Used with + * permission.) + * + * This entire notice must be retained in this source code + * Redistributing this source code requires written permission + * This software is provided "as is", with no warranty. + * + * Latest fixes enhancements and documentation at www.firstobject.com + **********************************************************************/ + + + + +/*********************************************************************** + * ZLIB + * + * (Open Transactions does not actually contain the zlib code, but + * merely links to it via easyzlib. Nevertheless, these credits are + * provided in respect of the people who worked on the project.) + * + * + * 'zlib' general purpose compression library + * version 1.2.2, October 3rd, 2004 + * + * Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source + * distribution. + * + * Jean-loup Gailly jloup@gzip.org + * Mark Adler madler@alumni.caltech.edu + + ***********************************************************************/ + + + + +/* + * (PGP-to-OpenSSL Conversion) + * + * An implementation of conversion from PGP public key format to OpenSSL + * equivalent Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI http://www.idrix.fr + * Used with permission. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +// ------------------------------------------- + +/* + * STLplus (used for smart pointers) + * + * Author: Andy Rushton http://www.andyrushton.co.uk/ + * + * http://stlplus.sourceforge.net/ + * + * BSD-style license: + * http://stlplus.sourceforge.net/stlplus/docs/license.html + * + */ + +// ------------------------------------------- + +/* + * MESSAGE PACK (Used for packing data.) + * + * http://msgpack.org/ + * + * Copyright (C) 2008-2010 FURUHASHI Sadayuki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ------------------------------------------- + +/* + * PROTOCOL BUFFERS (Used for packing data.) + * + * http://protobuf.googlecode.com + * + * Copyright 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Code generated by the Protocol Buffer compiler is owned by the owner + * of the input file used when generating it. This code is not + * standalone and requires a support library to be linked with it. This + * support library is itself covered by the above license. + * + */ + +// ------------------------------------------- + +/* + * ZeroMQ (transport library.) + * + * http://www.zeromq.org/ + * + * ZeroMQ 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * ------------------------------------------------------ + * + * SPECIAL EXCEPTION GRANTED BY IMATIX + * + * As a special exception, iMatix gives you permission to link this library + * with independent modules to produce an executable, regardless of the + * license terms of these independent modules, and to copy and distribute + * the resulting executable under terms of your choice, provided that you + * also meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module which + * is not derived from or based on this library. If you modify this + * library, you must extend this exception to your version of the library. + * + * ------------------------------------------------------ + * + * Parts of the software are licensed under the MIT (X11) license + * as follows: + * + * Copyright (c) 2007-2010 Contributors as listed in AUTHORS + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +// ------------------------------------------- + + +/* (transport: OTMessage -> TCP -> SSL) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +// ------------------------------------------- + + +/* + * strlcpy and strlcat + * + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + + +/************************************************************************** + + irrXML --- (XML Parser) + +The irrXML license is based on the zlib license. Basically, this means you +can do with irrXML whatever you want: + +Copyright (C) 2002-2005 Nikolaus Gebhardt + +http://www.ambiera.com/irrxml/ + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +History + +As lots of references in this documentation and the source show, this xml +parser has originally been a part of the +Irrlicht Engine. But because +the parser has become very useful with the latest release, people asked for +a separate version of it, to be able to use it in non Irrlicht projects. +With irrXML 1.0, this has now been done. + +*/ + +// ------------------------------------------- + + + +/* + Simple Ini (Used for ini files.) + + Copyright (c) 2006-2008, Brodie Thiesfield + + The licence text below is the boilerplate "MIT Licence" used from: + http://www.opensource.org/licenses/mit-license.php + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +/* + * AnyOption 1.3 (Used for command-line options and config files.) + * + * kishan at hackorama dot com www.hackorama.com JULY 2001 + * + * With updates from Michael D Peters (mpeters at sandia.gov) + * and Boyan Asenov. + * + */ + + +// ------------------------------------------------------------------- + +/* + + C++ Big Integer Library + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, + waive my copyright to it, placing it in the public domain. The library + comes with absolutely no warranty. + + */ + + + + + +// ************************************************************************* + + + + +/* + It seems appropriate to mention a few other people who deserve mentioning. + + A moment of silence for "Jolly Good Fellow" Bernard von NotHaus, + the founder of NORFED who was recently (and wrongfully) convicted of + "domestic terrorism." + + For history, I will reproduce a few gloating FBI quotes: + + "Attempts to undermine the legitimate currency of this country + are simply a unique form of domestic terrorism." + ... + "We are determined to meet these threats through infiltration, + disruption, and dismantling of organizations which seek to challenge + the legitimacy of our democratic form of government." + ... + "While these forms of anti-government activities do not involve + violence, they are every bit as insidious and represent a clear and + present danger to the economic stability of this country." + + // ----------------------------------------------- + + Speaking of wrongful prosecution... + + Tip of the hat to Dr. Douglas Jackson for his sacrifices and + accomplishments. + May this software protect future innovators from persecution, in a + diversity of jurisdictions. And check out e-gold.com, as well as + goldmoney.com, igolder, pecunix, and all the other digital gold reserve + outfits. May they all soon be traded as a single basket currency using + this new software. + + // ----------------------------------------------- + + Thank you to David Chaum, for inventing digital cash in the first place. + + Kudos to David Wagner, and Ben Laurie, who brought us Lucre. + + Kudos to Ian Grigg for his many advancements in financial cryptography. + Check out his website at http://iang.org/ + + J. Orlin Grabbe and his writings have been inspirational. He will be + missed. His DMT as well as critiques of it were useful to me. + http://www.orlingrabbe.com/ + + Kudos to Phil Zimmermann for writing and releasing PGP. The man who put + power into the hands of the people. Many people in corrupt jurisdictions + now have PGP to thank for their lives. Let's do the same for their money. + + Bill St. Clair, whose Truledger was truly inspirational. Check out + Truledger at http://truledger.com/ + + Patrick Chkoreff, whose Loom is operational and is what showed me the + idea of separation of powers. Check out https://Loom.cc for more info. + + Andrew McMeikan's PKTP, which can be found here: http://pktp.co.cc/ + + Ryan Fugger's Ripple project, which will probably figure more into the + client development of OpenTransactions. http://ripple-project.org/ + + Jim Bell, of course. His story is partially the reason for this software. + I still don't understand why he was stink-bombing IRS offices instead of + writing code. But he definitely made his mark. + + Tim May for writing the Cyphernomicon. (Google it.) + + Robert A. Hettinga for his writings: http://www.philodox.com/ + + And of course SAMY, who wrote the famous MySpace worm, and who suggested + using two message digest algorithms XOR'd together in case one is ever + broken and needs to be swapped out. Thus the SAMY hash is named in his + honor, and utilizes WHIRLPOOL XOR'd with SHA-256. +*/ + + + + + +/************************************************************************** + + + ==================> OPEN TRANSACTIONS LICENSE <================== + + + * Components: + * Moneychanger..... A Java Client App..........LICENSE: GPLv3 + * OTLib............ A class library............LICENSE: LAGPLv3 + * OT-API........... A Client API...............LICENSE: LAGPLv3 + * testwallet....... A command-line client......LICENSE: LAGPLv3 + * OT-Server........ A Server Application.......LICENSE: AGPLv3 + * http://github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which was + * written by Vicky C (livewire_3001@yahoo.com) under contract. + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 section 7: + * This paragraph applies only to the LAGPLv3 components listed above. + * If you modify this Program, or any covered work, by linking or + * combining it with other code, such other code is not for that reason + * alone subject to any of the requirements of the GNU Affero GPL + * version 3. (This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to Open + * Transactions itself must be open source. Similar to LGPLv3, except + * it applies to software-as-a-service, not just distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries used by OT: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. The same is + * true for any other open source libraries included in this project: + * complete waiver from the AGPL is hereby granted to compile, link, + * and/or use them with Open Transactions, according to their own terms, + * as long as the rest of the Open Transactions terms remain respected, + * with regard to the Open Transactions code itself. + * + * Lucre License: + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. See Open-Transactions/OTLib/Lucre. + * The Laurie requirements are light, but if there is any problem with + * his license, simply remove the Lucre code. Although there are no other + * blind token algorithms in Open Transactions (yet. credlib is coming), + * the other functionality will continue to operate. + + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see: + . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . + +*/ + + + diff --git a/docs/RELEASE-NOTES.txt b/docs/RELEASE-NOTES.txt new file mode 100755 index 000000000..aa6ebf9dd --- /dev/null +++ b/docs/RELEASE-NOTES.txt @@ -0,0 +1,414 @@ + +NOTES on the Version: + +// -------------------------------------------------------------------- + + 0.72b--- Bug fix in Basket Exchange (which is now working in the GUI!) + + 0.72a--- More bug fixes. Plus: added more options to the ini files. + + 0.72 --- This release was all debugging. It's downright embarrassing, + all the bugs I still had to fix. A new version of the GUI is + coming soon, with matching fixes. + + 0.71 --- Massive upgrades to the command-line utility for OT, as well + as the addition of "make install". Lots of debugging. + Default data folders are now ~/.ot/server_data and ~/.ot/client_data + + 0.70 --- Added finalReceipt, basketReceipt, plus related internal changes. + Also added messages for DELETING accounts and nyms. + + 0.69 --- Bug fixes in preparation for the new MARKETS screen... + + 0.68 --- Minor bug fixes at the request of client developers. + + 0.67 --- Output now goes to a logfile (in the config file) or stderr. + No more logs to standard output. OT client no longer hangs if + server isn't running. Client and Server now both use ini files + as well as config files. + + 0.66 --- Added the rest of the Market API, since the GUI will soon + support it! + + 0.65 --- THE SAMPLE DATA WAS ALL RE-GENERATED... So grab it, plus the + latest version of the code. What all changed? + + I added default packing to all OTASCIIArmor strings. I think + OT should now be binary compatible across all platforms, but + we'll see. Oh and, due to this, re-generated all sample data. + + ===> Also added bindings for **the D programming language** + http://www.digitalmars.com/d/2.0/overview.html + + ===> Also added .ot_ini files! (What sorts of options would + YOU like to see in the configuration files for OT?) + + Also did some bug fixes in OTString, OTMint, and createmint. + + 0.64 --- Added default packing (currently protobuf) to all binary + to base64 encoding. I had a recent complaint about binary + incompatibility across platform, and this is either the + complete fix, or at least a strong beginning of a drive to + ensure binary compatibility across all platforms. + + 0.63 --- Open Transactions has entirely been converted to the NEW + STORAGE CLASS. (This means you can easily switch to different + storage systems, instead of using the filesystem, just by sub- + classing the OTDB::Storage class and overriding a few methods.) + + ==> IN OTHER NEWS: OT now uses the ZeroMQ library for transport! + To learn more about OT's new transport capabilities, check out + this guide: http://zguide.zeromq.org/page:all + + 0.62 --- Load/SaveWallet uses the new Storage class. Dynamic casting + was added to the storable objects. Pack/Unpack were debugged. + Store/Query now supports plain strings. Contact ID was added. + Storable objects now use smart pointers for internals. + + 0.61 --- Added new Storage context class! Currently filesystem supported + only, BUT you can now add any new storage you want simply by + subclassing OTDB::Storage and implementing a few methods!! Many + other storage methods can now quickly and easily be added. + + Furthermore, the Storage object was designed to make it easy to + swap Packing libraries. OT now supports MsgPack IN ADDITION TO + Google's Protobuf library. Soon these will also be used to + clear up any binary incompatibilities between different + systems running OT. (So the contracts will work on all systems + equally.) + + 0.60 --- Added password callback! Works in the API, in Java, etc. + + 0.59 --- Fixed ANOTHER old bug in receipt verification. + + 0.58 --- Added API stub for Import Nym + + 0.57 --- Fixed an old bug in receipt verification. + + 0.56 --- "Verify Last Signed Receipt against intermediary files" has + officially been added to the API. Also added more ability to + manipulate Tokens through the API. Also some debugging in + balance agreement (cleaned up an old bug that prevented + transactions while certain receipt types were in the inbox.) + + 0.55 --- Minor release, goes along with Moneychanger (new Java GUI.) + + 0.54 --- OT now stores the last 1024 logs internally, and makes them + available via the API. Various other API debugging was done. + + 0.53 --- API functions for Nym outbox, and for checking success status + of a transaction message. Various other API fixes preparing + for the upcoming test GUI. + + 0.52 --- API functions for deleting Nyms, Accounts, and Contracts. + + 0.51 --- API functions for Mail and Transactions. + + 0.50 --- BASE-62-ENCODED IDs (much more compact.) + + 0.45 --- Added a few API functions and updated the Windows build. + + 0.44 --- RECEIPT VERIFICATION. Goes with the below change. Client-side + receipts are now saved after every transaction, and whenever + account/inbox/outbox files are downloaded, they're verified + against the last signed receipt. + + 0.43 --- BALANCE AGREEMENT / NO ACCOUNT HISTORY has been added! + Just make sure you grab the outbox and inbox, and the account + file, before doing a transaction, since they are needed + for balance agreement, which is now operational and required. + + 0.42 --- More bug fixes, plus added OT_API_CreateNym() (finally). + + 0.41 --- Bug fixes in support of API, added various transaction + types, receipt types, item types, to get full transfer + receipt process working end-to-end. + + 0.40 --- More additions to the API, plus many under-the-hood fixes. + + 0.39 --- Continually updating the API based on developer feedback. + + 0.38 --- Added Payment Plans, Markets, and Baskets to the API. Also + added message buffer access to the API, so you can read all + the server replies if you want to (or flush them...) + + 0.37 --- Added build option DSP=1, for using custom builds of OpenSSL, + and for turning off all the output logs. + + 0.36 --- Top-level build targets added for API in Python, Ruby, PHP, + and Perl! It's now this easy to build the API: + + cd Open-Transactions + make clean + + Then, from the same folder: + + make ruby + make python + make php5 + make perl5 + + (More languages are supported, but for now these are the ones + available at the top level.) + + 0.35 --- Huge additions to the API! See testwallet/OTAPI_funcdef.h + for the complete interface, with NOTES above each function. + + That same interface is also wrapped by SWIG, and available + in Java, Python, Ruby, Perl, Php, Lisp, etc, so those OTAPI + functions are relevant to ALL developers... + + People have asked about documentation so hopefully the API, + plus the notes within, will answer any questions for now + until more professional docs can be written. As always, feel + free to contact me with any questions. + + This release continues my push to make the library EASY and + ACCESSIBLE to all developers, in all languages, on all + platforms. There are already multiple developers who are + starting to play around with client software using the OTAPI, + and I am very responsive to their needs. + + *** The latest SECURITY notes.. + + ..Any new software requires testing with users AND peer review! + Open Transactions was recently reviewed by Ben Laurie, and + I accepted all the changes that he submitted. It's a good + start! This process must continue. + + ..In this release I have replaced all instances of strcpy + with strlcpy/strcpy_s, and all instances of sprintf with + snprintf/sprintf_s, and all instances of vsprintf with + vsnprintf/vsprintf_s, and all instances of strcat with + strlcat/strcat_s. It's important to make sure there are no + buffer overflows in this code. + + ..I also set up the code with Valgrind, and went through all + the warnings, adding comments, fixes, and exclusions where + appropriate or necessary. This process will continue, but + it's important to run code scanners on this sort of software! + + 0.34 --- (Various additions to the API at developer request.) + + 0.33 --- Slicker build process. This release is all about having an + EASY BUILD PROCESS, and is based on real-world feedback I've + been getting from YOU, my testers: + + * For ALL users: XmlRpc++ is now part of the distribution, + and is part of the build process. Various users had trouble + installing this library separately, so I integrated it into + the project. Now it's built-in! + + * For ALL users: Platform now auto-detected by MUCH easier/ + slicker Makefiles. + (And as with the last release, I was able to eliminate + several Makefiles.) To build (from main folder), just type: + + make + + (You may prefer 'make rpc', to build in the preferred XmlRpc mode.) + + * To build the API: + cd testwallet; + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=c + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=ruby + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=java + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=python + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=perl5 + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=php5 + make -f Makefile.API TRANSPORT=XmlRpc LANGUAGE=lisp + Etc... + Slick, eh? In all the above cases, the platform is + automatically detected. + See testwallet/API-README.txt for more notes. + + * For MAC users: The Makefiles had been using the wrong + location for OpenSSL (at least, for the Macports 1.0.0a + version) so I fixed this. The previous Makefiles referenced + the default location, where (the wrong) version 0.9.8 can be + found. (The new version looks in /opt, as used by MacPorts.) + + * For LINUX users: Now, OT attempts to link 64-bit libs where + appropriate. + + * For FREEBSD users: The full new Makefile is now FULLY + operational on FreeBSD, including the utilities + "createmint.exe" and "signcontract.exe", which were + previously unsupported on FreeBSD. + + // --------------------------------------------------------------------- + + 0.31 --- Native API, with easy Makefiles, added for C, C++, Objective-C, + C#, Java, Lisp, Ruby, Python, Perl, PHP, and Tcl. Also + supporting JRuby, Jython, and any other languages on the JVM. + + Transport is now implemented as a CALLBACK FUNCTION, which + means it is now VERY EASY to swap out to different forms of + transport (though XmlRpc is probably the last form we'll ever + need.) + + // --------------------------------------------------------------------- + + 0.30 --- MAJOR RELEASE! Markets, Payment Plans, and OT as a Web Service! + + *** Open Transactions is now officially a WEB SERVICE! The + server, client, and API now support *XML-RPC/HTTP*, in + addition to the TCP/SSL mode from before. Open Transactions + also now comes with an easy mechanism for substituting your + own transport mechanism, using a callback function. (ALL + transport protocols are welcome in Open Transactions...) + + *** Open Transactions now supports real MARKETS with full- + featured 2-way trades! These markets can do LIMIT orders, + STOP orders, DAY orders, FILL-OR-KILL orders, STOP LIMITS, + etc. Markets also have SCALE, which means bulk pricing, and + arbitrage. + + *** Open Transactions now supports PAYMENT PLANS. As long as both + parties have signed the contract, the server will continue + processing it according to its terms, placing receipts in the + inboxes of the two parties until the payments are done. + + *** All data files were removed to a data folder, and all file + paths were removed from data files (filenames are generated + now, when needed.) This all means datafiles are much easier + now to work with. + +// --------------------------------------------------------------------- + + 0.25 --- All file pointers were removed and replaced with C++ fstreams. + + An all new logging class, with errors, asserts, and multi- + verbosity output. See the OTLog.h and .cpp files for more. + (Centralizing the output and logging also helps porting + efforts.) + + All the test certs were regenerated, and the contracts were + re-signed, etc. This time they will last for 10 years, instead + of 30 days. Slight fix to the Open-Transactions/ssl Makefile. + + 0.24 --- FreeBSD working! + + 0.23 --- Android version! (In support of our upcoming Android client.) + UPDATE: this port is still ongoing, NOT perfect! Android has + many custom things and limitations. + + 0.22 --- EASY Makefiles and project files are now available for the + JNI Java interface, as well as the high-level C++ API. + + Now it's easier than ever to use Open Transactions in your + Java and C++ applications, for Mac, Linux, and Windows! + + Makefiles are supplied for MAC and LINUX, as well as project + files for XCode on Mac and MS Visual C++ 2010 Express on + Windows. + + "FiatCash" (the first client, on Android) is humming along + and hopefully we'll have some basic version soon up on Github. + + Negative transactions are no longer allowed for vouchers, + account transfers, or cash withdrawals. They are still, + however, allowed for cheques, which serve as invoices. + + Various global variable issues were cleaned up... + + 0.21 --- Windows release! + + Open Transactions now supports Windows, LINUX, and Mac OS X. + (In the same code base.) + + This distribution comes with gcc Makefiles for Mac and Linux, + as well as XCode project files for Mac and Microsoft VC++ + project files for Windows. + + The Windows port was at the request of an Android developer who + has begun work on a wallet (client app) that he calls + "FiatCash". + He will be building it on Windows, in Java, using the Open + Transactions JNI interface to talk to the library. When + complete, the wallet software will run on Android phones. + + INVOICES: Imagine that you hand someone an invoice. He runs it + through his bank account and the money is automatically + transferred to you, with receipts on both sides. This is the + same thing as a cheque with a negative amount. Thus, "negative + cheques" can be used as invoices. (Already operational.) + + Assorted: + + Many of the C Standard Library includes were replaced with their + C++ standard library versions. + + Other cleanups were made including some fixes to OTString (which + used to have some large stack-allocations) as well as a bug fix + in the socket code for the server / test client. + + The client cert expired, so I re-created all the certs. If you + have any problem with your own, just install the new version to + fix it. + +// --------------------------------------------------------------------- + + 0.2 --- Major Release! ALL NEW: + + JNI Interface (High-level Java API) + + High-level C++ Interface + + Spent Token Database is fully operational! + + Mints and Tokens now support Expiration AND Series. + + New Financial Instruments: Cheques and Vouchers. + + Reserve accounts are now working to store the backing funds + for cash withdrawals and vouchers (cashier's cheques.) + + Transaction numbers are fully working now. + + Nym files are now signed (to prevent tampering.) + + Hardcoding of paths was fixed, using config files and + command-line arguments now, so you can use the software + without having to change the code. + + Path separators were improved to support Windows-style paths + (though I haven't tried to actually build on Windows.) + + Numerous bug fixes. Including a big one: discarding + token signature after unblinding. + + +// --------------------------------------------------------------------- + + 0.11 --- Added LINUX support... + + Added Makefiles, and a few fixes related to Linux. + + OT now runs on TWO platforms: LINUX and Mac OS X. + +// --------------------------------------------------------------------- + + 0.1 --- The original goal was just proof-of-concept. There are many + TODOs listed on the project page, as well as throughout the + code. But it all works!!! + + A WARNING: This software is brand-spanking-new. The project has not +yet been audited for security or tested for any extended period of time. +Thus far, it must be considered as for experimental purposes only. + + --- There are still a few values that are hardcoded (in the client + and the server), unfortunately, but it's all documented and I + have everything set up already to run, so you don't have to + mess with them. This will be fixed next release. + +---------------------------------------------------------------------- + +The server expects its OWN cert to be in the transaction/certs folder. +The filename should be the server_user_ID from notaryServer.xml +(I HAVE ALREADY PLACED IT THERE.) + +This is the file that includes the server's public AND private key. + +---------------------------------------------------------------------- + diff --git a/docs/SSL-NOTES.txt b/docs/SSL-NOTES.txt new file mode 100755 index 000000000..92a0240fd --- /dev/null +++ b/docs/SSL-NOTES.txt @@ -0,0 +1,293 @@ + +There are certain files (keys, etc) that need to be in the SSL-Example folder +(for client AND server -- both have their own different versions of that folder). + +You can generate those files in the ssl folder by typing make. (Already done FYI.) +Then copy the appropriate files to the client and server SSL-Example folders. + + +** I have generated these files already and put them in the appropriate directories, +with all the test passwords set to "test". So if you just want to try it out, you're +already GOOD TO GO! + +** But if you would like to erase all the certs, these are the instructions for +re-creating them in a format that the software will use. + + +===> HOW IS THIS ALL DONE? + +1) Go to the main project folder and then: cd ssl + + +1.1 (optional) To erase the certs that I generated: + + make dhparamclean; make certclean + +ONLY IF YOU WANT TO WIPE THE CERTS I GENERATED. +Make sure if you do this, to wipe them out of the client and server SSL-Example folders +as well (the crt and pem files.) + +2) To generate certs, dhparams, (everything), Just type "make" and hit enter. + +3) Once they are created, some of the certs need to be copied to the server's SSL-Example +folder, and some of the files need to be copied to the client's SSL-Example folder: + +cd .. + +(now we are in the main project folder again: Open-Transactions) + +===> TO COPY THE SERVER FILES: +cp ./ssl/rootcert.pem ~/.ot/server_data/certs/special/ca.crt; +cp ./ssl/dh1024.pem ~/.ot/server_data/certs/special/dh_param_1024.pem; +cat ./ssl/servercert.pem ./ssl/serverkey.pem ./ssl/serverCAcert.pem ./ssl/rootcert.pem >~/.ot/server_data/certs/special/server.pem; + +------------------------------------ + +A copy of that server.pem also needs to go into the ~/.ot/server_data/certs folder, +under the filename of the server's User ID. I have already put it there, but since +you're recreating, you need to put the new one there: +(From within Open-Transactions folder still, as current directory...) + +cp ~/.ot/server_data/certs/special/server.pem ~/.ot/server_data/certs/SERVER_USER_ID_GOES_HERE + + +NOTE: +Just use the existing server user ID for the old cert (that you are currently replacing +with new certs by following this process.) + +In other words, the file already exists, and you are simply copying the new one +into the old one's filename, under the old one's ID. Why? Because that is part of +this process -- you will rename the file to the new ID later, once you get to that +step. + +------------------------------------ + +===> Next: TO COPY THE CLIENT FILES: + +cp ./ssl/rootcert.pem ~/.ot/client_data/certs/special/ca.crt; +cp ./ssl/client.pem ~/.ot/client_data/certs/special/client.pem; + +------------------------------------ + +Next: +A copy of the client.pem also needs to go into the ~/.ot/client_data/certs folder. + +(This is for the actual User account on the server, versus in the SSL-Example +folder where we also happen to be using the same cert for the lower-level SSL +socket code. As we transition away from test client to a real client, we won't +have that anymore.) + +To copy it: +cp ./ssl/client.pem ~/.ot/client_data/certs/USER_ID_AKA_NYM_ID_GOES_HERE + + + +------------------------------------ + + +4) Make sure the HARDCODED DEFAULT values are correct in the source code. + +ACTUALLY: The code is ALREADY set up correctly, so you shouldn't have to do +anything here. But I still record this here for my own notes. You can skip it. + +These are only defaults, and they are now configurable also on the command line: + +testserver.cpp, near the top: +#define CA_FILE "certs/special/ca.crt" +#define DH_FILE "certs/special/dh_param_1024.pem" +#define KEY_FILE "certs/special/server.pem" + +------------------------------------ + +===> Some defaults are also HARDCODED on the CLIENT... + +NOTE: Again, this is ALREADY set up correctly. But this is just for my notes, and again, +these are also all configurable on the command line: + +testclient.cpp, near the top: +#define CA_FILE "certs/special/ca.crt" +#define KEY_FILE "certs/special/client.pem" +#define KEY_PASSWORD "test" // RIGHT NOW THE PASSWORD FOR CONNECTING TO THE + // SERVER IS HARDCODED HERE. TODO: config file, password prompt. + +------------------------------------ + +5) By generating new certs, you have caused the server's User ID, as well +as the client's default User ID, to be changed. (The IDs are a hash of the +public key, so by changing the key, you therefore also have changed the ID.) + +Therefore, when you first load the server, it will complain that the server's User ID +doesn't match the hash of the public key for the server's Nym (since the key has been changed.) + +Similarly, when you first load the client, it will complain that the user's ID doesn't match +the user's public key either, for the same reason. + +==> When this happens, just look at what the new ID is (it will show the old one +followed by the new one) and then edit transaction/notaryServer.xml in order to update the +server's User ID, and also edit testwallet/wallet.xml, in order to update the client's Nym ID. + +IMPORTANT: The ID may appear multiple times in the file, for example in the testwallet, +the Nym ID appears also as a filename and also as a "User ID" so make sure you replace all +occurrences of the old ID with the new one. + +------------------------------------ + +Next: +Now you have the new Server cert, and the new Server User ID, but the cert is still saved +under a filename based on the OLD ID!! So next we need to rename that file: + +mv ~/.ot/server_data/certs/OLD_SERVER_USER_ID ~/.ot/server_data/certs/NEW_SERVER_USER_ID + +------------------------------------ + +Next: + +At this time, if you load the wallet, it will be unable, because NOW, the Nym ID +no longer matches the FILENAMES in certs/ and nyms/. So rename: + +mv ~/.ot/client_data/certs/OLD_NYM_ID ~/.ot/client_data/certs/NEW_NYM_ID + +mv ~/.ot/client_data/nyms/OLD_NYM_ID ~/.ot/client_data/certs/NEW_NYM_ID + + +ALSO: edit ~/.ot/client_data/nyms/NEW_NYM_ID and ~/.ot/server_data/nyms/NEW_SERVER_USER_ID +In BOTH of those files, make sure the "filename" variable matches the name of +the file. You will have to update this variable from the old ID just as you had +to rename the file. + +------------------------------------ + +NYM FILE MUST BE RE-CREATED (Explanation immediately below, ACTIONS below the line.) + +Since the Nym ID is a hash of the cert, the cert file is easy to verify. The software +just loads it up, hashes it, and compares to the ID. + +==> But the Nym file is not so easy to verify, since it uses the same ID, which +will obviously NOT come from a hash of the nymfile as well. (Meaning, if you hash +the public key to get the ID, then you can't reasonably expect a hash of the nymfile +to ALSO result in the SAME ID. Different files will result in different hashes. But +both files are still identified by Nym ID. One is verified by hashing the file again to +compare to the ID. The other must be verified in another way: By storing the ID inside +the file and then signing the file with the server's Nym. Later on the Server can +verify the signature and therefore trust the ID stored within the signed file.) + +The Nym is stored in an OTSignedFile. The ID is inside the signed file. (It's +not enough just to put a Nym there with the right filename. What if the file was swapped? +So you HAVE to put the ID *inside* the signed file.) + +An attacker cannot edit the nymfile and alter the ID, without also invalidating the server's +signature on the file. + +------------------------------------ + +==> So therefore the Nymfile has to be re-created... and re-signed + +Until I add an "AddNym" API function, for now I have a line of code in OTServer.cpp +(for the server nym) and a similar couple of lines of code in the OTLib (in OTWallet.cpp). + +==> All you have to do is: + +1) Uncomment that line of code in each of the above projects. Use this code to find it: + +fgrep -n SaveSignedNymfile transaction/*.cpp OTLib/*.cpp | grep Uncomment + +In OTWallet you will also have to comment one line out. You will see it next to the other. + +2) Update the relevant nymfiles so the "filename" value stored within is set to + the NEW Nym ID (aka User ID) instead of the old one. (This will cause the signature + to break when you run.) + +3) Recompile OTLib and transaction projects. + +4) Run both projects once, to regenerate the nymfiles. You will notice the signature failing + when you run, as it loads up and fails to verify. (IT WILL GENERATE THE NEW NYM AND SAVE + IT TO THE FILE AT THIS TIME, DUE TO THE CODE MOD WE JUST MADE.) + +5) Stop the software. When you run it again, you will see the signature WORKS this time-- + (it fails the first time and succeeds the second time) because the file is now fixed! + +6) Edit the code AGAIN, and COMMENT THE LINE BACK OUT! + +Normally the server, or wallet, loads a nym, verifies the signature, and DUMPS it if it fails +to verify. + +But with the code uncommented (as discussed), it will instead load it and then SAVE IT AGAIN +WITH A NEW SIGNATURE, REGARDLESS OF WHETHER IT VERIFIED WHILE LOADING. (SO THIS IS DANGEROUS -- +AN EMPLOYEE COULD DO THIS SURREPTITIOUSLY TO SIGN THINGS -- YOU MUST HAVE A SECURE AUDITING +PROCESS ON YOUR CODE, AND RUN IT IN A SECURE ENVIRONMENT!! (Security experts, chime in?) +If you do not feel safe about your code, then you should not feel safe about your cash on +the server running it.) + +==> This process makes it easy to create new NymFiles until the "GenerateNym" function is added +to the API. + + +------------------------------------ + +NEXT STEP: All the nym files are fixed now, and certs, etc. But because the Nyms +have a new public key, that means the CONTRACTS must be RE-SIGNED! + +Here's what I just did for the SERVER CONTRACT: + +1) Edited the server contract to remove the PGP signature information from top and bottom. +2) While editing, I replaced the contents of the first key (or cert) with the new one. + To be clear: the first cert in the server.pem file should also be the first cert in + the server's contract. +3) BECAUSE I just changed the server's contract, I had to RE-SIGN THE CONTRACT. + So I used the signcontract utility to do this. (I had to copy the server's cert and + nym into the testwallet cert and nym folders so that the signcontract utility, which + was in the testwallet folder, would find them.) +4) This will cause the SERVER CONTRACT to have a new hash, and thus a new SERVER ID. + So the server USER Id got changed (the nym ID) and now the Server ID as well (contract hash). +5) I ran the testwallet and tried to load the new server contract (with the new signature.) + It FAILED loading the contract because the hash of the contract didn't match the old ID. + (Expected.) But when it failed, it gave me the new ID, so I copied that and edited the + wallet file to update the server ID. Upon loading it a second time, it SUCCEEDED! +6) Next I edited the notaryServer.xml file to fix the server ID there as well. + The server User ID had already been updated when I generated the certs (above.) + +Similar above steps must be repeated for each asset contract, (using the user's default +nym instead of the server nym.) + +(It is the users who upload the asset contracts. The user cannot issue any currency unless +HE has signed the asset contract that he's uploading. Therefore, unless the user's nym is +used to sign those contracts, he cannot upload them and test the issuing -- and therefore +trading -- on the system.) + + +---------------------- + + +Obviously these functions will all be really easy with better client software. For now we +are dealing with test software. Pitch in? + + +------------------------------------ + + +My own notes: + +openssl x509 -inform PEM -text -in clientcert.pem + +openssl x509 -inform PEM -text -in my-ca.crt + +openssl verify -CAfile my-ca.crt my-cert.crt + +-------------------------------------- + +Some more notes, on converting PGP keys to OpenSSL format: + +Gpgsm utility can exports keys and certificate in PCSC12: + +gpgsm -o secret-gpg-key.p12 --export-secret-key-p12 0xXXXXXXXX + +You have to extract Key and Certificates separately: + +openssl pkcs12 -in secret-gpg-key.p12 -nocerts -out gpg-key.pem +openssl pkcs12 -in secret-gpg-key.p12 -nokeys -out gpg-certs.pem + +there you go + + + + diff --git a/docs/WIPE-USERS-ACCOUNTS.txt b/docs/WIPE-USERS-ACCOUNTS.txt new file mode 100755 index 000000000..18d038711 --- /dev/null +++ b/docs/WIPE-USERS-ACCOUNTS.txt @@ -0,0 +1,89 @@ + + +TO CLEAR THE SERVER INSTALLATION OF ALL: User Accounts, Asset Types, Asset Accounts, Spent Tokens, etc and therefore START FRESH yet with the SAME test keys, (but all new user data) follow these steps: + + +In ~/.ot/server_data: + +rm accounts/* +rm contracts/* (EXCEPT WAIT! Don't erase the server's own contract! duh) +rm inbox/* +rm outbox/* +rm nymbox/* +rm -rf mints/* +rm pubkeys/* +rm useraccounts/* +rm -rf spent/* +rm markets/* +rm cron/* +rm -rf receipts/* + +Do NOT touch the certs folder. + +In the nyms folder (Open-Transactions/transaction/nyms), remove EVERY FILE EXCEPT THE SERVER NYM, WHICH IS THIS ONE (IN THE TEST DATA): +pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C + +Then edit notaryServer.xml and remove all of the extra user data such as asset types, etc. It should look like this when you're done: + + + + + + +----------------------------------------------------------- + +SAME THING on the CLIENT SIDE: + +To keep your test keys, yet erase all the asset accounts and "start fresh" with a blank installation (and the same test keys and Nyms already generated) then follow these steps for the TEST WALLET: + +In the Open-Transactions/testwallet directory: + + +rm accounts/* +rm inbox/* +rm outbox/* +rm nymbox/* +rm -rf mints/* +rm -rf purse/* +rm -rf receipts/* + + +In the ~/.ot/client_data/contracts folder, do NOT remove 8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp which is actually your server contract. (It's the test server contract that tries to connect to a server on localhost.) There is a backup of this file in the sample-contracts directory. +Remove all the other files in the contracts folder, except 8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp as just described. + +Do NOT touch the certs folder. + + +Do NOT touch the nyms folder. You keep your nym on the client side, and use it to create your user account on the server. If you erase your own nym, then you cannot use it to create your user account when you connect to the Open Transactions server. + + +edit wallet.xml with your favorite editor... +-- keep the pseudonym. +-- keep the notaryProvider +-- delete all the asset types (you can re-issue them) +-- delete all the asset accounts (you can create as many new ones as you want.) + +It will look like this when you are done: + + + + + + + + + + + +---------------------------------------------------------- + +Now you can run the software fresh, as if zero users had ever connected to it! + +(Yet while continuing to use the test keys and test nym that came with the distribution.) + + diff --git a/ot-sample-data-clean/CLIENT-COMMANDS.txt b/ot-sample-data-clean/CLIENT-COMMANDS.txt new file mode 100755 index 000000000..f421fcc8f --- /dev/null +++ b/ot-sample-data-clean/CLIENT-COMMANDS.txt @@ -0,0 +1,247 @@ +TO GIT + + git clone git://github.com/FellowTraveler/Open-Transactions.git + cd Open-Transactions + +----------------------------------- + +TO BUILD + make clean && make + +Notes: +https://github.com/FellowTraveler/Open-Transactions/wiki/Install + +----------------------------------- + +TO BUILD FOR MONEYCHANGER (Java-based GUI) + + make clean && make java + +FYI: https://github.com/FellowTraveler/Moneychanger + +----------------------------------- + +TO INSTALL + sudo make install + +FYI, This copies transaction/transaction.exe to /usr/local/bin/ot_server, +and it copies testwallet/testwallet.exe to /usr/local/bin/ot +It also creates the ~/.ot folder, and copies the contents of ot-sample-data +into that folder. + +Important configuration data is located in the various .cfg and .opt files +located in ~/.ot +(I suggest you check them out.) +You can browse it online here: +https://github.com/FellowTraveler/Open-Transactions/tree/master/ot-sample-data + +----------------------------------- + +TO START THE SERVER + + ot_server + +It will probably ask you to enter a password and a path. Don't worry, +it gives clear instructions. Also see the INSTALL docs. + +----------------------------------- + +OT GUI (MONEYCHANGER) + +To start Moneychanger, just double click the jar file. +Or type: java -jar JavaWrapper.jar + +You will need to select the data folder for the client. + +This is located in: ~/.ot/client_data + +----------------------------------- + +To use the OT COMMAND-LINE... + +In a new shell, run the command-line utility like this: + + ot -? + +(NOTE: for now, do not run multiple clients AT THE SAME TIME against +the SAME data folder!) + +COMMAND-LINE COMMANDS / OPTIONS: + +ot --stat (Prints the wallet contents) +ot [-h|-?|--help] (Prints this help) +The '|' symbol means use --balance or -b, use --withdraw or -w, etc. +The brackets '[]' show required arguments, where default values are +normally expected to be found in: ~/.ot/command-line-ot.opt +ot --balance | -b [--myacct ] (Display account balance) +ot --withdraw | -w [--myacct ] (Withdraw as CASH) +ot --transfer | -t [--myacct ] [--hisacct ] +ot --cheque | -c [--myacct ] [--hisnym ] +ot --voucher | -v [--myacct ] [--hisnym ] +ot --depositcheque [--myacct ] (Deposit a cheque.) +ot --depositpurse [--myacct ] (Deposit a cash purse.) +ot --deposittokens [--myacct ] (Deposit individual cash tokens.) +ot --inbox | -i [--myacct ] (Display the inbox.) +ot --sign | -s [--mynym ] (Sign a contract.) +ot --verify [--mynym ] (Verify a signature.) +ot --purse | -p (Display a purse.) + Arguments: [--mynym ] [--mypurse ] +ot --refresh | -r [--myacct ] (Download account files from server.) +ot --refreshnym [--mynym ] (Download nym files from server.) +ot --marketoffer [--mynym ] (Place an offer on a market.) +Also, [--server ] will work with all of the above. + +Recurring payments: +ot --proposeplan (Merchant) + Arguments: [--mynym ] [--myacct ] (continued.) + Continued: [--hisnym ] [--hisacct ] +ot --confirmplan (Customer) +ot --activateplan (Customer again) + Arguments: [--mynym ] [--myacct ] + + +----------------------------------- + +OT PROMPT + +For the OT PROMPT, type "ot" with NO ARGUMENTS: +(A few arguments are still allowed: --mynym and --server) + + $ ot + +The result: + + OT> + +------------------------- +OT PROMPT COMMANDS: + +load -- Load wallet.xml from the data_folder. (Do this first.) +stat -- Display wallet contents. + +(Yes, that's just a 'c' by itself down there.) + +c -- Sends a checkServerID command. This is OTLib's "Ping". + It's the wallet pinging the notary, and verifying to + both sides that each can encrypt/verify with the other. + +r -- Register a new user account (using first Nym in wallet.) + (Register will fail for you because I already registered + with this Nym. So you can just START USING IT, since it's + already registered. Ignore this command, in other words.) + +u -- Sends a checkUser command (retrieves public key based on + userID) + +g -- Ask the server to send me the current request number. + If you get errors that the request number is wrong, use + this and then try again. (It must always be in sync. This + command is what re-syncs it.) + +issue -- Issue new currency. (It will ask for the currency contract.) + The wallet will ask you for the currency contract and then + create an issuer account. The public key in the currency + contract must be the same as the Nym's public key, AND the + signature on the contract must verify with that same key. + +(I already uploaded the silver contract, which is why you see it in your wallet as though you are the issuer of that currency -- because you are.) + +getcontract -- Get server's copy of any currency contract, by asset + type ID. + +getmint -- Get server's copy of public Mint file (contains public + keys for each asset type. This is needed in order to make + withdrawal requests for any given asset type.) + +a -- create asset account. (Of any type, including any + Basket Type ID, which is used like another asset type ID.) + +get -- Get latest copy of one of my asset accounts (by account ID). + +n -- Ask the server to send me a new transaction number. + (If you ever get an error related to being out of transaction + numbers, just use this. Sometimes you just run out of them, + and you need more from the server.) + +t -- Initiate transfer from my account into another account's + inbox (with a pending notice being put into my outbox). + +i -- getInbox from the server so I can decide what to do with + it. (There will be pending notices, cheque receipts, etc. + I need to go through them all and accept or reject them.) + +NOTE: the test client, upon receiving a @getInbox response from the server, will *automatically* process *that* into a processInbox command back to the server, automatically accepting all of the transactions, resulting in a final @processInbox reply from the server. Obviously a real GUI client would merely display the inbox to the user, where the user could choose to accept the items individually. The API offers faculties for doing this. + +w -- Withdraw cash and save to a purse. (It will ask for Account ID and amount.) + +Note on token format: the individual notes are stored with the internal Lucre data *encrypted* to the user's Nym. So even if the tokens were stolen in plaintext, they still could not be used--because the internal Lucre data member is still encrypted. As long as you keep backups of your financial data, they cannot be lost, nor can they be stolen simply by the files becoming compromised. + +v -- Withdraw voucher. (This is like a cashier's cheque. The + server removes funds from your account, then issues you a + cheque drawn on one of the server's accounts.) + +q -- Deposit cheque. (You can also deposit vouchers here.) + +d -- Deposit cash. (Will ask for Account ID and Cash Note.) + +NOTE: When making a deposit, the test client automatically re-encrypts the Lucre data (internal to the token) to the SERVER's nym, so that the server will be able to process the tokens. Similarly, if you wanted to give some tokens to a friend, using a nice GUI, you would simply drag the gold over to his name, and then your wallet would re-encrypt the internal Lucre Data of each token to his public key, and then send the tokens to him. Future options include exporting to a passphrase, or in the clear. + +p -- Deposit a purse full of cash. (It will ask for the Account + ID and and Purse.) + +cheque -- Write a cheque. You can do this offline but you need to have + at least one transaction number laying around to write it with. + +basket -- Create a basket currency. (It will ask for the basket + details, and lead you through the process.) + +NOTE: The wallet will ask for the number of asset types in the basket, then the *minimum transfer amount* for the basket itself, then it will ask for each asset type ID followed by the minimum transfer amount for that asset type. For example: I might create a new basket currency called the Rand, defined as, 10 Rand = [$50, 2 gold g, and 10 silver oz]. Those numbers would serve as the *minimum transfer amount* for each asset type, with all transfers being a multiple of those numbers. + +Normally when you issue a currency, you are given an issuer account by the server. This account is allowed to go negative, and you can transfer to whoever you wish based on the terms of your currency contract. And with a basket currency, an issuer account is also created. But.. instead of handing control of that issuer account over to the user who defined the basket, the server manages it internally. Each basket account has its own internal asset accounts to store the reserves for the basket. Whenever users exchange in or out of a basket, the various assets are moved in or out of those internal asset accounts. After this point, an asset account storing a basket currency is no different than any other asset account, as far as the server is concerned. It's just another asset type ID. Due to this, baskets also support infinite nesting yet with no additional system resource usage. + + +exchange -- Exchange from asset accounts, in and out of basket + accounts. This is where the magic happens. + +Any exchange in or out is based on a multiple of the minimum transfer amount. So I could transfer into 10 Rand, or 20, or 30, or 40, etc. Any multiple of 10, since 10 is the minimum amount. I would have to trade ($50, 2 gold, and 10 silver) times 1, or 2, or 3, etc for the exchange. Once the user has Rands in his Rand asset account, he can trade it with other Rand asset accounts in any amount he wishes, with no minimum amount. The minimum amount is only for exchanging in and out of the basket. + + +propose -- Create a payment plan (like WRITING a proposal.) Merchant does this. +confirm -- Agree to a payment plan (like SIGNING that agreement). Customer does this. +activate -- Activate a payment plan (like ACTIVATING the agreement). Customer again. + + +offer -- Put an Offer onto a Market. + + +setnymname -- Set a Nym's name (merely a client-side label.) +setaccountname -- Set an Asset Account's name (merely a client-side label.) + + +signcontract -- Allows you to input a contract and sign it with the + current Nym. + +decode -- Decodes base64-encoded data at the command line. +encode -- Base64-encodes data at the command line. + +decrypt -- If you have already loaded your Nym, you can use this + to decrypt messages at the command line. + + +NOTE: The below commands are for TCP / SSL mode only. +(You can **IGNORE** them.) + +connect -- Connect to the first server on the wallet's list. + (NOTE: **NOT** necessary in ZMQ mode! If you didn't + use "make tcp", then you can ignore this command. It's + only used in TCP/SSL mode.) + +1 -- Sends a type 1 header command to the server, with no + payload. +2 -- Sends a deliberately-malformed command to the server. +3 -- Sends a signed XML message in the payload, but with no + XML requests. + + + + diff --git a/ot-sample-data-clean/client.cfg b/ot-sample-data-clean/client.cfg new file mode 100644 index 000000000..07fd8c3b5 --- /dev/null +++ b/ot-sample-data-clean/client.cfg @@ -0,0 +1,19 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions Client ini file + + +[logging] +logfile_path=~/.ot/log-client.log +log_level=0 + + +;; For sending and receiving: +;; no_tries is the number of times OT will try to send or receive a message. +;; ms is the number of milliseconds it will wait between each attempt. + +[latency] +send_no_tries=5 +send_ms=200 +receive_no_tries=25 +receive_ms=200 + diff --git a/ot-sample-data-clean/client_data/.ot_ini b/ot-sample-data-clean/client_data/.ot_ini new file mode 100755 index 000000000..f6690a303 --- /dev/null +++ b/ot-sample-data-clean/client_data/.ot_ini @@ -0,0 +1,5 @@ + +[logging] +logfile_path=./ot.log +log_level=3 + diff --git a/ot-sample-data-clean/client_data/LICENSE-AND-CREDITS.txt b/ot-sample-data-clean/client_data/LICENSE-AND-CREDITS.txt new file mode 100755 index 000000000..d66061644 --- /dev/null +++ b/ot-sample-data-clean/client_data/LICENSE-AND-CREDITS.txt @@ -0,0 +1,2059 @@ +Moneychanger v0.06 +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + + * M O N E Y C H A N G E R + * + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * Open Transactions: + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * OFFICIAL PROJECT WIKI: + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more + * details. + +-----BEGIN PGP SIGNATURE----- +wsFVAwUBTbFZUwMIAO35UbuOAQjDRBAAmIUJBi5/WC1KpI4TNAWdQNh6g59qYS6w +SI6mTMbnP0DUVOrmJdNR7/n1sRlnWzyjKLcKkRtXwRWGC+jE16jijxek9Ome5Qid +bDqjHSuFvqnsD3+0tbENf+kVrbAReU3YvWk+xFvVc6I2NpS+lEIdjHIWm85jSmew +Ydx+4KpELkO59thkcKgSYsTSyTP3l9GOTtJlq45XiamoEvso4jFUC1y5KMQsz1KH +DTE32m5FPZqJqUw9loAmrni3dIMpXKC5yLhdqSMXHK0MAPEIexsuaZjrjKJQSjwV +eDjwJcMn2WZVvcIr9IEoKEU/2j9wHNZv5Xuj78A/78AkjqEUwrY1M9ht0r/QbusW +ZT7MlxNCq4DFstrjyKi03yZQGR+m8eJFHE7GvF8Vzg/ap0/CUJzeoXg5wACXGfJj +k6y8ZBriQO08JECki2sy6oTitDoi7FmzgAIxPGB1qA4HMur/LuzrxAj2V7XkZQlk +VfAda6Ff9bmStNut+zbsQ0pnIeL/URwWifI8Wq81c7DEIvA5SH/bU9Hws1FMO8PU +BcDmzadU+syJBTxoP/mHZcLfwHDhcZyBeHX7sHfpHweEunzWjcHjqVCutQMO4dii +yrsc64WTfAqd4s12SfKMgVFLeL/FUYH7MNqpfgjgwX5co817m9VvCntU6njIuYtV +6+G/TuSViH8= +=/jIC +-----END PGP SIGNATURE----- + **************************************************************/ + + + + + + + +Open Transactions v0.72b +(Scroll to the bottom to see the complete AGPLv3.) +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (Darwin) + +iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki +hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K +7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F +R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U +GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU +BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp +Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 +0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX +5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH +RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s +DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O +qg/U8uXzgLQuLbFxBjyr +=utx2 +-----END PGP SIGNATURE----- +**************************************************************/ + + + + + +SIGNED PUBLIC KEY FOR AUTHOR. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Public key for "FellowTraveler", author: + +- -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: PGP Desktop 10.0.1 + + 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 + =6+N5 + -----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.10 (Darwin) + +iQIcBAEBCAAGBQJNsWCWAAoJEAMIAO35UbuOv3kP/Rd6UekX27+rHiMPfo8vN1Iz +cjXg3o7J4BWsppZQppT4r1ZmZ6ftVXDxfSeR22kWQeU7IjNjDKcQ8Vh0P1x/DHva +YczzHzQsiGGCWVzCyJyh8ENreS0mFAM6RqAP7HwOE+5iJstSatN5EHd0Om+QQvKJ +xdSe8pct6y4NjhfjXm1bfIV4suadQodFw4qp3h3LfVypPEeiGD0ohAJ2l7zO/bE3 +xNxvvj/WLfqyxVVc1pip7CzNNJTr+bQI1hh3nFXTElH+zu/YXvob4NPySruh98wE +PxzFnZ+Nl0n13+sfUW/tdI2xYWo7IZ34Ft2SjCy3He9rSLE5keke3loT8r50tu3J +pfpwDUHXAJO6nQFMbiAIEc/n+B42s8AvQ/PNmQA1/JcdlQaeBA2+k/ursOPSajDb +sTjsqsBsp5AYXAIJUbvzDDIz/2gzRcZjXaj+P9YfH00gJ2ZmKM1gTLWFrYRURIW7 +dRLUMY6HvDtyjAlO9LnvuwbdBU6jQb9EaE7FOQuO4LG62Rh9irHo3j7/FjJZkllj +g7Ypjamz9+U/5Jt2V7ivvmPbZ/IGu5dA2bw3Pqf0LtTMGqiLQWFmXLRlZ44DPv6Q +MvrCHCsSZB/Dgb4A8vZYFLbY2kzqf+g1ra4qWkKQFyNkwCbSU1p1xj2rnrRmWwSf +kLZLksZLPzcxEHdPh6YV +=/Nb5 +-----END PGP SIGNATURE----- + + + + +A few relevant notes, followed by contributor credits: + + +"The silver is mine, and the gold is mine, says the LORD of hosts." +Haggai 2:8 + +"By your wisdom and your understanding you have made wealth for + yourself, and have gathered gold and silver into your treasuries" +Ezekiel 28:4 + +"Precious treasure and oil are in a wise man's dwelling, + but a foolish man devours it." +Proverbs 21:20 + +"Because you say, 'I am rich, and increased with goods, and I need nothing,' + and you know not that you are wretched, and miserable, and poor, and blind, + and naked... +"I counsel you to buy from me gold refined by fire, so that you may be rich, + and white garments so that you may clothe yourself and the shame of your + nakedness may not be seen, and salve to anoint your eyes, + so that you may see." +Rev. 3:17-18 + +"Say to the children of Israel, I am the LORD, + and I will bring you out from under the burdens of the Egyptians, + and I will rid you out of their bondage, + and I will redeem you with a stretched out arm, + and with great judgments. + And I will take you to me for a people, + and I will be to you a God: + and you shall know that I am the LORD your God, + which brings you out from under the burdens of the Egyptians. + And I will bring you in unto the land, + concerning which I did swear to give it to Abraham, to Isaac, and to Jacob; + and I will give it you for an heritage: I am the LORD." +Exodus 6:6-9 + +"After the doings of the land of Egypt, + (where you lived before), you shall not do: + and after the doings of the land of Canaan, + (where I am bringing you), you shall not do: + neither shall you walk in their ordinances. + You shall do MY judgments, and keep MY ordinances, + to walk in them: I am the LORD your God. + You shall therefore keep my statutes, and my judgments: + which if a man does, he shall live in them: I am the LORD." +Leviticus 18:1-5 + +"Except the LORD build the house, they labor in vain that build it: + except the LORD keep the city, the watchman wakes in vain." +Psalms 127 + +"Do what is right and good in the Lord's sight, + so all will go well with you." +Deuteronomy 6:18 + +"Hate evil, and love good, + and establish justice in the courts." +Amos 5:15 + +"Justice, and only justice, you shall follow, that you may live and + inherit the land that the Lord your God is giving you." +Deuteronomy 16:20 + +"Select capable men, + from all the people, + men who fear God, + trustworthy men who hate dishonest gain, + and appoint them as officials over thousands, + hundreds, fifties and tens." +Exodus 18:21 + +"Let every soul be subject unto the higher powers. + For there is no power but of God: + the powers that be are ordained of God. + Whosoever therefore resists the power, resists the ordinance of God: + and they that resist shall receive to themselves condemnation. + For rulers are not a terror to good works, but to the evil. + Will you then not be afraid of the power? + Do that which is good, and you shall have praise of the same: + For he is the minister of God to you for good. + But if you do that which is evil, be afraid; + for he bears not the sword in vain: + for he is the minister of God, + a revenger to execute wrath upon him that does evil. + Therefore you must be subject, not only for wrath, + but also for conscience sake." +Romans 13:1-5 + +"Woe to those... + who justify the wicked for a bribe, + and take away the rights of the innocent." +Isaiah 5:23 + +"Woe unto those who decree unrighteous decrees, and + write grievousness which they have prescribed;" +Isaiah 10:1 + +"And David said to God, +'Wasn't it I who commanded the people to be numbered? + I am the one who has sinned, and done evil indeed'" +1 Chronicles 21:17a + +"Woe to those who scheme iniquity, + who work out evil on their beds! + When morning comes, they do it, + (for it is in the power of their hands.) + They covet fields and then seize them, + and houses, and take them away. + They rob a man and his house, + a man and his inheritance." +Micah 2:1-2 + +"Then came also publicans to be baptized, and said unto Him, + 'Master, what shall we do?' + And He said to them, + 'Exact no more than that which is appointed you.' + And the soldiers likewise demanded of Him, saying, + 'And what shall we do?' + And He said to them, + 'Do violence to no man, + neither accuse any falsely; + and be content with your wages.'" +Luke 3:12-14 + +"Do not pervert justice; + do not show partiality to the poor + or favoritism to the strong, + but judge your neighbor fairly." +Leviticus 19:15 + +"You shall not go after the majority to do evil. + Neither shall you testify in a matter of strife + to incline after the majority to pervert justice." +Exodus 23:2 + +"You shall not accept a bribe, + for a bribe blinds the eyes of the wise, + and subverts the cause of the righteous." +Deuteronomy 16:19 + +"You shall not lend upon usury to thy brother; + usury of money, usury of victuals, + usury of any thing that is lent upon usury: + Unto a stranger you may lend upon usury; + but unto your brother you shall not lend upon usury: + that the LORD your God may bless you in all that you set your hand to + in the land you go to possess." +Deuteronomy 23:19-20 + +"You shall not have different weights in your bag, a great and a small. + You shall not have different measures in your house, a great and a small. + But you shall have a perfect and just weight, a perfect and just measure + you shall have: That your days may be lengthened in the land which the + LORD your God gives you." +Deuteronomy 25:13 + +"You shall not steal." +Exodus 20:15 + +"Different weights, and different measures, both of them are alike + abomination to the LORD." +Proverbs 20:10 + + He overturned the tables of the money-lenders, + and the benches of those selling doves. + "It is written," he said to them, + "'My house will be called a house of prayer,' (1) + but you are making it a 'den of thieves'." (2) +Matthew 21:12b-13, 1. Isaiah 56:7, 2. Jeremiah 7:11 + +"The rich rule over the poor, and the borrower is servant to the lender." +Proverbs 22:7 + +"Be not deceived; God is not mocked: for whatsoever a man sows, + he shall also reap." +Galatians 6:7 + +"You are bought with a price; be you not the servants of men." +1 Corinthians 7:23 + +"You cannot serve both God and Mammon." +Luke 16:13 + +"Now the Lord is the Spirit, + and where the Spirit of the Lord is, there is liberty." +2 Corinthians 3:17 + +"Proclaim liberty throughout all the land unto all its inhabitants." +Leviticus 25:10 + +"From any tree of the garden you may eat freely;" +Genesis 2:16a + +"So in everything, do unto others what you would have them do unto you, +for this sums up the Law and the Prophets." +-Jesus Christ, Matthew 7:12 + +"We must obey God rather than men." +Acts 5:29 + +"For the LORD is our judge; + the LORD is our lawgiver; + the LORD is our king." +Isaiah 33:22 + +"And it shall come to pass, if you listen diligently + to the voice of the Lord your God, + to observe and to do all his commandments + which I command you today, + that the Lord your God will set you on high, + above all nations of the earth" +Deuteronomy 28:1 + +"Righteousness exalts a nation." +Proverbs 14:34 + +"Tell the righteous it will be well with them, + for they will enjoy the fruit of their labor." +Isaiah 3:10 + +"A righteous man knows the rights of the poor; + a wicked man does not understand such knowledge." +Proverbs 29:7 + +"Is it not lawful for me to do what I wish with my own things?" +-Jesus Christ, Matthew 20:15 + +"The man who looks intently into the perfect law that gives freedom, + and continues to do this, not forgetting what he has heard, but doing it, + he will be blessed in what he does." +James 1:25 + +"Whoever hears these words of mine and puts them into practice, + he is like a wise man, who built his house upon a rock: + and the rain descended, + and the floods came, + and the winds blew, + and beat upon that house; + yet it fell not: + for it was founded upon a rock." +Matthew 7:24-25 + +"Observe and hear all these words which I command you, that it may + go well with you, and with your children after you forever, + when you do that which is good and right + in the sight of the LORD your God." +Deuteronomy 12:28-32 + +"It is for freedom that Christ has set us free. Stand firm, then, + and do not let yourselves be burdened again by a yoke of slavery." +-Galatians 5:1 + +"Whoever hears these words of mine and fails to do them, + he is like a foolish man who built his house upon the sand, + and the rain descended, + and the rivers came, + and the winds blew, + and they dashed against that house; + and it fell -- and its fall was great." +Matthew 7:26-27 + +"My people are destroyed for lack of knowledge: + because you have rejected knowledge, + I will also reject you, + that you shall be no priest to me: + seeing you have forgotten the law of your God, + I will also forget your children." +Hosea 4:6 + +"Come now you rich, + weep and howl for your miseries + which are coming upon you. + Your riches have rotted + Your gold and your silver have rusted + and their rust will be a witness against you. + It is in the last days that you have stored up your treasure! + Behold, the pay of the laborers who mowed your fields + (which has been withheld by you) + cries out against you, + and the outcry of those who did the harvesting + has reached the ears of the Lord of the Sabbath. + You have lived luxuriously on the earth, + and led a life of wanton pleasure. + You have fattened your hearts in a day of slaughter. + You have condemned and murdered the righteous man;" +James 5:1-6 + +"'...And you had turned, and had done right in my sight, in + proclaiming liberty, every man to his neighbor; and you had made a + covenant before me in the house which is called by my name. +"'But you turned and polluted my name, and caused every man his + servant, and every man his handmaid, whom you had set at liberty, to + return, and brought them into subjection, to be your servants and + handmaids. +"'Therefore,' (thus says the Lord) 'You have not hearkened unto me, + in proclaiming a liberty, every one to his brother, and every man to his + neighbor: behold, I proclaim a liberty for you, says the Lord, to the + sword, to the pestilence, and to the famine; and I will make you to be + removed into all the kingdoms of the earth.'" +Jeremiah 34:15-17 + +"Now it shall come to pass in the latter days + that the mountain of the LORD's house + shall be established on the top of the mountains, + and shall be exalted above the hills; + and all nations shall flow to it. + Many people shall come and say: + 'Come, and let us go up to the mountain of the Lord, + to the house of the God of Jacob; + He will teach us His ways, + and we shall walk in His paths.' + For out of Zion shall go forth the law, + and the word of the Lord from Jerusalem." +Isaiah 2:2-3 + +"In the last days... everyone will + sit under their own vine, + and under their own fig tree, + and no one will make them afraid, + for the LORD Almighty has spoken." +Micah 4:1-4 + +"Because the creature itself also shall be delivered + from the bondage of corruption + into the glorious liberty of the children of God." +Romans 8:21 + + + +Thomas Paine wrote in COMMON SENSE: + +Government by kings was first introduced into the world by the +Heathens, from whom the children of Israel copied the custom. It was +the most prosperous invention the Devil ever set on foot for the +promotion of idolatry. The Heathens paid divine honors to their +deceased kings, and the Christian world hath improved on the plan by +doing the same to their living ones. + +How impious is the title of sacred majesty applied to a worm, who in +the midst of his splendor is crumbling into dust! + +As the exalting one man so greatly above the rest cannot be +justified on the equal rights of nature, so neither can it be +defended on the authority of scripture; for the will of the +Almighty, as declared by Gideon and the prophet Samuel, expressly +disapproves of government by kings. + +All anti-monarchial parts of scripture have been very smoothly +glossed over in monarchial governments, but they undoubtedly merit +the attention of countries which have their governments yet to form. +Render unto Caesar the things which are Caesar's is the scriptural +doctrine of courts, yet it is no support of monarchial government, +for the Jews at that time were without a king, and in a state of +vassalage to the Romans. + +Near three thousand years passed away from the Mosaic account of the +creation, till the Jews under a national delusion requested a king. +Till then their form of government (except in extraordinary cases, +where the Almighty interposed) was a kind of republic administered +by a judge and the elders of the tribes. Kings they had none, and it +was held sinful to acknowledge any being under that title but the +Lords of Hosts. + +And when a man seriously reflects on the idolatrous homage which is +paid to the persons of kings he need not wonder, that the Almighty, +ever jealous of his honor, should disapprove of a form of government +which so impiously invades the prerogative of heaven. +... +The children of Israel being oppressed by the Midianites, Gideon +marched against them with a small army, and victory, through the +divine interposition, decided in his favor. The Jews, elate with +success, and attributing it to the generalship of Gideon, proposed +making him a king, saying, "Rule thou over us, thou and thy son and +thy son's son." + +Here was temptation in its fullest extent; not a kingdom only, but +an hereditary one, but Gideon in the piety of his soul replied, "I +will not rule over you, neither shall my son rule over you, THE LORD +SHALL RULE OVER YOU." + +Words need not be more explicit; Gideon doth not decline the honor +but denies their right to give it; neither doth he compliment them +with invented declarations of his thanks, but in the positive style +of a prophet charges them with disaffection to their proper +sovereign, the King of Heaven. + +About one hundred and thirty years after this, they fell again into +the same error. The hankering which the Jews had for the idolatrous +customs of the Heathens, is something exceedingly unaccountable; but +so it was, that laying hold of the misconduct of Samuel's two sons, +who were entrusted with some secular concerns, they came in an +abrupt and clamorous manner to Samuel, saying, "Behold thou art old +and thy sons walk not in thy ways, now make us a king to judge us +like all the other nations." + +And here we cannot but observe that their motives were bad, viz., +that they might be like unto other nations, i.e., the Heathen, +whereas their true glory laid in being as much unlike them as +possible. But the thing displeased Samuel when they said, give us a +king to judge us; and Samuel prayed unto the Lord, and the Lord said +unto Samuel, "Listen to the voice of the people in all that they say +to you, for they have not rejected you, but they have rejected me, +THEN I SHOULD NOT REIGN OVER THEM. According to all the works which +they have done since the day; wherewith they brought them up out of +Egypt, even unto this day; wherewith they have forsaken me and served +other Gods; so do they also unto you. + +"Now therefore hearken unto their voice, howbeit, protest solemnly +unto them and show them the manner of the king that shall reign over +them," i.e., not of any particular king, but the general manner of +the kings of the earth, whom Israel was so eagerly copying after. +And notwithstanding the great distance of time and difference of +manners, the character is still in fashion. + +And Samuel told all the words of the Lord unto the people, that +asked of him a king. And he said, "This shall be the manner of the +king that shall reign over you: + +"He will take your sons and appoint them for himself for his +chariots, and to be his horsemen, and some shall run before his +chariots [this description agrees with the present mode of +impressing men] and he will appoint him captains over thousands and +captains over fifties, and will set them to ear his ground and to +reap his harvest, and to make his instruments of war, and +instruments of his chariots; and he will take your daughters to be +confectionaries and to be cooks and to be bakers [this describes the +expense and luxury as well as the oppression of kings] and he will +take your fields and your olive yards, even the best of them, and +give them to his servants; and he will take the tenth of your seed, +and of your vineyards, and give them to his officers and to his +servants [by which we see that bribery, corruption, and favoritism +are the standing vices of kings] and he will take the tenth of your +men servants, and your maid servants, and your goodliest young men +and your asses, and put them to his work; and he will take the tenth +of your sheep, ---and ye shall be his servants--- and ye shall cry +out in that day because of your king which ye shall have chosen, AND +THE LORD WILL NOT HEAR YOU IN THAT DAY." + +This accounts for the continuation of monarchy; neither do the +characters of the few good kings which have lived since, either +sanctify the title, or blot out the sinfulness of the origin; the +high encomium given of David takes no notice of him officially as a +king, but only as a man after God's own heart. + +Nevertheless the People refused to obey the voice of Samuel, and +they said, "Nay, but we will have a king over us, that we may be like +all the nations, and that our king may judge us, and go out before +us and fight our battles." + +Samuel continued to reason with them, but to no purpose; he set +before them their ingratitude, but all would not avail; and seeing +them fully bent on their folly, he cried out, "I will call unto the +Lord, and he shall send thunder and rain [which then was a +punishment, being the time of wheat harvest] that ye may perceive +and see that your wickedness is great which ye have done in the +sight of the Lord, IN ASKING YOU A KING." + +So Samuel called unto the Lord, and the Lord sent thunder and rain +that day, and all the people greatly feared the Lord and Samuel. And +all the people said unto Samuel, "Pray for thy servants unto the Lord +thy God that we die not, for WE HAVE ADDED UNTO OUR SINS THIS EVIL, +TO ASK A KING." + +These portions of scripture are direct and positive. They admit of +no equivocal construction. That the Almighty hath here entered his +protest against monarchial government is true, or the scripture is +false. And a man hath good reason to believe that there is as much +of kingcraft, as priestcraft in withholding the scripture from the +public in Popish countries. For monarchy in every instance is the +Popery of government. + + + + + +----------------------------------------------------------------- + + + + + + + + More detailed credits regarding the other contributors: + + + + + * ==================================================================== + * + * LUCRE -- Anonymous Electronic Tokens v1.8 + * Copyright (c) 1999, 2000, 2009 Ben Laurie. All rights reserved. + * + * OFFICIAL SITE: http://anoncvs.aldigital.co.uk/lucre/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * 4. The name "Lucre" must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 5. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR + * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + + + +/*************************************************************************** + +www.OpenSSL.org (Crypto library) + +(Open Transactions does not actually contain the OpenSSL code, but merely +links to it. Nevertheless, these credits are provided in respect of the people +who worked on the project.) + +OpenSSL is based on the excellent SSLeay library developed by Eric A. Young and Tim J. Hudson. +The OpenSSL toolkit is licensed under a Apache-style licence which basically means that you are +free to get and use it for commercial and non-commercial purposes. + +The current OpenSSL core team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Mark J. Cox mark@openssl.org mark@awe.com UK +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK +Ben Laurie ben@openssl.org ben@algroup.co.uk UK + +The current OpenSSL development team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location Key ID +Mark J. Cox mark@openssl.org mark@awe.com UK 49A563D9 +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE 26BB437D +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK F295C759 +Lutz Jänicke jaenicke@openssl.org lutz@lutz-jaenicke.de DE 9C58A66D +Nils Larsch nils@openssl.org nils@larsch.net DE +Ben Laurie ben@openssl.org ben@algroup.co.uk UK 2118CF83 +Richard Levitte levitte@openssl.org richard@levitte.org SE F709453B +Bodo Möller bodo@openssl.org bmoeller@acm.org DE 5A6A9B85 +Ulf Möller ulf@openssl.org mail@ulfm.de DE +Andy Polyakov appro@openssl.org appro@fy.chalmers.se SE +Geoff Thorpe geoff@openssl.org geoff@geoffthorpe.net QC + +OpenSSL Emeritae - old members now off doing other things (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Holger Reif holger@openssl.org holger@reif.net DE +Paul C. Sutton paul@openssl.org paul@awe.com UK + +*/ + + + +/********************************************************************* + + * easyzlib release 1.0 --- (Compression) + * + * Copyright (C) 2008 First Objective Software, Inc. (Used with + * permission.) + * + * This entire notice must be retained in this source code + * Redistributing this source code requires written permission + * This software is provided "as is", with no warranty. + * + * Latest fixes enhancements and documentation at www.firstobject.com + **********************************************************************/ + + + + +/*********************************************************************** + * ZLIB + * + * (Open Transactions does not actually contain the zlib code, but + * merely links to it via easyzlib. Nevertheless, these credits are + * provided in respect of the people who worked on the project.) + * + * + * 'zlib' general purpose compression library + * version 1.2.2, October 3rd, 2004 + * + * Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source + * distribution. + * + * Jean-loup Gailly jloup@gzip.org + * Mark Adler madler@alumni.caltech.edu + + ***********************************************************************/ + + + + +/* + * (PGP-to-OpenSSL Conversion) + * + * An implementation of conversion from PGP public key format to OpenSSL + * equivalent Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI http://www.idrix.fr + * Used with permission. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +// ------------------------------------------- + +/* + * STLplus (used for smart pointers) + * + * Author: Andy Rushton http://www.andyrushton.co.uk/ + * + * http://stlplus.sourceforge.net/ + * + * BSD-style license: + * http://stlplus.sourceforge.net/stlplus/docs/license.html + * + */ + +// ------------------------------------------- + +/* + * MESSAGE PACK (Used for packing data.) + * + * http://msgpack.org/ + * + * Copyright (C) 2008-2010 FURUHASHI Sadayuki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ------------------------------------------- + +/* + * PROTOCOL BUFFERS (Used for packing data.) + * + * http://protobuf.googlecode.com + * + * Copyright 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Code generated by the Protocol Buffer compiler is owned by the owner + * of the input file used when generating it. This code is not + * standalone and requires a support library to be linked with it. This + * support library is itself covered by the above license. + * + */ + +// ------------------------------------------- + +/* + * ZeroMQ (transport library.) + * + * http://www.zeromq.org/ + * + * ZeroMQ 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * ------------------------------------------------------ + * + * SPECIAL EXCEPTION GRANTED BY IMATIX + * + * As a special exception, iMatix gives you permission to link this library + * with independent modules to produce an executable, regardless of the + * license terms of these independent modules, and to copy and distribute + * the resulting executable under terms of your choice, provided that you + * also meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module which + * is not derived from or based on this library. If you modify this + * library, you must extend this exception to your version of the library. + * + * ------------------------------------------------------ + * + * Parts of the software are licensed under the MIT (X11) license + * as follows: + * + * Copyright (c) 2007-2010 Contributors as listed in AUTHORS + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +// ------------------------------------------- + + +/* (transport: OTMessage -> TCP -> SSL) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +// ------------------------------------------- + + +/* + * strlcpy and strlcat + * + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + + +/************************************************************************** + + irrXML --- (XML Parser) + +The irrXML license is based on the zlib license. Basically, this means you +can do with irrXML whatever you want: + +Copyright (C) 2002-2005 Nikolaus Gebhardt + +http://www.ambiera.com/irrxml/ + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +History + +As lots of references in this documentation and the source show, this xml +parser has originally been a part of the +Irrlicht Engine. But because +the parser has become very useful with the latest release, people asked for +a separate version of it, to be able to use it in non Irrlicht projects. +With irrXML 1.0, this has now been done. + +*/ + +// ------------------------------------------- + + + +/* + Simple Ini (Used for ini files.) + + Copyright (c) 2006-2008, Brodie Thiesfield + + The licence text below is the boilerplate "MIT Licence" used from: + http://www.opensource.org/licenses/mit-license.php + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +/* + * AnyOption 1.3 (Used for command-line options and config files.) + * + * kishan at hackorama dot com www.hackorama.com JULY 2001 + * + * With updates from Michael D Peters (mpeters at sandia.gov) + * and Boyan Asenov. + * + */ + + +// ------------------------------------------------------------------- + +/* + + C++ Big Integer Library + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, + waive my copyright to it, placing it in the public domain. The library + comes with absolutely no warranty. + + */ + + + + + +// ************************************************************************* + + + + +/* + It seems appropriate to mention a few other people who deserve mentioning. + + A moment of silence for "Jolly Good Fellow" Bernard von NotHaus, + the founder of NORFED who was recently (and wrongfully) convicted of + "domestic terrorism." + + For history, I will reproduce a few gloating FBI quotes: + + "Attempts to undermine the legitimate currency of this country + are simply a unique form of domestic terrorism." + ... + "We are determined to meet these threats through infiltration, + disruption, and dismantling of organizations which seek to challenge + the legitimacy of our democratic form of government." + ... + "While these forms of anti-government activities do not involve + violence, they are every bit as insidious and represent a clear and + present danger to the economic stability of this country." + + // ----------------------------------------------- + + Speaking of wrongful prosecution... + + Tip of the hat to Dr. Douglas Jackson for his sacrifices and + accomplishments. + May this software protect future innovators from persecution, in a + diversity of jurisdictions. And check out e-gold.com, as well as + goldmoney.com, igolder, pecunix, and all the other digital gold reserve + outfits. May they all soon be traded as a single basket currency using + this new software. + + // ----------------------------------------------- + + Thank you to David Chaum, for inventing digital cash in the first place. + + Kudos to David Wagner, and Ben Laurie, who brought us Lucre. + + Kudos to Ian Grigg for his many advancements in financial cryptography. + Check out his website at http://iang.org/ + + J. Orlin Grabbe and his writings have been inspirational. He will be + missed. His DMT as well as critiques of it were useful to me. + http://www.orlingrabbe.com/ + + Kudos to Phil Zimmermann for writing and releasing PGP. The man who put + power into the hands of the people. Many people in corrupt jurisdictions + now have PGP to thank for their lives. Let's do the same for their money. + + Bill St. Clair, whose Truledger was truly inspirational. Check out + Truledger at http://truledger.com/ + + Patrick Chkoreff, whose Loom is operational and is what showed me the + idea of separation of powers. Check out https://Loom.cc for more info. + + Andrew McMeikan's PKTP, which can be found here: http://pktp.co.cc/ + + Ryan Fugger's Ripple project, which will probably figure more into the + client development of OpenTransactions. http://ripple-project.org/ + + Jim Bell, of course. His story is partially the reason for this software. + I still don't understand why he was stink-bombing IRS offices instead of + writing code. But he definitely made his mark. + + Tim May for writing the Cyphernomicon. (Google it.) + + Robert A. Hettinga for his writings: http://www.philodox.com/ + + And of course SAMY, who wrote the famous MySpace worm, and who suggested + using two message digest algorithms XOR'd together in case one is ever + broken and needs to be swapped out. Thus the SAMY hash is named in his + honor, and utilizes WHIRLPOOL XOR'd with SHA-256. +*/ + + + + + +/************************************************************************** + + + ==================> OPEN TRANSACTIONS LICENSE <================== + + + * Components: + * Moneychanger..... A Java Client App..........LICENSE: GPLv3 + * OTLib............ A class library............LICENSE: LAGPLv3 + * OT-API........... A Client API...............LICENSE: LAGPLv3 + * testwallet....... A command-line client......LICENSE: LAGPLv3 + * OT-Server........ A Server Application.......LICENSE: AGPLv3 + * http://github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which was + * written by Vicky C (livewire_3001@yahoo.com) under contract. + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 section 7: + * This paragraph applies only to the LAGPLv3 components listed above. + * If you modify this Program, or any covered work, by linking or + * combining it with other code, such other code is not for that reason + * alone subject to any of the requirements of the GNU Affero GPL + * version 3. (This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to Open + * Transactions itself must be open source. Similar to LGPLv3, except + * it applies to software-as-a-service, not just distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries used by OT: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. The same is + * true for any other open source libraries included in this project: + * complete waiver from the AGPL is hereby granted to compile, link, + * and/or use them with Open Transactions, according to their own terms, + * as long as the rest of the Open Transactions terms remain respected, + * with regard to the Open Transactions code itself. + * + * Lucre License: + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. See Open-Transactions/OTLib/Lucre. + * The Laurie requirements are light, but if there is any problem with + * his license, simply remove the Lucre code. Although there are no other + * blind token algorithms in Open Transactions (yet. credlib is coming), + * the other functionality will continue to operate. + + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see: + . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . + +*/ + + + diff --git a/ot-sample-data-clean/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..324088ea3 --- /dev/null +++ b/ot-sample-data-clean/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABZTvVrxEsprNlvkQ1KoYu2sTz7CWuPYCbyfcvDaHCHaZaeF+F3A8fHvN43Lhd +d7jWGGU2GTT/Z59jkoYRKQAojZ5CBawzfid0KPo0I8cMy021PfGFmCoup+8AeCFy +vbdGVdpQPp0+ff8yj8L4h2Uoqm7q8v3fvAwe9Ya0E2r8/TA= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..f5b0b19cd --- /dev/null +++ b/ot-sample-data-clean/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABrJ7qNm20TSNZp0p/y2mlDFMmGaj8YXD0PuHyVnI2olVve8zzfC9NJ8k4uUli +dgliN+vH7oWU6/FASdvBFFjdgnRinFKwzcRiEIZbAtUt6uGNnd4x2+WJW5COldTc +EcWpdUJTB2SxxqrBV/ikyyzk2fLgXr9bGI4roz0PSGayseY= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100755 index 000000000..20a8b6d8b --- /dev/null +++ b/ot-sample-data-clean/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data-clean/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data-clean/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/client_data/certs/special/ca.crt b/ot-sample-data-clean/client_data/certs/special/ca.crt new file mode 100755 index 000000000..d1a3fdc1e --- /dev/null +++ b/ot-sample-data-clean/client_data/certs/special/ca.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/client_data/certs/special/client.pem b/ot-sample-data-clean/client_data/certs/special/client.pem new file mode 100755 index 000000000..20a8b6d8b --- /dev/null +++ b/ot-sample-data-clean/client_data/certs/special/client.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp b/ot-sample-data-clean/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp new file mode 100755 index 000000000..76e556011 --- /dev/null +++ b/ot-sample-data-clean/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp @@ -0,0 +1,131 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVzz3XhlBBKUmd74RKfM1SQp2HtPsdjaz8QtRXLGpYFi0SXq1bLPCz8ZOpa8U +IzJOGLUVwgH9FAzy1LVs+bKa4RqoMqgyjciqqFcfc7vQ0MjuxamLsfBK2vy6W6T6 +xp6qDWBfdCMQF/SZrmmosEOR6hlgwStSQn5YcaJjXQTKBos= +-----END CONTRACT SIGNATURE----- diff --git a/ot-sample-data-clean/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data-clean/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..a8faee2d9 --- /dev/null +++ b/ot-sample-data-clean/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,143 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOTSi/LXilVNhOWAi/poHk7YstayyRwAOqBBIJgSD1eOODlHMuHZO6s/l9fuY +p2NeMenp3g/jAG6atY+5s0sK4NAyTWAafaT2FvBdcetTyqulROrMSz1j5xJgaQBx +49YyjMbhPH+WFrK4ZzLbwqy3ll3bmVqf6Ww8UduHBQl6aZo= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..5bc5ed163 --- /dev/null +++ b/ot-sample-data-clean/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB1WGWEMSTgvwvp9PM6SEN7yVk7vO41hl+lCLYFPeDAxcvSvEKNhXG3y1DJ22v +tth8TXzkLPnVdnBSTi9CABMaPYK7ugdDT6QXAY0jVVgu9YfVBKFiuyE7l5hmgX8h +f7bbzeeGR8Fqekizp8+tIIVXmRL01ZR8evUSyT1C3xbKSGs= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..dea0e28f2 --- /dev/null +++ b/ot-sample-data-clean/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABm7Onhq4OeuY4PXgau3pTA20fW6kayJj+mRZAovRzeB9/wGpZwwXB7B3J0T7Y +TsBYLFhtaIzbvtbHFhuDh0IdBpm4jd+cA78O0R92x/IYBd04HL4qmZo+8liYX0zD +fNeGtDCsL6TQJgEw4YnNcSJDwcrvy43tCZnSIhVMdybajcc= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data-clean/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..6bb71f0fb --- /dev/null +++ b/ot-sample-data-clean/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,134 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +eJwVkDmSEEAIRROjOQ1L00AwAetBNLCsMpjEc3hl2wSKAv6H9/H3289P+fj6dOGy +ZhgDRzrtF+rSlISjSfoSHrM4gckClxdSZ3uFapXasYsgOqWjj654bLg8EdEZfX2R +QoywtzrYN/tcPaYWwG1jEqUX4eoElb/xOSVPqbOaOlHUrw0dL7Zs7mm91WEjDLHs +RbqFB5haDoEcD3s2ISuiqnvXxrtxwaY78+keaT4arkLDH19/vv/+9eOT0nl0GVhp +VJgW1tDy2b56KDLShLUJ8OnBoL3IYebqGnvnyDJeB+lrdUd9R/F/pjJbAgO9BpQh +pB1ya5HQINFLdt4fN9wBTNz4YR4EzVjbUD5hAOOn1DS9cB4DOTNJlnPrytlqeK+q +ss/GPLYVgf7uET4jdEkiKWotyodXIUswkZnPg7zx8Q+If3mm + + + +eJwVkTmOEEAMBBOifY3PGTvYwOdDIEBIBJvwDr7MkFhy4nZVf/z99vNTP74+ZwY2 +jfBgNr9BAI21eGfwGJinCNqeZI9LShwMBctHQtYEwE5z4EVTNpe8FFt6M1XS197V +7O40hKQGot3Q6C7eY3aZZRXZEVkuC2UkVmM3QR7EGC3hS4MTSz0xAA5a7HlabQTy +BcUBN5Y8IJekwXt1UuJQGT6ABj2qGnLOPS+3yd/zTNqxH19/vv/+9eMTdVak0jwc +D5nooMxD9RuLli49BXeA71yT56eSDAu8SLBOh82lusUF594mZia0gHYqJ39sh02X +Vz3gpc15CjVhx2HW3On4Kgy9Ro6T8sMuP3sRVQ5lOaaTPIHlbwnuuT1gGYEAVcPD +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70b +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABpPwb6mddbpB4vMCkl0q6pLaqqkMqUcgaRH7j57lsr9jA8WBuU+4typdOuznD +OTGilYFYaVLAmTddnj70YQ5ZA/5Y1939Uo0heWxs1AnlPKECsc3XG30QveaukqQl +OKACy0xj2hxFVlCflRJfq217D598VVrjV0/IQ6eSEbisgCk= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..09fc50d84 --- /dev/null +++ b/ot-sample-data-clean/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABFAWHTjfMEdLcvw/L3u2FQuHRJ958qeZc+PBu6nMhrhcNti92W+Ht2BwPYmNe +JNQOKTIj0Q4u4vnR8XuZNh/XfnucrriQzGAKzWLb2K/IxhRHQqDZQPrkwbhfETmL +CNfJWEaFBTWl5caDIzxUPfNTqWYFfbUBLc9F699TQbVpPX0= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/nyms/NOTES.txt b/ot-sample-data-clean/client_data/nyms/NOTES.txt new file mode 100755 index 000000000..83002e6f9 --- /dev/null +++ b/ot-sample-data-clean/client_data/nyms/NOTES.txt @@ -0,0 +1,24 @@ + +There must be a nymfile in here for each User Account. +(User ID is consistent across multiple servers.) + +The filename can be whatever you want, as long as the +same filename is the one listed in the wallet file. + +The nymfile stores the current request number for any +given server, as well as any transaction numbers that +user has downloaded (from any server.) + +IMPORTANT: the Nymfile contains a NymID field. That field +MUST contain the same NymID that the wallet is expecting +to find after it loads the wallet file. +Otherwise you will see an error client that the NymID +didn't match the one in the wallet. That's okay, just +make sure to edit both files to have the same NymID. + +(It will be expecting a specific ID based on a hash of your +public key for that user.) + +There needs to be a nice PRETTY client GUI that handles +this stuff transparently. + diff --git a/ot-sample-data-clean/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100755 index 000000000..22eb31c59 --- /dev/null +++ b/ot-sample-data-clean/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,61 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +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 +N3c= + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB12OO75vw1MpbwJ//9QtLu2bUXjAKxu0YnD8muWpsdZNiZFMYm7P6URjTLfQg +CF0srBEgqqMuF1zTsVzy1Qrlfse0HkxPHYpCLh8p+WSYGED8+WqqQ3+UEUVk11YK +8H+mUsiWPcNYJWYWifC6QuiFNno29OmykYBdHp/3qhPuJdQ= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data-clean/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..c8dc82ded --- /dev/null +++ b/ot-sample-data-clean/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,26 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJzjyrOxr8jNUShLLSrOzM+zVTLUM1Cyt+PisvEPKS1OLUKV4FLIq8z1dLFVKkg2 +Mk4PLQwotXTKNgzLMfA2zaky9iow9I30TMty93SKCAt3KTBMT0q0dFYCGaYPMc2O +CwCC8SGr + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.64 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABHxjvdOyOINl3wZBb0jStA+SQKhLy7naabO6kRCORz0fdab2KIqcORCA5ghQ6 +wGAxhxLzZdzq+Sq9F60sou1m00NPaPcpiPBQ3Fu68YVHgurpXY+BBSRK5tyh3pe+ +k2Y4ho+aZeF92i+ogDEH5uv3Kt1/DfMtWm4gQvYPOqA8HVc= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..dbbc053ca --- /dev/null +++ b/ot-sample-data-clean/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABNZbQQRBix/2HhArEYDZmRzoDUCP0Y7hyJnQNNM9xRM6smhm/hvFq7pZh4rWB +NzbaQYZzJAqbtKQ4lhJQYBkkQSEp0JqbV1dV8IRmsBDuxz2BufI0kFl9Mh/LhnNA +Saw3jBCwn2+hQzB+ZIqxWzuYaQNILN2sW1EyTT2GijijC/s= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..a7f853184 --- /dev/null +++ b/ot-sample-data-clean/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABTA4qYlD0ZbT1MX9P0LnNReefpN4bi1ZF+Jit3O9VHmVHQsW/EQdbzwF2YQIk +UrtQBJkpycURu8QHnLeUlEcbp1icQZaUHoRgeifQGimXZ3/KrwHdhy/AHaGWEQfF +cRRLpJ4ioUdtLKyQLyrU18fa4PdB7+GIoYkK7UVGOZBtst4= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/pubkeys/TESTPUBKEYCLI.txt b/ot-sample-data-clean/client_data/pubkeys/TESTPUBKEYCLI.txt new file mode 100755 index 000000000..c28274c78 --- /dev/null +++ b/ot-sample-data-clean/client_data/pubkeys/TESTPUBKEYCLI.txt @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success new file mode 100644 index 000000000..8bb17685d --- /dev/null +++ b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success @@ -0,0 +1,88 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6GW2g1Kck5hljZrMDDJh5HsxL9Cu3T5X63lLdXGVm +xB9S/hn5JfD3f/74GgwvysbJlkWD506ORRs2zTry1TjJDq//yACkaHp+O9m0fgeA +v4o5bU7zq08/P6KZieqoTVJ7jt67aTt/AKfpPV+mdzCp2m6r00f+b2Qeo3aKkrno +WmNpPj9Q+IJ+CdJxTUeZ+/wgH7WltCJbDu653Ig4jDaUFhAEdUc2LISMsSm2VUbd +t/u3bpl+qvoExXJ3MBeKqRCvhtVzfWBKj+h3OStFmQk8n+uRPI4o9q3Kxq6hk6Rb +2vlLjNJZeseOl/NQK/SO4AIddkbIVORUqdY9jS5XLuh0k4Sl59cJul+k73XRWmmW +junbAqf774Gi5ivl8wP+OH3/MuzXpO9Aquy1Sy52V3UuxhObcLfiDk8D2Mj3R27L +skp3DsU/bgVvahGDqxa5Y9j+TFueCKfLADhzrJTcM/Qf5SqhlFNYs2AETOzdX8aT +W/y7UbJozZvMgF8aCM1Yf4sRvZLifCV0PKYA+7lumzIHrBcdEUabd7qclGe+08oU +PuesXCIk0Dd7EOabAw80jVTSvaddGJ0eg9XrCWDeYBahxcoeplCi4Jmzx3GUtHCU +QCjo1FRobLWrUXgdrJdmjJrxcG5QYwfyBZxXJL8CoaNR5+DGlfXEx3kacGAHDtwY +37QwaLN1kxSmGKTDYwxCLmpp53V1i0T+qPzqyTSPBki5xmpno40KXqtJFS+4OjsT +PcLkAlaZe5GBjhI7yuxKr7JsYVWzaI7RY6/1ZUSGkw5I+QMbqCq2XBzZDkrqcbVh +E6XSl7tDU4PW1Xu6gj4Lvmz0BS6Ln4NswKEEVlC1lVQU4IbOccRrKmKaIudrz8zu ++9IDtr4mCW+Dm0+HUgGqBePmE1IU/uLBM4KMJFoHhCZea0DR8sxuZgyrx4IMyqvP +D+aQdctgJxQOX7gW2TY0dm9eEBuT9to1sdRxp3Sd4P7uyhcFBDUjaJrMXSfkaZG4 +YJY+B2Zj3juKECzTec1o9ybqV0I8s3w2quO4KzeFEYplCvpxPQD9VVnOzdh87Byk +YRdgq9VhCPgcM7eQdlPTdxuNHnYnambYe0Ohr9V+gY/7nkDn16FcAHBzbm8dJY9E +bMRvQ8rLHu8SdT3PkF5M+DgGZ3uoJJdDRYLWoZrmimMF9wGTXudjCoH7dS30qIZw +vnVqhuQTd4l7DQM5eZLku0ms6VNy8myhGdHZ5hljIsUk91ss3G47XhgmAPdQ3PkR +DWPJsyEWVsHxVdRIsp1WStlvbIPy8FkhnpDer/hsJNTjNfu+9So9ZNz0zARuwWYa +Ot2xTVAhszYhZ4F+M6CyQkadydDzJ6SBp2JSD7Wi2xWzzYHHWTmuHAVdWWkBLFe8 +eFrJ8sIUptGehUW9wmrstAMEegWSrcXlkUkMHof1RvlBvq8lFkHULEH3jEE8DZDo +z0/gL+g3SnztvJH6HfiF0b/D+Qe0ace1+J+Y9tJxerP12+nap+3J+R9tpxP8JwFH +ANs1Xyj+dnrOc/8NgvJifi7xn0nXQEJa19321qxpnY7QV4U/fq0AbUVVAO8KNLOq +XD5UyGrPjO89oMBit+tSedPNrd8ttJauXetX9dlU5xkLloNVcnKFJWZ7JdwGMC// +yAh70JJ2nvAYTEqSpfKuf5xJyL4e70chvMRp6nCZrCcabNnjIjaWL9wbeqrSiwdU +hJME/VUzRSS4M+i6CPK1NKqbknt0Sjz5Gup4UcSIAYHPzAX+/Gkgb/z/3/a7fcA/ +juNLrQ== + + + +eJxllNmuozgQQN+Zn4jua9TNlkBy1WkJCBAgISwhQN5YHHbMvv3k/NIk3dLMVY/f +7KpTcpWtg/z917f3YnlRUlemJKr8cXUzGNVkuJt0VVfSjb/8ykBOXht/rkzm4iLI +j6QDxaqbK3D48DomCEDVSa8jAwQgqboPZNV2Xte3r2iQlXDMQRiBApTvSNd4ZesF +XQJLtS8OHwRGEW8ANANopOPhYxfmhlyKXFpb23Sk/Yc3EoyA44TVcI9EeLLmnivl +5mKb1Yvr299UFRBkZNVav2cz/J5jyjZfSLnCL670TEWJde72scIj39tzL+rZwOJ1 +bdiX3RsmmCdwyWW+hUpGuPhGYB5QfbDZrs0UwwUedT068KLtsFP87gB+QV/7pDTA +EzSgDMAN/tuQV7xTDh/Yx+rne2Jfk34iQJ7yrCWuMGMsIwfLxswke6+pKUUk4q1j +DaOqLI/XH8JTrzxZjy0r3pTDdT3OWLLweyTEA5JECxPg56DEdwNtTdhIG1t8Mdpn +4B4NWg19vbnkAeHrwn4t05Fms9NpUNounBYSuRI83OBFCGme2UxpvoijfYSVkaVX +djO2on0vLqwLe9lsvKN30YWFLbhAIAoXEwwAG8Q3joZCnQufm6FDFct48bFQE6iK +gHrss2Z3zlplosK4zXcaKZ4seo7MPaqK1KY9xaaOqHus3jM7CTAGdV+Wy1Yzejsl +RLC1ZGwYultE+ndud/Hjrr5hRTHd+Opid7ER9qnzDAESzWjTXJesozObT/ugVJ3E +P2Y0q/WNbXG2hzvU9ew6GQcwYD5d3el43t0Y0hVnI4JakPie+aLeDm1nXsfzjuxa +w8aXgXxodbkpUFwcmAA1BTohUqNmm6mepvg0zLc7ejQpjOMQUjYyMZDbid09Zgwk +gE/d1p2Au1XkYGsWlVi7CgYNIezFfB2IrdVcuTDAPPZKTE9shzhB6bOPI0WfmkfW +szt6Gu7c/UGAc2pnnsCfMCE73u9nx6z3pmymO7HLT/XMnkuhhj7VIbSnr+M0HJXZ +NB27LtFqDkJ7Zp4x6FFrS2pL/3hWqZVVUGAm3n528EEoleYnQRnQpYqcjg1l1uvC +p+k7AUSvr/poz0+DGuvklNqRW3KQ6nExK0f9fGvMNSfoHYqi8IbigbNjkVlz0lw/ +HJAf6B+f/H3yssJP5Itj/pTLL+kwN8vgf2vmDpr2pYbP1bUC5er2nyzaFfadxjyE +g8XbJJ+ruOuqTxSNki7u/e8BLFAB5DkcX8wActCg7wrfvlZAxyRLkFcFhlUp6onN +zrCmQFdI4fn1VqkgtKxv7B5cPpWKjAU0MUdxfMZNQ1WKe28U5WnBuzpFYhkjwkup +x9WlgPkAIoW086j1rtFUt5E+xzDUmJmsEjbjB9TZbtTzmSpkWNRUoynrLTKEjxSd ++JLMIohNpmInx0hAZxcbpbFxQ8FmXWHUXHuyfVNSpcPvAfLq/9385/iQfwAcjOTi + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABjwZHsqrKPWX7LVYXC6sroTDXlR8OT3Gblk8GRW4qwketUTavFAS7rLmmmBTp +V6WIcuVpLTxwvyvfp5XlIjnCHQ9i4Pw+78gEDRSqYa8QgKUbpCK8+D4doavIz4vc +qcAbf7XvfFlMnBNGG3zzyy+VaG9CmLGo3Qc72aFT+UQs5wA= +-----END TRANSACTION SIGNATURE----- + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABIfWnnOn0P/cijWV6FBTwaGED1hI82m1Yyyd5nTSHzBtn5Neg3CjcL2aHwB4z +RCOnPGn1OaviwDiv+azHZGVfMtMs9QvukggMBVrYtZvzeJnnuAe5cQeSYHPbGxLT +6FtbYtX8DUvQa7gT+IgXFqWdesOp6FhDz9p+eDQVXaOEQNM= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail new file mode 100644 index 000000000..f16b9fc67 --- /dev/null +++ b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail @@ -0,0 +1,52 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllUmvm0gUhfdI/R+st0VpJmNDlBeJGYwZzIx3mHmewfDDe912suindK2q7j3n +quosvgL++evbe9GcIKkHUxJUjj1YBqWaFGNJmnqQLE75pQDEYMy+H0xK8QHgRz7F +9WHauvjzI5isIWjGIJzytjGn4NWJm+kDOIyv/Tx+fgxxEf9qvmrTf1J1rj8/4Lcu +HpZ4kNjPDyKqjEsjMEVv48V6ftyDFaV4BEHtgbnnfEKbJNNcBsU1u5dvHn+7uhDF +UrvXZ5IuEaeCZbzasUuHKL6UFIJEe47Ldkj6CEjm5UqGtqbCsJ2b6W22kBu23t00 +tuw2sJeGrJFql2R8avBVsqr9uQ+CKhH9FDjv67dfrK9z3hhxEg9xE8ZW+/s1Qf3u +v/eHn++gvip+AvFlcyplNtsytbMhtHTKy5C5qJNByPtNNuvV7nuJ4c8pY+WwlJcS +u/m6SqQIelW8zgXK07Rb3RkqiBRayiI/n0lQl8D8CqOPSEGrwZ3LaY1RBrH0SNhN +UrfU84rlCrrtKinxQL2pNKS0zyvXELMiYoKLM4jkP/d8KY8NE9yORkOrlRZFMbg/ +Oz8606RVHd1zgBMNKerANSrgkRUQEq+I6+K7bt97aBbO6dOM1pbj6VFbk16Lw1w1 +MMmVB+Gx49Gx9qII7PdnDTxXtBmexinJvJPu9LbFCoG8coVvMaQ/bPoeSShu9GIG +147K25fjUPScfob8aiNNOQQBA5v9lQpyQRwcEl0YommgQal1ObjdjjurNU1FcCp9 +UhTX8VLYG1+Bu1we7akzngc7A/r9ntQxl6iCg0yPnM0hTCKXGz42s+r4m0blVKD5 +iA9TfsLeGy5WEHw/VrDDk3ekjBjA14hnRV5E2ztytU/4eRVpxx4L5V7jOIVAsRpZ +fO8Jcvzo6PAJa2nB5MDreKr3UD1uAbC3Sh6KaTuJq0eSlDjbjLch2bUs3WkUHZAb +ZhlFeruEaM5XE3xWEtHRpe0S2XiEwwOwiOWo2SFb5wsPcT3G24mbpTfWjVVMv9NI +HpGyTa1o92hBDqw1/GmwWpmkYrdoHVpfgZAIBS56LvtVrbAjlt36RKLaKx+3+Eke +7xFP3L0h3kh7GJRnlGau7D1gU35wV7BF0K0ByLEpaEhgiI5QINR/xDoeQ6cHTl0m +lFoENRKOtzI6QcHVLyFHy2+wPG19chbwKkvEuQB61hJdIyELeTaVmjYcRStPLkcL +4NARmu6kxrAFMK6wJXvpg6LiV0Q4kXwWVzfPcEsECMBlGKM2P+UXxo+cwD+hs/Ag +qOPFlNPYlNKQ2mbBV49pITiPVKuj7uxp+Tmq8l0ZQBPANNdd0IeHs7lc1DmNM6LS +JB5CFx40ukedaDZ8LZhbjhUjYwRau5fCiopNk+gnGIRtgLqfnrIw40I/5PZgFzeI +IDxZ20gtUrAzDtGn4gFBMAO1mw5SCc5XKQj8gP6AwrvyouZP4AuK/2TwLzZTlm1w +v2nsxMP4guj3g9bFzeELgccD/PcZDgCmrd8c/n7Ipqn7DkFpPmXz4++wrSE+rqp2 +fXmWuIoH6D3h29cJ0JqXOfCaQNEDe8sMXRkL/j4LVFYQ8zD3aKBQhkM9nlhOWKHb +xEy/LNmYVk0wGybaIKNyF80NuKq1FnT3IgHrPdPSWZVuheNwdyzcjlZr6tuVMxey +PMIPfjAipJD7x3FJuMXaaCZRuhKI2bhUuGKe5I0XlRa2WVEWQP20t+OtDcB+qW/g +0872NpaC/qR8/g6QU///hf0ZH/AvmHBEWQ== + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzJAH1UWhVHTE2nj01SQoTZrZFJqBm7a3aROu+jsVmWuL4OY5FOKb+R1ZwZZ2 +Kh8IM+2Qn+CvnIKTa7OoV10qeGX40ir4gkjes5xipx/uSeqaYF7F1RHScnmqjMPJ +cr3cy4c8RerMgVx09vVY/LPOjELCQQWtLcdx0vM4KY8iLuM= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success new file mode 100644 index 000000000..f0e4af3cf --- /dev/null +++ b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success @@ -0,0 +1,77 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxlldnOo7gWhe+RzjtEdRt1A2EKpf5LIswQhjCFcMdgwgxhMskTn8c4SZdaXarj +K9t7rSV7S/6M/Pc/f3zGSZRVc+eqsikKO8/hTJfjPdUyd6onGn8rECWeiu87lzNu +CPJXOYN2Nz8H8PUtnr0x7qY4ncu+c+f4XQHd/A3ZTe/5Mr0Fad31sAHZ/Z/K/K/B +XNqvb9hHDcYVjKrw9e2YNY7WyXz18KkKMkkUwwMn4fjBH/molPKTy/KdNhpXd3j7 +lumna0gPxN1/2At7qvGgwXSqeRHagBs3Na9k9RQGV2HA70nM8m9XPvYtl6b90s0f +s4dfCBhd78Dz+9hfO7bFm5eqU3NHQdVrXttrlE31+Jjj4HP8/hfre112DsjBCLoU +eP3P28Ttp/6Z73582vWr4gcCtGdQH5elr3u/eKSdzQVbPPanLZutZTNEzFGHRp14 +43jifYv01fNmrodOIHqz2vebhVRZFM85iT48NhcTFN17cvoKb4qqtyclg/qgU0/f +MknFLS8ne7iic39nazLKNS7W8ElEju4q6ny0tbSC86fM8qseCLMpQoxEHVgD8epF +OH6llMLvR5yjPJO83pzr6qAuLG59jEj+6VZRMeEKWG2htCMzpjIRp3mgGqhOplGp +OnFhlTzmp73leM8gnekwCPYPwmttmZgQeiMGZ+lvWaLrbXwXsDvsJpj0fp4/ygIT +nxtkGpxppENngICKtbxCS0KhtYVgDEl2kAo+fCAW9oqj1WbYrK9Zee7fra0nQ0Fp +juJSXYxG0lw07SK63tNF0j0JK08pagGiXCMufuYoF7ND9LasxjHqqWnaNv1KUXXv +ccHLvPi6mgqHk7DpXAoUOaqX19lJ41BvXlLaIUwlOHJjw2NfxElb2OB5GdbsDGU1 +wvRDjxutImJ398g4B/GYF9KLpqVTQ/MBAVZDX1mEI0a+TLc4bAHODWmGDQvNSQk5 +8sohYxpzzUZvnO7wcj1em9IX6PNivzyCiy7h4d6dAAJ0KPZcfcxgmiTzMAACXP2I +L3wYZ0xSuyd+W2Nf40PY7ss4s2s85bmbpT+Ym/9kHwmSdsxB0oLQ49u+ofNzaw1P +FDqkx2yENWZAZPY9u1VMVgtrTZQV27Lp+hLaTLSzvDcZ5OKHkYFmJ71odNfGc75e +XHRs78pNs8mjwt4hhK+K7OmCKXtFQ0HbGKVb6tgjCXG+4JGT55OoUhC9NkLZ0VmO +yYbb0l2lwlWJ2CkOtAuvCujOz3MW4MxUJOOjr/ZDtdekW40VCM0KtRqcFU1eFwJA +P1WdHDarTg1K1gzXRl1CmcJfDUGoACtnOpnGV1Jc/Vxe4/HxOiNdrqlC2pQTjRd2 +HGq69wwdXYjfD7jZqu6dnJtNoDMHWbMsAcupRSoTk7FeytYuE1sjkFwV/yGEBJQW +MmTRPYtuYnjkLtoWPOHXF/IX+hsAPjtvTv5AfoHv79T9m8ac5zviT/4GYJzewPy+ +swbQ7X5h7rTD/mSwGOH79sPX77tinofvKHov52JJ/kz7FpVA0/Tw7VlBA0b0k/DH +rwkoLOsSeSdwp2vrdQSRhffcKR/mBdplSM5VYBWDsJwHPiiMtpjj6KKiab7IRAhs +fU4MyuDhUUFMSrBNizZ9S+BHgX9aw6i/pEOb4+f1Vm6EGx7de5B57YMeI6Icu0i/ +kMJhQPMzz/KZjJQSGrUj0bIOszWk8cixjcyFCtWKvTcMpCxKuh122n6fB2LC1F8/ +Gyia//9p/d4+5H+OTEFJ + + + +eJxllMmSm0gQhu/MSyj6qrBZJITocDsCENAgiX0R3FgKsYm1WF/BLz2SfZgOT92q +8v8zsjIyP+TXP99eh+VFSdmYkqjwp41lMIrJcJakKhvJ4q+/Fchn0KfvG5O5egjy +I4PgsYFLAz7eAshEEWig1QVVH0Qwq6s3ZNPDAA79MxoVVT2VIL6DB6jgMwL/0ynD +4+MNe6lBN4JOOn28HePSkCuRy1ubzCcq9IOJYAQcJ+yO8zMhYU2aq+Tu6prN0zf0 +f1xNROzudqsNNFvgTomdyXLdyQ1+9aQkFyX25rinBr+HAc09XUlXP54110MFX2YL +13eT796BZdeBPVb0Ay9X6UzCipwkq1zntRMV6djCwHmVX3+xPu9ZZYAEdKCKgFV/ +vBEYtX++Bo+X5PW5zc9Xu76KfiJAXpyih0tdMHZagnVvFjUsQ+5im3Na6mw9SMLg +NgV+FFx1Lwwh28ra4wqCjBnmvu2Rporp7Yhu21FxInyLfnZNrhrabb8ou31e5Nqd +VC7rBRICTo5sTy3bI69MNyeK0k+yulyQKDwa9+mmXTIbY2W27EV9ZsM7J9pXnpvn +5Bqd2iVlak1xJ28gePS22x16SW+4vXAwShOJCV264xhYxxOf5MeSqEYrwSBbk2nu +Op4ZtHE9XqJsF3nrAGfej0YH94gzabMQ6zEWme8FuxhVl/pzsgsrsVeCfXSj6FE5 +y+REqqfzHAYFLXuu57fWJ5WQmaFSJi3NK6cFuo74K/NIW1ZCg5jg6nrAst3nSJnm +fKVMbhdV23Pih1vlUUmWuiZ8gLU1rqjGTY6sYxWrZ6ScKYof2N5Odb1fBNQ/T1E2 +SGzvajTdZIaerieNi5WFnNNTW3mKtUbK/q5sCzYiCDZARL3C3c5dZocnt4LgkDk1 +hL6GGzfLsT/VmYoOyaktSU23MH7rGIS+jeNLKaQh6plYMiC5rDuuxJK6kMF820BS +2Nl46+IQdRYD5TCozWzBxA26Zw9lRwEs3nVGWZVjojm6h0EExBORiWBpMIGoB9+k +BzCuixie8nMf9NbR/JzKiz07iXzoylatB8PzlL2o0s+RQc8PDdlOCpGq5zvyA/1r +Rl8vzyX/iXzhw99g+A0MxrIN/g8iHND1z7V+36gNqDZfgNBvsO8UFiBc/XhR4H2T +Qti8o+g9g+kQfo/qByqAsqynp2cEJejQV4ZvXzOgU1ZkyDMDw/JNDXahuEq1FBXp +SBqQzwkm5tpLaSVWpbpuPB5Saky7Cu9lJWRx2Yno/nFXIYGAnjlMsTEe1irJUfs5 +aKGpYestE2xj1LkTVgY0eaAEHz1QVNgDoKBaKfPJvBJ+pE05QtzK42hMV69wcye3 +debIUovfsJbjH4x8BFgipeNNXC6PIqF0++NPA3nl/1z9u33Iv8/czXo= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABGTieDIwkEcURZYvpQDxSamYMxaAUoK1IioHoDKdJKl/RdstpAMh26Fc4wF3t +s2Xfl6sG6/YSE05e5FCYsJfEMcZFSpr792vH0I2woT1D+elTP1Y23M04981Kzx1E +aPSYOJ9qpMo9COC7ydgil5YQndp3db4j5/T1JC0vR4YMyIA= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success new file mode 100644 index 000000000..812bc4851 --- /dev/null +++ b/ot-sample-data-clean/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success @@ -0,0 +1,90 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6mWyGUp+SwMzGgM1k2DEkYOYZzIv067ZPlfreUt1c +ZUbEH8r4U/oS+vs/f3wtTpAU/WApki7wB/vO6hZ7thVDPyi2cP1RAcnhmH87WOzV +h6C/nhOoD9OrA58f4cSFVdjEwJrCdxQ00wd0GN/7eXwn47Jp1wok2b+ZaQibMYyn +Z9voc/35gaMU8SUAwwIGhf/8oJPqrjbSueidU7FSURCuOCtiGO4M5+ApppzFnBt1 +uHpW99bN409VF+NE5vTmzHAl5lbo5VTthNphV19JC0nhHq7Hd1gWhcz5rUqHtmbj +uJ2b6Us8Wlzc2pVd+j7dmQu55PiFJ2vFHe6JsrZJNnp8q+5K2rlfE7S/SN/nZ3MH +KRjA2wK7/e9AYf1V8vmBfhy+fxn2a9F3CKhb5dC1UaOsswgBzaWaa1UZLc/63eQu +lLTNNHuNjtukSDx/j/w1gtWUDl/c+rImqoMW0D3UCLP0VB5wBHScWIpcXZ6xgK3Q +YtjzsdbEIvNVjSuRmJbG1AthBUVBglZPlVahvKhVeFPnYCAfwHqy6hJI/FmhFTqv +KX2qr+SUY7Fa3xp+amNfi0Ula2mUuJ4CoIWBCHk8k/OhrRfsvI/HwKFdOXihgKBr +BmyIclkpDteSo3WySD/cxG4CpH+K86FGYW8LVg8iYlxtJefRLJhAnnaVG7jIH+wx +Ux1dRo1Jas/DKMeBlwLyZZbZRewFlVCLcynmgRv10Fxtp1Q7wj7hNwuIMqdjeJRz +c4zPrfZGZI/yVD7kV140xnlfWCPcnyDKvUiysfOjIBkowv2rmXjXlIN1uuDxrCle +pwBnvZEpLxHQnIJUKILz6TABLcdERqWzALQgv42h3HoGVOpHY5vxo1nttwnABUn5 +Lu2p8IOT55vbDxuBDuyN4GIdxkV02oa2TJo6X/iSJJ1ZTiA0A7mm6THxuhDt+YVg +tsE4Be1hyeYLXbrzU3osFuKEilmcPDEGWbPEmNYZLLQ33BIXchaFTLBVvBASbsNa +GUuVdeoNsophWb4fyXVReivS/ArWBC14TYYZ5Bjc9y2vMHKAbdBGIS3SLvh+boyl +K4IkqsSuL1Ng5fKLciz93nMV3R1JqaqoXmc0QSjvrP/qomxhs8iGXLg1XsVDDhEM +pqLT+FQRx0UWKfaHxECEakwZiXFgAcQj/DrB+RKfSck2iXt+ujyFYoCitY3Khdza +AjtrpqoiPn69WlR6OXeXWN9J86g8u83yA8ch4u64ZruDXR470pccZgXtDWpXZQGX +4X25xtP2kakfxqvMC6IqMFy7tfMLVVFEpMpZdtf7c46CJnCvyy24vOoBM4UBggPP +7xAqdrjLRvXz9c0rs5OqBnWo4Sx7J3k/Kwk99vQwhXH68FmjAbvKOLjGPayCgSFe +A4q6KYiR1W6VKhqXleTDfD7VcRUt5z5NPRsXShjFjXoUgmJWbFZLF71rpZ1GGBOB +Jh858omgugL6Cf2F/EaLr8gbrd+hX1j9O6R/wJu1nbvwE9cuGMY3Y78djA40B/t/ +1B0P6J8UGkLntv5C8rdDPk3dNwTJnlM+R3/GbY2IoKra9a1ZQAUG5KvDH792QNZn ++YTeHVgu0W2xCxIjW7nL6XbKVNguL1re4gkvKlbG9zetbGbuTnJMaWUoy7ErQ47l +jdeYHOIkj6CoultEfsB49v2s9qMJ37U7VzpYuuN5Q0qIdXfRQbmy1olyxsVcBdHs +Mrurnwo0BWye9ryA93LJo319p02M19BoumKKyW2WyY1b5Ja7zBKScYs/fxoo6P// +x/1uH/QPQ4pLxQ== + + + +eJxllNmum0gQQN/RfIR1X1GCWYwhyo3EbsxiMI1teGNpFrPvNt80Hzl2Is1EmX7r +rjqlqpL6IH//9eV9eElRzY2jKqYkbsCZMx1OAOrJ3KhAMn5mIIdgyL5tHM7wEOR7 +PsJqMz5b+PkRjFwUwXa0YB3ndfqBbIYxGKfhFYmKullKGKewgvX4iox9UA9BNOZN +bU7V5wex3ZNvAPYz7FXx84OJy/OxVoR75+7uyz70g4XgZBwn3F7wcznhHVaoj71x +ddoXNw2/qDYiyNTtrInlC/xSbrVduZLHFjc8NbkrKn+7XMUWT8OAFV5U0jfVq+Vm +qsc3PDh81IASFJ7HtNZMzxmhiXSlXvpzrC5NnA5XsTmuatJe3hM0v6Gve16fYQJ7 +WEcQNP8OFFTvlM+P7cfmx3tbvyf9QODxURbM5DR3zs1quFJC0Yy4FVPcRe7Qbceb +ipoPBB57kcerkmSvopYy5CqGjk7DZod0KHDRhO5qDROwpMa3oz/MKR+SaaDvL+v9 +4M4+0fQdd7B0joAo6vdpWUg+ILOQgMsO2edEZpyStqFEADJBGTRun0vU8VRH1NzZ +fB+1bcbwPe/OQSykR5evJNOQmyt6A6BgIoSNR95RaJtTyKBwUX90VZ29HfHWHsKD +zfD0s6RHdlzzW6uySlbd8etWzeZEz7pJa1EX2WJkM1AmljW0zmFQedQF2VFS5jr2 +g1IAPjuBrvvCbFpcoOUqdWFU+0LlRKTUlj09CgT0ffJkbpPZr7LlGuFu4O54WiyJ +2N3mxr+ZXq7JXUgpbB9JBOAFXlPt6Z72S2RWFW0j49MCoIyHjjlhJjUKlXEkxW7f +PTGXuY5VCHvyJE7iQzFn5ZiafWLXXaQvVT3dNIeOZmTADuKJqKBMVDg+RmwMCrAQ +aRvlir6vJG9YbS9Qe94QOawdnyEjPWaxI6wYpcNny5yQmV26ezWb9eqxjtErD8om +BSqjdjs0K7I4ORM614G7pQYqsLpgW3F34RTIj/i2mJGzbxDDGJZgl4arwJ2Jxrnt +l0JwWE0KHpp7jcIpyUX22HWEp4TWiXMT96oV2P0KWFmMHE+hEKx7OkSYby2h6OiE +sC/3/dr7Lge0W7WeLG4QbOsalVCek+eg71w6iNZJeRTh83DzqhoiYB23h2dGxWcS +Dx9XVvF8yE/cWWcs92Sk19fYjuEE1dk5r13k+I/nXgapcbAUMD0gXiIoC3DTLe0B +p8sUW5h6pW4nE0Ox5YL2DbYXcB3ysfSJfMf++EXvl5eFfiC/CexPc/00Ggfcs/TL +YRfYDy/3fNucWlhvwH82Gjbbr/ttgAhN9VbVt002ju03DEvzMZvCr1FTYTIsy2Z5 +MTMsYY+9K3z5vQK25EWOvCpw/EWFbujrRr5iY9amM0HtzrDTFnyHVS5NEm7Q6fyh +HwQlMRn68gzUOkD1tZTQLEEoTiNtyVgjqNlbeTVz8WxiA+ofm7r3uHEYDDE8Codu +p9kz6xqnud0Du2gAvNnYWI4CEkwi7s+nhNOEaZX9+oA1lT/cDEE2JzmBjo7ftag6 +9GKq76od9flrgZL5f/H/uT7kH4SYALE= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBSstkMhL1VAZyMdIFsHP03xamtQECxsSBMsfFq9+z5Nunvqtq5TiuXvMrTvu +UcjbIHO07iRdr9pYNEYKJx8/JOk4quZMPEGXMltcNAzBJxsPqLNftxYLCczDs/M3 +Z3y9vcUYY5vWllC8LLSfCKzdzk8lY424XiKYWxRkOFW5i+4= +-----END TRANSACTION SIGNATURE----- + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABIGFQ/xQgst4JgISX+CbvtyfxIS8UGvLx9iFz7rXv2n1/T7RxC+gPvd0Wiz/j +sQ0TvQGDtmwQm92JkHc3DYfL3MwsC0Zgl/ad+fPjk6IIuDjWlRAzf+I4CeBWjy6b +FrvESb+eQGKyBDtIjBjkKTk/Jw0K/9sIfEFu1hx6klBCEMc= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/client_data/signcontract.exe b/ot-sample-data-clean/client_data/signcontract.exe new file mode 100755 index 0000000000000000000000000000000000000000..a389468779b18617703d4ad8950795d77eefce52 GIT binary patch literal 5408524 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̡G9EP%|DDk6^G(-c2VrI7m(ilULg021DngZzFf) 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

g?Q z`|L5x%l;M^8GyrN4+4%+L~axDAVCBmyl8mLaxaf_n`06eEeLSlk}-+>1reO#xx!Ej$A+&}6>SKjGLfZYLXCBv-cGH2V7AvDp=+5?| z(y|_m(IRkK`fgJ2H94Ww(Vt?g9!}KavEQlKcvRrhg6Av@n(vb2EM8adZX}EYq)b}z zM9ZvTd*J}w|6|F_0y@c5D4CF>O}qPBGW3=pgJ!#sxr<~z!5uo53|fUkrb@|V>1*X~ z0oMmIXc-Eb6G`TQ02z8UN|Vd0rQJ&_O^(oyfef00LWUP*xMu~(&_$8VVwEN<&!@d) z$j~W)4BApc<|&ft6d*%?Lo&Ji4SENb3_T3Upt&SuMv_cDI-OQGXdMX|SENC1{?H@f zJ%EX3kYN6im{ZwZowSIhLgqKhh|LC&fV2k)*@Xi2YQC(%Po!971-_FjaAB^%zvl{k zBv;@)xdLy?5!h6kEqT-ERw3uN3OTJ+$e_$$*x+&KL}mGh9)8r8`l3!Nx6l_g?$U-Ynwjuiuol2V8syYLUB-@qAP5qW_3* z8f)h+;efL0%(DYgS-vS!^l%_5%QsE&qqfvHjs3tM{0cT@{B=ARL&3H! z800H!=44>)_y9z(9pmqN*~5pxWtV1}X~WQ>f=rM0Y@l7h2AZrR#pr;JMw&rGHco?F zk&O#?QXQG8A%QoGP=!#2tH0$|AVWAZ#iuIcRnq z#wFR26=lY_az&Xju3S-Oj4M}^8RND_4{m8yn~Gyo|2V0jXxVU;Aa+pPU25Fe?H~UL5#hDKmXv*R>U=9 zTtXdrU9*SZhuxH~{`?5fSMTu3f5cb6Hplm4Sta7hKvY)A+x=c2E31U>h>euiF=jcF zZ+7*gvbJtORa{219<_K1qRbio)k$?+W3yH7Z3i$u) zt2qTj<#^T8|43iGZISP*D_Pz9M`g5dz9Mp%=bx{h_aE`k`#+L%m`4#6b-R=6IFzJdZ>(P4%ykKBsEY@nJYB;5yc*8wN za58MZ+3i?UVTS4+WkjoWGy2cJG3vp9oj`Kwv9!T6XS222A3bDC>_MLxm-&KNmO}ej zVi>G8#BkascQj_C>FmDX6PxW5tIX++Kki^8tMrKBOidvsP3H#!#9s1=RV%S90~wVv z22$-2!%><-Oq$N81&DD8o6%XF63a5gJ03U0>O5jNK~soH)45%M7#FV@VoR0S0Ba38 zx;@YmTj~+RN;V-TP3Py)gR~jIwQGi0qY#5JeX_l2IyZXwSi2_p;*M_wKHPC7tVX7X z1z*X~HwmC=I_HWqP3K%ursYg^X*%bMGVVA> zlr)`lg|q3LE1XT|T;XjropCD=23h&@0Dm^sbQbE!>pykzMmddeCEa$opzKf zO>Oxz-new}roHjoP2!Em_uc|;JX3JC%p0#OXxke<{;cl|HtCHkEwMb_`1b)~oAk!R zEwMb_xKn`GCcW`HSWqSglE)j@Rr|@@q&NQ2&Nt@q#y13rZPFXhw#4#y7{Q~H{&j@l~?Dp}{7rPU4qkqTx z#CXI@k0d(fhcH-A8L4yo9BhN?cqvd!Z+lQ->xO9@7Wfw4`LxoJRJ?akAVM~fndH4> zB0L4vy6cay40wI}_$#d@?#>3Sb{Bb|)sPKc;>9I1AZu004?mW~-YM;4QP1{JO)@Io zULq>?)gHCrRvg=~MviS*gJT=k#3QSdk=57`vsW!nHeqA_?xXFo4ac|RP1!E%jix
{HB+oOi5$T7c8dix|glC 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 z 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ΜW|+|e%bM>Ar;MCfu%XuFw4O& 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∾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%0D`j&O8z9u7gq39LVc2sc8(Vf~RQoTfj(j@*!c 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 z zJMn$Q0pfdzvxrIJpAqNrolL)$coOk%i3@?@wXjc)_jtqmF#d^s4H)D(>Dcv1=e`0= z-Aeovu*iMY@IND6=Dup4`>I9mtCqR18ss_YJoiR!J80WekombtH5;=XF&KIokq2bQ_7n!6N!h@DM;{5So)8yLD5{tEwz zep`#@fsIH9??yWKW6)=>#q;Z)^rBWsc-lI_AvuzA^zt51KvM( zCf+~8bMOy_kUncQ@}0Q~?N%rAH@yw-@7Mx^Ggr=SPVFdCxhD_jAqz-qQ?xp#>P_ ze(-+c2JQ<#%kO+d$-l^bmOwPXAWT8vX|)q%gOOPz_lz#VYy-UYgy*Mh4*N7kxzi{V|-tH4djlK z-+rD`+QV}L=`E1&2A(t6$8kXO1+Z6<=M+l(uG)k2`(nU^EmUDdEQ}+=a(L$TxalHLy5op`q=5P zLpOg9w!nSg4SYV%b;&gEd7O0<+U*hMzwy(s(=whPTYWd$>)4s#yMg3r@NKhN`HVV=Jj=JOl)J(R=T zU%r-fXY2v}W1j_{@OfZ}=Qj57+{VkycZknR{2oY(`@u1mlVbk+d7j{U(na|^Pr4}S zMsGxU=kXlKZ9E^co4-SQJKLeBSE9X%E&{gm`33xr%gGTue~5G^^L)sO-FSY%7QW~C zks{BRY+(8t=3mA0CS~roXPHmo^ObBbPgw1A@ub`OA>_~Td4c(3%-^{i?;oOEMdr`*_kDZ$J)Ecb9sLl`%{21)0pdLQy&Te= z$n!Jj{}s;3Y(D|Go9Aot|I70b4F1<50I|( zVU+Xu9^kUwz$cjh@{gmvF7f-sC-)(}mfwH8`W$?>vB2*)#)$b3Am6p@hx6of0qGCi ziuX5>?_7=(AM3~SJkOtQ<$0#|ccGm5JYSw?zZB-Uaz4u~ay+_*eD7g-3ZG|57a-jo zUqyKvcuwjJmcNnbU9aSM*4@PGhuJXw^vfCiUiO3Z+bOi?`FmmCo9U

Ed*ZV8^JmLnZf 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 z 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 z zlBFri=`7-2lH4})ag{suS&BPNS&BRD;GO~-tz;cy7z1eBc}?tIcjh2sjb+|pfLI5& zf5dA)nad`b%)?;z{M#?uvORAy7E5PMyTm0+sGqLae!4zFS1WYUU4w+o zICeu_Nrh)LQ7Jt`LbYI{;xe~VN!@3Zs0^M_qT&R1@e$@8lVFYKvtbFDNBOK3pskIZ z9F5(A9MUu?xhoREt=MhPQS5f*D0Ttj1v4SyIuG z%G^n5;8qM?KdTsQJgXRN19#_X=1$FE=*xtVx;0J{ySMt^K_okyc}LDLuTS;o=lWLv z#axofKg%-Xxh$iuD@U%T2>swLu`>7cIdCgQSk6_7a3oJDLUJB)R~9h$Tp>eU5rou5 zxJ>NcBGf`;`2zDcUSwXiJCE};?u>&wzLdG!%NSBB7`iVpST9Sclu$(=*1IPR7}JCJ zv*`Re6FqpZeDEm!0&doy}<7_b^Zq5 zbE$juk9Hav=UHi>JJ+THzH>cNPu!L|4$CM2A2J;%{6yvNylOIjC#J1|;_@$g%g^sm zQFmxmIVaAWc71o?huu53)3;DG;jB-iaGI~{hI8z^UpTXh{K9#)fy1f3CgN^UfRb2g zpm3%ZaX4Mqi8~+Mbgv>IwVuy%009>QdZmifP*E*~;%{(aHjBOspQuKPY68^A!<$qi z;`-?T(VxFS!`19*3UncSquX0{F;HmAi#aq8QLa`gl-(f9WmLz57e7&Pk6Z~*To;P# z{^Wu7$*HAuDqt-;sk{(l>7q%qhS63=GhX+SMQVw%@X&9gLN-E>mKdabfVG7?B^;R+ zL}p3~HQZ#`VSrF<&zERzUsu^qDOGGcV0)Ye{oaZ3wA8QpXO{Uj|JQa?)Xx3;X%D6B zQ0SFoubN5ey!0kONlun=Nk%J(JJrrb7?Titi_bD|GuZDibU$J!8DZ#=Q1+P5`Xp31 z`D{Rf?FpX^NvIsG8Fi+mLXn(8=G>e*v)q&U7MT+tI1~474=Vz#>%4&X$&18I8_|~;>Q-1* z_26*ICGM`=U&DBVo@)6}3Phao45JAIG$eap{CZy_lGbFR# zk=aY8?ec>v_|{b{m~vBDeNr0p2D5NfZF8^2WL1-VOD4TnD&*neWgWFY_Jx?MiZ^`aUydcZ13O z=-?u;Z8KOFQr?C|Z^E)b-rURbseKGn9~g3CPp~%Q$AKCu`C>`IWj|3!+_VIG0Ydz| z($h-zbFz~Cd{sqEsU^%bUnVv40$f2=P=3}ze&iC%yKD?e*BC~wOKrw}j#sgtCGa!9 znT5t%AjEzit7bn_tJzO0s5rKyeH2XYDp)4A zAgUml<)5*9@i>EHN~$p~Q{5FV(@m7Ac$$T#ToB?iJ-)(a8mCc%Za-ht5YyCKW=i@X zHFNCqYJzgG8uG=;%iMNZEOXDF;jq zrEb|1b#8YGkZdkjWDDzH_j(=sT&*y@2UBB(TlTJ!yo}@=nEj|;cP>$gn9`>66OH`mh9e;DY|NC8|C-3nx!%L z0*h*eA6d5pK=<16ZJpsiVigFFfLxUK5c~NSC45&TUYwalL-U4dDVM#>;w=Cj@d+LA zd5Dim0p-aXKfA>@4c$(nIBl@3u-$rqj@_P{JeLrCjbv*`^2VD}5yeUg-4d21lpLZw z9X-W%lk!hRGzXF93+5n|66OEo#D^nL+-~LLTdH40Z{#5^RS#aZG|W zj?acAWFDb2?aI-eTbgx_UWB&?Z1mVkJVUbt^HDylmoP7(I)M{i0PmunroLMnJqvuA z^y@9AU0Am8SqI2N{a6!OtsNlNxo2E*S#iG6q*0UKL=I0&erpnoHA|S6kbR63J0!Ry zlqGXwyMze|@y9u_P(q^wr-Wq*#VO3I0#O3f=eJ;bS1bZHz#aRh_qS|>| z8`Y;Yv)#~oj`@=d7#xKRX+Pm+BDu((i4Cbp0&9w{(bqpQX87wy#oDB>~HyKjw40eE6XR!Qcv}5kw9c3q#?{b=v zL>0EoO-h^7x7f6`k)d5eXA_^9n;A+ZRNUq>ryE-2*&PY3651rRGmPFP5QbkQbnjy> zY*Ti~__^=quw$olNeAnklu&X{o=GU_lxGr3?(^9^z&M!dU1nwNh7nY=rC_g5ZZ~Uh z?vW<@7%YPfWkUo3Os=+>sLiw6*FO}i$(F#mo?-T5X@sHh3B$lshOse**k=qW;{?X8 z`t9tcKdL(ngQUY9izZeEBlOqBbA~<%qZ52)e!-AD$xtGp<|Uu?NN`T^*|LPBX+E<_ z7?LpZniDN92Im{e@|Iyp!pN*-dB;#Ep<#~CToSV1^I7gZL%Rgm0-vRSWT;DQBJ*)pWa(ls_b@m{7+lW@#6M!iPUJgiw_J?4;V}IfxVI9c$evGT2a_RZ)7luGxS>*E-pDt^iJd&2W-Tr!CCWB0$M=Z$xnwzMExxK z9j1S!KVc)I#53^OPcWbBG=n{p+3D@WImO_dOH0d{^7fQ^!9IYiKVkR*_Q2A623iZd$=so=mS%D%wHnEi`c#^GU_XO z|M6~-^@c)Z%V*xG?OV5qWGy4`%&|?xM zNO9d{o6bh!m2IOA$@V5rwlp(8eafEn5BHdMgh&2YjA-vA4$B?2_SdYdkGcO_9PKsj zJ-9P!-(GR-4J}xc3(~EEUekfSp0g6DaSgH|+ang;wLLN_Ml|)BB6jW-U2JAl=1(w~ zCjlF*IT--E1eXNsSx$5S#IOD+3i?dH`P28JciyyF#D6e-Nyl#&OKi?rRY@X!?>a?EMt!&7bjes&u8(=bOa&hjhJc7SBoTxBuTC ze*bkuG<~P*Q9pEi`)yPdC1IliJ>Vry_nSWd#(TbJ|L$+aOuy+%(Kd2LmkrB6dBs@GGO}FKlLM2*dau_4_NjeKNq$^s)4(Mrr(JAAqv9Okmodq}B4+L|e!olh)TyOurV{PfcHlrspQHfv=VwUmw7?!NcgqS|;^#pq!<<;4~zo(-9{QHPBea)b%Tut_TX?&~n|_C1Qr{2Q1B zpKi;2Nb{Z@cxWk1ym)G&_l(Ko_fM5^HcVWbC&4ZV(yIYje%-fT8;uXipvZqtJeGWv zUX~U9&4VYWsgx$l6@ZSc&jXhl1im9_m!HUm5s877t|;|5eZ=7>^?&4I>?3*M zgco$l79w!#-G69_yA&h&VQ0k5qvpvIb(B2Gl`yJdeD&C*G4<*YZc<@`-XFoH)_pC~ zoYacol}FJTx+vC3yUMj!>ooD@;o(_8lXkF@*`bU87p-4RhdIS zcY80jXk5vNr4C<{?NMF!L~$r$zec7Hk#b4*Q_dq&ZZBnv8hT=)e!-(AWrDb^V53Tw z;AEi<>dV{1UPVm>9e_AG?!L-L#!dA1^uI^!J`kyK;}P627qMci1iJ($fM!GyxTc?u zn(z#Dm^k$m{1-e~9+SyWnZt9Qz^xsO2W6MNeA7U9zR1tE`n{N>@v&pb#ESL z2|lhtSMJm>cywIy@OhHXLan)k)mj14C05n%VW$nA=#=dm29J*T=ZbkxQX$kjrCM{T z)Gome5bOB*jMyJW-xV{_5c5;yKX0P}2iKsJ8P>Zm;fVbnoku5V@+-gksu>V^CcJ&F zhj|35%w^ItfW8P5j=4>EOw@tMus_o`iNZGT5G@m?%`*ANh}|@=QPS_>TDu~}YgnAN zpp3krk@wb&>9-!=!e~I+qW^sz`czZ+<}Wa|Meg|14}YbtomjaI+d`jB5{~!uuos4W z@c4aO$Ut&4B>Uf+#KzC)6Km8x6~CfE|C)<>rpxb4TQyw|`(@l&8Cdu=ELwKFwX z*sAW_gK+c<*r=vTR9?5ih26^Co6f5~3_RV!uAY2tLjQ!$fL&oF?vx;0*}{!I^EH(> zvz)I)a|K_CZa<__9ud~y8D9sbF0E&t$Nhq9S6jH9R=UWu3AjWf|0VWJjsj_Kd`AIx z^$U-y{tu%X#BnpXo4Ofyb+|_~1oI0|jRdcZFNd-jF1nv8??@6v)okXAqG|?B(Z&HN zzRZwWi8!oRChzR2C%D0T%B}F!tTIzqg>P+ca+j3t=|!Mtv))(GjKa^2VC)owA^fNE4u zzS5H3E4?kxA5nK(4CW<9dic7?d#|3QOMeU|F$Q`#OpOS8aSa#Ka+Sd)!BNX+wbvLj z>lo%GIIr_rYdwSQ27{%6!NnlVnZ>wV9Awv z5;`O}C7AO#&kCT2H~FSQtk4b8Un2kWK%^*GGW|Ys2Yr%D^u>nCb|hx7*k-*1fq&dg zYb^sGOj`(!FPMJ)r|-Xt7FQRr5+lbi)J+tPg<@pE^cgWdTQF@U=vc&>4RsI7dnz$; z5Un&T-tb*?(b_Rx}U{-WtyadD9rqux2-Fy6}G@u`2o^z)uQkyK{vX%&l0 zSo#{0@p#1C--!7IQ`p{vk-PVie^oS_U9S}A%pxuA?*4&X6R{snv>x_tOynLh2B#X2 zTtwwLk_qt7JAEsZ{-%x+w--(H?|T%z0g~K*1kS`PX8A7SXQX|%J7TYxT10`BxQP2; zdnMVv7l)VJ!)VSDb+`NmsMAZPeY+y}iU;t1`374a?`N<*g7yu6z#?SF5?|0F@uP_y zz4g)b4HofULjTGP^YQ6et;FIm;}AV~)Wk!SbHZYyjmYU}u)y zWglGDOd-^LlCa>0LuaHFcbApXRKwrBOvQ41U~BULed)v%U1`e-Nn00Kx)mVgL;a$3 z#qI0s70s}yvHe6U^&fG>1oXP3-poahS2~>M&7u0EjVLoysO=D@-EOQyd41M}L!tUp zI`PkxaaNgJRw4q;hhUu_aHlS<)vtpuk8 z^D$1eO0Y|CoZ>{6gv>NPvrDj@k$Dm$ety$#t87Fw^n`TxifrG~W+OC%q0_xnDZCr;5DP{q813$i4^+{NYj3NQIXhwdZM zeI)ezee|~%=W929pN}VHaZ>yn_jgfrG-Skw%2(VfJeq*d(ra%;0+i6+JqZ@6Qhpp- zG{uKX!59&Hl$Wx0Xx(@fA4;=AZQ3kcOOxs{CFDr0v_z}1Uvd=EnxxBc$ttA^r4)7U zw4q(YH4Z_FnKtzmWQ(P2nFO1JY6-Ox>Lu6#-2W(Jhfnw)B!to*Yuh8gi;UWax2kGf z7{VK^o28~!2^|s~QZE%&>t0r(f2^!{cXp4I8;~$8!6{)(!i0n=2`+$Gr`sxBiJ{xX zizHGzE4k=8qp;JfZ#C|hCWX>6#C|THCgVO{3qG$B{a(A3ZIlG%XSy_E4ap?7B*o;C zu(qnRj)jsr%sMn;t*~b9_Fe^|<(OfcuR2amP^Xd49t*|X)~EIskCEy)sHQe9E$GPF zlJ#V-qBO};)*>NILMCfkZ`>}<9}iW{MtpoKJ0AMa^tU%&%DZjfKSxAqVo`@!jRtX&v91?l}293v_qTi+6!6WWd4>*=C39}OB0S4Mq zPUvepjVJV%q`bKY^6ODEnqUl_2>n-jFjtfIBaQyvam?`G%2rpbv?1@7ij|WnNmK7<^79Pe$u~4)hGRnbp0gh zvPxZr5{g-+evxKLgsp{7jA+oU{RUGO8efBH1bx>Q!7mvt+Zv{XwiwNi_2U=~vK z19J#Z4%SO~JInhArsb4>VD6pr4@?hqHA`Ks5;`O}B=oqUmz%?Ygkb<}VgGrLUn8qX zb33i=sN3;)o>NMXNtlo@CBX$SX!M6q>j&Z_ZJiXeQhr{-k_2-fyBjAVK|-_#C2{(sYj0;J26AnI1~9)JAL?a#kr< zD4|$FnFO1JY6-Ox>Lu7EIG=JDoX=5W+Og1^5sK{zjYFZ>xRCZRbhDUy7>bPxaZf_A zW1(}DZZ6$B7Us?7zqg z^=_UJkFs@2cskp^gsmvy6a5nQW$TpirCtd?poG@9R6_a}NP<&>`5h-(CD`W>1fAU& zx6bI8vgCyNhdnokOgWA8B;f!70JM3@1+h`mQkaGjXzrr0!iH`R5lyw~8C3B!BNx=&waVW#|{; z@bysNT_$JpLe>9Ngo&G%LV4j>T)&EG(vC>+q80&Eoa@XZ<*(t~0Gz8=IadScu9cHR zt8&;f4x`yUr z?nPyIx4=wTF?V)vfq7mS>e(kE-abQNeEBoasraYW{0rcBFu!-pOxHR3ci6pU=2jK% z8L(hMyQ`{{Ka|5n{Bsg?`UocFdj(rnf@3Pd;}EnTq7sq31WPQ+r`~dNC7&D?RdrzX z%k1XN9%PyiLsD-)PDz2{is#SQK95J9q#2K6o}@F+(XaXM$LTHz)$GR^EFk+9*r&JO z7`kzpg6*>{=)S)jFa6y}GjL`0osuC{+O4oj*)Wj*|(ij<%#Ctu`mLC0){LoAS~22HG5~O|#c%qDZwUMcX=T zsuiy=v0_t}vX5V;-p0GvD5FmCf#w8Zv`dS$o8wV(jrNuc8ts!>?eUit?ZsN{xmxWP zq20#XH*OQwVwFx$`+4K>wCS>{2%h{C<0^+esWw!%|4yck;!s}R*DSqF@TI4CQFKwy zi+PV1Q@UQH>w0lj-;3^xI$k{BNGEWMvrBLRyxXesOQ`L~Y^M#iXl$OMUcRJmUY_Ln zaf*P3vAHBvQ|@8f+fC2@Xl%rn>e{H)x3S`9qqtOSqYyUiNn9%PF$Nnz&Uv zPQ5m?SyW+Q^ES8a;~a0ip}V)HsIrEYtR-YQWR|zRg^9zLLe(49vg(P= ze1bKo*-Er*R?2ot*OSUh80z1 zweE?^kb$ZWuBlV(qdASiCc!DeoX&}M2`+$e@18q%ITU}rgo)FY@Fzo+Rj*{_Aj{#+ z^0b|2lEZU;7R}V0>CxfINU3Bip7TO5TC>?*gq3LSL~zUu0#q_b{y=4w*sf;w{f41+_0IY%a*WpGNc zSCr_|T$JJe= zCX^>!%2^EHOPRvP>I_O+oyXN`+d zYT#?pRXtzr+<*(Xvg{IE09jm~VDw5sK7Pn|4ux8VITgbw7#tb~Ph8H|vInHdlXQp8 zpI7Vio3~Ud6X(q*}TDi{<1Bd zV~xDSK&d;a1Vap^sK*|I;>sDimAmnP;D5kV<)%-g1-HGtaKWAeHde zwIj{&3@(vp)$Ez9kmt?5Lm>z87jNl2-r}wfIR}u+*pzo-5JWsT^Onw)+gx-%Ro@kS&m% z`XyUB=UTZ2)bc1*Fk$B&;A1QNxhnkuP`p3Imd;1*N^i?|Y3MzE(U#7ccJF4}ifiTa+1pS)Zh`8N6f>eA zMwrb!#Fz*EzLEIo0Quu=m+|h9@%|Je@$*5YxBdG@;-$e)G7{%;M|V$#y_3OtUlzKH z!P+hJ9>}~Nnb#-t`eojL%o~(>4*|kDOdvL(BNAgnp}apn-x(@5@IMLVeepG8*aPy| z%Xs{uWW4BReCcMq0Y-;pbU!}P@G#W<_{5wu)cyE`eN-9KrXk?e2)y2QJd?5f zl>Xx0Cgz4iy$@ZaIaQBXWRGF3)BW&8@fdYN{Fenk5AZ0|^PE5fw-wBcZAX zN8+hsh0Te|@#8%5Sj~AHoDaZh8HLVu--x`&p`OP?@+qvI$3z+*hbqs8G>?TUPmEN< zA-f_xtP;Mc7GCiR|NrdWeOy%4`ZxZ)_YA{>sQ83LM&m?8G||K%A|lR2L_|bHW@JW_ znR&>F%*@PeA|f&)A~G_viOkH%$cV_uh{%Y@CNnZ3n}~>rjEu;P>|SesKBHK6PT%vr zU$5WqkK0l9yysf$T5GTUIJ5WQy9X=3Dk~3uDOwiyLG5uZ6^a zb8+CCC+!|_gShuQDU~vrv+oZ@z8_uWaapAH8?=B)*|&NHaU;_gJoQ*92Vegp%DOM6 z=(j>_m#b})x8Q5uf)5@j_&y7MA`1=<==ojWp_$$K#QD8GX&Mw0aj)#bbzCX$mftBk z@TD1#zD@nP*eiz?`&t%r?LksZoI^6VLG1AK@2dQuSJ1z!GSV}}`(>6Das*t5mVER} z*#o`gonIX&`G73x`AKiVIjm1ya&qVwkKA8Q8U4khb+S^^pNsu`XtC#HvB95_bgw>f z|DsQv`}9feulmG;iTgLi_9ON?VwjZO(IMBKCQMv+LYTPjf-tGQTbBouvU?E2WDpbA z3jIa*z52v?pFXL@#Dj^mRDaQhi5n9SCS~{Qu_jE)%1|8>5A}flq6d?vatM>A2O&(H z59w;c#Is75>tVcDsZX4b;KkMY#Dj^m3PmvSJcc4`^ojFveNu~w2NUNLsDQ~JCa!9{ z_$2DBMLkSBm^jy=2qqp(oKNd7x-eLS7H@9{$rOrM7?6dF>(DU+$NEdmeq06UF;gs7>FF zdRKQyon7CLdaHIwWYvKSM1LIEO@pJ}XdY7M6?x_8kLQR=*SC6)4=MTOw{m{bSC8IT zzR6oXz;XOw;IEhY9o{Qcf9zV@fcF~8A+5doy&RcZeQ_P;eVKB{cZaRkEUPuWFls4R zeaGH?@|~Ddnd&ghayzmeCi0Hnj~5U0<1j_;->rA$FcG)jo4V1p&}-1^`ox7v6DA%^ zoJ}bC21>pOwLn|-i3^h^Ogxx4-$o3RCQO{~pn4msw?pqi??Y}e5x?n8`E78@Vx>sl zn(6G+BPE!WVN!{S3zPMjG-2Ywr1n$2o?A{7L)Mjx=3jJmf%vV0;{L<4m0y4G-T|I^ z{Q~jJ*3MR1_DspX`l_q{Rj|nW%Dz3K^+CP5IP0q1qo0#|gHH~Lbx)jad0oF}iujdt zUX>1ss%2ez2Wl~K%ZZ|Y5kbD=@s|8?kN!SLes9_PQkASch+1Wz$y!FSiOsowiMPPp zKTf&erbVM(xO+(6l`eh{wYS7WLwpC|eW5|-tkshl&dncH)j2ffq5^S-<}J8ErdoL8 z)n30KE4pPx(I-sGc459Sabq%wN!jO!VdBPQ5R)>GoEQ0@9DX`9B}UwmtM^I1C|baz z50gQZwB2|`fquKF{B>xL{xl_~AXWU@zeWGLKL33At8S|0*9`ZfhVu(OO$jDtm{elo z!el)rwU{(u(u7GXCT>i2V&cK150gPm_G04f*5?I#h#Rknxw=4JiWT3vd~4YIest7} zeZ!)sC9;Y2lbx7&FzJ(%!D)%hcdDz@Vbv0AjTV2m zs+M-OQY{vbWy_W?=d{z`BOVwJnNNo@m<`t^Bi*uLG zot?WywM9Cz>{+&~j3&(@{;trF+HG))6deYSf1PoKZ-;5KHfK(@_|v2Ir~~5BEgoq( zDJ#{~B_(QHR;8M_O{>@3TB90Uu5MPXD@8-m<*G-sNA5T7H*VMZd>Tzfenoz1)-Y>W zrMlFu+RA*Ks#`o|(!#i-o>#6ls6D3WV$G@M)o4Rw zb{OKfsXN8&tu>Yzoazo!o3?*kr&g*z>+-Erclhj3cc@Nnw<=Pul<7)kx)n%QHY(i) zZ@L{Koy)j_=?cepXeEb9H>{=Wz35U))YvYyP)lE@b&qK>j2MaydE3-BP4=aB+*WO| zQ*&xPCP~?$(OqgXB+bjuU(zhr(%ov>ytFlHlBGgjuP&cAZ^42shAOcf&5qdF_T|>J z%*u+(;SNNv*QObgDBUZbYkT&it@IxlM8CbghUUB0|f%-;?*v)*UDw#VSq z3e`fjpddfLLQR?{{>ZgnKIY9U5#4T8XPF&lmu9mU*b?H>hgIvmeCxdZYP-5ZJQgor zWS*UBwRlvUB{MU#cWjEsXZw+Tsz)s|^cvdLl$3-7IXfvSh3cvanb}QZoon>VTsJOr zhhL7lOtsm9W9Koo`1EZJp&o6LKR zs||a#I<3m5(&$LpJ+1r5>>9Cj`i<)+R2$+P#ah3Xze%k+vS?hTU)QwUd8Jxs;6}fB zZDLDWtyO7pPXD<5h7}X#qa&yzXoGmjX+>~luz6l|T(m9D79C~@2nz^{jtNajOpTLI z1H!^AHj8*QENon8YFv_hF(N>`UilvwEF!j2>?*=-wnQ-;iHS>6J=zAX!PF6$zSpoMb&Zyinq8!(r{>w#8m*Sq zYL{t+Uze%NG$bDVrf%PE-#q~hhHYcEjVTW(57;Uecv3_}e3B(DF0MgcKea!&KY0CA z`Pdh_FLWe$BseZ*uQtOywa$>IWR@ypE}Fy-#{Z5f-}Y3LHWiKJ}- zb8`zXsF=RPw{c>hVXwOBc#ltKKx;s=y1}qCKfg=eKHhC8nY2>t3>q>O83+6}8vBEr zjrC)C0{W6V0?c9vtk&3!aIdL@;;e3H!)ni3Z!ekR4mAuiH}+w>(Uo<+)MVWO7aT(~7W)sm<$FN^${WD|R7`AAq8 zAQq;4SYn#=9bKJRlo@#1q?)~pGt82H;Aw#9y}ryxPu8m82iJrWJyWe%`BxrzW(`cX z23V4<;*WRD&{vKExsK@1ysHbRNwW*p#ieTAdQ-&A4s}q?@Y3p0m(-|BGWV;Sj4RaG zC8=^PT9RHY_F|GVY__zFw2Z_=xxRVCzRIKFnRq4fz?vtYl&J@Q>Z_wu72BTtk?!$X z+@Te#x%b0tO@bjW0V)YTTS;UC1RjXA?wHg~IH>)+?&8kgXXUvPqiL?x9Lt503HmlfJ zY}{|8&Xm4eox4jjm;39hnpm?f8Oh11Kb3}yI8Z3SUTcU!q1H^`C ziI0osR)MVtdpfa6#p|1a<-ls3=^ga>F}7HXrChTnghv-@ahVCr+qFb42eIZRXNbd@ zq0BUT8FXmX<0CB*VG&W5CcjQKDJe|u)4EJ`{&oIU;<3WC(qwiNj*ke7vJ3}p(u%cG ztw`%WdZpGrrOCfJ!)uIS_Z~-2eggfI=*N8 ze!byRtt+TloQHK7deoAnr22`Q)Iy_tIDIyVI!>P+V~=q}JQ~HL-)HTZlE{{a)!O6C z^ToDoj)+al$;q`v2a5w)a89iF8D)-)v`5+l%_$)%wnTmRZ?-L&k&+f~4Y%x3qdL`9 z$91YhV>{KY>K45RmD(Nv z-a_;Imn0jAh1s;^&Zfboh4owi^qB+l}QuWt9tNtuO{v$u(p4)g4APmrZ8!l_kjy~f%x!`k*q z@=-gXc7i9!>~L$AssIF6i!E0^_KHV~CPF?ov7M)Ms@tb^s%`$A>Tbhs!y56ZH<)Le z#UHyprR%7G085fZ92Dg-^tdilmCq(ap;}=S&jP9fs{O0|NBlMG~=h)J0jxw>YuF*mg;}RV9L3K&3+GI@MqB@-FWhlO~jN5m zy0j5vzu4P|^)MnMEF?!9H*<1q;;3nhj*E+kwnZl1IpI8I*1D!R%>^VYF$a(0w8Pad(bvWSzJdR1R-cv@p^(wekpEe_{4iHX^NI=$f$r%jW4=pr>KC4Eak zbc&@Qu~Xe>=v0dW*Bf2pM6^>K5vRuTT~dp9)cRNY7abKR7SpaHofFLS0<6~fkjN}s zq}{1Ha%|>stIf7k&B~vG zX*NVH=k{4U$>q1wf2DuTn3^%A;!$m^QTMCc zv^KSNqWI58y2oxb)lMk#T^H^)4IXQDh*d(S&dA8H+9D#7E%LcNCNA0`R;4(bH6Y#* zZL!9QRY*KyZ2@7{DDiGio+qWo#aZPVV~LNC&W_EFjdH5#+;iw>I?2h+s@Us`orOFU zh}9u3k88pz73+Z9V}w~+Ra;_uO7`d-ew%m`Q?He2JI7=v#91Qts>9llco)^AiMIyg zoq*Y~>RmO;vR56MFmR8lRZNmbCaj%MGr{ag5C=V*&C=-G;MXPQ*_M^KK-Af(wQKSn zgZCldNpy%u!WOO7kgxyH-&~}bM^vkIc5wP8H7r=1Qe`s5;eRZDibziGyMXW3yXQWJkrH%tW)p9^4}K&0*r` zoR}CkGs(I`vljVU*J|FszSatZb;zLqRINp-wZ&jfOO$Wq-jW zMdAqeR}b-~%~+xBRI}P9)K3y`){WbZHtP<*T7U0zyn>%Y;@qv*)MHvXrqj^wSFG=q zI>qdCs#V4vqMlr-Tz=d9>P2lFcB_rsjN)Y59=b>E`qQINwN@N>u~W@ll09H(RuhK| zHaWW$ChL&Ozv8(Vi8_P)xkI%svKASv_D-$Qu+!8&d9P_-z&5|_{#~ZkfrWn77R_UF z`Z|4GeocOZrm`{C9v?Y|qkrxQv=)s!_{xyU+9L}1S$o8bp@t@>Aw z^=gy<4*zAAh5L`$e~h_IjZCuznd8&!_UwRw$kbHvSA2w0t_Ij*(kCZoXN%MPFspbm zAvrm0nngS!r-fTA;TG|EM|dP3w(tl&B*UW~q7({>pHVRp;bOu^#NjK9uKb7RVs-z+ zD}QbA_EYblRUGe=tqIly@%L~Kv6*MYMT<{m%2oY`I0^lme`UF3i+so_o_k*z{pz2i ze|+U&-GtoXMyj>ITuKquK78($l5Fs9^$(iCE z)xwS99ga(!gv-vNWBGFqK0o+O6g>z_!olbN{@Kj*b;d%UgJmoU^TbKIx2c2A;$|Ow z9+~jRI*Uhj$&z5VgxaH0>(u|dKkec(ng8OE9$?9cijtidGbK)1^z)Y_TUc&b+<_m~ zgac0xzW6tu>1$Ac*^#U#7pFqj(9~pk8s}28~T^5O*L7Eryoi3+*F?P{KX$znEu&{{Cwqq_%9-1T57o1-o=Me(aDEy^DBZ1l2JxE)#MWqa#H zIrLZNjn0nea-$zzXYm{e8S~}mwSV=nX4z*X+A_kkY?kOUHLE~=yqaJU$CEhmaiu+a zqbVmpnopK_U$BUk;P4@D5$`nLVzG!d@$iN7|D5MQTOu|sB{gbhMqIo-JucOuPc!0D zbm&g}!|Qr*R0&Z?FNZ4sw!SyNnCfq#{%70W!R^%XcmIe_gLr1m|I0tA zB9fb%n=C#r+My=N&jQ6WImt7dIqDXCG0kR{P@c6N@HGcDT4N*5QK53#p7IXs01>jvWnqevj;4GA{;{HgR| zn%Wk!Eu=H#?{vyz@`yLAe<$Z=ReaLUDc9)Ty^#{}W`u?IsYM!};?;7s-cV^gB*hxB z6X6S6yiaD$mB|kfZH?*@UcgUrRWv>`sot>W(6nNn=FUh0YS>Q8fT2|F7k3KuifOaz(bXq@)*jt0ey$nY zV~}YgTg4~jf9D}@UOHIrP#t{z;4@ibbd7_N|NQLm^$z!{yc{)bs1>)g6gX-P@`S9+ zccZvVXHcv$Y2Ld8yk}+(d$G3e$nE|)Z6a>Ralom$G>^}p6KppYtEvAc!D^#jwmo#1 zw*N-eo%%6Iw(a!)uiCCuGYdoqM19eT{r^QLO3{C(@z2cCZOjQQWF+NL`G{Ve>A9F=PJzt8bER>1!_3|qx8 z{JWK)NDk!;^rJ+RR}P)xC!YOpe>zo}Vf4=;{guD_vr_L(wZ3iCiW@XHi*q`Uwy@98 zt3_=S_rWx1aVg?ow)l~t|Jb7G6Tt>8Uc4HgQYudFqSOBLGcoZ`FO4oFE-cB*shJzJ z&8F4j4oPv-&dM=4`Z&qwJH+Yc;nNNnOAYd^NvSGt4f?A`gSzQI?)u9{l_*tZ-b!(u zNKRLen(j818^js--+tX&|Bv;&_D;R!{_gaz>ZSCEGgonrEk2qPm;U0!|K{8%-fUov zD{wdphP8l@>@fY`L_QJsacW(vc}q}E6dt*2)m(9t=LSQ%_}Lu+<26b zkc0y9;ubxtyiHI1Nr)1EqQ$-}P3+dZE7gCR$}95!smveavd%VrO~v}^{khaG{-hU( zyW_(~{k29FsWIMv@(hvBqhjPO8+fc2D>xqJQ5!n9^L|5%vER_IjoQ-1E!#dLhK=He z#$91d%U+#6OGl)pTGX1Q^# zPr0~l|IodFcl$p$^={vXpSslp8@nSi(t8P5E;D_(9hlh6HZxwaS^hYdf5+ajE>=S~ z8V~FS<>(yP>gCR0m9a$J^B6pO8}AldcfVM#_h`+=J=$7vzoZzZZeyXg)>!EyHf`fR z!*)ZXxL4lvGbT(zjn*P4Ho-J={{4RNo?SzLpQiJK5Kl+ z)fM3*ruL~V+8Uoiam$|gn#8mWAI}NT$W#Y~_&8^mo^Qb1jCZ7Vg zRv`LiEEAiYV^FIdQ_y5+8q=h?j7|P!;^RM$uV;MiWKU3SSd*ybGC1sR-?Fos#77^Z zzG$Yv>1TF|Z>`h@I>lE|41<~@%W3e8cN&@ugN6c^Nqn2dW|Q|8%0D6UN4zy+$xYtVlJYs4{$U*7Prl^`@zW7s6P#`Ds9S-?dPQ^E@6h#>)zG>w= zLs7&;IfZu9GwGlt#P6XU^ai?&{*3m}`{~;2Q9o2PBHJ6J6X~qG5kK4Or{E=Y0WJUI zNLk9bMCB(JiVE=UyS&h zwC6$iM_Q?X!;NUq@eq6>Z439&^XJl8^!;>`8}UloU0~A7Z>9(7Z@qpH@gds$1RUmr z_U-fqwDTFnbLgPA;X7#?UFY>Xh`&ZV=&f`a{XX49@1zImFKBZc^7YeM^pCWY9-(V# z9~0)sLyx0_-bKC;+D=>O0@_Nu=s4O<+i9g8`O;|{J%e`8xpWylpKhWT(u4Fe+WZCb zucPhs$8?s_S6|*9ub03ReKG$9^jWm?S;RAF^A7la+D_3L(=>)pgj`&%$tsH)k&Z1jrdo|+k(M`4RZrVd19mw(Bgm@&~G(Ax7e>&}< zZ>58lAYMc}n&DSyC*AKY|0Uu-(yoZHdj509a(?M0wBt0y@9?@9?xLOa*m0=ud<5}e zuNREd^IuE5=qg%y67i>K^Rw`qw4ENJ9TUdu`F^8oTY_{SKOXJ7=~=X6E8o_76?csK3*VY;4g>Lm7m2+pP5^!;?fEQ?T z;Wz1m82AG^D*^tTHap+}+ClH5J@+7Pnu_spKLAgr?GM98(*=*gC)0y;3hk;zJkwkL zJ@^uDoSsiN(T_-ra}ed`D1G^CqTRQ`pU{2p!TogW2XIgb>icbnW9bljrnEQ*amJmX z=f9G^lU_g<(>K#Dx{~(LKhnxI$d`5m@(0n6(PsK<+D4xmit@4a3Ob(NNoUbfN20ug zzKyP>Kce0AiPKPCnUDSz(pmJ!^n5z%D3o8|El(GC%hQW!YZ%Js{0sSuXa~KME})~2 zMtK)~C+(&?=$t&{i#DUYgD$3>^yjpTj-8J3P4r6IO@Bo@u0{Smw1@uP8()CqQzlEFK?#T(02Mc+CewcPP$!M9K)4j zp?xQQ{L3%B{m#(9g4H%ym+K=8r2hqRKA+$LH{WsG#I-D-0 zBkAvG8~qz?r%yi)`3mUs=q2=Jw3EJ;E}?Iw%jkRQO8QaSML$cgr(dOO>38V{`ct}z z{+4#rztSH1ghN{A(WoCp&!X*>UO!z5!@JzUw zPR@dR=*8KvDG}pae-3<{Zl|)~X*iwn;1qZ<;{$WyQpRUo20uwBI^YI+FXQjgRkIQA zrpso*Khtw_;lML6KCU_Nblr-w@?1EX?mZjMr`NH)JL#}15wE1v+5U61^K!(S={@Yv z$8^>eh!5y?Dm%Z%`lcpf{LJEYx&0kMFR;VWwDq6xS@bq8pB%cB<*)O40Qv8x_we() zC+Mz8*q_wXVUyu^X$LK@3(EcFf}3$Y>vy_tF&ruSCF3PG!I^X%eLdZqgLoO;aSL2e zN6myi^vohy74s$Y7rzXjOQ)8=x6z@Ea1CAeD*O!{aW{O57&n>E%=}l=#cv^AMmOFC zx6x}8;i<`}-+Kz2K-awvUrv`^1m8i2)xs~*rZ?c7bOrmjpLQOL_(^A>y&2cQm(X)x zgPrv1E$}mRhqw?bW>Xm>wmUh$v$Em&^zuUZ0lJ>!v6Z&IfcQAEUC8=r7r;yD?kxBV zx{>2ILRZ8g9+8UrJGwoKcf6PI{I6<&Fesv|AwwS8lE8bL$bdc ze`Wjh=C|R~=@vJfMQ{5AzM6I{#QySrICwA|0h@$iTX zEn=d)L8lbLd+7z@!i|4e5-00(BUzie+hJx^SClJgTs2eQ5M=xM8Pd@rO! zSHhd<_Iu$k>3&`h3^^a|<+FYw9mn{EbmGIPe-pio@fEa%*Bc+Fm(z80C;g6YrxLmp z=Tp1r;8$=w7-sp1m*9|0EDt-&|3kN;Ox}q2Ovan;LcWEJcRz#pO2&8Hg7_1RFWrFn ztBiYY!1ZP~z4&(cE4p?$ypQ!)hoZju0*v3#H256dPH{p4FQDz>yh|>>N;*rNcSyI; zlf`+E^dMcs_%v~zBG<23uaAHqrl(DXpYxi_=S@0f3gVx59Rh!^+o_oDf_*MR|6FYENUz!6$@FTr zcMe@M4)rgm*RZ`Cy=Hs&=yoc5#d)0^|HtY2xo`u^mrj7U(Un1P4_!V9-bc4jgo9>a z`8MB!^*x);Ye4*3-HMW12bVIgm7x3^^p3mXT`X^Z4&}9rkw3l|@uO+y1Mr!&eFc1p zZbfN!jM3+J3B7s+{4%|r*Y`W=(z6kd6zB1BeMx0JgLa&Z_ycqz;|+8c?RyFO>#0Qf zBs%yJ_$J+ovS>E^936B8{1wZWuYp5z(4V>Ne>NR?C*sTL6=%Y$>45^cnXa1$57V}# zaNwoLUwRW9OS`Xy=hHRI;pKEpGF(B2TncZXbFPA$=$4PHujy#+r;?`D7Arwi#3dg64HH(xIEJC#km|13qfI3KtG@r87B z5c~wo?_&9_jQ8_?w{Pj0|3LYpa?$_nMmU>Z@CsZ)n@@!|)1}F{|T%TI$2j7|L5H&Z^K>=+KApw(zM@lD|5tjL@d^Jze|lN}I67cE zKJQAVSMYw_T)N<6#Fx|JH6<4GUw$9UkivOTBb=Jt6qy`J|!&ZO7!c)Wt{ zjmG=EEwoYG*eBQTuXHQQMCOlOfce=-XVLSXM)@W5{tfUtdf!I4k&bx=?x9C&;EC5E zzs&_l(g9DxN%Zoy@Ccx1jrbj-7-|@!%@c#T~I^s*jQ}fY&)^G3c2*B8$rB_?)5?3biK$Y&J81Zy&zm#3~cu=D1QdMYae_iT`X=~m*ZbZr!s#P zoyYPo(h+n!UH&Wb$@}bOd#S$2H=zJt!F(ssYgs>;p2+dKly=Ys^hWw_y1N_gx#(E- z{|!2r^ZTi^7!O-5uBZG?XVJ&pfd18ehR+)>r1$KCSJ07Pz?5?0=r2Yj{6#8(qu&)30;} z_itf~(Vxmnd_Hg%z0L(+OSkg-2d~omRw2HVE@1p;dJprNZ$|$8RVaTdy>~V2pc~e} zH`5a<;8MEyA^0ge{9(9}4(0bVKBKj3aXb!OBHMQ=_HDd>PPd}uT#C4p9?XWHq9K(p;NUeWbb$@tNLw$1JL!N#Sh)@P3VA>KarBl8nUAiEhgax!D$bSgi;VZ*4u3|+ zGhg&_jOS{Wzm&GqcheExeDuzHknan6-M#Sm+mX-2@@ME)lsqTmd5q_<{v(Vx&q91F z<6D_;n66{KW1Yyqg!O0Ay)1t>-NEt=^f1f!(+$x|9aM<;U3BGL@MCm7+k1&_q~D_#alF2wchuthGro6X zein!?u83|ZQMwf+*aXj_m-M6ja_RAk;z+{r{0YV*_Vf((u>3wd1U{-rBm2m;$6sB`y=AzwEH#KO?M8#M;4=e_9i%$uCZW# z3+aM<*i9$Dj`BWtqy9|sMIzas(`m&Y?B ztQT^5+(5T7Unw0u7xCw5lUS~@{D*YDSWl#Xq{Hc;m1sYO?VYGw{I83z;QCA+UAF~( zhK_jx{*_)<2WQ@g@pOF#FQt|5;R-sd7jB|!`F*iYI;sirA$ml7(M$G!Tq*Kz`w)(# zjZ^Xd{BnBMQE;jBL`9j;^XC^CpL_)3U(@Zpzh&C}$iMI#od2CeZ`}>wN-yq%*V7Jq zmu{zG=KJ}vWysfcEZRGt9{C;h@1tA9O}}#f-lOf4;9ux6_V0)XFh2#Hp9E=9acwBd zUqZY4k^cs|{7A%0X^rvqbRpeL$I@MNDf=@_JEtMvq;lE5QyDbicz>d9MH$xc{`E>a zo8RZFqx1J;`T0GF{x9%D`BUiGW8f^h#~;3p_VD|Hm2{91@fYbLA9x$R*93nMeP2qq+=K16Lbsw+^ZTAn^i29YdLkYA5ay?C1M*)_H`c;W)5??Z=X5p8 zk6VTQ_$|lyoKI)4KlkYtpHIJl`p+|7!gx31+glKy^f3C9_bPlg9k30)lFk=jOqJ_j zIUOdxxGLR3PyPV*&@ca&i&`Ly2bV0n~;Acy+WL4%K2@eLki$e z=&XErA6@E%BUWR6S1p9k(d|?gaeq3O4tx{w3c8eTq0{IgI^qkI4}TQ%SJeW~pu^sR zi|Cz<*U>XPi1*Mtn16B=^37!V6gr4rM0;3&Egk(e@_j)M_rhV1A>WLf@p;J=^!6L! z)%2=QQ2t|j+f9g1UW59nZzFy+J&xW;JMKpLpS>=D?T@4Wz{jY62fg+##GC0Zj+fDe z^5x8*MfcEE^vWfu|0TU>IUMx_>f08;#q^v9;1B5jV%Vn|6$GzMY8I(BVFae?zyt zgLuMIsNXaQ-$~DDgWKtiY;TI#4&?En>m$Tx(pi&`|6zLXR>VJ{gP8Bwr%``|zJVSR zTdS&w?Umj>2L7Fn*o%CZtw;TiBM@IlZU5Kpnk%1IFl|q8@`urPl8+Nh-ldVS=8@56HcL%xc%Hg?>h_eEp&V<`Zr$eH|2P{ zPC`6~E@S>D=%{y4zMt;tfKPZ1^~1AKe*vAx<+G74Vtf1O4mx!s>Tmxi>fc9Kr^7pF zDbiNEv)1J@+ltucG%ng!o(Ziq8?>O~+3`e0n|d zuMB}_(oU|=x6_-BLVP_P|0(i)Kx;D)H;VHVxqZ#N1U`-4!~V^om(51}UOMkH3C-cOeVz&T>M$oh?(|8;bR zhWHR|OocPVa+l?e+@9CaIp-q2myTw>RIy&j@)6vBRnY0zp!{aKdp`WRw>+(g^-$K| zNL%QDYf=6jx+xF7##_Dz<9jC^bT#5n(Vj06Z>5*_!u@o51j+|)LHn(YN77sVg?Jjh z`YJe|HhzVC6|_4X@y&GcH;8-am~UYpv7O5KUDyvt(EI5$dfzbO*Ll4gzK_oAhM%F= zd;4kT!$HPXk zUy<$g&=GX!DTtp(cby1dOP6r@-Ay~Kh(AM{+5WrqdXC3#y73<U<>%(H&y$1Emb&LBg#BoGb6lDvYD$WC>-E@{XPD%H%{!X#oOOG(_7W*mbsbaq< z_t&-JxG4P(-A*N+<>mVV+28HFU-WW%V;SD>TuW6-!0Q96=o0#Mx>@X3WP5IU zF+acW)~zVp#eQ1Gf1@{x+h%ArcTuzBKCuFdG&|GF?2u-oS|FXcl#asb0;0&iuvC_ zo97_DgC6AkD{mwJay!}&rT3kK{IT>jI+IRHMSMQ3{VPoG?_KonU5GzU2Yms*LdSUE z5546X|BkM^8{^|E&I9HA?_U8=r%UdEPp22HgfG^uC__V--<9-&cQGC>(uqGJK0w!r z8&u``I9Z&>%IznF^)H}<7+*p=_MrYtbk2LI|2Z9d4dVW7$d~vpIF@e7h8=YLe0U|D z!T2k*UHoDl*}q=8gz?GmB7YElmTspq|2{0w%V|>p#`|WvMEqhBnePEQzyLq1TT#My zqrEP=i|doxj`qT@Li~8Tj_cD!x}D0dEVQ4`c=oF(e-CYKgxAuh*WlM#zd-!r71_T| zy8J`kDBw>-(LB&sV>ti)fP@`IG7CwB^Ssdi#mG#qs5AtnUlG z&Vb8l+qrNP?aqR`>4Klpp9vqJy>ahhd7VhFz8CA`xpd#d@YQtOTKEp#in8+?LkHy|K6SfnPkcXT27HcgaX*-X_OGI6y@LF=)5{v*N9i>$!!OgtzoWem=^^@i zdLupNL(K2&+qwMcye{}GdfylD6?BI9#Y1xW-%79Vfgh%$KS%#xq&GC7fA7-)E%3K= z-rKP64vfc0AI2kvHgf!~rvooX{4sjk#qfK&#r8LNgx2K)x zBC3x{ZfZup&2&vJ^6jLnuYiZ?%9*Gi(uw>9Z=n8}^uR2Xzm2wC2ER&=*wCM! z>FNo{cZ7JKE&IFTb>ushUY3LU7t;$bg>R&D!cqSrx^@lfZ=vnOD8G*`qT{<{dvd>w z^<%DXr&8!XQXd}|qIdEcP^wRCGZ z*2fLBLVrdV(m}hBKaoC*wnU)*GJ4jr@H2E5-9fLS4WDEFd&+S9w9@mI!xz)_%i!g@ z#peZG@CJIP3GH>T{NxW2_wk7Q6BT7WuTREG`zlJtH7DrfdzG{p|BVGG|FCYSvixJX zo$;Yk_{1+z-hKm|O>chyzKM1-Up<|82jU(&;V#(HjeJ{ghtJpTRH`q-`g1eg{yE}L zuzcbRa0}h|BK#%2Y!hty68V?c!N=0U6>ti@>>>CndeOshA)S?sdZMYmJQeTCaAoqhqy`PP%9<0={}buVJoGPv-YI^O zp3HYGJ?9#D1s(ks>OVv0-H5pSoJZylSqy(oZ(RbLzQ+93^`pNTbOz`5HhS_Eh`&Iu zW&gj{?Nn?N(7ve;?WGqX|FQIfJK+?%v=F{Zx47T=6y#q|2gJeOvwWftw#V_`Ab$gW z61|wdfR6qr&JVAr3tDk}^3W?&kuSR+^I!7-mgiQw>OT1NZ_(beqp{RiyxJ>m@~!`IU0HnjH{ zosq`&2GQPt5$(N2&rU{rr~iO_HDi#k+UxPK{~p9c$H4`3E!*p+7o3FgzW7J9mv|@I zYoo1B*gk}OjXuctG+plxkNXMnNI&={I_nk8UpF0?!ucCUd$WU(zlmOX0p{=IpOJ6w zi>Ut~o%=HU6YYKpzGN@TXT1%#(hJT(dkMdwy})s3ZzDaBf%cBshx)URNB{4kXPyXu zPq&@`U;Hb|J6q7+R=SJh89##d+UwC?4ZYwQc=~UsA9xP(-R<>x@OSjmbK#5jqkP#r zXzy)0!^ZbhzoWg8dyxM{dY~AVM>)AashWU%74)hp@Ncx=WO$y6@*9^v+WnYivN+pFR7 z+fG-VkM`2Vb!OS#f@6^HMS9+G@HBB9LdJI<3*SWtZNvQiN(ZK6eOc&-_A>S(|F?8w z0(`YU@=fbTeYe-W@aX}Fujql-(Jr<(Ow40G>6ky?BT(OZI>zfpI^v)3=XB*6 z@Ohyq?`TK+Z_^`OUs8@l{*fhU?@fByLins{s6X%{>eqSwGkmPLt|-TE)-b$^9%OqH z#eD=aUUe?Ehx>Jl`BRa9+|g)%K@#S#RJT(Z`40Jhr-y%l3(Uwje-QqHcD@H+J{|Fu zoWD-piqf8s_Aa%cy~bZ93`&9$b7vs;l*^$#qj&I`(3n`d>qPKIiB^p#rCHm zzg1i(lIu(3Khge^y2bUcUr>LHxGp8z>-Y`6kxmAMlI0tDKGCdO%%1`6 z#h-xo0?$Ny&+B$7?Y|@6RB;_j*57Kt{M=5*Yw*{!!sAi)i74O2Q)r%dgS*%8SQmF1>dS$ zte+Xkw~HRmg3pXWzWEoxYjukq%{J73hi=*q53+pIlQ@4qQe4NAO@1`H2 zN2)QtAJe&h{QQBoje)1eB40uPd@5~!9PM32uOGqrcr`shf2mviKJ9KS--+TnrtDwL zHF&>&p>A>iXb<9dFz(7jd>viBAML+Q2mXTg`smgBVE;JeU%DLiqjihxczi!_KI4Nf z^#2xmU@ty@YoKkvz`xK=3)+uA75Nj_PSf}Qm(#8xlwVFS{26|nUN#Ij(NQm>{#UfS z0sWZ}kNoa4F+W-KJd>Zo2{wM06O3$#vIdsBq)W3}` zdkpoTq1R`id>=hPAD<6G`R{B6c3CnJ9!9e6JC`=5^f zR;I&Iw1dlQCLJe!5x!_vd5B(0chIIIF+NkoeNb|JTYU=FhXlI+KGeUAZY+bB(Od6_ zAEP7FP`_EXqEztnmG9{J{JbRO42(x2KQB578)2Zl}1PALBEN@f9tI-%ba-4ZG;Jx8S$vcE)?@tfvw8 zJrnKKuZJV)j_2WXb&Jmrxc|G!>nT`&>gYxEPpsd>&%eWyWqxtL#Yb5GuhOk3D{jI1 z`XJ-=v?8ro~1JD-R9XeAouk4#6tvXkIU z-Qsh@WytT87W)tLwfKDb1v--MmKOV)tQStv`#bqOl%K|UsnGqF=~lM)G9A1C`FeCamH2zGyvJUE_Ht|(|I>7f z_gm9ZemR{r7p`IXRxZC!7ErQi72~U!|5Mt=;$luDio$jne{3_bM8ZM^$pMsy!E$(;Uh5i4>wCzP4 zA3`pX`Nj8f=*#Gac!=?vQEQp|tVDjfgfbUT&gFOctM#oU@9Dj-!V_nqzs@I6 z-cDD4i{r%|bT8dP&xpkM_*{niNnE0U!y<$ z^n&-$-xFq|y;?e-&Q3&so~H|YF+Lr1`&Y>K3q8_?eA6yRzCG{4|D^MOLH&7j7ME8A zowgI@KcZLCA-OW2xE}T>mdCleoyxMQ*k7(-y!0`|8yPq4!S&+L>6#tLuU&!u#dpBR z(m_0*nL#gV#dxlw8|Y4N{plE=X%6Ju9*FTyp(9&Re?Gl$E4-36(zSHk(Wt*ux1tp6 z!~9IW67z52{_|{lGOxehs9U^0e;UWnCm4_C{`7r1gZn?j9Fb4#AJe$Mi<1`nLl^gl zdD3FM1DO9w-QxWQuNQyDc+D%=ADnd+%9pmn*U=8{{~n@~nD0}%wGHJ1=F0lw{)t}r z6y4(c!&~5Gbly8~4PD+2@1X53!F%bL{2Drl`KxH>qdXqdam=U9N4}s2#N%}ei8e7fwaiyVZLH| zkbaHsqJPrsi_e2D$M~OgE$a6%K3`h&C-io-_oQxdK5#r7ut3Je|1+@|^-rPWo`Q4f zYUY26ZZAOnk93RsyR2AV#_NzTBNg!sy7Nl-HahqQcpaU53H&a-eIYzVPs@Ri$VdL& z;cyZ?7y(~Jmz@Kb(0%@xpO@*5xfXr-_Rt<-V||=Yx6x~8 zH~aH39hZvw;}@d-KKdMb;n|4aPNz;q{+H<@`g_`sKJG@5Ppq$rT;Hys?exRaV*M*j zLw+}{aC`7yB;$%QI~(JFmTvL;%g;gi+vsL*f22iwY0Uovok5>)6XGfK)zYH2; zuh6IIR+Pm<)Aj!6Gam1Q^6R9<_SC@R`KQuieObx>KQU+-^6fts^OH&!9|td^nHPUE5~`#27t z%oNEGkr3Aq(TtQxamfV{(a_Xz$psOSh|C2Mm&{y7!VQtg%+O2;mk^OiNy$)ANzK$y zk;r_AObwR^*NlvwGw1i^<@Nb5_kH#=GiPSv)z1gd!s)E|UX+Bx>n}jp)r*@n3bK>~Dh+SF#O_!^FBl)B3HuFbx*7$31 z3gZ=#zk+S3ZN`cBbU$51+@JGdyVdso z=Ifyh?H}XqHqVCzoDWm1xcU33^gn60x&P<0zUwBdK9~KuuVwS|?Dd-OcI?qi^Er#X z*dEo`ty0^o-~0A{=JzjtQ~gYw^{M;!N7$dZ--l+sxxGrcUzujNxqd6dG~eySi;0(8 zahtJqk;ZGWR{61|%8$pXk@7BldAnSKow@&S^^xk6XRF^(?0H%FA7S4J#gE}q^8dsS zxSw}jr+)5pmEQ;Fjgup>%LVmcj^~xgSvdMP`79p7=MTom>VIvb;xAzD8FIK~^Z$Z) z9&rs`@r91B_+`FV!<2O;+Rv&nXw+dG2o{VDOhUCJ-6&EKv3 zC)ZQINA6$iFXaW64dW8?-)pzI{R4P^zKZ;Nyg&c^2E}_2kH)=mI`+fA*lkYyOp4aW zz)$2d_V=0CD^2kY*d;>#6~``?8*fzoemo8*EmS-auNkE6y9bxNDwpEiA@XCNs^6m! zxjjC0Mg3mEeid>o_PHg0gcqY(_1&!b_h7uKmd)=Uu)RJf-r=t1+bB)>0kh;@_!#T|4Lps0 zyYQ&VT0dpD!(Xa@_A~W+5Uuz)yovnxu;&QHci_+|@_GD-_}_TlpX&ciy864_mIvTz z59O&ikk?C};89a`fABrd;`R7Hmd)Qc_R#tDg)R2}HlzF*`3)S~M*ajljnQ~Tc!-O( z*ArVczoedu_p;mEUe0WtbT6WG#@AW54GFe-uL)F^#pti zAHY@kfmLr9+e5VcFK$=A9-dmB8Mt9@jlUD0WBG32M8<#ab9=pExT$KN8hU!l+pBdPZ*Q;sRV}a_g<9l=D7CTgbrnCADz{9%AQ?Zku{1JBU zCVzu#+Q`4+sJ3$bO!W_ICwIb*o8<}E?;UwH&f)Xq1D0(@-m_Z2Rk*6X?6uS0-@N}z z)&4#jNAY>=3S7kX{vb~EQvE%g^|9(ZWT{_!>cepGbISh^SFBV1iCQ<;{`D`8Xs7(H zyR`f_INwaQ+uXhlIlrXYZSK#(?9U~{9f&u~)_h9&{J1}k_(w)c-rYajje@NBKVV>t(n7_~CwKHhzS6S^4JwC-C`k z1#xG__xw`*yjY(Ta3=jz?Y18e^gB;Hh4(`n?N;2N-z#>T$CJxW?N57fJlDHl@RfAM z8|+cOAM+cIqbF#2<1L$?=XTKc+)aG)Io1Dz=Z7l4Q?B~uP(KDAd`VFqE-yt{qO8v9W%Y7}I_p>~o7K@8x_4!aPcAqI%Q$KBmKA-W~Ywu@%KYF%4 z--@$rzTQYu{BzSsHp{K2^8BE^$&1TL=4@1oD6-1AiL zIbZV$#HlCMZ!*q$mwq^Xft-s=lT=@ZV>hb4(bww#aE0mb#j?$C zanku^A@1>~#@mBE-E}_y9cTQZcN}T#oF2IxjmLKBSO4;{-`c*uo z`9xbbjP`f+dhAo;iA^-0Vw~Mj`A;5HeZT|t8(_D2{;S~i?E<^a-yZVoxTxPv zJj_*Ydr1BEx0J`@l-ugR4xeCo&*Fj1r$K@0SJY8`KYXH*=KD@9fQ zdmUE4M~^9g0-kqY^I31VxqPlH-#Pq<*Y8grQN6=o$`8gl_vEE^+t0V;AHoLx{>Hwz z%Te`@V#K?e*q(ReC>QlHKO`e)QjnA2OdGt$g!&_@^~q zlW#S?3w{;*J+AmF?8g3d92c?t^^U1NvzhYyl9?#C7P z!n5r*&wrg;sQ+$!jpL~b_hx_aIidV1j5iI3H&y*kyunSrfzw&O=e|>YIG${`Io}S< z=X2Z=U&9`_-AUCyV7_nQc;>gwZnK{=`B!nn+WPP9^=5p&&M(P!oB17y7ZJblkGA)} zIDLTfJDgIz`)$Q%;-24Xdu+kgrl!2wnre&r{5|(@386*;MwoU_0Orkd4b#$A0ht@oUujmB)sUTybs53mCNwuner3o z)jx8UZ2upyM&|yOH(wr!M?32NB>|s{*75Qc&fxRhYnE+BL=)YAwJNsvGq;bcJPPMM zEw9ElH~AQ@BL6?j=JSrcp6qr({Yu@HAB)qP$(eSW+tY*l^IwS%9K`)tiRv8(%fs<} zSM47waUMR5*Sw07r=Ks(P*Y@mkQR8{he+KS=cVZ9x zyWQsYE#>vI*Uzf=BR&cDz?6{7bkwZhlGeO4ip{oP*cdZLSYr`jz00*zJGz zdh`Dc%CtO-ap@>I3uiv1@qfg(SbmQ()n~^ke*{i_N8X4R@pQ}F$JOn%V$g}WVcX6TjN~ng37JNb#5O!wTJR#9}wzpV^AbZz=vi%jW;H-qHEP^|IN| z++IPPPY2s=9-j|6-!35@OgztSbNne!Y5Xc2#{4?`rg*`1jTeRIJ1c(^UU5V5pYbT> z`}7sfr#IuhYPY$+biAYM<0|4qh#$A&=JO1V)xYjljeqB%maiXPL;pqChxMC}H!%Nd zyUq0xLjRYp$pQEsyUqDzjn?+Oj3e)AevN)te13n$d*Wft|2-U!-P{S5ervg}f0Lw3JKmidM37mFgdoKiIOlJ-FV-+ih+ycedAl z^1VZJKD>)7amU;0cY^n8-@x^nXn)v*=Z;YQPq^nu+4YXV9=&)^{T!%|!42_FTo+f^ZT64j zdffiLd}NfCCmPqVyxVba?nkcG##x^B5A5~k^JaIn{Zs5Vm(P{)&S7Wl`j_%sj!}Lf z9_Fm^V{j@9lsUC77F6yWA%R!voM!thb^Sprle@*S{-=jw7+X&0%^Pcx~d~LAX+@DWy z{VOKl+f&Qi=pWTzO!hksS?{ebfYc6ZeAvjXpKtNDC~M-z9fQT<#m#fRXv#FOnd=X-+r7U4qd@}KH^ z^1Rq<_#E}AmJOrl9j*VmMjfl)De8l95ngS#x&LNA(Dm~GUNc1XH*p5*r~6~dKXOsa zKMhZDl)uJ3&dGn`hCj=#>Zsnxl3&I{F3EH75#pQirAp1`I~-Ug-^JNa(*JSwPh)=^ zjy?a>@-4M&zMr#0+v{tbiT@zKxQY6=sjGfx?yCQIyUp!W%KBT2i}7i@&HcBC{kQ%T zs&{AnftJnh>#+YUBR+PO`roO|ch~ry=Kt>6w~r^=BLokl-$vZ9MD=Gao8RY)*Y&@S z`9Hz-YJ1+o=^l!=b=30rsMhg30iPs) zEgt)?;zgDXV;$Su@kz7Z+}>B%zWwbsw{I!icOmf#;`{72*Z1hw8vhP(i^TKj=g?U7YcrJJ89ywNBk<@Qaw6VZr15gG<2ktu&;3Jo za8Z9Z_Q&2hl=q8cEt}t`Sghk|EAb*e-zX)1F;n}aQxo+IXMYN|+uVQ3*?;2gHrIa@ z>;C}xA&mFPvdu_l`}KBJzmto#d>OcRQ_a5=_hkFjds_Jk^c#V*zE}NneDXcH7!Nxs zJG!a<0r@>}`F6!4@$S=d3f}*@ydU>iAYZ|G3uULK>hH8v?t#nsJU$x7-cWokb}rKX zcoe6E>iD^b3;t8QoxA#b%$CRCh`06mWFq!`RrLpO&UNKi;n?Z2S2Oi1cwP5Dp|uW` z*I2e0+wp1aOn-;w_ImU8Xy_kgx4A#~a{s;&%o6`$nn^xu0F5)2&dPRGjQP(@;BI4Up`~EIseJb*Qup_KIZ%Juj%{8 z9W0x_542C?^}+SNkw@T^ujM!Kf_!-auHpA~*Wknn`us5iU&05mPq^a6_{2e-Pj28* zV-z=9Y5i@-ZulYYXxTjf{;AJLCt@%DuOS}iRVls?+rHEC|BO4nq4;C1wSGE8$sKTS zevdu`&%^Inwiyq)>id)L6VE!L`fd2sG5H&O>!f@ZpYhUs8a<=&3%kkPaj>^M9hdc% zKgJIqsNWepx{c!1c%6^@tcUtf?jn!I*?+4(8E4Wj&$9V^c5nSY)^E7d(E0OkocoyE zsExLlCvJz!eph`jyUqP^9>+^4w&8cJeDisgF`CaNY>bnS;z#4<8?_FVn|NyZiuwIW zUwn?=-yVw3geiZzW%KuS`Tg_++@ASNoOxl|SKOqt)*|F1jzbYODD;@_Xpx z@B)4xJkhev=*jy03}@gx9EpFRek{M2{*;&2_ud2@k6zf-pY@I7@CaOl->QxCd-Ct& z1$ZxBQCHjd41R#G;T&9J+5CUi#@fH0Yp3~*Xr=lgIDq$KXW$~d*0TBh{+C*Rg?RT) z`5_*bA$M%A^;@x3o{4illlS7?O*EgI*s&?|dsg-CdzAkwj@l>B!bkp+SK%zaZ@dNf zPE-6FJS9&)kITN6Z(6n)ga6a{?ePv;Khqx5`ML#8HsmgNa2@#-oR<8AVV=f~C~P~{ z(DK4s^M5?+>^6_Lh+SQ+c(xTcfA8z8{-5V0`4Nxn|6H%&l%@5p{2J=3zEFMB=QQ8g zl}=W?Gxnu^C{DqXaS`)<&$40MIIrVR{zB~;e@;qI~L2|*lqT6X8C`tHU016SmKSI zx6j9Xe}Mj-uyH~ChT3iRE24f1&Y^xePQhELKk|#}zs0d-@)h!n$gk5;{d4H=fvd1T z_9Z{eZgal*Y>x#vobfWq4`BZ}jzj2o4ObC=qLao?A?{_j`FT$;|5x9icnIUaj$_Gx zkNhFzZ?oH+-<^wE-tUPA5U;{P*xkpTZ$4kf{^D)fFg!|B-xm)nmB-`AA~_CsV|^sy zWb(J*_N@QIcoh9hE!&KMYW4dA$Fl#`c|prlPQMm*+xG|7pD*!6XH-APviZCz%M(F< z4*7G*-@x&(6sO>|I2&)lTk&puv8B!*7xCpgPg=*zeaq(eyIxiN8DGu+UL$!hzHv|a zZ{wPM@*%vah4OFK#=ld%!Hep*(LwP+c=R*!Tlko}ycyTot@;X_%lJ;6)z1re!&CMs ze+b@9{p&d3OU38c#+@|Y2RNmPya!MIL-`kR;s4}Y_|aAQ$u63Y$B%LgT>h)v3Gcox z55aL4|!~|vbq0dJ!Wmc?Zl(D%HI%A;{WV_AZ~xo+PLku9*HA%W z%I}6RHdcHz-pG75EvBbEOx4xc1n#XiCEeVi65yZCGTj+5oi*kPC)h%;Q}5xBIO9Et0A$Z?jYV{m@9=6?YDf1~-i1}T3q^Ph+#_9~u%ve;&@~_bVNSD!+{RMc~Qw&%%4zKOf@ih3fzEFx9VZp!K%_ z=kL_~Z{kXS#e-f|enSWO1Kh2bT!y{*er%@@2Hk`jl{mo9Atsj8Og*<{ypodERCpc4Gd{BbD#X{3qa~o|=CqPUQQ#)wp_v<~MAV>hr(U z{L`=#+qW8TW&XjhDL*n-_3Q8kJ|C>W70lm%wDObqd~^*S7O44E;tlNo{$rG%*jw>r ze3H*g%JD(^cN@$6`Me|%pXsamYdDYo-Nq@uob9^|`*Qw0gj2G#eAPIjSm&!gp{jp? z<8dxNj+5~}_{3$^cN?#IU(TNk@VVaQ@*skR}jn~kxYq;_=iEpm;=gMy|QSs)CHw#Z8|9{w<{NM=XdlTP-LwjiZ zJTpo0Ddexh&58eoFK^TMQIX2ONc=qBfCFDwJhV{xM{!hz*2jP-#XBEW{5!lgM;`iy z;uS+Rzq8o!h~lqBD?Tb)zKAau$P?dGJa(|^ui^z?C_Z(v;=zLyzl}TYQheT9iWdw~ z{IMx=>ML?0&OfC58tl*YbkzGCrI^qI4D#3FV0Xrk^MCjKV}o+W4S-rg$>Sk4zm<5TC4hST)tiBzprsxx%QW4vz716{n#9w!}a)dZJhfP z?>Wj(;rg3|)0S)f+^99zlfb$3=l)|eHn{(I>}|yhnEyl^!1EdVa5?v1uJe>{-Pnm!u-41lwUMo%l|%h=K5TTBl>869*25DxUGV{!Ygco3;MWVPD4Y z@}BYoY^qPe<=kK1!D;<8{aV+2GX||N{xqiNjJ^HHtGA^Qiz%u1;;`lp- z^SGXkTCTYN3eB$!`*8m~d4=L<*njWfm}Saeuu}14_OJShvJ>}@Yp@UZd#zU~9-gE6 z%v!%IcS}!F+{(P#|?4O|@5@&y_s5Se~+iMx0`z?o$$Y=Ym$KfnrvvrF5 zuzVYEILp`SW5vT+zBKH^^0iGR&hl-qHOuF{o;b^wU2B%F%Ld{sUtX1&@VzJk}IrMQ^a4-+;iUizhux63%AxAy-xH!Hq~*ORw!NABO_ z(iHcueLaFRd#Zl%XNt%3da+)*Y!F|KOX&CX7R76NseUsag`eB1_y(?TU*d$Tx?c6% zrucrYKi^_+t|uYe70(P*|DW+i&iB!uD?Wwu_Z=L{`FK$Vaevi6xkDbz`7#wJa{g0KcB65 z`BvqBg44$8{g)@dP&}=>mhWBcfp6jn?nlSx(2w=|J&s^Ly}wl4gXej6;RwcWy_@m; zG+qk!z;*UeKTh+Tjnld)|5|MvkIkhY`QO*NoALv`q96VWr*&1_doOXk*|K4HJf-*V zzbD@EMfoA_?JK+Qv)7x?|GCJMuumJ=X4(9HC;3}&OMIOCsz%ChoTvH3#_03hu6QH) z<8c^%4-cHK{45+bLq3fCaEWE}`Albx_XqKO#(Uyxjh{$Se3$ytC3?T|nQt`y>}M4pf^$2_AK{Zd_zoX32s@ri31|H&ho&-S{?Z)w?PI6tn}i!b3#cr+e@XW@v| zdOqe$9I{xxjg6Ud=cD%VY=&=)JPXGTmveE%cwOKA!UcmA?^US!@^SKF?EIE|6c

wl|!kAd;i)P6~aM~RCBOEeMF2gCouGaD1{X5k=50=w$8g@IWxbe2)A7a}mIp%xC zBVLtTosv_M-62sQd}89;x*^xw6_e_RqOD6u+`q^SO>Q*+2W- zR6OlD9sk?$2DZm@w-k47uXrM^!~XRLF7Q+QwLg?UpY2zIom(p2ty1w2_ScVa#50QD z!;b9Vul}k0oSusB!inrpb*mK5JfrWceu1a3Kaahwc*+}!|AOP$za#Dte?k2Z;7s;k z=evp*wN-o?j^lX!20J!a-0hz7Z*aU!!fAaJ-;ceC|BIve|Ja51Ri8+_0@vgB)s{a{ zd_KqD(|^g;_4NNaYjF(6V+}s}q<(+Q_E7o5SiV1SX1U@s|5n_G^;?dwxas|&sA|Py zIDXIL>|%{y_z&}$qT@B|kvx#!KkM?Z?9TqN4f{>e_4%n9#ZPd&N8q%kT7Q{%gPUA{ zW47u01|>M8j>i8FNBe63@ARMgKO#N=U*`T|9)8$Q{WI`9n_P;gCCU!Ql`I6rlQYoYh};drbZ2;^DY8_d_3JC+7PLJ{YU|4s}#tIbEKKeYhXmk6Uv; z^u*)JU&Q^;aJ-58p-=Id$?A8#HlO>Uu60#kHbC(uxbk)RbZva3-24gU9}JV<#4+3t z<>F!757nus{F>#;55Z?5T=N**q#Qo3$ zJUd9^<>0!Z+Fze+p!`vBiobyqX2^$d;Rv~zqw-x}k>_H+@$z{bHAVJ)Qu(uAmRI9Z z;qpyf_f>gNL*-vtCTHNNNV)z~iU%!_qp{yu`53-8SMK1Xe5WLNDz0Jw-h>@iDSj58 zTq)P!ZtTy`H&VZI+}}>X-2#>WK6au10lby-!8LpkH*{9NfWE5ljH`J)F%0|jeTJzx zkmGL^esEalx2@PCUf;hsfDN|)9h}4b+Beqt1sva@xSaL16&Eei{HkyouV03_sNTl$ z`w1@M^~~QmhvRu*6XiRzKW)WTA?kk{m$QEcxGFzlu;QQL0FL+D*cPhzh^NWt_)o_< zZz=w`o8l>)4@Tku&Iem?0k4nhHdTHa=Z8@^hx5bM+BoNj`?cov(inHu+c;lj;E-XO zk7F~%eK~)OuQmJsLF~-=#JRch3pk%d;v8OIeT!2f)W2y9<)^$W&&RQxZ%$zk&Nr=F zGT$-EkH-<5e=gt<&OhF*lpnzHmV!MvA6>;oZ>wL=*2?!7r}NKd9K!Kefo)vh>OZ4= z-)5?Bhl||gK%C|-PsAQm)qfpM@mKtZ+WMKgUuf>3{zaV?AB9u;D!#eaFDm{MPOGc? z1+O+N&sp7{h2xMdIvzLRob`%V;3EF-zMZG)BhIPcEbP%%&Me@t$l){VDYi#X0;Rb82n8 zO!KY4Mo-m0+g|l4{9k7@F4(N`_Ts7z%D<1(T(v$2JgfSu-ijySBK}YEC^mYjpKAx@ z7qwCTDC|2&^IM0VGvw>F=Jmky&#B&br{dGGZKLLM2_a~D!(Ou4afRv z{H?ef@q4)ECXFBPqUs&nYrGU3HdMZXXFsR$x^-55#!@*Ed*L$d!}{;kMfv{37vk+f z8vi@&I85U;^HYA#tt+5bj#SN+x%8t-%Lfgj=4qc#4J9?I`Y{8MZjt?_SQ$DSIm*GtL|`&aP~ z@I4=mcNM38AouF2d{_JdK5|drU%rfei2L>}`H8%Km=rkU3iZcX1%`(|Fw?jn~3o`HqnqZ#s^;tN2m8^#zUBw6F5rK9r~9 zHEZOfIP!{?-!(w_S;V99hX1L5E_S&m*XyVJusNE~1f1Jm{deP>#d3o{<#)sp*mr`K ze>WaT{E7a`U-yB=8-*R`YP`>JSbfVE=zCd%$Zl)q`EJQ)`SY5YAnkNAH${)WbXd8q0geKp>P_#WraGx!nLFUMiZ z4-Z#;AP%m*e&GzRKVM^m>(zZ6&-JI%tLhib_2(^ou=e_a=W_ih$6L96xQ9^B^X&d z-{Y^TK8N#H0KUcfYZ0znrusY_!ujg~Uc~vwZ?yU?q7 z`YO&JF?cKIkDWM}^T#b*#_`{Ftm@-9{>S5a9RKg*V2=OexQOGo2H)fO?KV#Rj6BVM z3J&J@O~Kdg8@&ORiUW51*F9h^@8x)U^h@P5VJuzSAT0gv9P?_UPtii>gt_WW61fOp@P zQ?dIUITt7VAeZBSTXMs2b3W$x(*yc;wYJ}LcANJj&i51#wroDX@}>MXUdQS{yBU<)gK#s6rY64j>=2% zCGv}K%omD3!k(+;Hj~tUS&sZNesoBV!7a1okFZ~^{0DY9A~%gxKgYvzf9#qpkH=xG z&pCJz+wXn+=sV@_!9}O!i#X}Hd<#c^FFU`k@x9N;-ErXwc@Xxmoe$1VSA05NkSQ<5 z>Ff2p!YBAzcRl~K4-fuX@$;5##-?ZWyh9a^#7{+OetCYX?}(cR$>VWJCpi(%zoP#6 zc;GhqI?h=wcX`9!-)4BW)%c;74Z|%%@%h9{JQd$aJY}55yNZiamG2O(`L6g;?uY|M zD?b8flfM&3Ur_$f*soNs`=;jSHBZpN~Ux z<#YJb9=QT<+$|eZG@oII<>olxsO*O~Wy?dbKmDU{_-Vx#Vy|QJ2RP_kc{|>8LjD%V ze=lFbQ@)eyPSyP8o|N0+VW;GQ_#EqFJPs&SJQg=+ea7Q8%x@jeWqvzxUB*9&E12JP zTt&RWG|lf3^Yg|f%R8vutJtBn{0}Z@B{!L_`Mb~6@A>q>yIth*I4D|v2cPRLZ^ae;DWmo{rCrl(*sSJ*da)y33__#XGVQt9~An zgVGeyd9Ulr}{H^FZDGz0(YII z{z>>X?D9bMbMRo|AK>H!#dqQK=XCxp!+!Xm+Is9hTjO11zQb|7^_ehe?{>>o~uIw#Q~%fxpLvUW(tv(ZpYvtNv^7csz~#_i$tj z9j}LQGQNppn{zzBt$y2Q>-stzpTmpsey-m;@I~%#e#iBg&(rhNZ!GsCeX%d`h1g+^ z#@mTqng0dcnYi0K>KBe*#?9kYKO3)`D}RNL;A{B7EXAA5SHFg=k6_#bPsfg|pJZId z_{VDF^smGxnUBl6>c4{g!8jMk;W+Zw;S$cjCAa|pgFQL_dMvQ_H;l+My`GH5?K9;M z@!S@Ttn+ypPTQ&F{||R-thnbw^^3A4Mnet+M4X?rJI0L7oEB_ljdxv}mAHlz3XX@`+wi!1v z^?pL1#oC@h*?Rvc9uFI-&#zA7OSANTUqhSnWAMv(9gfGxK3D(m@v_b8@4Q6yPHohG zJTBt-&kZ;dU%-jjIbQWqZ>aw`Joshx--OGq>hs3yxabYdzr%Z~kHoLzM7#;R4pILb zILSf%J13~Va=!Z8a6zQ{AHgHAu~hlOv*TzO5Om%6M} zeNB+oPXxXaq5kQ3E-uHLaO*_XXH8ZAsW>l6^UuX)!!-ZLS1CVevic9iC2z`0aSblS zJziD+#!1vSRsT?&yi4=nfls}zez$Nqetxy;m*FY+*lG38!v)`~f1PCICm+)OKLV$` ztN!b-CoaK*vD^EqFN#tBC>%OV{j+h6P3xxyhp@i{rl|fh>nk2R5?{--IXW}{s)c+t(Ua9#v{z&=r=cwOU+z@|){csr$8=?OF)~SBP>+)ut(N5#l z;AzX%|MicRUpYq3$2QzJRq+fQjn~ds|L<@des;a`hb+_kzsqnepMTuMmq%;7pbg5O zjo0IixDpp`(Rjl@QGPo90!O~2@tig)evQvdX5lGAG~Oxv=oPumr^@#tJ{PYI)ObJP zI)mlzo0LEBzRoY}a3!Cw{DXIoQ2$Yzl^=w6;Ayx9uU)PFk!i}0!-uhNjFzv>XNu3} z^O)uMIeyeGen z{pV|ame$7ke5mgZ<(Iss@iySe_%=?#!I{eU`c3_J;X3%Kor;gTuH}otVSIjm0dF6! z@qDwC-vckl5x5Myeys6=b}9ePI(ZxRjMVbg&sO{apFhpO2S;kW?{Nrj`-Sr7;dgQ2 zck2HePR9dtl<(@O@iK8liu${Lsd)0Mavb)+r*JTCzgzih_h`JOI1c}Uz`Oe!tO%vzE*GI3z)?z>~4-H|iI9Tc1aT;4{C=%kkPO`4GND z{9hb!P4O4<)$iO@c>=D+t7_x3^!te?u!o;)98kUOJ^3Zv`8jzW9{7U16PNnP7qLOS z!9n%Q&(iiAiKp$*@xC6r^ZlX=IJ>L957GFL>Qi^9emu_Jp!(17BEH}EKkP$&vjWw3 zdsFqVf>>b zg{uD^8+;$i@u>2B{8T>(S8P=MI$XI*^}pckIOVr4RDCw}6L4TZ)n{V2%ep?_#qoSU zt@F3k^L><=c+qs#AHwAmHGYF*%0D%c`C^|g@=EMDT=hTVX)da7b6oXFd|z%7&Sw36 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 literal 0 HcmV?d00001 diff --git a/ot-sample-data-clean/client_data/wallet.xml b/ot-sample-data-clean/client_data/wallet.xml new file mode 100755 index 000000000..adf5d4d0f --- /dev/null +++ b/ot-sample-data-clean/client_data/wallet.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/ot-sample-data-clean/command-line-ot.opt b/ot-sample-data-clean/command-line-ot.opt new file mode 100644 index 000000000..a5553d48a --- /dev/null +++ b/ot-sample-data-clean/command-line-ot.opt @@ -0,0 +1,15 @@ + +# The OT command line uses these for default values +# If you don't specify --mynym ID or --myacct ID, then +# it comes from here instead. + +defaultserver : 8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp + +defaultmynym : T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV +defaultmypurse :lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa +defaultmyacct : sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV + +#defaulthisacct: +#defaulthisnym: +#defaulthispurse: + diff --git a/ot-sample-data-clean/ot_init.cfg b/ot-sample-data-clean/ot_init.cfg new file mode 100644 index 000000000..1644cc2ae --- /dev/null +++ b/ot-sample-data-clean/ot_init.cfg @@ -0,0 +1,7 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions ini file + +[paths] +client_path=~/.ot/client_data +server_path=~/.ot/server_data + diff --git a/ot-sample-data-clean/server.cfg b/ot-sample-data-clean/server.cfg new file mode 100644 index 000000000..9af48ccf9 --- /dev/null +++ b/ot-sample-data-clean/server.cfg @@ -0,0 +1,25 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions Server ini file + + +[logging] +logfile_path=~/.ot/log-server.log +log_level=0 + + +;; no_requests is the number of client requests the server processes per heartbeat. +;; ms_between_beats is the number of milliseconds between each heartbeat. + +[heartbeat] +no_requests=10 +ms_between_beats=100 + + +;; For sending: +;; no_tries is the number of times OT will try to send or receive a message. +;; ms is the number of milliseconds it will wait between each attempt. + +[latency] +send_no_tries=5 +send_ms=200 + diff --git a/ot-sample-data-clean/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..82fbaa87d --- /dev/null +++ b/ot-sample-data-clean/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABrM2Xl5rPGDfne4Lx+JLc71hH9WpRxD28DkG6L2WvucjYwIGlhJjod7wtZYZz +dL3zmnweNYk22mebKG5eumkKz83XL8Xmh1v8Pr7qpJ9c4c20jRzwP01NVnRHq1o1 +iS/74QrI4w5c5k/hheFQE947lyspIBWG1HFCKrao9Hg7yXI= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN b/ot-sample-data-clean/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN new file mode 100644 index 000000000..6b879c128 --- /dev/null +++ b/ot-sample-data-clean/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABQOmLuPVsHk3jOYLvkf9oeqcCMG/klJIJ6RIMxxq2juck5dvyKskzz3PflhdO +kCUb2DsWch5Nikru33EwTlApwkURRFynvtd6YCrfZi8lekOH58Hgwp2NNyzuJAKR +H7T/0sfpfPOQJArLrPHl6dlqIUekLKv6UHE4TUbpvhlxgco= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..3d8c6244a --- /dev/null +++ b/ot-sample-data-clean/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzKbz6VuPK4ZdmdHD1C7o+LNITVIYcQZ+4ioR1dYtcknZsuwu2YyX7G+uRq5c +2QX9dLXR/JuBZjVeOi968bgiff1OutlztuhzpraaPhwS7WoBGzHSfeYsnlDhaJe8 +HcIp7srZelLOoZLu112jqH1+mIOhdwtD+m/QkWV4weProik= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data-clean/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data-clean/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/server_data/certs/special/ca.crt b/ot-sample-data-clean/server_data/certs/special/ca.crt new file mode 100755 index 000000000..d1a3fdc1e --- /dev/null +++ b/ot-sample-data-clean/server_data/certs/special/ca.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/server_data/certs/special/dh_param_1024.pem b/ot-sample-data-clean/server_data/certs/special/dh_param_1024.pem new file mode 100755 index 000000000..8459c5460 --- /dev/null +++ b/ot-sample-data-clean/server_data/certs/special/dh_param_1024.pem @@ -0,0 +1,17 @@ +Diffie-Hellman-Parameters: (1024 bit) + prime: + 00:a6:b5:e3:7a:99:1f:c9:ea:47:83:d2:0f:db:9e: + 0e:02:e6:33:e8:b1:a6:d6:21:9d:3e:4a:bc:97:6a: + 15:5b:c4:7a:ed:aa:e8:86:c0:2f:57:f0:df:03:d3: + 0c:56:e4:49:ac:96:ab:6a:82:cc:80:40:f7:40:ff: + 1e:78:57:93:ca:96:5a:31:21:e8:95:de:5b:20:6d: + dc:bb:b7:2e:03:09:a3:0a:74:53:47:da:57:bf:80: + ce:99:0f:e7:0b:25:ea:b2:80:29:17:ac:b3:72:94: + 02:26:c1:6d:9f:cd:45:92:70:18:24:7c:c6:57:7c: + eb:c4:de:6d:6c:c9:10:ac:cb + generator: 5 (0x5) +-----BEGIN DH PARAMETERS----- +MIGHAoGBAKa143qZH8nqR4PSD9ueDgLmM+ixptYhnT5KvJdqFVvEeu2q6IbAL1fw +3wPTDFbkSayWq2qCzIBA90D/HnhXk8qWWjEh6JXeWyBt3Lu3LgMJowp0U0faV7+A +zpkP5wsl6rKAKRess3KUAibBbZ/NRZJwGCR8xld868TebWzJEKzLAgEF +-----END DH PARAMETERS----- diff --git a/ot-sample-data-clean/server_data/certs/special/server.pem b/ot-sample-data-clean/server_data/certs/special/server.pem new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data-clean/server_data/certs/special/server.pem @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data-clean/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp b/ot-sample-data-clean/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp new file mode 100755 index 000000000..76e556011 --- /dev/null +++ b/ot-sample-data-clean/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp @@ -0,0 +1,131 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVzz3XhlBBKUmd74RKfM1SQp2HtPsdjaz8QtRXLGpYFi0SXq1bLPCz8ZOpa8U +IzJOGLUVwgH9FAzy1LVs+bKa4RqoMqgyjciqqFcfc7vQ0MjuxamLsfBK2vy6W6T6 +xp6qDWBfdCMQF/SZrmmosEOR6hlgwStSQn5YcaJjXQTKBos= +-----END CONTRACT SIGNATURE----- diff --git a/ot-sample-data-clean/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data-clean/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..a8faee2d9 --- /dev/null +++ b/ot-sample-data-clean/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,143 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOTSi/LXilVNhOWAi/poHk7YstayyRwAOqBBIJgSD1eOODlHMuHZO6s/l9fuY +p2NeMenp3g/jAG6atY+5s0sK4NAyTWAafaT2FvBdcetTyqulROrMSz1j5xJgaQBx +49YyjMbhPH+WFrK4ZzLbwqy3ll3bmVqf6Ww8UduHBQl6aZo= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/createmint.exe b/ot-sample-data-clean/server_data/createmint.exe new file mode 100755 index 0000000000000000000000000000000000000000..ba26e645cf3a0ce6995153bec8865f6e6cfdb58b GIT binary patch literal 5408652 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⩔U@dh-k>i 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%0DFZK%@D!g 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 =&;Ib_L5^bT%a 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

69p2Kc<8r#63r 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

43^! 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 z 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%0A(3lf(|;e29aJ%z$gL1KV__B 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

7iWO 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%0AE9D+|UhUEd6ZtO0sPV%MX1lJf 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�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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-----BEGIN CRON SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABklx82gJE+HPBoPvgirN9Sqf9KXnw12EmrliswW727xPwbasOW5e6Xeh65Y2V +ZE+W/sRONmyJCm4xuVQW1/QhW2QHILO3CWKPYnAYjT55jj/Ng+gR5O92mXbawFH0 +MgL1H71E0R7u5TbGpuPjfCAz0JjPoa3twbVs/Mz5iV3t2Mw= +-----END CRON SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..2303f0a3e --- /dev/null +++ b/ot-sample-data-clean/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABWDw/m1wk5t7Qldorme3izZKrFOa/ifZ3ef2BYOstB0NGVUcGLeB4gbiS2xqg +zbevppFA3VevW2yatuTSlS6LBH2ST0lEjbdMhCBkk4lCC0rleDVKasN9ioV9DmPI +nqyuQ+eNmsi1QFTPUBqU7YEjUSzvBEoKZLw4ug5zTm3PXpE= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..4ae04af3b --- /dev/null +++ b/ot-sample-data-clean/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABahyVg7Dmhmu2KOTeukNiN7VRLSCr5kKKg8Jh7K7rFlznnl4MGDLhgwQvIWpd +nrHlO9cvEO9bu2UkfXHPlGg3oeDJ0Vy9i1MGZqy6RERKLiX4cVwP1g/vfn+Lj8tR +jDx8F2olUjWhCBlyha6W+X8jqgrhP4/O4w38NDiL79fXBT8= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..7a9c95f7a --- /dev/null +++ b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,364 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +CrQHAAAAgMsVopVl4GB7RSa50z4FOlwNcCHAZIQh1Pzn5qgEL8tW8McImOF1SHAA +wfFNjzk01H4HJEsDkY/adHsDtnagzZDVhSpZHe6UfH2gp2LYFOvxecYG3NhrnMTa +c8xsiW0RcHtRY8i40iLVqkJuCTQFpxy+wtlVHGB+kfY8864vTdwo0cbQvK/GZTPo +njoIDWTrNKdcROaPcOqGj0ZeziGqzyRU/bhR18GEM6hsgEeiYVnQ1GaGs+1615a8 +y2SnAZg7v1jRbZ8BB+PQq/6cw37kHmFNdNOlm2qiJlz1wfaTZw9Y05HTzHr/R0+q +uFM+LzRExtdki85IB8eS4QM5ZH8MvyriuliWwxoUd82mfjkHkYrWttxRs6lMfkdU +QeV8i81ip6yVSm2bWoA4BrZL3ECj11UqsFsVS6XL97+RPKxxLkqAvXaqEVy/O6m7 +2RELq1+sFrtbBffJAn+ux/u6Y8mWXDtnUN5Ni05L/WwQ0Es1cwLGzlobUnI04hS5 +0H7LYtYOA6Wtzckp5ROIwoz5TRIjolRdoipMT0NAmjcSGDBE2/VggiFFhOOiHS0U +KEDBWBEoyUqZEe1ruLlI6uEhj0n54+zp8CVxtWI9gRVlggS+nFhbdPotQPAK23UW +9Ox2Tk+NpUAyjxuu58o3Xa6hPNpKG9TLrXe8JdYish+g6kYbVf/HBwFwRhsRxSRl +o3bDuLfDNyyQGUv+Sg5XwnK94mlAxkdW+ZY4/akXyuEBc3HrZQw07XeuouvNwhte +oE35CwOIcpGKmkwpae/P9L2ozKoVMIUM+SrIxeMWsJJxVgvp3J0E2G4/3jHkyOrM +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABuj26XO5Z/Y9KFCLVrrUW8LtMUgrEI3S+ZCEs521Y7uuyo4Xtd2phjly5uSsr +vdB2EI5m5O5DWrsZPULi+/rQA2/8oOWcBGiDCY9HtjZI6gX2KsTuSP4kVYv4gvUO +Fch0yJ93fDtAj+jMfKFFiKGPV/nGGSW8IZEauDJS+vNPc0M= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 new file mode 100644 index 000000000..7a9c95f7a --- /dev/null +++ b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 @@ -0,0 +1,364 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +CrQHAAAAgMsVopVl4GB7RSa50z4FOlwNcCHAZIQh1Pzn5qgEL8tW8McImOF1SHAA +wfFNjzk01H4HJEsDkY/adHsDtnagzZDVhSpZHe6UfH2gp2LYFOvxecYG3NhrnMTa +c8xsiW0RcHtRY8i40iLVqkJuCTQFpxy+wtlVHGB+kfY8864vTdwo0cbQvK/GZTPo +njoIDWTrNKdcROaPcOqGj0ZeziGqzyRU/bhR18GEM6hsgEeiYVnQ1GaGs+1615a8 +y2SnAZg7v1jRbZ8BB+PQq/6cw37kHmFNdNOlm2qiJlz1wfaTZw9Y05HTzHr/R0+q +uFM+LzRExtdki85IB8eS4QM5ZH8MvyriuliWwxoUd82mfjkHkYrWttxRs6lMfkdU +QeV8i81ip6yVSm2bWoA4BrZL3ECj11UqsFsVS6XL97+RPKxxLkqAvXaqEVy/O6m7 +2RELq1+sFrtbBffJAn+ux/u6Y8mWXDtnUN5Ni05L/WwQ0Es1cwLGzlobUnI04hS5 +0H7LYtYOA6Wtzckp5ROIwoz5TRIjolRdoipMT0NAmjcSGDBE2/VggiFFhOOiHS0U +KEDBWBEoyUqZEe1ruLlI6uEhj0n54+zp8CVxtWI9gRVlggS+nFhbdPotQPAK23UW +9Ox2Tk+NpUAyjxuu58o3Xa6hPNpKG9TLrXe8JdYish+g6kYbVf/HBwFwRhsRxSRl +o3bDuLfDNyyQGUv+Sg5XwnK94mlAxkdW+ZY4/akXyuEBc3HrZQw07XeuouvNwhte +oE35CwOIcpGKmkwpae/P9L2ozKoVMIUM+SrIxeMWsJJxVgvp3J0E2G4/3jHkyOrM +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABuj26XO5Z/Y9KFCLVrrUW8LtMUgrEI3S+ZCEs521Y7uuyo4Xtd2phjly5uSsr +vdB2EI5m5O5DWrsZPULi+/rQA2/8oOWcBGiDCY9HtjZI6gX2KsTuSP4kVYv4gvUO +Fch0yJ93fDtAj+jMfKFFiKGPV/nGGSW8IZEauDJS+vNPc0M= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC new file mode 100644 index 000000000..66b9a972c --- /dev/null +++ b/ot-sample-data-clean/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC @@ -0,0 +1,134 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +eJwVkDmSEEAIRROjOQ1L00AwAetBNLCsMpjEc3hl2wSKAv6H9/H3289P+fj6dOGy +ZhgDRzrtF+rSlISjSfoSHrM4gckClxdSZ3uFapXasYsgOqWjj654bLg8EdEZfX2R +QoywtzrYN/tcPaYWwG1jEqUX4eoElb/xOSVPqbOaOlHUrw0dL7Zs7mm91WEjDLHs +RbqFB5haDoEcD3s2ISuiqnvXxrtxwaY78+keaT4arkLDH19/vv/+9eOT0nl0GVhp +VJgW1tDy2b56KDLShLUJ8OnBoL3IYebqGnvnyDJeB+lrdUd9R/F/pjJbAgO9BpQh +pB1ya5HQINFLdt4fN9wBTNz4YR4EzVjbUD5hAOOn1DS9cB4DOTNJlnPrytlqeK+q +ss/GPLYVgf7uET4jdEkiKWotyodXIUswkZnPg7zx8Q+If3mm + + + +eJwVkTmOEEAMBBOifY3PGTvYwOdDIEBIBJvwDr7MkFhy4nZVf/z99vNTP74+ZwY2 +jfBgNr9BAI21eGfwGJinCNqeZI9LShwMBctHQtYEwE5z4EVTNpe8FFt6M1XS197V +7O40hKQGot3Q6C7eY3aZZRXZEVkuC2UkVmM3QR7EGC3hS4MTSz0xAA5a7HlabQTy +BcUBN5Y8IJekwXt1UuJQGT6ABj2qGnLOPS+3yd/zTNqxH19/vv/+9eMTdVak0jwc +D5nooMxD9RuLli49BXeA71yT56eSDAu8SLBOh82lusUF594mZia0gHYqJ39sh02X +Vz3gpc15CjVhx2HW3On4Kgy9Ro6T8sMuP3sRVQ5lOaaTPIHlbwnuuT1gGYEAVcPD +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABpPwb6mddbpB4vMCkl0q6pLaqqkMqUcgaRH7j57lsr9jA8WBuU+4typdOuznD +OTGilYFYaVLAmTddnj70YQ5ZA/5Y1939Uo0heWxs1AnlPKECsc3XG30QveaukqQl +OKACy0xj2hxFVlCflRJfq217D598VVrjV0/IQ6eSEbisgCk= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/notaryServer.xml b/ot-sample-data-clean/server_data/notaryServer.xml new file mode 100755 index 000000000..00a3ab3cc --- /dev/null +++ b/ot-sample-data-clean/server_data/notaryServer.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/ot-sample-data-clean/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..50f8cced4 --- /dev/null +++ b/ot-sample-data-clean/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABX+B1wpxpgCgO5/7y8eGa77RRKn19wBsMUK4AujWzoWM0iH8KlUk1O2GMqee7 +im/ppD9CT2ONXBOYq/8oMZw8q6k+qC05khQh6YQ7m+ckxKzHu1h0tF6OlU5AdJfA +1F6jSGELYadTwi6SRrkP1UKOovT9ORZEU5QTsA84jt1KIY0= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..6f4ea17f8 --- /dev/null +++ b/ot-sample-data-clean/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,29 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJy11kFrwjAUwPF7TvsIJR9gJtW0KVhl61DqmGPaTuit02xU2rgmqXX94J5X6RSE +7TTe+ZHfn3d4EHS8GY4PRW7thdLZTvqY3hI8HiE0fI4qLdT1AFnyqwgffBzRl36d +rD5EFO/SeC+9guZN+MiMZHUY5c2hUdN5yEuTvuITpkRZCW3mVYGsVm3Rk9J660op +Ic3iMvcxwb2/n/BNvpjJabAtY7at3bckre27CaV2rIIkm7zfL71AztTTavn5u85p +xxuVSp2uTbvbvxLXjo9t4trgBfgdCHTB8cALHLzgghcc8AIDLwzAC/2ukGldiQ3Q +OcPgFBIngPj5fmFwDom7kLgDiTNIfACJ/1xor/tVjNA3nSq6EQ== + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABvpAolOHpO5fnSqKzPGFD6hOvKFZkZtBBz2cnHO6YfNkwcZWCO4gDUTWkTqST +Bdng4r8fgKrfr8V8kuW/suxskhG4fgblusivJ/PlqgwXapuseq42TOPdx+g8xzBt +PF3Zv0J32ws/z2De67vqJ4REb7AwihfEOJF/mXZhewyE3uQ= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data-clean/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..c8dc82ded --- /dev/null +++ b/ot-sample-data-clean/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,26 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJzjyrOxr8jNUShLLSrOzM+zVTLUM1Cyt+PisvEPKS1OLUKV4FLIq8z1dLFVKkg2 +Mk4PLQwotXTKNgzLMfA2zaky9iow9I30TMty93SKCAt3KTBMT0q0dFYCGaYPMc2O +CwCC8SGr + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.64 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABHxjvdOyOINl3wZBb0jStA+SQKhLy7naabO6kRCORz0fdab2KIqcORCA5ghQ6 +wGAxhxLzZdzq+Sq9F60sou1m00NPaPcpiPBQ3Fu68YVHgurpXY+BBSRK5tyh3pe+ +k2Y4ho+aZeF92i+ogDEH5uv3Kt1/DfMtWm4gQvYPOqA8HVc= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data-clean/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..115f10221 --- /dev/null +++ b/ot-sample-data-clean/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABGF12UgelVeDaix3cCAPqUKGkDdp5d3/ZkyhPadkEZGo4wPM7XUPMOG9JlRIw +4mN84k6QNXBTRH5RJ+YDf0UgapAyoiJw5RiaRLGtltlb8JrAHIkMObwUxxcyUZXV +GgXjcKFo9Q/n4IrlEl8Qu6ZvLyQJox30pVMsMgtCoUqeP+Y= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data-clean/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..6262e79d6 --- /dev/null +++ b/ot-sample-data-clean/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABDSy8YqquFfr60I0HH7zqCq1AxwCPqAhTR7S4siyu7PNHuWPeJCiTQFlyjsQh +Ux0uhsHpM2RFRNgot0CKGt5us1ohDtHW2LyH6pNftF+V5XxSEmGk4+WpWY5ZdIX0 +oqWMKa0mAG6ERZOrRDHz+mTni2E0FXTB8aQvMxViQ0U6Jh8= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..b285f0ff4 --- /dev/null +++ b/ot-sample-data-clean/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZThQMTg3aWkvanpuZ3Z6QmV1QisvYTJXMApQ +UFNKNVd0TTFJdTdMWEc1REp2Ly80ekJuUVJqQzd5TXd4Q3VwdFJwZ2JyTHpNbTdm +YklFcXNFMDgvQW41OGtUCjYxK0JXRHpyUjBaVnZBeDNncUdtUXEybWtsZVpsb2Fv +dXE4UXRwZHJoVEQwM2VxRDk5cVBRMHdRTWdHRy8rMFAKOEhsVHJtOGY1VFFtVkVu +VHVRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data-clean/server_data/pubkeys/TESTPUBKEY.txt b/ot-sample-data-clean/server_data/pubkeys/TESTPUBKEY.txt new file mode 100755 index 000000000..c28274c78 --- /dev/null +++ b/ot-sample-data-clean/server_data/pubkeys/TESTPUBKEY.txt @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data-clean/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success b/ot-sample-data-clean/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success new file mode 100644 index 000000000..8e99723ea --- /dev/null +++ b/ot-sample-data-clean/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success @@ -0,0 +1,79 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6GW2g1Kck5hljZrMDDJh5HsxL9Cu3T5X63lLdXGVm +xB9S/hn5JfD3f/74GgwvysbJlkWD506ORRs2zTry1TjJDq//yACkaHp+O9m0fgeA +v4o5bU7zq08/P6KZieqoTVJ7jt67aTt/AKfpPV+mdzCp2m6r00f+b2Qeo3aKkrno +WmNpPj9Q+IJ+CdJxTUeZ+/wgH7WltCJbDu653Ig4jDaUFhAEdUc2LISMsSm2VUbd +t/u3bpl+qvoExXJ3MBeKqRCvhtVzfWBKj+h3OStFmQk8n+uRPI4o9q3Kxq6hk6Rb +2vlLjNJZeseOl/NQK/SO4AIddkbIVORUqdY9jS5XLuh0k4Sl59cJul+k73XRWmmW +junbAqf774Gi5ivl8wP+OH3/MuzXpO9Aquy1Sy52V3UuxhObcLfiDk8D2Mj3R27L +skp3DsU/bgVvahGDqxa5Y9j+TFueCKfLADhzrJTcM/Qf5SqhlFNYs2AETOzdX8aT +W/y7UbJozZvMgF8aCM1Yf4sRvZLifCV0PKYA+7lumzIHrBcdEUabd7qclGe+08oU +PuesXCIk0Dd7EOabAw80jVTSvaddGJ0eg9XrCWDeYBahxcoeplCi4Jmzx3GUtHCU +QCjo1FRobLWrUXgdrJdmjJrxcG5QYwfyBZxXJL8CoaNR5+DGlfXEx3kacGAHDtwY +37QwaLN1kxSmGKTDYwxCLmpp53V1i0T+qPzqyTSPBki5xmpno40KXqtJFS+4OjsT +PcLkAlaZe5GBjhI7yuxKr7JsYVWzaI7RY6/1ZUSGkw5I+QMbqCq2XBzZDkrqcbVh +E6XSl7tDU4PW1Xu6gj4Lvmz0BS6Ln4NswKEEVlC1lVQU4IbOccRrKmKaIudrz8zu ++9IDtr4mCW+Dm0+HUgGqBePmE1IU/uLBM4KMJFoHhCZea0DR8sxuZgyrx4IMyqvP +D+aQdctgJxQOX7gW2TY0dm9eEBuT9to1sdRxp3Sd4P7uyhcFBDUjaJrMXSfkaZG4 +YJY+B2Zj3juKECzTec1o9ybqV0I8s3w2quO4KzeFEYplCvpxPQD9VVnOzdh87Byk +YRdgq9VhCPgcM7eQdlPTdxuNHnYnambYe0Ohr9V+gY/7nkDn16FcAHBzbm8dJY9E +bMRvQ8rLHu8SdT3PkF5M+DgGZ3uoJJdDRYLWoZrmimMF9wGTXudjCoH7dS30qIZw +vnVqhuQTd4l7DQM5eZLku0ms6VNy8myhGdHZ5hljIsUk91ss3G47XhgmAPdQ3PkR +DWPJsyEWVsHxVdRIsp1WStlvbIPy8FkhnpDer/hsJNTjNfu+9So9ZNz0zARuwWYa +Ot2xTVAhszYhZ4F+M6CyQkadydDzJ6SBp2JSD7Wi2xWzzYHHWTmuHAVdWWkBLFe8 +eFrJ8sIUptGehUW9wmrstAMEegWSrcXlkUkMHof1RvlBvq8lFkHULEH3jEE8DZDo +z0/gL+g3SnztvJH6HfiF0b/D+Qe0ace1+J+Y9tJxerP12+nap+3J+R9tpxP8JwFH +ANs1Xyj+dnrOc/8NgvJifi7xn0nXQEJa19321qxpnY7QV4U/fq0AbUVVAO8KNLOq +XD5UyGrPjO89oMBit+tSedPNrd8ttJauXetX9dlU5xkLloNVcnKFJWZ7JdwGMC// +yAh70JJ2nvAYTEqSpfKuf5xJyL4e70chvMRp6nCZrCcabNnjIjaWL9wbeqrSiwdU +hJME/VUzRSS4M+i6CPK1NKqbknt0Sjz5Gup4UcSIAYHPzAX+/Gkgb/z/3/a7fcA/ +juNLrQ== + + + +eJxllNmuozgQQN+Zn4jua9TNlkBy1WkJCBAgISwhQN5YHHbMvv3k/NIk3dLMVY/f +7KpTcpWtg/z917f3YnlRUlemJKr8cXUzGNVkuJt0VVfSjb/8ykBOXht/rkzm4iLI +j6QDxaqbK3D48DomCEDVSa8jAwQgqboPZNV2Xte3r2iQlXDMQRiBApTvSNd4ZesF +XQJLtS8OHwRGEW8ANANopOPhYxfmhlyKXFpb23Sk/Yc3EoyA44TVcI9EeLLmnivl +5mKb1Yvr299UFRBkZNVav2cz/J5jyjZfSLnCL670TEWJde72scIj39tzL+rZwOJ1 +bdiX3RsmmCdwyWW+hUpGuPhGYB5QfbDZrs0UwwUedT068KLtsFP87gB+QV/7pDTA +EzSgDMAN/tuQV7xTDh/Yx+rne2Jfk34iQJ7yrCWuMGMsIwfLxswke6+pKUUk4q1j +DaOqLI/XH8JTrzxZjy0r3pTDdT3OWLLweyTEA5JECxPg56DEdwNtTdhIG1t8Mdpn +4B4NWg19vbnkAeHrwn4t05Fms9NpUNounBYSuRI83OBFCGme2UxpvoijfYSVkaVX +djO2on0vLqwLe9lsvKN30YWFLbhAIAoXEwwAG8Q3joZCnQufm6FDFct48bFQE6iK +gHrss2Z3zlplosK4zXcaKZ4seo7MPaqK1KY9xaaOqHus3jM7CTAGdV+Wy1Yzejsl +RLC1ZGwYultE+ndud/Hjrr5hRTHd+Opid7ER9qnzDAESzWjTXJesozObT/ugVJ3E +P2Y0q/WNbXG2hzvU9ew6GQcwYD5d3el43t0Y0hVnI4JakPie+aLeDm1nXsfzjuxa +w8aXgXxodbkpUFwcmAA1BTohUqNmm6mepvg0zLc7ejQpjOMQUjYyMZDbid09Zgwk +gE/d1p2Au1XkYGsWlVi7CgYNIezFfB2IrdVcuTDAPPZKTE9shzhB6bOPI0WfmkfW +szt6Gu7c/UGAc2pnnsCfMCE73u9nx6z3pmymO7HLT/XMnkuhhj7VIbSnr+M0HJXZ +NB27LtFqDkJ7Zp4x6FFrS2pL/3hWqZVVUGAm3n528EEoleYnQRnQpYqcjg1l1uvC +p+k7AUSvr/poz0+DGuvklNqRW3KQ6nExK0f9fGvMNSfoHYqi8IbigbNjkVlz0lw/ +HJAf6B+f/H3yssJP5Itj/pTLL+kwN8vgf2vmDpr2pYbP1bUC5er2nyzaFfadxjyE +g8XbJJ+ruOuqTxSNki7u/e8BLFAB5DkcX8wActCg7wrfvlZAxyRLkFcFhlUp6onN +zrCmQFdI4fn1VqkgtKxv7B5cPpWKjAU0MUdxfMZNQ1WKe28U5WnBuzpFYhkjwkup +x9WlgPkAIoW086j1rtFUt5E+xzDUmJmsEjbjB9TZbtTzmSpkWNRUoynrLTKEjxSd ++JLMIohNpmInx0hAZxcbpbFxQ8FmXWHUXHuyfVNSpcPvAfLq/9385/iQfwAcjOTi + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABjwZHsqrKPWX7LVYXC6sroTDXlR8OT3Gblk8GRW4qwketUTavFAS7rLmmmBTp +V6WIcuVpLTxwvyvfp5XlIjnCHQ9i4Pw+78gEDRSqYa8QgKUbpCK8+D4doavIz4vc +qcAbf7XvfFlMnBNGG3zzyy+VaG9CmLGo3Qc72aFT+UQs5wA= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success b/ot-sample-data-clean/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success new file mode 100644 index 000000000..f0e4af3cf --- /dev/null +++ b/ot-sample-data-clean/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success @@ -0,0 +1,77 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxlldnOo7gWhe+RzjtEdRt1A2EKpf5LIswQhjCFcMdgwgxhMskTn8c4SZdaXarj +K9t7rSV7S/6M/Pc/f3zGSZRVc+eqsikKO8/hTJfjPdUyd6onGn8rECWeiu87lzNu +CPJXOYN2Nz8H8PUtnr0x7qY4ncu+c+f4XQHd/A3ZTe/5Mr0Fad31sAHZ/Z/K/K/B +XNqvb9hHDcYVjKrw9e2YNY7WyXz18KkKMkkUwwMn4fjBH/molPKTy/KdNhpXd3j7 +lumna0gPxN1/2At7qvGgwXSqeRHagBs3Na9k9RQGV2HA70nM8m9XPvYtl6b90s0f +s4dfCBhd78Dz+9hfO7bFm5eqU3NHQdVrXttrlE31+Jjj4HP8/hfre112DsjBCLoU +eP3P28Ttp/6Z73582vWr4gcCtGdQH5elr3u/eKSdzQVbPPanLZutZTNEzFGHRp14 +43jifYv01fNmrodOIHqz2vebhVRZFM85iT48NhcTFN17cvoKb4qqtyclg/qgU0/f +MknFLS8ne7iic39nazLKNS7W8ElEju4q6ny0tbSC86fM8qseCLMpQoxEHVgD8epF +OH6llMLvR5yjPJO83pzr6qAuLG59jEj+6VZRMeEKWG2htCMzpjIRp3mgGqhOplGp +OnFhlTzmp73leM8gnekwCPYPwmttmZgQeiMGZ+lvWaLrbXwXsDvsJpj0fp4/ygIT +nxtkGpxppENngICKtbxCS0KhtYVgDEl2kAo+fCAW9oqj1WbYrK9Zee7fra0nQ0Fp +juJSXYxG0lw07SK63tNF0j0JK08pagGiXCMufuYoF7ND9LasxjHqqWnaNv1KUXXv +ccHLvPi6mgqHk7DpXAoUOaqX19lJ41BvXlLaIUwlOHJjw2NfxElb2OB5GdbsDGU1 +wvRDjxutImJ398g4B/GYF9KLpqVTQ/MBAVZDX1mEI0a+TLc4bAHODWmGDQvNSQk5 +8sohYxpzzUZvnO7wcj1em9IX6PNivzyCiy7h4d6dAAJ0KPZcfcxgmiTzMAACXP2I +L3wYZ0xSuyd+W2Nf40PY7ss4s2s85bmbpT+Ym/9kHwmSdsxB0oLQ49u+ofNzaw1P +FDqkx2yENWZAZPY9u1VMVgtrTZQV27Lp+hLaTLSzvDcZ5OKHkYFmJ71odNfGc75e +XHRs78pNs8mjwt4hhK+K7OmCKXtFQ0HbGKVb6tgjCXG+4JGT55OoUhC9NkLZ0VmO +yYbb0l2lwlWJ2CkOtAuvCujOz3MW4MxUJOOjr/ZDtdekW40VCM0KtRqcFU1eFwJA +P1WdHDarTg1K1gzXRl1CmcJfDUGoACtnOpnGV1Jc/Vxe4/HxOiNdrqlC2pQTjRd2 +HGq69wwdXYjfD7jZqu6dnJtNoDMHWbMsAcupRSoTk7FeytYuE1sjkFwV/yGEBJQW +MmTRPYtuYnjkLtoWPOHXF/IX+hsAPjtvTv5AfoHv79T9m8ac5zviT/4GYJzewPy+ +swbQ7X5h7rTD/mSwGOH79sPX77tinofvKHov52JJ/kz7FpVA0/Tw7VlBA0b0k/DH +rwkoLOsSeSdwp2vrdQSRhffcKR/mBdplSM5VYBWDsJwHPiiMtpjj6KKiab7IRAhs +fU4MyuDhUUFMSrBNizZ9S+BHgX9aw6i/pEOb4+f1Vm6EGx7de5B57YMeI6Icu0i/ +kMJhQPMzz/KZjJQSGrUj0bIOszWk8cixjcyFCtWKvTcMpCxKuh122n6fB2LC1F8/ +Gyia//9p/d4+5H+OTEFJ + + + +eJxllMmSm0gQhu/MSyj6qrBZJITocDsCENAgiX0R3FgKsYm1WF/BLz2SfZgOT92q +8v8zsjIyP+TXP99eh+VFSdmYkqjwp41lMIrJcJakKhvJ4q+/Fchn0KfvG5O5egjy +I4PgsYFLAz7eAshEEWig1QVVH0Qwq6s3ZNPDAA79MxoVVT2VIL6DB6jgMwL/0ynD +4+MNe6lBN4JOOn28HePSkCuRy1ubzCcq9IOJYAQcJ+yO8zMhYU2aq+Tu6prN0zf0 +f1xNROzudqsNNFvgTomdyXLdyQ1+9aQkFyX25rinBr+HAc09XUlXP54110MFX2YL +13eT796BZdeBPVb0Ay9X6UzCipwkq1zntRMV6djCwHmVX3+xPu9ZZYAEdKCKgFV/ +vBEYtX++Bo+X5PW5zc9Xu76KfiJAXpyih0tdMHZagnVvFjUsQ+5im3Na6mw9SMLg +NgV+FFx1Lwwh28ra4wqCjBnmvu2Rporp7Yhu21FxInyLfnZNrhrabb8ou31e5Nqd +VC7rBRICTo5sTy3bI69MNyeK0k+yulyQKDwa9+mmXTIbY2W27EV9ZsM7J9pXnpvn +5Bqd2iVlak1xJ28gePS22x16SW+4vXAwShOJCV264xhYxxOf5MeSqEYrwSBbk2nu +Op4ZtHE9XqJsF3nrAGfej0YH94gzabMQ6zEWme8FuxhVl/pzsgsrsVeCfXSj6FE5 +y+REqqfzHAYFLXuu57fWJ5WQmaFSJi3NK6cFuo74K/NIW1ZCg5jg6nrAst3nSJnm +fKVMbhdV23Pih1vlUUmWuiZ8gLU1rqjGTY6sYxWrZ6ScKYof2N5Odb1fBNQ/T1E2 +SGzvajTdZIaerieNi5WFnNNTW3mKtUbK/q5sCzYiCDZARL3C3c5dZocnt4LgkDk1 +hL6GGzfLsT/VmYoOyaktSU23MH7rGIS+jeNLKaQh6plYMiC5rDuuxJK6kMF820BS +2Nl46+IQdRYD5TCozWzBxA26Zw9lRwEs3nVGWZVjojm6h0EExBORiWBpMIGoB9+k +BzCuixie8nMf9NbR/JzKiz07iXzoylatB8PzlL2o0s+RQc8PDdlOCpGq5zvyA/1r +Rl8vzyX/iXzhw99g+A0MxrIN/g8iHND1z7V+36gNqDZfgNBvsO8UFiBc/XhR4H2T +Qti8o+g9g+kQfo/qByqAsqynp2cEJejQV4ZvXzOgU1ZkyDMDw/JNDXahuEq1FBXp +SBqQzwkm5tpLaSVWpbpuPB5Saky7Cu9lJWRx2Yno/nFXIYGAnjlMsTEe1irJUfs5 +aKGpYestE2xj1LkTVgY0eaAEHz1QVNgDoKBaKfPJvBJ+pE05QtzK42hMV69wcye3 +debIUovfsJbjH4x8BFgipeNNXC6PIqF0++NPA3nl/1z9u33Iv8/czXo= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABGTieDIwkEcURZYvpQDxSamYMxaAUoK1IioHoDKdJKl/RdstpAMh26Fc4wF3t +s2Xfl6sG6/YSE05e5FCYsJfEMcZFSpr792vH0I2woT1D+elTP1Y23M04981Kzx1E +aPSYOJ9qpMo9COC7ydgil5YQndp3db4j5/T1JC0vR4YMyIA= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success b/ot-sample-data-clean/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success new file mode 100644 index 000000000..120c0237e --- /dev/null +++ b/ot-sample-data-clean/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success @@ -0,0 +1,81 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6mWyGUp+SwMzGgM1k2DEkYOYZzIv067ZPlfreUt1c +ZUbEH8r4U/oS+vs/f3wtTpAU/WApki7wB/vO6hZ7thVDPyi2cP1RAcnhmH87WOzV +h6C/nhOoD9OrA58f4cSFVdjEwJrCdxQ00wd0GN/7eXwn47Jp1wok2b+ZaQibMYyn +Z9voc/35gaMU8SUAwwIGhf/8oJPqrjbSueidU7FSURCuOCtiGO4M5+ApppzFnBt1 +uHpW99bN409VF+NE5vTmzHAl5lbo5VTthNphV19JC0nhHq7Hd1gWhcz5rUqHtmbj +uJ2b6Us8Wlzc2pVd+j7dmQu55PiFJ2vFHe6JsrZJNnp8q+5K2rlfE7S/SN/nZ3MH +KRjA2wK7/e9AYf1V8vmBfhy+fxn2a9F3CKhb5dC1UaOsswgBzaWaa1UZLc/63eQu +lLTNNHuNjtukSDx/j/w1gtWUDl/c+rImqoMW0D3UCLP0VB5wBHScWIpcXZ6xgK3Q +YtjzsdbEIvNVjSuRmJbG1AthBUVBglZPlVahvKhVeFPnYCAfwHqy6hJI/FmhFTqv +KX2qr+SUY7Fa3xp+amNfi0Ula2mUuJ4CoIWBCHk8k/OhrRfsvI/HwKFdOXihgKBr +BmyIclkpDteSo3WySD/cxG4CpH+K86FGYW8LVg8iYlxtJefRLJhAnnaVG7jIH+wx +Ux1dRo1Jas/DKMeBlwLyZZbZRewFlVCLcynmgRv10Fxtp1Q7wj7hNwuIMqdjeJRz +c4zPrfZGZI/yVD7kV140xnlfWCPcnyDKvUiysfOjIBkowv2rmXjXlIN1uuDxrCle +pwBnvZEpLxHQnIJUKILz6TABLcdERqWzALQgv42h3HoGVOpHY5vxo1nttwnABUn5 +Lu2p8IOT55vbDxuBDuyN4GIdxkV02oa2TJo6X/iSJJ1ZTiA0A7mm6THxuhDt+YVg +tsE4Be1hyeYLXbrzU3osFuKEilmcPDEGWbPEmNYZLLQ33BIXchaFTLBVvBASbsNa +GUuVdeoNsophWb4fyXVReivS/ArWBC14TYYZ5Bjc9y2vMHKAbdBGIS3SLvh+boyl +K4IkqsSuL1Ng5fKLciz93nMV3R1JqaqoXmc0QSjvrP/qomxhs8iGXLg1XsVDDhEM +pqLT+FQRx0UWKfaHxECEakwZiXFgAcQj/DrB+RKfSck2iXt+ujyFYoCitY3Khdza +AjtrpqoiPn69WlR6OXeXWN9J86g8u83yA8ch4u64ZruDXR470pccZgXtDWpXZQGX +4X25xtP2kakfxqvMC6IqMFy7tfMLVVFEpMpZdtf7c46CJnCvyy24vOoBM4UBggPP +7xAqdrjLRvXz9c0rs5OqBnWo4Sx7J3k/Kwk99vQwhXH68FmjAbvKOLjGPayCgSFe +A4q6KYiR1W6VKhqXleTDfD7VcRUt5z5NPRsXShjFjXoUgmJWbFZLF71rpZ1GGBOB +Jh858omgugL6Cf2F/EaLr8gbrd+hX1j9O6R/wJu1nbvwE9cuGMY3Y78djA40B/t/ +1B0P6J8UGkLntv5C8rdDPk3dNwTJnlM+R3/GbY2IoKra9a1ZQAUG5KvDH792QNZn ++YTeHVgu0W2xCxIjW7nL6XbKVNguL1re4gkvKlbG9zetbGbuTnJMaWUoy7ErQ47l +jdeYHOIkj6CoultEfsB49v2s9qMJ37U7VzpYuuN5Q0qIdXfRQbmy1olyxsVcBdHs +Mrurnwo0BWye9ryA93LJo319p02M19BoumKKyW2WyY1b5Ja7zBKScYs/fxoo6P// +x/1uH/QPQ4pLxQ== + + + +eJxllNmum0gQQN/RfIR1X1GCWYwhyo3EbsxiMI1teGNpFrPvNt80Hzl2Is1EmX7r +rjqlqpL6IH//9eV9eElRzY2jKqYkbsCZMx1OAOrJ3KhAMn5mIIdgyL5tHM7wEOR7 +PsJqMz5b+PkRjFwUwXa0YB3ndfqBbIYxGKfhFYmKullKGKewgvX4iox9UA9BNOZN +bU7V5wex3ZNvAPYz7FXx84OJy/OxVoR75+7uyz70g4XgZBwn3F7wcznhHVaoj71x +ddoXNw2/qDYiyNTtrInlC/xSbrVduZLHFjc8NbkrKn+7XMUWT8OAFV5U0jfVq+Vm +qsc3PDh81IASFJ7HtNZMzxmhiXSlXvpzrC5NnA5XsTmuatJe3hM0v6Gve16fYQJ7 +WEcQNP8OFFTvlM+P7cfmx3tbvyf9QODxURbM5DR3zs1quFJC0Yy4FVPcRe7Qbceb +ipoPBB57kcerkmSvopYy5CqGjk7DZod0KHDRhO5qDROwpMa3oz/MKR+SaaDvL+v9 +4M4+0fQdd7B0joAo6vdpWUg+ILOQgMsO2edEZpyStqFEADJBGTRun0vU8VRH1NzZ +fB+1bcbwPe/OQSykR5evJNOQmyt6A6BgIoSNR95RaJtTyKBwUX90VZ29HfHWHsKD +zfD0s6RHdlzzW6uySlbd8etWzeZEz7pJa1EX2WJkM1AmljW0zmFQedQF2VFS5jr2 +g1IAPjuBrvvCbFpcoOUqdWFU+0LlRKTUlj09CgT0ffJkbpPZr7LlGuFu4O54WiyJ +2N3mxr+ZXq7JXUgpbB9JBOAFXlPt6Z72S2RWFW0j49MCoIyHjjlhJjUKlXEkxW7f +PTGXuY5VCHvyJE7iQzFn5ZiafWLXXaQvVT3dNIeOZmTADuKJqKBMVDg+RmwMCrAQ +aRvlir6vJG9YbS9Qe94QOawdnyEjPWaxI6wYpcNny5yQmV26ezWb9eqxjtErD8om +BSqjdjs0K7I4ORM614G7pQYqsLpgW3F34RTIj/i2mJGzbxDDGJZgl4arwJ2Jxrnt +l0JwWE0KHpp7jcIpyUX22HWEp4TWiXMT96oV2P0KWFmMHE+hEKx7OkSYby2h6OiE +sC/3/dr7Lge0W7WeLG4QbOsalVCek+eg71w6iNZJeRTh83DzqhoiYB23h2dGxWcS +Dx9XVvF8yE/cWWcs92Sk19fYjuEE1dk5r13k+I/nXgapcbAUMD0gXiIoC3DTLe0B +p8sUW5h6pW4nE0Ox5YL2DbYXcB3ysfSJfMf++EXvl5eFfiC/CexPc/00Ggfcs/TL +YRfYDy/3fNucWlhvwH82Gjbbr/ttgAhN9VbVt002ju03DEvzMZvCr1FTYTIsy2Z5 +MTMsYY+9K3z5vQK25EWOvCpw/EWFbujrRr5iY9amM0HtzrDTFnyHVS5NEm7Q6fyh +HwQlMRn68gzUOkD1tZTQLEEoTiNtyVgjqNlbeTVz8WxiA+ofm7r3uHEYDDE8Codu +p9kz6xqnud0Du2gAvNnYWI4CEkwi7s+nhNOEaZX9+oA1lT/cDEE2JzmBjo7ftag6 +9GKq76od9flrgZL5f/H/uT7kH4SYALE= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBSstkMhL1VAZyMdIFsHP03xamtQECxsSBMsfFq9+z5Nunvqtq5TiuXvMrTvu +UcjbIHO07iRdr9pYNEYKJx8/JOk4quZMPEGXMltcNAzBJxsPqLNftxYLCczDs/M3 +Z3y9vcUYY5vWllC8LLSfCKzdzk8lY424XiKYWxRkOFW5i+4= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data-clean/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data-clean/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..3ed904e6a --- /dev/null +++ b/ot-sample-data-clean/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,35 @@ +-----BEGIN SIGNED MESSAGE----- +Hash: SAMY + + + + + + + + +- -----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZThQMTg3aWkvanpuZ3Z6QmV1QisvYTJXMApQ +UFNKNVd0TTFJdTdMWEc1REp2Ly80ekJuUVJqQzd5TXd4Q3VwdFJwZ2JyTHpNbTdm +YklFcXNFMDgvQW41OGtUCjYxK0JXRHpyUjBaVnZBeDNncUdtUXEybWtsZVpsb2Fv +dXE4UXRwZHJoVEQwM2VxRDk5cVBRMHdRTWdHRy8rMFAKOEhsVHJtOGY1VFFtVkVu +VHVRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +- -----END PUBLIC KEY----- + + + + + +-----BEGIN MESSAGE SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABsSzz/9KIsKWOXMEVpcdmRBnmUaMptjmejkFhR89EGqQShY+eA7zUgzMGjEQy +qiOKOFOSWDSLKTPm41vwv9S40Isylwiv15W2Kj8kszhf+GHfFIsOXj4lHznWeSz7 +8ftwW6OT36BO1vzDIFFcBUc630GFZitcP1sAVXAfK8TmJeU= +-----END MESSAGE SIGNATURE----- + diff --git a/ot-sample-data/CLIENT-COMMANDS.txt b/ot-sample-data/CLIENT-COMMANDS.txt new file mode 100755 index 000000000..f421fcc8f --- /dev/null +++ b/ot-sample-data/CLIENT-COMMANDS.txt @@ -0,0 +1,247 @@ +TO GIT + + git clone git://github.com/FellowTraveler/Open-Transactions.git + cd Open-Transactions + +----------------------------------- + +TO BUILD + make clean && make + +Notes: +https://github.com/FellowTraveler/Open-Transactions/wiki/Install + +----------------------------------- + +TO BUILD FOR MONEYCHANGER (Java-based GUI) + + make clean && make java + +FYI: https://github.com/FellowTraveler/Moneychanger + +----------------------------------- + +TO INSTALL + sudo make install + +FYI, This copies transaction/transaction.exe to /usr/local/bin/ot_server, +and it copies testwallet/testwallet.exe to /usr/local/bin/ot +It also creates the ~/.ot folder, and copies the contents of ot-sample-data +into that folder. + +Important configuration data is located in the various .cfg and .opt files +located in ~/.ot +(I suggest you check them out.) +You can browse it online here: +https://github.com/FellowTraveler/Open-Transactions/tree/master/ot-sample-data + +----------------------------------- + +TO START THE SERVER + + ot_server + +It will probably ask you to enter a password and a path. Don't worry, +it gives clear instructions. Also see the INSTALL docs. + +----------------------------------- + +OT GUI (MONEYCHANGER) + +To start Moneychanger, just double click the jar file. +Or type: java -jar JavaWrapper.jar + +You will need to select the data folder for the client. + +This is located in: ~/.ot/client_data + +----------------------------------- + +To use the OT COMMAND-LINE... + +In a new shell, run the command-line utility like this: + + ot -? + +(NOTE: for now, do not run multiple clients AT THE SAME TIME against +the SAME data folder!) + +COMMAND-LINE COMMANDS / OPTIONS: + +ot --stat (Prints the wallet contents) +ot [-h|-?|--help] (Prints this help) +The '|' symbol means use --balance or -b, use --withdraw or -w, etc. +The brackets '[]' show required arguments, where default values are +normally expected to be found in: ~/.ot/command-line-ot.opt +ot --balance | -b [--myacct ] (Display account balance) +ot --withdraw | -w [--myacct ] (Withdraw as CASH) +ot --transfer | -t [--myacct ] [--hisacct ] +ot --cheque | -c [--myacct ] [--hisnym ] +ot --voucher | -v [--myacct ] [--hisnym ] +ot --depositcheque [--myacct ] (Deposit a cheque.) +ot --depositpurse [--myacct ] (Deposit a cash purse.) +ot --deposittokens [--myacct ] (Deposit individual cash tokens.) +ot --inbox | -i [--myacct ] (Display the inbox.) +ot --sign | -s [--mynym ] (Sign a contract.) +ot --verify [--mynym ] (Verify a signature.) +ot --purse | -p (Display a purse.) + Arguments: [--mynym ] [--mypurse ] +ot --refresh | -r [--myacct ] (Download account files from server.) +ot --refreshnym [--mynym ] (Download nym files from server.) +ot --marketoffer [--mynym ] (Place an offer on a market.) +Also, [--server ] will work with all of the above. + +Recurring payments: +ot --proposeplan (Merchant) + Arguments: [--mynym ] [--myacct ] (continued.) + Continued: [--hisnym ] [--hisacct ] +ot --confirmplan (Customer) +ot --activateplan (Customer again) + Arguments: [--mynym ] [--myacct ] + + +----------------------------------- + +OT PROMPT + +For the OT PROMPT, type "ot" with NO ARGUMENTS: +(A few arguments are still allowed: --mynym and --server) + + $ ot + +The result: + + OT> + +------------------------- +OT PROMPT COMMANDS: + +load -- Load wallet.xml from the data_folder. (Do this first.) +stat -- Display wallet contents. + +(Yes, that's just a 'c' by itself down there.) + +c -- Sends a checkServerID command. This is OTLib's "Ping". + It's the wallet pinging the notary, and verifying to + both sides that each can encrypt/verify with the other. + +r -- Register a new user account (using first Nym in wallet.) + (Register will fail for you because I already registered + with this Nym. So you can just START USING IT, since it's + already registered. Ignore this command, in other words.) + +u -- Sends a checkUser command (retrieves public key based on + userID) + +g -- Ask the server to send me the current request number. + If you get errors that the request number is wrong, use + this and then try again. (It must always be in sync. This + command is what re-syncs it.) + +issue -- Issue new currency. (It will ask for the currency contract.) + The wallet will ask you for the currency contract and then + create an issuer account. The public key in the currency + contract must be the same as the Nym's public key, AND the + signature on the contract must verify with that same key. + +(I already uploaded the silver contract, which is why you see it in your wallet as though you are the issuer of that currency -- because you are.) + +getcontract -- Get server's copy of any currency contract, by asset + type ID. + +getmint -- Get server's copy of public Mint file (contains public + keys for each asset type. This is needed in order to make + withdrawal requests for any given asset type.) + +a -- create asset account. (Of any type, including any + Basket Type ID, which is used like another asset type ID.) + +get -- Get latest copy of one of my asset accounts (by account ID). + +n -- Ask the server to send me a new transaction number. + (If you ever get an error related to being out of transaction + numbers, just use this. Sometimes you just run out of them, + and you need more from the server.) + +t -- Initiate transfer from my account into another account's + inbox (with a pending notice being put into my outbox). + +i -- getInbox from the server so I can decide what to do with + it. (There will be pending notices, cheque receipts, etc. + I need to go through them all and accept or reject them.) + +NOTE: the test client, upon receiving a @getInbox response from the server, will *automatically* process *that* into a processInbox command back to the server, automatically accepting all of the transactions, resulting in a final @processInbox reply from the server. Obviously a real GUI client would merely display the inbox to the user, where the user could choose to accept the items individually. The API offers faculties for doing this. + +w -- Withdraw cash and save to a purse. (It will ask for Account ID and amount.) + +Note on token format: the individual notes are stored with the internal Lucre data *encrypted* to the user's Nym. So even if the tokens were stolen in plaintext, they still could not be used--because the internal Lucre data member is still encrypted. As long as you keep backups of your financial data, they cannot be lost, nor can they be stolen simply by the files becoming compromised. + +v -- Withdraw voucher. (This is like a cashier's cheque. The + server removes funds from your account, then issues you a + cheque drawn on one of the server's accounts.) + +q -- Deposit cheque. (You can also deposit vouchers here.) + +d -- Deposit cash. (Will ask for Account ID and Cash Note.) + +NOTE: When making a deposit, the test client automatically re-encrypts the Lucre data (internal to the token) to the SERVER's nym, so that the server will be able to process the tokens. Similarly, if you wanted to give some tokens to a friend, using a nice GUI, you would simply drag the gold over to his name, and then your wallet would re-encrypt the internal Lucre Data of each token to his public key, and then send the tokens to him. Future options include exporting to a passphrase, or in the clear. + +p -- Deposit a purse full of cash. (It will ask for the Account + ID and and Purse.) + +cheque -- Write a cheque. You can do this offline but you need to have + at least one transaction number laying around to write it with. + +basket -- Create a basket currency. (It will ask for the basket + details, and lead you through the process.) + +NOTE: The wallet will ask for the number of asset types in the basket, then the *minimum transfer amount* for the basket itself, then it will ask for each asset type ID followed by the minimum transfer amount for that asset type. For example: I might create a new basket currency called the Rand, defined as, 10 Rand = [$50, 2 gold g, and 10 silver oz]. Those numbers would serve as the *minimum transfer amount* for each asset type, with all transfers being a multiple of those numbers. + +Normally when you issue a currency, you are given an issuer account by the server. This account is allowed to go negative, and you can transfer to whoever you wish based on the terms of your currency contract. And with a basket currency, an issuer account is also created. But.. instead of handing control of that issuer account over to the user who defined the basket, the server manages it internally. Each basket account has its own internal asset accounts to store the reserves for the basket. Whenever users exchange in or out of a basket, the various assets are moved in or out of those internal asset accounts. After this point, an asset account storing a basket currency is no different than any other asset account, as far as the server is concerned. It's just another asset type ID. Due to this, baskets also support infinite nesting yet with no additional system resource usage. + + +exchange -- Exchange from asset accounts, in and out of basket + accounts. This is where the magic happens. + +Any exchange in or out is based on a multiple of the minimum transfer amount. So I could transfer into 10 Rand, or 20, or 30, or 40, etc. Any multiple of 10, since 10 is the minimum amount. I would have to trade ($50, 2 gold, and 10 silver) times 1, or 2, or 3, etc for the exchange. Once the user has Rands in his Rand asset account, he can trade it with other Rand asset accounts in any amount he wishes, with no minimum amount. The minimum amount is only for exchanging in and out of the basket. + + +propose -- Create a payment plan (like WRITING a proposal.) Merchant does this. +confirm -- Agree to a payment plan (like SIGNING that agreement). Customer does this. +activate -- Activate a payment plan (like ACTIVATING the agreement). Customer again. + + +offer -- Put an Offer onto a Market. + + +setnymname -- Set a Nym's name (merely a client-side label.) +setaccountname -- Set an Asset Account's name (merely a client-side label.) + + +signcontract -- Allows you to input a contract and sign it with the + current Nym. + +decode -- Decodes base64-encoded data at the command line. +encode -- Base64-encodes data at the command line. + +decrypt -- If you have already loaded your Nym, you can use this + to decrypt messages at the command line. + + +NOTE: The below commands are for TCP / SSL mode only. +(You can **IGNORE** them.) + +connect -- Connect to the first server on the wallet's list. + (NOTE: **NOT** necessary in ZMQ mode! If you didn't + use "make tcp", then you can ignore this command. It's + only used in TCP/SSL mode.) + +1 -- Sends a type 1 header command to the server, with no + payload. +2 -- Sends a deliberately-malformed command to the server. +3 -- Sends a signed XML message in the payload, but with no + XML requests. + + + + diff --git a/ot-sample-data/client.cfg b/ot-sample-data/client.cfg new file mode 100644 index 000000000..07fd8c3b5 --- /dev/null +++ b/ot-sample-data/client.cfg @@ -0,0 +1,19 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions Client ini file + + +[logging] +logfile_path=~/.ot/log-client.log +log_level=0 + + +;; For sending and receiving: +;; no_tries is the number of times OT will try to send or receive a message. +;; ms is the number of milliseconds it will wait between each attempt. + +[latency] +send_no_tries=5 +send_ms=200 +receive_no_tries=25 +receive_ms=200 + diff --git a/ot-sample-data/client_data/.ot_ini b/ot-sample-data/client_data/.ot_ini new file mode 100755 index 000000000..f6690a303 --- /dev/null +++ b/ot-sample-data/client_data/.ot_ini @@ -0,0 +1,5 @@ + +[logging] +logfile_path=./ot.log +log_level=3 + diff --git a/ot-sample-data/client_data/LICENSE-AND-CREDITS.txt b/ot-sample-data/client_data/LICENSE-AND-CREDITS.txt new file mode 100755 index 000000000..d66061644 --- /dev/null +++ b/ot-sample-data/client_data/LICENSE-AND-CREDITS.txt @@ -0,0 +1,2059 @@ +Moneychanger v0.06 +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + + * M O N E Y C H A N G E R + * + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * Open Transactions: + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * OFFICIAL PROJECT WIKI: + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more + * details. + +-----BEGIN PGP SIGNATURE----- +wsFVAwUBTbFZUwMIAO35UbuOAQjDRBAAmIUJBi5/WC1KpI4TNAWdQNh6g59qYS6w +SI6mTMbnP0DUVOrmJdNR7/n1sRlnWzyjKLcKkRtXwRWGC+jE16jijxek9Ome5Qid +bDqjHSuFvqnsD3+0tbENf+kVrbAReU3YvWk+xFvVc6I2NpS+lEIdjHIWm85jSmew +Ydx+4KpELkO59thkcKgSYsTSyTP3l9GOTtJlq45XiamoEvso4jFUC1y5KMQsz1KH +DTE32m5FPZqJqUw9loAmrni3dIMpXKC5yLhdqSMXHK0MAPEIexsuaZjrjKJQSjwV +eDjwJcMn2WZVvcIr9IEoKEU/2j9wHNZv5Xuj78A/78AkjqEUwrY1M9ht0r/QbusW +ZT7MlxNCq4DFstrjyKi03yZQGR+m8eJFHE7GvF8Vzg/ap0/CUJzeoXg5wACXGfJj +k6y8ZBriQO08JECki2sy6oTitDoi7FmzgAIxPGB1qA4HMur/LuzrxAj2V7XkZQlk +VfAda6Ff9bmStNut+zbsQ0pnIeL/URwWifI8Wq81c7DEIvA5SH/bU9Hws1FMO8PU +BcDmzadU+syJBTxoP/mHZcLfwHDhcZyBeHX7sHfpHweEunzWjcHjqVCutQMO4dii +yrsc64WTfAqd4s12SfKMgVFLeL/FUYH7MNqpfgjgwX5co817m9VvCntU6njIuYtV +6+G/TuSViH8= +=/jIC +-----END PGP SIGNATURE----- + **************************************************************/ + + + + + + + +Open Transactions v0.72b +(Scroll to the bottom to see the complete AGPLv3.) +/************************************************************ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (Darwin) + +iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki +hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K +7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F +R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U +GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU +BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp +Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 +0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX +5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH +RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s +DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O +qg/U8uXzgLQuLbFxBjyr +=utx2 +-----END PGP SIGNATURE----- +**************************************************************/ + + + + + +SIGNED PUBLIC KEY FOR AUTHOR. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +Public key for "FellowTraveler", author: + +- -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: PGP Desktop 10.0.1 + + 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 + =6+N5 + -----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.10 (Darwin) + +iQIcBAEBCAAGBQJNsWCWAAoJEAMIAO35UbuOv3kP/Rd6UekX27+rHiMPfo8vN1Iz +cjXg3o7J4BWsppZQppT4r1ZmZ6ftVXDxfSeR22kWQeU7IjNjDKcQ8Vh0P1x/DHva +YczzHzQsiGGCWVzCyJyh8ENreS0mFAM6RqAP7HwOE+5iJstSatN5EHd0Om+QQvKJ +xdSe8pct6y4NjhfjXm1bfIV4suadQodFw4qp3h3LfVypPEeiGD0ohAJ2l7zO/bE3 +xNxvvj/WLfqyxVVc1pip7CzNNJTr+bQI1hh3nFXTElH+zu/YXvob4NPySruh98wE +PxzFnZ+Nl0n13+sfUW/tdI2xYWo7IZ34Ft2SjCy3He9rSLE5keke3loT8r50tu3J +pfpwDUHXAJO6nQFMbiAIEc/n+B42s8AvQ/PNmQA1/JcdlQaeBA2+k/ursOPSajDb +sTjsqsBsp5AYXAIJUbvzDDIz/2gzRcZjXaj+P9YfH00gJ2ZmKM1gTLWFrYRURIW7 +dRLUMY6HvDtyjAlO9LnvuwbdBU6jQb9EaE7FOQuO4LG62Rh9irHo3j7/FjJZkllj +g7Ypjamz9+U/5Jt2V7ivvmPbZ/IGu5dA2bw3Pqf0LtTMGqiLQWFmXLRlZ44DPv6Q +MvrCHCsSZB/Dgb4A8vZYFLbY2kzqf+g1ra4qWkKQFyNkwCbSU1p1xj2rnrRmWwSf +kLZLksZLPzcxEHdPh6YV +=/Nb5 +-----END PGP SIGNATURE----- + + + + +A few relevant notes, followed by contributor credits: + + +"The silver is mine, and the gold is mine, says the LORD of hosts." +Haggai 2:8 + +"By your wisdom and your understanding you have made wealth for + yourself, and have gathered gold and silver into your treasuries" +Ezekiel 28:4 + +"Precious treasure and oil are in a wise man's dwelling, + but a foolish man devours it." +Proverbs 21:20 + +"Because you say, 'I am rich, and increased with goods, and I need nothing,' + and you know not that you are wretched, and miserable, and poor, and blind, + and naked... +"I counsel you to buy from me gold refined by fire, so that you may be rich, + and white garments so that you may clothe yourself and the shame of your + nakedness may not be seen, and salve to anoint your eyes, + so that you may see." +Rev. 3:17-18 + +"Say to the children of Israel, I am the LORD, + and I will bring you out from under the burdens of the Egyptians, + and I will rid you out of their bondage, + and I will redeem you with a stretched out arm, + and with great judgments. + And I will take you to me for a people, + and I will be to you a God: + and you shall know that I am the LORD your God, + which brings you out from under the burdens of the Egyptians. + And I will bring you in unto the land, + concerning which I did swear to give it to Abraham, to Isaac, and to Jacob; + and I will give it you for an heritage: I am the LORD." +Exodus 6:6-9 + +"After the doings of the land of Egypt, + (where you lived before), you shall not do: + and after the doings of the land of Canaan, + (where I am bringing you), you shall not do: + neither shall you walk in their ordinances. + You shall do MY judgments, and keep MY ordinances, + to walk in them: I am the LORD your God. + You shall therefore keep my statutes, and my judgments: + which if a man does, he shall live in them: I am the LORD." +Leviticus 18:1-5 + +"Except the LORD build the house, they labor in vain that build it: + except the LORD keep the city, the watchman wakes in vain." +Psalms 127 + +"Do what is right and good in the Lord's sight, + so all will go well with you." +Deuteronomy 6:18 + +"Hate evil, and love good, + and establish justice in the courts." +Amos 5:15 + +"Justice, and only justice, you shall follow, that you may live and + inherit the land that the Lord your God is giving you." +Deuteronomy 16:20 + +"Select capable men, + from all the people, + men who fear God, + trustworthy men who hate dishonest gain, + and appoint them as officials over thousands, + hundreds, fifties and tens." +Exodus 18:21 + +"Let every soul be subject unto the higher powers. + For there is no power but of God: + the powers that be are ordained of God. + Whosoever therefore resists the power, resists the ordinance of God: + and they that resist shall receive to themselves condemnation. + For rulers are not a terror to good works, but to the evil. + Will you then not be afraid of the power? + Do that which is good, and you shall have praise of the same: + For he is the minister of God to you for good. + But if you do that which is evil, be afraid; + for he bears not the sword in vain: + for he is the minister of God, + a revenger to execute wrath upon him that does evil. + Therefore you must be subject, not only for wrath, + but also for conscience sake." +Romans 13:1-5 + +"Woe to those... + who justify the wicked for a bribe, + and take away the rights of the innocent." +Isaiah 5:23 + +"Woe unto those who decree unrighteous decrees, and + write grievousness which they have prescribed;" +Isaiah 10:1 + +"And David said to God, +'Wasn't it I who commanded the people to be numbered? + I am the one who has sinned, and done evil indeed'" +1 Chronicles 21:17a + +"Woe to those who scheme iniquity, + who work out evil on their beds! + When morning comes, they do it, + (for it is in the power of their hands.) + They covet fields and then seize them, + and houses, and take them away. + They rob a man and his house, + a man and his inheritance." +Micah 2:1-2 + +"Then came also publicans to be baptized, and said unto Him, + 'Master, what shall we do?' + And He said to them, + 'Exact no more than that which is appointed you.' + And the soldiers likewise demanded of Him, saying, + 'And what shall we do?' + And He said to them, + 'Do violence to no man, + neither accuse any falsely; + and be content with your wages.'" +Luke 3:12-14 + +"Do not pervert justice; + do not show partiality to the poor + or favoritism to the strong, + but judge your neighbor fairly." +Leviticus 19:15 + +"You shall not go after the majority to do evil. + Neither shall you testify in a matter of strife + to incline after the majority to pervert justice." +Exodus 23:2 + +"You shall not accept a bribe, + for a bribe blinds the eyes of the wise, + and subverts the cause of the righteous." +Deuteronomy 16:19 + +"You shall not lend upon usury to thy brother; + usury of money, usury of victuals, + usury of any thing that is lent upon usury: + Unto a stranger you may lend upon usury; + but unto your brother you shall not lend upon usury: + that the LORD your God may bless you in all that you set your hand to + in the land you go to possess." +Deuteronomy 23:19-20 + +"You shall not have different weights in your bag, a great and a small. + You shall not have different measures in your house, a great and a small. + But you shall have a perfect and just weight, a perfect and just measure + you shall have: That your days may be lengthened in the land which the + LORD your God gives you." +Deuteronomy 25:13 + +"You shall not steal." +Exodus 20:15 + +"Different weights, and different measures, both of them are alike + abomination to the LORD." +Proverbs 20:10 + + He overturned the tables of the money-lenders, + and the benches of those selling doves. + "It is written," he said to them, + "'My house will be called a house of prayer,' (1) + but you are making it a 'den of thieves'." (2) +Matthew 21:12b-13, 1. Isaiah 56:7, 2. Jeremiah 7:11 + +"The rich rule over the poor, and the borrower is servant to the lender." +Proverbs 22:7 + +"Be not deceived; God is not mocked: for whatsoever a man sows, + he shall also reap." +Galatians 6:7 + +"You are bought with a price; be you not the servants of men." +1 Corinthians 7:23 + +"You cannot serve both God and Mammon." +Luke 16:13 + +"Now the Lord is the Spirit, + and where the Spirit of the Lord is, there is liberty." +2 Corinthians 3:17 + +"Proclaim liberty throughout all the land unto all its inhabitants." +Leviticus 25:10 + +"From any tree of the garden you may eat freely;" +Genesis 2:16a + +"So in everything, do unto others what you would have them do unto you, +for this sums up the Law and the Prophets." +-Jesus Christ, Matthew 7:12 + +"We must obey God rather than men." +Acts 5:29 + +"For the LORD is our judge; + the LORD is our lawgiver; + the LORD is our king." +Isaiah 33:22 + +"And it shall come to pass, if you listen diligently + to the voice of the Lord your God, + to observe and to do all his commandments + which I command you today, + that the Lord your God will set you on high, + above all nations of the earth" +Deuteronomy 28:1 + +"Righteousness exalts a nation." +Proverbs 14:34 + +"Tell the righteous it will be well with them, + for they will enjoy the fruit of their labor." +Isaiah 3:10 + +"A righteous man knows the rights of the poor; + a wicked man does not understand such knowledge." +Proverbs 29:7 + +"Is it not lawful for me to do what I wish with my own things?" +-Jesus Christ, Matthew 20:15 + +"The man who looks intently into the perfect law that gives freedom, + and continues to do this, not forgetting what he has heard, but doing it, + he will be blessed in what he does." +James 1:25 + +"Whoever hears these words of mine and puts them into practice, + he is like a wise man, who built his house upon a rock: + and the rain descended, + and the floods came, + and the winds blew, + and beat upon that house; + yet it fell not: + for it was founded upon a rock." +Matthew 7:24-25 + +"Observe and hear all these words which I command you, that it may + go well with you, and with your children after you forever, + when you do that which is good and right + in the sight of the LORD your God." +Deuteronomy 12:28-32 + +"It is for freedom that Christ has set us free. Stand firm, then, + and do not let yourselves be burdened again by a yoke of slavery." +-Galatians 5:1 + +"Whoever hears these words of mine and fails to do them, + he is like a foolish man who built his house upon the sand, + and the rain descended, + and the rivers came, + and the winds blew, + and they dashed against that house; + and it fell -- and its fall was great." +Matthew 7:26-27 + +"My people are destroyed for lack of knowledge: + because you have rejected knowledge, + I will also reject you, + that you shall be no priest to me: + seeing you have forgotten the law of your God, + I will also forget your children." +Hosea 4:6 + +"Come now you rich, + weep and howl for your miseries + which are coming upon you. + Your riches have rotted + Your gold and your silver have rusted + and their rust will be a witness against you. + It is in the last days that you have stored up your treasure! + Behold, the pay of the laborers who mowed your fields + (which has been withheld by you) + cries out against you, + and the outcry of those who did the harvesting + has reached the ears of the Lord of the Sabbath. + You have lived luxuriously on the earth, + and led a life of wanton pleasure. + You have fattened your hearts in a day of slaughter. + You have condemned and murdered the righteous man;" +James 5:1-6 + +"'...And you had turned, and had done right in my sight, in + proclaiming liberty, every man to his neighbor; and you had made a + covenant before me in the house which is called by my name. +"'But you turned and polluted my name, and caused every man his + servant, and every man his handmaid, whom you had set at liberty, to + return, and brought them into subjection, to be your servants and + handmaids. +"'Therefore,' (thus says the Lord) 'You have not hearkened unto me, + in proclaiming a liberty, every one to his brother, and every man to his + neighbor: behold, I proclaim a liberty for you, says the Lord, to the + sword, to the pestilence, and to the famine; and I will make you to be + removed into all the kingdoms of the earth.'" +Jeremiah 34:15-17 + +"Now it shall come to pass in the latter days + that the mountain of the LORD's house + shall be established on the top of the mountains, + and shall be exalted above the hills; + and all nations shall flow to it. + Many people shall come and say: + 'Come, and let us go up to the mountain of the Lord, + to the house of the God of Jacob; + He will teach us His ways, + and we shall walk in His paths.' + For out of Zion shall go forth the law, + and the word of the Lord from Jerusalem." +Isaiah 2:2-3 + +"In the last days... everyone will + sit under their own vine, + and under their own fig tree, + and no one will make them afraid, + for the LORD Almighty has spoken." +Micah 4:1-4 + +"Because the creature itself also shall be delivered + from the bondage of corruption + into the glorious liberty of the children of God." +Romans 8:21 + + + +Thomas Paine wrote in COMMON SENSE: + +Government by kings was first introduced into the world by the +Heathens, from whom the children of Israel copied the custom. It was +the most prosperous invention the Devil ever set on foot for the +promotion of idolatry. The Heathens paid divine honors to their +deceased kings, and the Christian world hath improved on the plan by +doing the same to their living ones. + +How impious is the title of sacred majesty applied to a worm, who in +the midst of his splendor is crumbling into dust! + +As the exalting one man so greatly above the rest cannot be +justified on the equal rights of nature, so neither can it be +defended on the authority of scripture; for the will of the +Almighty, as declared by Gideon and the prophet Samuel, expressly +disapproves of government by kings. + +All anti-monarchial parts of scripture have been very smoothly +glossed over in monarchial governments, but they undoubtedly merit +the attention of countries which have their governments yet to form. +Render unto Caesar the things which are Caesar's is the scriptural +doctrine of courts, yet it is no support of monarchial government, +for the Jews at that time were without a king, and in a state of +vassalage to the Romans. + +Near three thousand years passed away from the Mosaic account of the +creation, till the Jews under a national delusion requested a king. +Till then their form of government (except in extraordinary cases, +where the Almighty interposed) was a kind of republic administered +by a judge and the elders of the tribes. Kings they had none, and it +was held sinful to acknowledge any being under that title but the +Lords of Hosts. + +And when a man seriously reflects on the idolatrous homage which is +paid to the persons of kings he need not wonder, that the Almighty, +ever jealous of his honor, should disapprove of a form of government +which so impiously invades the prerogative of heaven. +... +The children of Israel being oppressed by the Midianites, Gideon +marched against them with a small army, and victory, through the +divine interposition, decided in his favor. The Jews, elate with +success, and attributing it to the generalship of Gideon, proposed +making him a king, saying, "Rule thou over us, thou and thy son and +thy son's son." + +Here was temptation in its fullest extent; not a kingdom only, but +an hereditary one, but Gideon in the piety of his soul replied, "I +will not rule over you, neither shall my son rule over you, THE LORD +SHALL RULE OVER YOU." + +Words need not be more explicit; Gideon doth not decline the honor +but denies their right to give it; neither doth he compliment them +with invented declarations of his thanks, but in the positive style +of a prophet charges them with disaffection to their proper +sovereign, the King of Heaven. + +About one hundred and thirty years after this, they fell again into +the same error. The hankering which the Jews had for the idolatrous +customs of the Heathens, is something exceedingly unaccountable; but +so it was, that laying hold of the misconduct of Samuel's two sons, +who were entrusted with some secular concerns, they came in an +abrupt and clamorous manner to Samuel, saying, "Behold thou art old +and thy sons walk not in thy ways, now make us a king to judge us +like all the other nations." + +And here we cannot but observe that their motives were bad, viz., +that they might be like unto other nations, i.e., the Heathen, +whereas their true glory laid in being as much unlike them as +possible. But the thing displeased Samuel when they said, give us a +king to judge us; and Samuel prayed unto the Lord, and the Lord said +unto Samuel, "Listen to the voice of the people in all that they say +to you, for they have not rejected you, but they have rejected me, +THEN I SHOULD NOT REIGN OVER THEM. According to all the works which +they have done since the day; wherewith they brought them up out of +Egypt, even unto this day; wherewith they have forsaken me and served +other Gods; so do they also unto you. + +"Now therefore hearken unto their voice, howbeit, protest solemnly +unto them and show them the manner of the king that shall reign over +them," i.e., not of any particular king, but the general manner of +the kings of the earth, whom Israel was so eagerly copying after. +And notwithstanding the great distance of time and difference of +manners, the character is still in fashion. + +And Samuel told all the words of the Lord unto the people, that +asked of him a king. And he said, "This shall be the manner of the +king that shall reign over you: + +"He will take your sons and appoint them for himself for his +chariots, and to be his horsemen, and some shall run before his +chariots [this description agrees with the present mode of +impressing men] and he will appoint him captains over thousands and +captains over fifties, and will set them to ear his ground and to +reap his harvest, and to make his instruments of war, and +instruments of his chariots; and he will take your daughters to be +confectionaries and to be cooks and to be bakers [this describes the +expense and luxury as well as the oppression of kings] and he will +take your fields and your olive yards, even the best of them, and +give them to his servants; and he will take the tenth of your seed, +and of your vineyards, and give them to his officers and to his +servants [by which we see that bribery, corruption, and favoritism +are the standing vices of kings] and he will take the tenth of your +men servants, and your maid servants, and your goodliest young men +and your asses, and put them to his work; and he will take the tenth +of your sheep, ---and ye shall be his servants--- and ye shall cry +out in that day because of your king which ye shall have chosen, AND +THE LORD WILL NOT HEAR YOU IN THAT DAY." + +This accounts for the continuation of monarchy; neither do the +characters of the few good kings which have lived since, either +sanctify the title, or blot out the sinfulness of the origin; the +high encomium given of David takes no notice of him officially as a +king, but only as a man after God's own heart. + +Nevertheless the People refused to obey the voice of Samuel, and +they said, "Nay, but we will have a king over us, that we may be like +all the nations, and that our king may judge us, and go out before +us and fight our battles." + +Samuel continued to reason with them, but to no purpose; he set +before them their ingratitude, but all would not avail; and seeing +them fully bent on their folly, he cried out, "I will call unto the +Lord, and he shall send thunder and rain [which then was a +punishment, being the time of wheat harvest] that ye may perceive +and see that your wickedness is great which ye have done in the +sight of the Lord, IN ASKING YOU A KING." + +So Samuel called unto the Lord, and the Lord sent thunder and rain +that day, and all the people greatly feared the Lord and Samuel. And +all the people said unto Samuel, "Pray for thy servants unto the Lord +thy God that we die not, for WE HAVE ADDED UNTO OUR SINS THIS EVIL, +TO ASK A KING." + +These portions of scripture are direct and positive. They admit of +no equivocal construction. That the Almighty hath here entered his +protest against monarchial government is true, or the scripture is +false. And a man hath good reason to believe that there is as much +of kingcraft, as priestcraft in withholding the scripture from the +public in Popish countries. For monarchy in every instance is the +Popery of government. + + + + + +----------------------------------------------------------------- + + + + + + + + More detailed credits regarding the other contributors: + + + + + * ==================================================================== + * + * LUCRE -- Anonymous Electronic Tokens v1.8 + * Copyright (c) 1999, 2000, 2009 Ben Laurie. All rights reserved. + * + * OFFICIAL SITE: http://anoncvs.aldigital.co.uk/lucre/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * 4. The name "Lucre" must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 5. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Ben Laurie + * for use in the Lucre project." + * + * THIS SOFTWARE IS PROVIDED BY BEN LAURIE ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BEN LAURIE OR + * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + + + + +/*************************************************************************** + +www.OpenSSL.org (Crypto library) + +(Open Transactions does not actually contain the OpenSSL code, but merely +links to it. Nevertheless, these credits are provided in respect of the people +who worked on the project.) + +OpenSSL is based on the excellent SSLeay library developed by Eric A. Young and Tim J. Hudson. +The OpenSSL toolkit is licensed under a Apache-style licence which basically means that you are +free to get and use it for commercial and non-commercial purposes. + +The current OpenSSL core team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Mark J. Cox mark@openssl.org mark@awe.com UK +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK +Ben Laurie ben@openssl.org ben@algroup.co.uk UK + +The current OpenSSL development team consists of (in alphabetical order): +Individual OpenSSL Email Personal Email Location Key ID +Mark J. Cox mark@openssl.org mark@awe.com UK 49A563D9 +Ralf S. Engelschall rse@openssl.org rse@engelschall.com DE 26BB437D +Dr. Stephen Henson steve@openssl.org shenson@drh-consultancy.demon.co.uk UK F295C759 +Lutz Jänicke jaenicke@openssl.org lutz@lutz-jaenicke.de DE 9C58A66D +Nils Larsch nils@openssl.org nils@larsch.net DE +Ben Laurie ben@openssl.org ben@algroup.co.uk UK 2118CF83 +Richard Levitte levitte@openssl.org richard@levitte.org SE F709453B +Bodo Möller bodo@openssl.org bmoeller@acm.org DE 5A6A9B85 +Ulf Möller ulf@openssl.org mail@ulfm.de DE +Andy Polyakov appro@openssl.org appro@fy.chalmers.se SE +Geoff Thorpe geoff@openssl.org geoff@geoffthorpe.net QC + +OpenSSL Emeritae - old members now off doing other things (in alphabetical order): +Individual OpenSSL Email Personal Email Location +Holger Reif holger@openssl.org holger@reif.net DE +Paul C. Sutton paul@openssl.org paul@awe.com UK + +*/ + + + +/********************************************************************* + + * easyzlib release 1.0 --- (Compression) + * + * Copyright (C) 2008 First Objective Software, Inc. (Used with + * permission.) + * + * This entire notice must be retained in this source code + * Redistributing this source code requires written permission + * This software is provided "as is", with no warranty. + * + * Latest fixes enhancements and documentation at www.firstobject.com + **********************************************************************/ + + + + +/*********************************************************************** + * ZLIB + * + * (Open Transactions does not actually contain the zlib code, but + * merely links to it via easyzlib. Nevertheless, these credits are + * provided in respect of the people who worked on the project.) + * + * + * 'zlib' general purpose compression library + * version 1.2.2, October 3rd, 2004 + * + * Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source + * distribution. + * + * Jean-loup Gailly jloup@gzip.org + * Mark Adler madler@alumni.caltech.edu + + ***********************************************************************/ + + + + +/* + * (PGP-to-OpenSSL Conversion) + * + * An implementation of conversion from PGP public key format to OpenSSL + * equivalent Support of RSA, DSA and Elgamal public keys + * + * Copyright (c) 2010 Mounir IDRASSI http://www.idrix.fr + * Used with permission. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +// ------------------------------------------- + +/* + * STLplus (used for smart pointers) + * + * Author: Andy Rushton http://www.andyrushton.co.uk/ + * + * http://stlplus.sourceforge.net/ + * + * BSD-style license: + * http://stlplus.sourceforge.net/stlplus/docs/license.html + * + */ + +// ------------------------------------------- + +/* + * MESSAGE PACK (Used for packing data.) + * + * http://msgpack.org/ + * + * Copyright (C) 2008-2010 FURUHASHI Sadayuki + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ------------------------------------------- + +/* + * PROTOCOL BUFFERS (Used for packing data.) + * + * http://protobuf.googlecode.com + * + * Copyright 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Code generated by the Protocol Buffer compiler is owned by the owner + * of the input file used when generating it. This code is not + * standalone and requires a support library to be linked with it. This + * support library is itself covered by the above license. + * + */ + +// ------------------------------------------- + +/* + * ZeroMQ (transport library.) + * + * http://www.zeromq.org/ + * + * ZeroMQ 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * ------------------------------------------------------ + * + * SPECIAL EXCEPTION GRANTED BY IMATIX + * + * As a special exception, iMatix gives you permission to link this library + * with independent modules to produce an executable, regardless of the + * license terms of these independent modules, and to copy and distribute + * the resulting executable under terms of your choice, provided that you + * also meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module which + * is not derived from or based on this library. If you modify this + * library, you must extend this exception to your version of the library. + * + * ------------------------------------------------------ + * + * Parts of the software are licensed under the MIT (X11) license + * as follows: + * + * Copyright (c) 2007-2010 Contributors as listed in AUTHORS + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +// ------------------------------------------- + + +/* (transport: OTMessage -> TCP -> SSL) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +// ------------------------------------------- + + +/* + * strlcpy and strlcat + * + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + + +/************************************************************************** + + irrXML --- (XML Parser) + +The irrXML license is based on the zlib license. Basically, this means you +can do with irrXML whatever you want: + +Copyright (C) 2002-2005 Nikolaus Gebhardt + +http://www.ambiera.com/irrxml/ + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + +History + +As lots of references in this documentation and the source show, this xml +parser has originally been a part of the +Irrlicht Engine. But because +the parser has become very useful with the latest release, people asked for +a separate version of it, to be able to use it in non Irrlicht projects. +With irrXML 1.0, this has now been done. + +*/ + +// ------------------------------------------- + + + +/* + Simple Ini (Used for ini files.) + + Copyright (c) 2006-2008, Brodie Thiesfield + + The licence text below is the boilerplate "MIT Licence" used from: + http://www.opensource.org/licenses/mit-license.php + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +/* + * AnyOption 1.3 (Used for command-line options and config files.) + * + * kishan at hackorama dot com www.hackorama.com JULY 2001 + * + * With updates from Michael D Peters (mpeters at sandia.gov) + * and Boyan Asenov. + * + */ + + +// ------------------------------------------------------------------- + +/* + + C++ Big Integer Library + + http://mattmccutchen.net/bigint/ + + Written and maintained by Matt McCutchen + + Legal + ----- + I, Matt McCutchen, the sole author of the original Big Integer Library, + waive my copyright to it, placing it in the public domain. The library + comes with absolutely no warranty. + + */ + + + + + +// ************************************************************************* + + + + +/* + It seems appropriate to mention a few other people who deserve mentioning. + + A moment of silence for "Jolly Good Fellow" Bernard von NotHaus, + the founder of NORFED who was recently (and wrongfully) convicted of + "domestic terrorism." + + For history, I will reproduce a few gloating FBI quotes: + + "Attempts to undermine the legitimate currency of this country + are simply a unique form of domestic terrorism." + ... + "We are determined to meet these threats through infiltration, + disruption, and dismantling of organizations which seek to challenge + the legitimacy of our democratic form of government." + ... + "While these forms of anti-government activities do not involve + violence, they are every bit as insidious and represent a clear and + present danger to the economic stability of this country." + + // ----------------------------------------------- + + Speaking of wrongful prosecution... + + Tip of the hat to Dr. Douglas Jackson for his sacrifices and + accomplishments. + May this software protect future innovators from persecution, in a + diversity of jurisdictions. And check out e-gold.com, as well as + goldmoney.com, igolder, pecunix, and all the other digital gold reserve + outfits. May they all soon be traded as a single basket currency using + this new software. + + // ----------------------------------------------- + + Thank you to David Chaum, for inventing digital cash in the first place. + + Kudos to David Wagner, and Ben Laurie, who brought us Lucre. + + Kudos to Ian Grigg for his many advancements in financial cryptography. + Check out his website at http://iang.org/ + + J. Orlin Grabbe and his writings have been inspirational. He will be + missed. His DMT as well as critiques of it were useful to me. + http://www.orlingrabbe.com/ + + Kudos to Phil Zimmermann for writing and releasing PGP. The man who put + power into the hands of the people. Many people in corrupt jurisdictions + now have PGP to thank for their lives. Let's do the same for their money. + + Bill St. Clair, whose Truledger was truly inspirational. Check out + Truledger at http://truledger.com/ + + Patrick Chkoreff, whose Loom is operational and is what showed me the + idea of separation of powers. Check out https://Loom.cc for more info. + + Andrew McMeikan's PKTP, which can be found here: http://pktp.co.cc/ + + Ryan Fugger's Ripple project, which will probably figure more into the + client development of OpenTransactions. http://ripple-project.org/ + + Jim Bell, of course. His story is partially the reason for this software. + I still don't understand why he was stink-bombing IRS offices instead of + writing code. But he definitely made his mark. + + Tim May for writing the Cyphernomicon. (Google it.) + + Robert A. Hettinga for his writings: http://www.philodox.com/ + + And of course SAMY, who wrote the famous MySpace worm, and who suggested + using two message digest algorithms XOR'd together in case one is ever + broken and needs to be swapped out. Thus the SAMY hash is named in his + honor, and utilizes WHIRLPOOL XOR'd with SHA-256. +*/ + + + + + +/************************************************************************** + + + ==================> OPEN TRANSACTIONS LICENSE <================== + + + * Components: + * Moneychanger..... A Java Client App..........LICENSE: GPLv3 + * OTLib............ A class library............LICENSE: LAGPLv3 + * OT-API........... A Client API...............LICENSE: LAGPLv3 + * testwallet....... A command-line client......LICENSE: LAGPLv3 + * OT-Server........ A Server Application.......LICENSE: AGPLv3 + * http://github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which was + * written by Vicky C (livewire_3001@yahoo.com) under contract. + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 section 7: + * This paragraph applies only to the LAGPLv3 components listed above. + * If you modify this Program, or any covered work, by linking or + * combining it with other code, such other code is not for that reason + * alone subject to any of the requirements of the GNU Affero GPL + * version 3. (This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to Open + * Transactions itself must be open source. Similar to LGPLv3, except + * it applies to software-as-a-service, not just distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries used by OT: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. The same is + * true for any other open source libraries included in this project: + * complete waiver from the AGPL is hereby granted to compile, link, + * and/or use them with Open Transactions, according to their own terms, + * as long as the rest of the Open Transactions terms remain respected, + * with regard to the Open Transactions code itself. + * + * Lucre License: + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. See Open-Transactions/OTLib/Lucre. + * The Laurie requirements are light, but if there is any problem with + * his license, simply remove the Lucre code. Although there are no other + * blind token algorithms in Open Transactions (yet. credlib is coming), + * the other functionality will continue to operate. + + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see: + . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU AGPL, see . + +*/ + + + diff --git a/ot-sample-data/client_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/client_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..78b3b71e3 --- /dev/null +++ b/ot-sample-data/client_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABZMVAdVZWdS/wXoJ8fKFJjP7LxzwukFhpaYJNvXVVxo9MuypcfuDnb3tFW41h +b8oSZt1UzwSQlJlR1iZyWJ1rD+EGSlIMlcWuYc/mryoTLAKXe0AyLEwBAQQoj8zh +j0OnMY0uGgIFZXRookgQCL6y6PRZJn65X2lOAaXBDKD2gWU= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..09802de5d --- /dev/null +++ b/ot-sample-data/client_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABfG4oJEQh/rQPZCJXonvsjlyfm/hg/scQbKQJc5jzv594WPnqMsm6ZqWxJ6Rt +QW8KppcVhhOSxsZzmhbQHBZdbrZSAACyBQj09G+MlGtNyLkZ3LvIdETfT5mgV7fL +n7cVN58g+wXqRTsS23xVbrSaEw5sGY/eSRE5qAwJNvVwrMI= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/client_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..dd815e874 --- /dev/null +++ b/ot-sample-data/client_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABJ0Z3TXhoZLgFRqWOxa+KVFhy1ykIiNJcSvenYclYDr0e/ci+kk/xuFWjMaTV +SXiKUeKeWW92sf3lGWcMygF6HG53UwzKfcHDOjH9oLnE7lkxBY1Jkt7rIZjoMhll +t/1a42d7LNyQgFNcCDIsCR5X9KK+G//WozzgdEbFdVJGb1g= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/client_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..489bcbc1b --- /dev/null +++ b/ot-sample-data/client_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABDe/8m+ZtXsT1cpuDvqQCVeUuOXrYEJLsmcGm8vd7RT4Mxdqpqihc9/YNUY06 +adfXobMSvkA+0VXNgzC+Lw4Jxk8d91XuXwHYGC4AEvewTRM0NvImwc8NZWAd/aWR +ewi/cAwN2JfuUYKktSy7x75v/s6UER+BZoXbV7hIyqcOP0k= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/client_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..abaa03fa0 --- /dev/null +++ b/ot-sample-data/client_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABjEpz7zBrdh7z1GcW3nU5Q4PV6Y/fOfMFuzg9mISdg5wBYJWpPaS7p47L7kzS +uNuigGoW+UGA0p8JFcApvLlunZEx1i60Tb/v3f/w53uajlcRgPp0LwjtKoeo1dUP +fHKeCY7RNlSOhYOucCzWmx9ZEXhyo9+RF65+iCnrb95S7uE= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/client_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..9da76583a --- /dev/null +++ b/ot-sample-data/client_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABFOLohD44Gp5hkhyHc+g6jbKuHkZhk5U3Fk8L8IGUVunUKoSobx60cLSCMSvZ +pzZaAye6mpHxJPczfj6v3+osMRZ5LWSNaakD3PWso/aw6r8eXpSGNMhD4ps8xDHS +E/hKfMHnaLARD5mrElfopPgF1XVjw7amJvDnBvT5TNULGCg= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..0049f9057 --- /dev/null +++ b/ot-sample-data/client_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABSRC8R89iifwVBhViET8T1HmPjbV8XUTYqm01IHhePnlzAswwHQ3fmrEwkttP +nPmf7rcI9BrULj3dTj/KZWuKanddS7V4BsWe+xGJZNYf6oc/RzG1oeADvhfpzoJo +M8AY+VnXvHc67F5ml4Q6HETlQltkIsBJShj9z2ANvY7eYuc= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100755 index 000000000..20a8b6d8b --- /dev/null +++ b/ot-sample-data/client_data/certs/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/certs/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/client_data/certs/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..863e5f454 --- /dev/null +++ b/ot-sample-data/client_data/certs/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,31 @@ +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANDFIhHj4hRVm1qu +gLjCQinuKNcfyzFIw9n1CZXnHsKU8k8mJ4jC88a1B4ha7MUkHAQ+RbgRCIWvujRt +nwdLd9Z4ufoMy5aWTYnKQpbHMIZLFM19ErEKpUuzaIURWhSb2p8PzSzr+Yxefczb +TbfBHm1iLapLuXNZblHkz+gdMSeRAgMBAAECgYAssJZbeAm0SqMH5WT+p+7b5PRv +IIoxkZ8DMDYOFbx68MFx+fvqhbkDZ0smgDhA9zrcGax4+4R0gap9gJ3TRO9w4Ydp +2TGwabQymnVXiowJzTIWtAA1Kg7VzT4722iKFLesdON7A4z3c9nCOkxFS2OICNDp +qmInpwCD1lb8fXGiMQJBAPi139iE/i2KdA6DL1NXPi6MYvZP+46KL8fpJqkQBuV3 +THsll8FZF4S+sx2M2zhK3Igc9pWZ9u0Pu5KifTApXo0CQQDW45PjcikI97TOhpku +HObv4dna9UVYtHeT6CorjY/aFdtkrpd3Ff2/8KkT2y6xW7SvM6ypja89q4X5ONgP +D34VAkAKmW2tw5U1iaYCjFKzAY/T2gXJq4T0AS2iHmyYXed9VgU7ZlG+Wram4J2v +j7Y0AvS9FEbp/0LHvZjn2ebt64VtAkEAo435bL7iHrIySpLFmgRjfScAYpgV3OsW +rFujZRzM5WeHYb1FCV2SkfmBJtzHUDSFdGg3PaHaRGz9fm/WergG9QJAK0rwQtC9 +S2wwPSyTJUAsjH6KAn15sdoGfpNGmrzHrAHTkcZu4wbwWJyuCfZPgeZOKEV5bVOB +YyGXEV8YYqmlLA== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICPzCCAaigAwIBAgIBADANBgkqhkiG9w0BAQQFADAlMQswCQYDVQQGEwJVSzEW +MBQGA1UEAxMNT3BlblNTTCBHcm91cDAeFw0xMTA5MzAxMjA0NDdaFw0yMTA5Mjcx +MjA0NDdaMCUxCzAJBgNVBAYTAlVLMRYwFAYDVQQDEw1PcGVuU1NMIEdyb3VwMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQxSIR4+IUVZtaroC4wkIp7ijXH8sx +SMPZ9QmV5x7ClPJPJieIwvPGtQeIWuzFJBwEPkW4EQiFr7o0bZ8HS3fWeLn6DMuW +lk2JykKWxzCGSxTNfRKxCqVLs2iFEVoUm9qfD80s6/mMXn3M2023wR5tYi2qS7lz +WW5R5M/oHTEnkQIDAQABo38wfTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUG+bLpr+FEk0Uk9IuknqTnnEftI0wEQYJYIZIAYb4QgEB +BAQDAgIEMCgGCWCGSAGG+EIBDQQbFhlleGFtcGxlIGNvbW1lbnQgZXh0ZW5zaW9u +MA0GCSqGSIb3DQEBBAUAA4GBAKHFvcnhx+euwTS/W7IxDI0ZlHKdn9ldWwywfESI +8zbvWesNSXw5A00p1OmPKkVeVcMb+mzC4A/K7l6WixWHCv+OomkCGzECry2s4QSi +rFOjlEBerAZIt5uyYZgeAp0VrW1xWYHL4vVYBeFPSLrkE9CiGy3OdNKxw1TITvnG +yMmU +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data/client_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/certs/special/ca.crt b/ot-sample-data/client_data/certs/special/ca.crt new file mode 100755 index 000000000..d1a3fdc1e --- /dev/null +++ b/ot-sample-data/client_data/certs/special/ca.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/certs/special/client.pem b/ot-sample-data/client_data/certs/special/client.pem new file mode 100755 index 000000000..20a8b6d8b --- /dev/null +++ b/ot-sample-data/client_data/certs/special/client.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/certs/temp.nym b/ot-sample-data/client_data/certs/temp.nym new file mode 100644 index 000000000..863e5f454 --- /dev/null +++ b/ot-sample-data/client_data/certs/temp.nym @@ -0,0 +1,31 @@ +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANDFIhHj4hRVm1qu +gLjCQinuKNcfyzFIw9n1CZXnHsKU8k8mJ4jC88a1B4ha7MUkHAQ+RbgRCIWvujRt +nwdLd9Z4ufoMy5aWTYnKQpbHMIZLFM19ErEKpUuzaIURWhSb2p8PzSzr+Yxefczb +TbfBHm1iLapLuXNZblHkz+gdMSeRAgMBAAECgYAssJZbeAm0SqMH5WT+p+7b5PRv +IIoxkZ8DMDYOFbx68MFx+fvqhbkDZ0smgDhA9zrcGax4+4R0gap9gJ3TRO9w4Ydp +2TGwabQymnVXiowJzTIWtAA1Kg7VzT4722iKFLesdON7A4z3c9nCOkxFS2OICNDp +qmInpwCD1lb8fXGiMQJBAPi139iE/i2KdA6DL1NXPi6MYvZP+46KL8fpJqkQBuV3 +THsll8FZF4S+sx2M2zhK3Igc9pWZ9u0Pu5KifTApXo0CQQDW45PjcikI97TOhpku +HObv4dna9UVYtHeT6CorjY/aFdtkrpd3Ff2/8KkT2y6xW7SvM6ypja89q4X5ONgP +D34VAkAKmW2tw5U1iaYCjFKzAY/T2gXJq4T0AS2iHmyYXed9VgU7ZlG+Wram4J2v +j7Y0AvS9FEbp/0LHvZjn2ebt64VtAkEAo435bL7iHrIySpLFmgRjfScAYpgV3OsW +rFujZRzM5WeHYb1FCV2SkfmBJtzHUDSFdGg3PaHaRGz9fm/WergG9QJAK0rwQtC9 +S2wwPSyTJUAsjH6KAn15sdoGfpNGmrzHrAHTkcZu4wbwWJyuCfZPgeZOKEV5bVOB +YyGXEV8YYqmlLA== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICPzCCAaigAwIBAgIBADANBgkqhkiG9w0BAQQFADAlMQswCQYDVQQGEwJVSzEW +MBQGA1UEAxMNT3BlblNTTCBHcm91cDAeFw0xMTA5MzAxMjA0NDdaFw0yMTA5Mjcx +MjA0NDdaMCUxCzAJBgNVBAYTAlVLMRYwFAYDVQQDEw1PcGVuU1NMIEdyb3VwMIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQxSIR4+IUVZtaroC4wkIp7ijXH8sx +SMPZ9QmV5x7ClPJPJieIwvPGtQeIWuzFJBwEPkW4EQiFr7o0bZ8HS3fWeLn6DMuW +lk2JykKWxzCGSxTNfRKxCqVLs2iFEVoUm9qfD80s6/mMXn3M2023wR5tYi2qS7lz +WW5R5M/oHTEnkQIDAQABo38wfTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUG+bLpr+FEk0Uk9IuknqTnnEftI0wEQYJYIZIAYb4QgEB +BAQDAgIEMCgGCWCGSAGG+EIBDQQbFhlleGFtcGxlIGNvbW1lbnQgZXh0ZW5zaW9u +MA0GCSqGSIb3DQEBBAUAA4GBAKHFvcnhx+euwTS/W7IxDI0ZlHKdn9ldWwywfESI +8zbvWesNSXw5A00p1OmPKkVeVcMb+mzC4A/K7l6WixWHCv+OomkCGzECry2s4QSi +rFOjlEBerAZIt5uyYZgeAp0VrW1xWYHL4vVYBeFPSLrkE9CiGy3OdNKxw1TITvnG +yMmU +-----END CERTIFICATE----- diff --git a/ot-sample-data/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp b/ot-sample-data/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp new file mode 100755 index 000000000..76e556011 --- /dev/null +++ b/ot-sample-data/client_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp @@ -0,0 +1,131 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVzz3XhlBBKUmd74RKfM1SQp2HtPsdjaz8QtRXLGpYFi0SXq1bLPCz8ZOpa8U +IzJOGLUVwgH9FAzy1LVs+bKa4RqoMqgyjciqqFcfc7vQ0MjuxamLsfBK2vy6W6T6 +xp6qDWBfdCMQF/SZrmmosEOR6hlgwStSQn5YcaJjXQTKBos= +-----END CONTRACT SIGNATURE----- diff --git a/ot-sample-data/client_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW b/ot-sample-data/client_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW new file mode 100644 index 000000000..e4340510a --- /dev/null +++ b/ot-sample-data/client_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW @@ -0,0 +1,159 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + Chuck-E-Cheese's Game Tokens are payable to bearer in fun video game + entertainment, on demand, subject to the conditions specified in this + currency contract. + + Chuck will maintain at all times a primary reserve of old 1980s + video games in an amount sufficient to satisfy all the tokens in circulation. + + + + Chuck-E-Cheese's Game Tokens are primarily backed by Chucky's + reputation as a connossieur of fine pizza. + + No primary reserve is established for this currency. + + + + In order to obtain Chuck-E-Cheese's Game Tokens, you must + persuade Chuck to part with same, by any means fair + or foul. Common means are in exchange for favours + done to Chuck or in exchange for national currency. + + + + In order to redeem Chuck-E-Cheese's Game Tokens, you must + negotiate a suitable time and place, and then ask + nicely. Because most suitable redemption locations + (game section of pizza parlor) do not have Internet access, + it is likely that there will be a time delay between + currency redemption and arrival of available games. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Chuck the rat is solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Chuck-E-Cheese's Game Tokens + outstanding - is created by a Mint account, + specially set by the Operator. Authorization to the Operator + is hereby included to specially set one Mint account for creation + of Chuck-E-Cheese's Game Tokens. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from Chuck the Rat. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return Chuck-E-Cheese's Game Tokens to the Mint + for the express purpose of reducing the float. Chuck-E-Cheese's Game Tokens + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading of Chuck-E-Cheese's Game Tokens normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB26rojg2jlm6SPEH4QyJFSMdMbegMZ9Ha5T/lBDqhU2nC5IpZuRXfVgukMtUd +gi/snHKAu5GZb9AxmHg6dCrI1IuE5yNvrDK+qq+JOCBvekFAlSpNb89LOuhBBUiq +gxJsw35oOzBVTE9msc3fp+TmeSdo++KJ4+o0G1tincQHrrM= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/client_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz b/ot-sample-data/client_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz new file mode 100644 index 000000000..7537fc632 --- /dev/null +++ b/ot-sample-data/client_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz @@ -0,0 +1,43 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + +eJyFkUtvm0AUhVfd8CuQt1ECOPipOhIeY0L8wDFv74ZhzGAegxmwDT8+qu20Utqq +6l3One/o3HO4j2+Pt5mqmr7mTV1bqzMeGGtrqwDrvuFeISNj3lRWPsd9R3VZ4hw1 +U8gSXPGI5lUJUQVonVeTTrfD8Vmcx1mdWSXM2R6Xk44kih3+5coGd0avcPb3p654 +RSFCNx19Num4KgzUoahu5JUf26qxNFeL1N7DZcbcwyV6vsQXIyva7TsrbiBj+I6l +Th+ivUvdxXQwRbXugfZkytCMj7ZxSLXIsRpcRBJUGOzwwv9M9f4wFQ+UcvgqFoUy +srbxfL90gn3PtI6y/AbjU7bxbUPMi4YqZfDV1LQgfbqjQJLBBe5N4pHdZpVKRZdK +vjpaRWem2p753gtc96cp4feYX7gvHf0q516WYtlb9bMmB5cspvmYNwqc8/cjrsVc +XxgvPg26HKBZhvNqzJOqKsaCEMUVqYMnRDNhjtOUnq/ICae4FG4Cj18FhHOcxNxV +QZmiRtJGA58ymczOXiu3g/YEJGI4iWOc9eH7yGj7D+VMeWvW2/ogeGSeaGitRTB5 +mHPG5pU+18a85zM9eJZrlZHaHVZqmKwORrPLk2a0SAg+134LCrIVTgsXaPoRUSdW +xT4AHNJ3oA57JukP9bI5WqPuBYMqFEJybENcZaFXXzzRCLut3Y9yNPnMTV3P/pka +9wNd6PjJ + + + +- -----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +- -----END PUBLIC KEY----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABih2pycKZQBQwhUTiSFugJrpy4U1VVgvXn93TXqMXCq9eg3PHZEJoqoRtVrTl +VCh6M85M6PUDgSCLsbJLDuFLCQxKiBVnhtE05QMZ5ugjXV75oDP0Uw/Fb3ZZ0GG8 +P5qo0WPALwFhLye4QgQmMqydeoYaeIl9FCidWCvxI7QNEuI= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..a8faee2d9 --- /dev/null +++ b/ot-sample-data/client_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,143 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOTSi/LXilVNhOWAi/poHk7YstayyRwAOqBBIJgSD1eOODlHMuHZO6s/l9fuY +p2NeMenp3g/jAG6atY+5s0sK4NAyTWAafaT2FvBdcetTyqulROrMSz1j5xJgaQBx +49YyjMbhPH+WFrK4ZzLbwqy3ll3bmVqf6Ww8UduHBQl6aZo= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/client_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..c3ec3483d --- /dev/null +++ b/ot-sample-data/client_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABde7DqOMqTEvfbNSBknzPt0Bnu8trXBcYI+3M/DJD/5FrY51YQ/kADEppHkQI +fIQ5CvJS1vdaZ1YCrOQe77jH6X3rQ5/zV/Elfh/HcXoPuD5roORIlGlkCBbtOcbs +CnAiBw1C3FAtbf0C1vhWH0gix8O2mrKlDjQLp1+993hLl0w= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..ba5acb067 --- /dev/null +++ b/ot-sample-data/client_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,45 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +eJx9lEmSo0gQRff0JWS5lVUhBglIqywzJiHEKCZJ7BiCeRIECHGZumpTWYvO7kXH +8nu8b+FuHh/59de334cTJVnf2LKki8LGsVjdZnlHNvTPInIKhux9Y7PaHUF+wD5o +hiCCedts4KsDH2+fSgJ6C0Qg7+AbsokDCOw8bUD88YYRGEXQJMEQayGIonZsoCx8 +vOFsAu7E8nJipcTvGHlk/Vb3uZIeSsW6g+BgCLdWM+ndKVvBcQD9b8rBLsTTv6bA +cdvAnRqmxqpFVvaw2T9lp1rmpZd0mX7AwFupFZr+cHRcWedG4ouHuy+eVOgHT5w9 +Yhju9ryfHxPOZvjm3GtXu1u5Lz3qY72+dUfTq5w3Flj7BE0EnPZTpd42P9eZ/Kvw +EwHnuSqH0WhL1s0qsJB2KV8ZTbdzvZ3LA5k/28dRJ3ih7WyXL0Z8yl16lwpjlxkL +03jIK0GZV1LZ85lJVFqXH/X+3klmWz0elyd3h9be5obQk9lDUcs7cUiXByjJfQtS +Zzbw6oJYhR+nlu+yvPioM4J372fzKJ6uTszvmLvycPU6H8eScKxbarScXtZGv1ih +m3EnUr7nD0Q5tJrvimf3+pgG/pDY+4gi0OIi4KTjWqN5xslqS1Z4dX75xRF4W1C6 +ZpxcnVeLpdc8Rq6nRMqWOL6SDTAKXEifKeWMj1qh8jOhRi0ZWVGiTgSmnhRtPvGT +dtPZc/yUrDzlzlGMjEszYRczzctnXwn5QelFonCZLAQkZiWtO0oHUja3EjPSIr7N +ZaW9ZOxUPUUB7eBOxBGLC936VGpWSBHdmHGYM81LcjanCwrlhoOM3RxYzMN6vDPC +dBTthDNv5e7Vo697aWoDcqFyvyROzvFkBGbu6YQcTJrGtELgdck4Wsqus6wLfVQZ +Wj0c4cu+59uLbx/2wSJEkXNB0jF4UKXT3KKgCPFFncMqkaCnbBOZj5hmrzeDdsD7 +YTuSHKhQeXSpW8oW0+7ugFxaJCSgKcWF6iEaI0eRtxmr2uPMJz25pfSnFOP3o5oB +DtPx22sX72Uz6WmK9uGrt8ys850rgvu32YgHYlRqA+JxsAwE1NrFwOo8pGxHDqBR +ksxJY9I5oxO7uU4MunQonqvMJBnsDvmB/me3V+XL7/iJfImPL7nxGSXsuininwTx +QD+s1983RgeajfOPwbDZfadwhG/rGjTwfZNB2L2jaJrDbAy/R22NHkFVtc8VmUAF +evS3wbevBugzL3NkdWA5tUJzTliysGFQbCo7li+IY9yQ10j1eHOU198nLTsfD4Cj +MH4clh6rOvqw9cYSIKU/27au5i9DyLAbv4dwi1GyYkjboIJZO9V4fB5tCMlDOGCF +L6u+TaPcPM9WLjCHVkA8pXA4CqMouxEbqQwu+d7T9MmMsG0kFqewlmSDbjQbloVj +a+nHn9GJuvB/g0P+Buc109E= + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOB7ciTdwMSdbMlRD75tT6vYO63tblShWKkx4TPuf/b+n8p5MXzNc5Nlo340L +oyWcnMq0pAYyf26bylpr86F34ZwccaJrfLxExd4cVKy4vGJ4PzwlT4Y9qVnG50DI +grysaFw9yBYkEmErjixXpuM0M9zsdvnr4MrCebm8SM68JDo= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/client_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..5092a5397 --- /dev/null +++ b/ot-sample-data/client_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABL3yVzleUJm97Uw2rHeVPLC4VkQpu5v3DsHtv91W+Mf1atGSaYS0SsuXxNv4Q +xlR8YPDKRLLA3A/eu/2m6NApdt4NytqfQVnpXoiAZBrXgn5EbxRcCgB1FHAywYTY +rG5Aoc8c6b7JnCw/E4aV0qGjbfn+QfWbW3zaPuo7aMgfHiw= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/client_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..22b217a01 --- /dev/null +++ b/ot-sample-data/client_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB1q42s6niTwC8SlIb1pNG025vVPuTuWVcjncAcVUKc/eBTI/bv6JvI1k1IhF0 +OLQ5yzQczCXirb4b0/5d6vXdSFtouTKA5Hn/72z6yauIqiUslAMG2G3vR7tmv2GQ +rjSAHPeMAaK61mcPSquNSCj/Sxxz5mzMPnCr1ljdXkPgT5s= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/client_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..8413207e5 --- /dev/null +++ b/ot-sample-data/client_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,45 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +eJx9VMmSm1gQvDM/oegrYbML1OF2BEgggSSQ2OHG8tj3XfyMf3Vo+zA9c5h3zKrM +WqJeQr/++vb5OP4syjtNPMv8aaerrKyxR11U5N9B6OL1yftOY+8OBP0YOq/qvWBI +62o3vBrw8fYbiUCnggCkzfAG7UJvAFoaVyD8eMMIjCYYkqLRLeAFQT1Wg3j6eAv1 +0LlQhnCYQmEr9zBpuyt7iVMpl1a7gvJpxtDLmCF0bSOOPeg+WTr2JGbXioFu1J4x +VYcSK1bxSg0VNYt6sS5rd5ZFph08c2NtpOkPjwkLVarOx6w1qGymfdebcVbAMNzo +jm4qRJx2OFZSd7e0ZuN9mVEey483HEM/u08rFWxzgioAer2h6IF+2/3cdvKvwE8I +SEuR96NS56yRFGAltVzE0ZxIS7Rzx5RPX9e6FjjScUJHzGvT4LT4UT4RlGTHZdIC +yHYJhkArJSQ7Cplsq8hu1skZsFOIet5rmd37aJobIpQjy4Cr6lxdLlDbpetW5x68 +Iqjkbzxa9GdJI8UnlalSoF3OfBDMi4PWZyMJnnopaUuN7vl85o0nmmWCWee5PqZi +vDoipD0tqTaqgJFYUhp8M4BpbEXMmJ4BJvLw3g74rE0Oj6yuu3aI85TEfdlc3Mex +etqR2ULRInPk1eJMnFdDV6HvYNCJKyPn8msK95K/ZMdq9tskS1UhSNJS8pwh4k4c +UzR8gT5rKC9wx4v3+aAf7Fm99EM9XW3N2udF4pkCjU+2dzqw5kBkAk5yvJbydxHt +w+O8d/z65KRQEGGKsaw0ZmephQnRKk5ZRYgRWtqxApSKyoxc1eR2kWt3Oa5ks6di +BYZPt1Ypj7xwh1T4JaHlyjOYcNdhG34Ys/ogBSkfHNnoeZ7vyJB5OPv4imQaM6M8 +rgvVAmjyIlmcXL0giozKpnOtVIvXdWbdAi57CqWoh6atyr5GJIyEDwxcGqi1In3E +DDC/xjAOqkMgHoMph7aGi9gDnIXRWYYnol86GGHP4sUWX8kwwHaL4IG6VZDTZBEC +gmIMeHrlHTVKrnu5DZBvm9OQe6UQdzfxjoeUB7rUdzM3oMKlkJMrv4TbTTBK4wGk +9y0EQ9ZmJcobJpPk4fkB/UD+c9sb8uV3/IS+2McX3/htJaxuqPwfBzFB12/p7zul +AdVO/0eg36HfaRw61mUJquF9t03VvCNInA7J6H8P6hIRQFHU80aZQAE65FPg21cB +ZE7zFNoUWC6wCtN4YVG1UKal6Q6eNEfVsidYcuCxBXH3uJJKolGvZ+7i95G3KxY4 +txOit90NYpvxWtjndpb3dpSIzpQdzhcwiWLXKpjeHM595ES+VBwzojmi1wOdPfMW +uzmRm79kf44hImqfyP2iBdU6zyE1jZ0VjaauOAGDSkhnPXJlFR6ADAjx7ijkx5/V +8fLp/xYH/Q2cltVq + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABSMmCz/U8zY8vWLa+rx79SiNW+SMxHmOZgTIMtTl07VLCsto8R3L4B68Vgpve +UKdIaiYIVbJx6ekqpMpt2gTvww7Cxb97D9TIWzCn3iCm/H1V4xETTv7D62Mfah+h +jvB2bIbS7zK8hOzFr8NHpfPtQnnxptQ6b3IrVTY4Ep4+PUg= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/client_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..96d9c0471 --- /dev/null +++ b/ot-sample-data/client_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBdMGK7rOc7V4UqQYMMssOj/bNeKeaIDHw54hO4fQsR6DzuHgj8h7I1J0jLkM +RsLfqkSTCzH1poRi4wQpG/YiRQFB9420FS5jaPr/g366Ewt0eB1IOaHoMtP9XGsa +ecLUK1ny18IjR8OME2epZ7W88x5MlcmbGpzAocjDjJOQujo= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..9797c0c79 --- /dev/null +++ b/ot-sample-data/client_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABw6uK89cNDqemn4CupT8jcsTn+Znk9ahIO3qG+2+1ODQdVpOVHGYi+UD36krH +Rh5xcw5nsBC4tl0QC0Ghh0u5sBxi+AcwGsaf47MN/4tsCSQ3PUnEJKGgWLIMtDeR +LxIojEGTw1I3nPmXc0u5Laa817P/aXPaS1+NrPbYxREA2mk= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..6bb71f0fb --- /dev/null +++ b/ot-sample-data/client_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,134 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +eJwVkDmSEEAIRROjOQ1L00AwAetBNLCsMpjEc3hl2wSKAv6H9/H3289P+fj6dOGy +ZhgDRzrtF+rSlISjSfoSHrM4gckClxdSZ3uFapXasYsgOqWjj654bLg8EdEZfX2R +QoywtzrYN/tcPaYWwG1jEqUX4eoElb/xOSVPqbOaOlHUrw0dL7Zs7mm91WEjDLHs +RbqFB5haDoEcD3s2ISuiqnvXxrtxwaY78+keaT4arkLDH19/vv/+9eOT0nl0GVhp +VJgW1tDy2b56KDLShLUJ8OnBoL3IYebqGnvnyDJeB+lrdUd9R/F/pjJbAgO9BpQh +pB1ya5HQINFLdt4fN9wBTNz4YR4EzVjbUD5hAOOn1DS9cB4DOTNJlnPrytlqeK+q +ss/GPLYVgf7uET4jdEkiKWotyodXIUswkZnPg7zx8Q+If3mm + + + +eJwVkTmOEEAMBBOifY3PGTvYwOdDIEBIBJvwDr7MkFhy4nZVf/z99vNTP74+ZwY2 +jfBgNr9BAI21eGfwGJinCNqeZI9LShwMBctHQtYEwE5z4EVTNpe8FFt6M1XS197V +7O40hKQGot3Q6C7eY3aZZRXZEVkuC2UkVmM3QR7EGC3hS4MTSz0xAA5a7HlabQTy +BcUBN5Y8IJekwXt1UuJQGT6ABj2qGnLOPS+3yd/zTNqxH19/vv/+9eMTdVak0jwc +D5nooMxD9RuLli49BXeA71yT56eSDAu8SLBOh82lusUF594mZia0gHYqJ39sh02X +Vz3gpc15CjVhx2HW3On4Kgy9Ro6T8sMuP3sRVQ5lOaaTPIHlbwnuuT1gGYEAVcPD +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70b +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABpPwb6mddbpB4vMCkl0q6pLaqqkMqUcgaRH7j57lsr9jA8WBuU+4typdOuznD +OTGilYFYaVLAmTddnj70YQ5ZA/5Y1939Uo0heWxs1AnlPKECsc3XG30QveaukqQl +OKACy0xj2hxFVlCflRJfq217D598VVrjV0/IQ6eSEbisgCk= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..3e050a6ce --- /dev/null +++ b/ot-sample-data/client_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABKM7ivKX8Ijto953vhymPvq3InZaNK+UBIpI+Qjs9GpndTfZgjM0YmL3qHcJN +qXJ3bpO4fum89MjOs/uTF/TBkjphvWOlG8a2q3262/Q/ynmDoUt8RprrRIt9GwmK +Gg18VBEqvaL2CmI3CiomdPB/wKolOPTKdglvtRcNVyv5Qm8= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/client_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..269eb4369 --- /dev/null +++ b/ot-sample-data/client_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABd/O/hT+bOwC9RuV4fVMoUkaw2Ml4mHDxC8JEqZamit+tu4pETrW8L67DsE0E +pGqGVvRWGgM/vZEddNklAexEvqscZfBfz7dYjlMjJFxq0KoCsJ76sSU0BB9u9InP +CxYiRnPi7SsAPn4BH3EUyBbNMXJ3yd4EAI9q15yILDgB9JQ= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/nyms/NOTES.txt b/ot-sample-data/client_data/nyms/NOTES.txt new file mode 100755 index 000000000..83002e6f9 --- /dev/null +++ b/ot-sample-data/client_data/nyms/NOTES.txt @@ -0,0 +1,24 @@ + +There must be a nymfile in here for each User Account. +(User ID is consistent across multiple servers.) + +The filename can be whatever you want, as long as the +same filename is the one listed in the wallet file. + +The nymfile stores the current request number for any +given server, as well as any transaction numbers that +user has downloaded (from any server.) + +IMPORTANT: the Nymfile contains a NymID field. That field +MUST contain the same NymID that the wallet is expecting +to find after it loads the wallet file. +Otherwise you will see an error client that the NymID +didn't match the one in the wallet. That's okay, just +make sure to edit both files to have the same NymID. + +(It will be expecting a specific ID based on a hash of your +public key for that user.) + +There needs to be a nice PRETTY client GUI that handles +this stuff transparently. + diff --git a/ot-sample-data/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100755 index 000000000..20efd81bc --- /dev/null +++ b/ot-sample-data/client_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,62 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +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 +CcmZKEk= + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABxBTlLhzYwk3tT565VXqDX/J1881CCIv9gLnid42kXberUmUdJNUaAE4ENVFA +R/IOOBv7kRzKJ8GTFkaTco1y1v4fUBV1bIvkuIH2w/79ryQo7h6zvZMbeD+0mpRA +ZlhDogOS/9O8+40cOyIhYLVWjPpX0QZe45mqIafsssDbpcA= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/client_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/client_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..6cc25acef --- /dev/null +++ b/ot-sample-data/client_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,29 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJy11cFOgzAcx/F7L74C6QM4KHRAMrZ0GBbRzWSDqLsxqAYCnWupiGcfXMjUZGfz +Pzf5fHvoL0VfV7PFR1Mb71yq8igCbF2beDFHaPaQaMXl5QEyRN/c3gS4Xids82qn +vnvoVlHMnu/qKnlieU+X/TTO74vUKUrKjsz5xCMm+Ulz1W50g4xBHdBR8Yp6G4tV +WJ1SWnXuYZ91hEWWRVIZ7svoZbnzQxHL9ePubUjnWkou2u0fFWBq4snItzITKsvb +4aL/Slw6ASamNwUvUPCCA16wwQsEvGCBF8Bfq+uDF7xzoVRK8wJobDA4hcQdSNyG +xAkkbkHiJiD+uyQY/GdEk/MfO0ffcvRqAw== + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABwXNc2ekhX6akgdGGu935ma/OjdbXkJn+M9SihGq7qrOvAhGliwxBolrCINEW +hX4jUFIAmIrRVFi8Y3taGhZupp/4rqs1d7Xt1PxEUUW25YbPHnNOaPSaljmw2ciX +uSPj/LUI8sNaT0b343ArzlwSdyT9CTnl5mit0b8Mul4GvHY= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..c8dc82ded --- /dev/null +++ b/ot-sample-data/client_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,26 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJzjyrOxr8jNUShLLSrOzM+zVTLUM1Cyt+PisvEPKS1OLUKV4FLIq8z1dLFVKkg2 +Mk4PLQwotXTKNgzLMfA2zaky9iow9I30TMty93SKCAt3KTBMT0q0dFYCGaYPMc2O +CwCC8SGr + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.64 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABHxjvdOyOINl3wZBb0jStA+SQKhLy7naabO6kRCORz0fdab2KIqcORCA5ghQ6 +wGAxhxLzZdzq+Sq9F60sou1m00NPaPcpiPBQ3Fu68YVHgurpXY+BBSRK5tyh3pe+ +k2Y4ho+aZeF92i+ogDEH5uv3Kt1/DfMtWm4gQvYPOqA8HVc= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/client_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..a239235cf --- /dev/null +++ b/ot-sample-data/client_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABo3+bS37WnoYidkrt64mBXXTAMrs+g2VjtmuETxNciPcXKF2E9gXiCeRPSqaJ +mNk+FLAtAHPYsBulQZI+RrH19cuvuewhZ4IGw8mcQ/JSU6zVHs0r+7Btgl7cHrZv +VEHVY/gOB9/b1nNhGJNleXJTCAQZAmSigh/Mk3e/XyBx+ig= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..b4a86225e --- /dev/null +++ b/ot-sample-data/client_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABIiMpuAxyBwlCYDblX1qFzxvPnCjiL5D1D3FJBj9gbg+vFd9ATro3+z5OdbIE +oVeU10aJ7CKQ9Jdh74s1YSF4XqXTlGKixLab24uPqGHo1TVTeEKYAok75pT1aHYi +rrAhb0XK41XPWYmInkKYAQn2n/roqXz3KReRqnQgxM+H6ps= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/client_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..f778998a2 --- /dev/null +++ b/ot-sample-data/client_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABpLPH2tncMgKsmzBGsAGS0EMjjhmOHbEHN5pDRXcWncPFeukmFmXThriVtHco +INeTyy2cx6JtRIHwEtiijRxAFTeo2M21/V3+ok8ZArr1P06zekT9IxzanJTluPTj +L3ls/g0aMfBFPHe3295eqVawdxxhp7NVP2viWzbxY971WYA= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/client_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..0b5774849 --- /dev/null +++ b/ot-sample-data/client_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABoginZFY91RIyq0+7W5MV4RPy074WKPI99qNFnv28QdN7MSD5YCsSGJv8uZSu +DLByNqalor/9zlfQg/A6kgdw2L7Wcgie+AxfsZgTC8IyLPfN3oEPCkYtoh5umKwt +5QGqRzfggkn69HzuBizVzv80kud/fSWPmhSkdjZ9qwG5zmU= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/client_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..fd8cc6637 --- /dev/null +++ b/ot-sample-data/client_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBlDVwhryICCJCxNCO3kJNV6duIPhKvgaV7YB/i0QLPYxUwL5ifeYNExoch9t +/oPaOfRXQxz/2vns75z9Ky1WTnczhkhkWKEmjqeuYhzYQShnCd8A3qj53YNKyo/v +M6JBX1QWZ/iSE3f4dceHVM6mGHB7nuKZy3nQUxObgSIFkco= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/client_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..6953eca1e --- /dev/null +++ b/ot-sample-data/client_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABEptnP6dkNdEYhO83kOkKWy+gZM7aoq1FGjdJTZovi+tjQ5lH6rGJM9Kp/BuG +2C0bomNXANz0wFVkYWQ7oRDFJTih31jqR+MBHybpxxpMeLxlkeUyavS35ImAJXHU +fM57Zjsz7YnsYStOXsGlRi5tulUJxI1jq6wS5uffyDKb2HM= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..db49e8be6 --- /dev/null +++ b/ot-sample-data/client_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABCEMf5mO1aYpHrx6n4UzL/DKOH54FDRgeN58vSKXcfBAuHrZStsjPM/RSepQc +5OvQRdMHzdmgmWUKuXo/EJ80Vm+ubFJViowjOCaumD+khvVK8yvqN2Y++scasJKf +PieoC3Y5yUn3sWiTZjeqbaCavB433SnUCLz6JDWhG06kpG0= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/client_data/pubkeys/TESTPUBKEYCLI.txt b/ot-sample-data/client_data/pubkeys/TESTPUBKEYCLI.txt new file mode 100755 index 000000000..c28274c78 --- /dev/null +++ b/ot-sample-data/client_data/pubkeys/TESTPUBKEYCLI.txt @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success new file mode 100644 index 000000000..09474b5ff --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success @@ -0,0 +1,83 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcnOm0gUhfeoH8L6t1bCZAxE+SMxG2MGM9rsABfzPJjhRft12k6k7ihdu7p1 +zlWdK9VX0N9/fXkvVpBkbWfJkibwO9tkNIvhbFnXdrItqD8V0CkY0m87i1HvEPQ9 +G0G1G9cWfH4Eo90H9RCD/gPaDWMwTsOrGBV1M5fgkYAK1OPrZHyLgmjMmlqbqs8P +DCGxtwH0T9DL/OcH9SjNcy1xeecQ+UyGfjBjjIiimNNzfibGrEVz9blXPat9+abh +l6uNMDxxOmOi2QJ1S0Qhyg0/t6h6l+Ncktmb6/EtmoQBzb1ccd9UTBQ1Uz2+zRgT +gzu+rfZDKbA7ehAZv9F8tqCGQjHvIDjq/K1RDQo5pe8EzW/W1z6rTfBKDeoI2M2/ +gYLqLfn8QD52P96D+l30AwLnpSyocW0KxklrsB24ohm7Sk3EE8t1ddY1bJIy96dO +mRKZJEhU168r0uxApA7RrUfIbuEnue9hkgr38KmlS457uqyOo77TWls2A82ozICd +bHcWh6cUzZoPThaxVBvQJeMOINnP0+5Cs3nBuSUdsT2TqD0hnaq2yZUywQbBzwmy +bvdW0kW9cdZluRJhMxdEH/eUwoLMjbuh2mUtzey2Zcsk7oGN0gp1LSXEOVS1xRRC +tbhbb18wusKL6tldmNGcsJbE3DmLoLk2Jt0fzWPAdyphG17qFdft4SioVlqTRciL +65hRSMbjqTgyJztmOAM5Cidxw9KctkJobimFWq+FfcYbNBWP1BFFFHkx0nI95cvg +4DRv3fChU4TTqj9wQYcLxu8f6uTUKWEdRWjBy4PxiCW7lQTDNnpzs5WLnQQMrsZJ +I+fr5VT6V6rNO172l9NhwdLqlvGHxBHH7IIPkC2RwoiF83TAL4vWVTYM6I25PDw2 +OzqrWme5iytTxaBXbmNLvfJvT1zuy0lmsLsmuhEUWdg17pkKtsMm5ulB2NPaofFu +DdnOur7QVH2zplNe0AeRzmCiJoY9PjPGqehh64GJLpSvwkQBRCPy/CBik1aQ1E3k +7p539bdRNflUIi8ruAZNyBAwHFxC5cJoHB4IYc2LYmBDKcX3j4N4llbH1LJ+vvbZ +zTRChw1Ku7GthD+ufTMTDUfdL/pzDEinoTNqIebFrwlxRqBgQ3FqWDauC8dGlst2 +MpxnG9QVAKZ60zWCeFCjhYsMgnR3B7ABxrnJwmVH6u5tQi1BvCKmlIS1qAc6tjS2 +PHFFpm72enatpyb1rjVyHpvKDW05FcEK0qahQqVKY1IcEtXUoO52juGhruANrlr8 +eb/NYyCG6if0Hf7j2b0rL2L9gH6D3Z+U+0k/xnZM4RfvXNAPL1h92+ktqHf2f/ga +dshXEoW4pnqj7dsuHcf2Gwwn2ZhO4deoqWARlGUzvyxPUIIefjf48nsDeM6KDHp1 +YFg0Qcih2zZdc23CshBXUI/ZItadS8Wi9vTIQ3c09yU98NsBndZLhzr4co2okncs +iL6m3nF9slvvoBNR55OJD2LnZdiWx91FNlNk8WYpzHj4KblKLBgOvHbIxjv+Wiow +cYC2ar8kWuTN+05LWryJ74TGIlJ3X/QCJcspuR5qNK7oIWARJpU/f81P0P7/R/w5 +Pegfz70Pzg== + + + +eJxlVceu40gSvPOw3yC8qzBDI9E1phsgKdE70YnkjaYkeu/E/977StOY3UZvnaoy +MwLIQCEC+ve//vgc9ipI+sGWBP16OTgWo9sM50iGfpCcq/b3BCRGY/btYDNaAEF/ +5ROoD9OrA9+/oomNqqhJgD1F7ypopi/oML7v8/huJmXTrhVIn/902nmK200HqzNE +zajP9fcvDCHJd2f6FKJkytvmnzL2oQLDAgbp8v2LSitLbgSu6F28WMk4jFaM4VEU +cwcuzPkHa9NcIw/a3e7euHn8ieoS7PR0e3Om2RL1KkTBq/0kd6gWSI9CkFjfu186 +9BlHNPdGPYa2ZpKknZvpA8aYBwhO+8tJlRIL0DPPhK0esiU1looVgIgwLn6rmRQi +Zp8N2l+g73feWOABBvAWx2n/u1BUf0a+fyFfhx8fKX8d+gEB+ZVWGmb3RetmIKFY +4LvEaCx5hU7e6vK3m+2KG99wLM9KTMdWXEIWJ5AdV2I0B9OAFGUrSc8+koy/Vadi +yF7PyQsMBI3cTHULkWkDHW/xXuid3jYH/1JKcr9oZHQzU/mcmxCrGcmmUUPDYMbN +ClwptjZEqNeVMbhB7XA/QQQ53r3RaD2fCXk+uJ1vgWfhpMbaCBxAj1wbSZJ1edJ4 +/yv/3leFgeAjaXeLTFkMospMmDW+erQFyyEk+i3A4C6PMTqCoceOPrRiLxyfLzwi +8tZZJ9Qowcsh6vXkwvcelw4ihuE672RZq6f43nsKk2a50XI0Ftwb5WJCk0s1SE6M +O8y8DO5SSDxxJXo5NJ+7gNeKSUsooxwfR3YueKxBmuzmmaPkpKiFIALNpRBvOPSx +3tetYBFzjcvwnPTr5SntOxY6qzI3z9VBqo5iAIF7fSzqobrHgWswvZw46cODKF+e +t9c082uqyrBnR0sitRVfDgFtJobVltizQb0iHIQjGuc5qE6c4T2HwYoWTwl6AXoZ +0UOXJvQhCbbFLGZkX7NXTaaaqC95475a7uoAZLk0RVrqx60+153e1lRY4o1gsskK +Ie+drGmw0Qye7Myfn/qxmcI8qCrWBGbPkCusG2xz7eqYB3dzLW4wVnSKQjl133KE +ClGDIdNLnTP+g+UwmMRWm6EivsuqyfHdtpuEDlU3dOpeMWP1vBLT90Q5z3Z39Mpy +BQ1k4BzlnnjyysKu8iLzM+Etqpjx8oOAiZhELg1tmu4wcAsQmmKnnZhwHvByW47z +dDrFL2jHmLWxwrq/9gpm1ptlwnHqUZvU14DXPZFaNHR36AJmveWs5neaPbWi/RqG +JSAjD8+gW0wkXicizVpddl4E7glp9i17nF5l7ywcbi5n2XVJWdOmG4I2syZpFWql +Z/BCGT0pK0iKW+XG7DHwS/qOh8uqtz4Ke/VDzybxtMQs+1Dw+WHYT74ZVeFctlUq +uHG1AHl/la0JEf5FvbpdPfSNEO96Jl7w0tUAt5CKfz7XeBysPL4tW10ARPZIrw3A +WaLvZdCPT6+415BMGzHV8xrFmyx+DvSZRkLHVG/3pHUwLBviUxqp7U6HYybTwJXS +TkzVweox7XU8uo0ALTvMNrAtwSvnrUTvQH/Bv1nOp/J27h/QL1Hwewb8nQ2M41rX +n2nggWF8G/W3g9GB5uD8z7rHA/IniUJcW38M/9shm6buGww/8ymb4z+TtoZ5UFXt +x/4XUIEB/hD88SsBvOZlDr0ZGHZxIh25pD1gfW3NCM28egENh6FNma61VXIVePxo +xrGqEZtB0nEkHq3R6ai+zW4Q6ycn+Frh3T3dNQ1ulc2gXIPGpjSJVH4k6LvIw2WK +w7fVoipN43vEKy4wmRT9dhKvCyRflZFJ83dy2M6c82lDF8xVp4zspIU1jdwJreWi +O3tx9AJ/PsfvP/W76v+foL+rB/0HTXhq/Q== + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABPC5MazY2Lz9bBPNcBj9KeM2x/GUm/I3+Uf3pjwnJU10BslDmgQePbYFoaKq5 +udz0BHHIhKl0QPlbPncRXBa3w9kBijasl0IX11S8H3kw0Ww+NDmdLTBfHCLAjzyA +meMJH5jvjaZYeCc/fdMULUIAldopwcVvklKrdl91mKD0HmQ= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail new file mode 100644 index 000000000..f16b9fc67 --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.fail @@ -0,0 +1,52 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllUmvm0gUhfdI/R+st0VpJmNDlBeJGYwZzIx3mHmewfDDe912suindK2q7j3n +quosvgL++evbe9GcIKkHUxJUjj1YBqWaFGNJmnqQLE75pQDEYMy+H0xK8QHgRz7F +9WHauvjzI5isIWjGIJzytjGn4NWJm+kDOIyv/Tx+fgxxEf9qvmrTf1J1rj8/4Lcu +HpZ4kNjPDyKqjEsjMEVv48V6ftyDFaV4BEHtgbnnfEKbJNNcBsU1u5dvHn+7uhDF +UrvXZ5IuEaeCZbzasUuHKL6UFIJEe47Ldkj6CEjm5UqGtqbCsJ2b6W22kBu23t00 +tuw2sJeGrJFql2R8avBVsqr9uQ+CKhH9FDjv67dfrK9z3hhxEg9xE8ZW+/s1Qf3u +v/eHn++gvip+AvFlcyplNtsytbMhtHTKy5C5qJNByPtNNuvV7nuJ4c8pY+WwlJcS +u/m6SqQIelW8zgXK07Rb3RkqiBRayiI/n0lQl8D8CqOPSEGrwZ3LaY1RBrH0SNhN +UrfU84rlCrrtKinxQL2pNKS0zyvXELMiYoKLM4jkP/d8KY8NE9yORkOrlRZFMbg/ +Oz8606RVHd1zgBMNKerANSrgkRUQEq+I6+K7bt97aBbO6dOM1pbj6VFbk16Lw1w1 +MMmVB+Gx49Gx9qII7PdnDTxXtBmexinJvJPu9LbFCoG8coVvMaQ/bPoeSShu9GIG +147K25fjUPScfob8aiNNOQQBA5v9lQpyQRwcEl0YommgQal1ObjdjjurNU1FcCp9 +UhTX8VLYG1+Bu1we7akzngc7A/r9ntQxl6iCg0yPnM0hTCKXGz42s+r4m0blVKD5 +iA9TfsLeGy5WEHw/VrDDk3ekjBjA14hnRV5E2ztytU/4eRVpxx4L5V7jOIVAsRpZ +fO8Jcvzo6PAJa2nB5MDreKr3UD1uAbC3Sh6KaTuJq0eSlDjbjLch2bUs3WkUHZAb +ZhlFeruEaM5XE3xWEtHRpe0S2XiEwwOwiOWo2SFb5wsPcT3G24mbpTfWjVVMv9NI +HpGyTa1o92hBDqw1/GmwWpmkYrdoHVpfgZAIBS56LvtVrbAjlt36RKLaKx+3+Eke +7xFP3L0h3kh7GJRnlGau7D1gU35wV7BF0K0ByLEpaEhgiI5QINR/xDoeQ6cHTl0m +lFoENRKOtzI6QcHVLyFHy2+wPG19chbwKkvEuQB61hJdIyELeTaVmjYcRStPLkcL +4NARmu6kxrAFMK6wJXvpg6LiV0Q4kXwWVzfPcEsECMBlGKM2P+UXxo+cwD+hs/Ag +qOPFlNPYlNKQ2mbBV49pITiPVKuj7uxp+Tmq8l0ZQBPANNdd0IeHs7lc1DmNM6LS +JB5CFx40ukedaDZ8LZhbjhUjYwRau5fCiopNk+gnGIRtgLqfnrIw40I/5PZgFzeI +IDxZ20gtUrAzDtGn4gFBMAO1mw5SCc5XKQj8gP6AwrvyouZP4AuK/2TwLzZTlm1w +v2nsxMP4guj3g9bFzeELgccD/PcZDgCmrd8c/n7Ipqn7DkFpPmXz4++wrSE+rqp2 +fXmWuIoH6D3h29cJ0JqXOfCaQNEDe8sMXRkL/j4LVFYQ8zD3aKBQhkM9nlhOWKHb +xEy/LNmYVk0wGybaIKNyF80NuKq1FnT3IgHrPdPSWZVuheNwdyzcjlZr6tuVMxey +PMIPfjAipJD7x3FJuMXaaCZRuhKI2bhUuGKe5I0XlRa2WVEWQP20t+OtDcB+qW/g +0872NpaC/qR8/g6QU///hf0ZH/AvmHBEWQ== + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzJAH1UWhVHTE2nj01SQoTZrZFJqBm7a3aROu+jsVmWuL4OY5FOKb+R1ZwZZ2 +Kh8IM+2Qn+CvnIKTa7OoV10qeGX40ir4gkjes5xipx/uSeqaYF7F1RHScnmqjMPJ +cr3cy4c8RerMgVx09vVY/LPOjELCQQWtLcdx0vM4KY8iLuM= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success new file mode 100644 index 000000000..a840d4a32 --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success @@ -0,0 +1,303 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcnOo8gShfcs7jNYtUXdOMEYKHWVxGAwYDC2GWx2DImZkxnM89wHvXaXWv2r +bq4iM84JZYRSX2L//c8fnyUcFNXc3FTFPEgb+8qbN1601bO5Ue2D8bcCOwZ9+n1z +440Hhv2VDbDaDK8G/vgWDHYX1H0QDRmqb0PwzsB6+IZt+nc89m9BVNRoLmH8/Ccz +/Gswx+rHt+1HDbsJdqr04xsbl1etVsS8deh8ZkI/mEleBoB0OtHP5ES4cWKtdYZ3 +a96+sf/laiKSejqtNXJCAdxyq9PlSmkNMB5qkiuqcHc9qQHPMODEtyvpUMVHERrr +4WO2wYWafe8JbQcFzlRzFShXVaeHmp5Vu1yXtVNMlW2HwP1cH32xvvdZfYUJ7GAd +QRv96iaoPvlPvPn5GddXxU8Mai/XNcYXKp4XymFm+XEN0TLN/D3Lp6uiqrrIX9BR +lDphB4+l/bTEiX3hUnKNc05/VZjZeP57oAdaL+00oTiwI+7kszh6kWniAa/BZX7U +iv+yNAFIPhSQxYyzeJsym5sLYMSYZI2uquVpIOZpjPz2ROIsL7pymGlT2xvRaots +BXWSjOjWO3kzdO9Q6RySZBnVXWCPnUF+wnHSmAKoFCmxu5LecFypfAR7Yne46V75 +BMzLz0bJoBKdcfaD02tgDRPd4GO3JjEm98RZRGzL9pTie2e2Vky2dqYndWXzyRUK +rtBhEhzEsc92O/0ZHK0twSoIquYZ+mqIGeoFrLyhZiPXTOcFEKhb1m1RSK/DlMnc +PlG0ixJkDkI77uXWS+Ibp7TRllmogEBNJ+xR4CseyDNUm2RbJMNtHdvzoEcVOTFV +3YSyFo8pdIYCdpyfrp2tbYmbQOxynhNnmp4weHqU+UqfFpjU7t7VNAeE9Ewf7JTk +NU8bAXlbKWlBoZiOIKFgnRbK/UFeUD4qkhlvsWZPPVifaam4nm2OB5l/vgsupeEF +3a8Vl4uaeN8qpeLzL1IrteZoxA44I4lxs5lmOw7L/ZhE7fYQtVJwSboIhifXUsxT +F5rxeJkOrNatN4aOujsKGVv24q1AeSin0MPb61P3wl6aTjVsGHLSfCNF5y4tsZcW +J02gh+ZB5XYo8mt/HAb+oDjReqich88y/HC3W/sYeAcWg/YQXsmyZLS7lF6cgya/ +GxdxO0XPHRnfZXka5MkkhPJEs/iu4ryEtjqCw/nlNUvnY4hxdtBXbDUfmRTO6Xwk +QLuboyqR1PtyTR4ZwQp5aiDriZ43+ZTg615SRUGpgli2Cn5fYb34fuASAcXHE8ed +ds4ex9ByamH3shGXx6NxdCVqvUTqs/dwSAv20Oy1d3uMdSKjgOwwW5YceXvWAZpd +LQAF7WbpiC9gqnpH1y/xPirreypZ1nSf20UAMnsGzH5NAX7082NKYSV0D36IXvjq +mJ6dW/i+nAzlJPSwf4kFqnOEWs132GkQn3xd5IwB62BX60Z4lmYgPbDGcePTMEzE +xR6mlZBrvEmJWdIir+6wv4jf6PE5eUP2J/aF3L8j+2+U87ZzPfyCtwu7/k3b75tz +A+vNF2D3m+2fDMBEVH3Y/H2TDkPznSCe2ZCO4Z8RqggZliWa35YJlrAjPgX++FqA +mLMiw94VeGEsFZM+B0rrPqi7ckp1rdnBS5GbMhlbQ1fcxEuZzlbo3m/V7trjiomX +40SjRB9GjGf9+QSvXR9dWVp8lfuRbbdLfgLFOTEW9Xqg4ACO9bWSF7JiCbcBRCsY +9yYdEQDaGWH77HHxLIaenqxfBamQ3+xBqCzqbDM7AmjmkgBCH2gpVaZlPEY/fs3v +YP7/h/f79LD/AU2IU8I= + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABvd2y+XK7sf1w2Az+T2P9ZaDrh1MwzfjgFcC4y1CMd0tYw4V4z8TlesUFH8tT +Y46F2+7cH9HRpDSR5CBsAAPIeXpwORYlUX46VxMthRBz5T+78SGtoNzNBhyEcZcS +Zq1GE0SZPje7oyliCuCngBFMFU1+JZfaIziAR7q9SJ3GI4s= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success new file mode 100644 index 000000000..06a0be0ea --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success @@ -0,0 +1,80 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ2t1M0+lPiUBZjKDMWCM2TGbeUgm87L9Ku1Tpb63VDdX +mRHxRyp+pb6E/v7PH1+LF2XVPDiqbIqng2tzpsMJrnoxD6orGj8qICUEz28HhzMe +EPRXMaXNYXr16edHOPFhHbZx6kzhO5q20wd0AO/9DN7JuGq7tU6T/N/MNIYtCOOp +6Fpzbj4/MISlvwTpuKSjevr8YJLaPreyUA43slzpKAhXjJNQFLuNQlBIGe+wQnse +jbvTv3Uz+KnqYwzPb4M1s3yFejWikfWOn3vUeKhZKau8791PPZpHISu8VdnYNVwc +d3M7fYkT1rU2kFc1BupH3J3sdFoDXXAz9+Ebi3OtZb42T/lcRfjXBN0v0ve5aO00 +S8f0bYHb/XegsPkq+fxAPg7fvwz7teg7lJ632jOaV1d1Vzyic20tcLtMT5qilYst +GvmQ54AxLkAU1kad+GW8wWSjZFu02PqeeFAT+K19uZ9vhM/Cc6ZcCGfq5oEYnZHy +gJoUbDL5rXurCGrc64hGCGWCL9GWJzOTgPsK+WslyA8yPSelwT1hKr0+ASkyaKUZ +wbPM3KVBMLD1N/1eppLn0ml6UTShfi0xghnkWEGYEpfDaboO7LmZRvIUksz4qAfy +RdttTi4ZQm/GLbKjgk7EMnciETbZMcCnGGjobmca1MWblO2Lsiqijh/Rlz5Y+cBT +d02CsSG3lEe4er6H+i8rbjzp6sv2UbaDuTTh8nKJoyu0iaxqwlwo9ap0Uxi6qOjK +F9gwIKerGHLzliL7XV9bTSf5ft/Pui3wcvUqL4zX2BVRQxY+ZxEW6HHXBXDZ9qRg +VU/iiOtn5oHpTPeSZKWdbXN43e7OJIwMSbUYLGmMYLPTWS8gmsfJGJfP+mUhtRMq +dtlAdPU5tHRhljHZsPjuuWO9kiXUMrdzKdMn75K1wgwidStuIWQQqEurDyH1hkC/ +39URPtc7n3X0fOz00hzok8AVg9YPMiB9gpg1deSs0xFQvnuTjpQGqekV9UX5Hmld +vaee0MQjMCbXDj15a+wZuT6yOrLzAIlrlHLz7gnPmoQOteSnQmBYGGQ6eN+x+NC4 +lTjEJcISlxdyjB2ALUZxPuq63o7gxq/oMTs+2sI02q6ZqfixUS4Yu6KGHtQxRHQe +L5FLFrZBaGBxSivhmMS9HozBtXcpeEny1hzGFuj41u2vAQdGEpi+OwYJgMbFoCQi +l1iqM5/dUaWGVmpWHCvgYoZJ5xhl8znzLQZHI5hZbWKj75hPRfjVRI12wTnIfflq +nMawtMfEMbjUhq6o+HzNjtzlyXRGTuRXFpv59i474ttPcMxbh7s+B6LCV2IHPIQ4 +mcWfwSPVRGBmOuapmyK65gBG5lrDs1Mxbv9o3OLWct2EW83dl9/vygGPC2k9x5MP +0S8JUBdzXeWXmSRVKVa7WTgqzJ1Az8qahaJUohiBTkRD7rHZU+madDqTO3lUJOY0 +lhBoMCnsJstpSyV8X7BLHppyIxI2dz5+Ht2e0fA7ZWqPR/SKzYUHJTMk9sbbHruY +KExBUebD2WbDA5GxAolUQSt+Qn/Bv2HnK/Jm9HfoF+j/TvsfvwDn3mzxJ/e9dARv +WH87XPq0Pbj/wzc4IH/SKCR0zRfavx2e09R/g+G8mJ5z9GfcNbCU1nW3viVLWqcj +/NXgj18bwGtRFdC7A8fzmdmvS3IvDECrm2BEGk8qklAqoizp5TPTCbA69W4Gzo5Z +vsjIk2cxBWcYfLhBktLEFCKcW/SEhdoma4kJK8xIBmIHnldNrp+EtBNrt5tpSR1N +ujIfTT0Veie32KgqBNQOiu5XoHvdrdATCas3LJTmiNpF9kuaoBSdXmuUzSLZApiq +XT9/+iea//9X/u4e9A9Pv2Uw + + + +eJxllNuOozgQhu/Zl4j6Fs1whqQ1PRIkkIYkJOEMd0AM4WgC5hDebt9syYy025r1 +nV31l+svWx/291/fXkuS96q+MtW9Lu9WliHqpri11LO+Ui359CsD+wy7+/vKFE8+ +hv3IEKhW6NmAj7cQiXEMGnQB9S2r0zds1aEQ9d0SiYsajiW4paACNVoiqA3rLoxR +Bmu9rz7eaHIjvASgHUCr7j7e1rfS0Or9Nn/YXD4KURCOtKhQFG232yBTEsncbGut +Pblms+j67reqiWkmtR+XfiMVlFOSB66cGa2hTr6a5HtV8hx311BpFG62iyppYbW0 +DPsavcS3jXWZurQo6a70Y7gzABqD49ZKLN87Dea13Eulvkv7ImJeDuAX6bLPagMk +oAV1DCz4r6GweqV8vJFvq5+vaX1N+okBbSqLrj/DQrTvJZhZs1BpsmCyimyDPpOz +5wFCRWJ9/+arBXRsyUwv1ZUgWbGfBjPGvIBZM2R9vrEtRwyeW+ZHd+cjancjw/A5 +jcGpdxbLvlL14hocDP8QSLHxmNp29k/xM8Eq+SiTZbfXTFa9crmhxebnXo7jcfJJ +uLfv8dWqNHOCJC8Xo2xfyTxXHFgUVp+p6eyrmHl1NWjX8VoTWQ1FTowL1Ew4qTAC +SpVx3ovl/HHfXHII2wdKi4ylI92Zgsu2vnqJ88CSSZfYgys5tGzcgrNwAshiDmu9 +0J/DjdeiKd/WY/S455mhxPes0kIfJdJOWpeNXJJXiC3v5YcpXyBr443GZ4fgcPBM +ly/Ke+goAj144W4jOojJFZqVZDOTTyrZ3bYj70dw52dYnFBne5oFysszl1KSWR3y +mlETsvLSMzjXXG4Xhqk/Jh0G03ZmG55Lzzi+Oz7O1VZWTpiBPzWymuU1pZws3MMv +9mhcWEUrkK/bnSzLLXtbX3w+PRC5uR5JmbaUegIC+6m5kl4/MY5NqqYN3MxM53kU +gxKvOo7kuItpzmceEhrF4ps1XtmkOxNdska4PKc4DepNrG7jocCWhss0BJJLCXlO +39Wo8inGG9VPT33eEcK9B0HHxnKDnt0nJWa4tY0Pz6Llei0IPo8IizxnQEVYKWl7 +VE/0jQtBm0VBHsTcbSr1+0GebsufWJ+bEBBd5BIUMTczUx0pnWU31w/sB/HH336d +LGz4iX3Byp88+cUZ0bIN+TdZHNB2CxHeV+cG1CvrP0Z0K/K7QGFbWL348b5aPDXv +BJFm6N5H32NYEQooSzgukgGUoCVeBb59LUCMWZFhSwVRii7bNEpJA+jkQE/IR8Tp +6O0Ph+GgBiHT8NrJkU1IkmfqAa4E0L3DsEmsRIdFbGJ2XZlBVTPuuDeu6Vw969nz +uIBzZ+FoZaST7nY8k1DCI/pkSB9Eszb7A9oTajQ6Ga/WWGvMZiL3V6QKWRPxQggp +/WpehxY+mT2r9ZGmN6LPO23S87zSffyen6z/n8Z/Tg/7BzPL33U= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABShpS64vrLbf1ck5hnaTDML4C0L7rTyByISix4lit1wes6f9CEEcN3eCICmIc +71HU3R2tKGs8urjKYSO4mbmPIaR3r8fp+sGvKrBZmBjTc9ZtfW0h/j6P6/o+TJGz +SvstVj/aEUZyruYVmLKDVJUlOmM6Jlw4Egi/J4mU8194UcE= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS.success new file mode 100644 index 000000000..cdd036d3c --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS.success @@ -0,0 +1,85 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcnOm0gUhfeoH8L6tyjBgMEQ5Y/EYMAYsJkNOzPPxQzmZftV2k6k7ihdu6o6 +50rn6tZX0N9/fXkv9iSetZ15FrUTv7MMRjMZzjpftd3ZOqk/FZD0GLJvO5NRPQj6 +no9xvRufbfz58Rit/tEMSdx/QLthfIzT8DoMywYsVRylcR034+tmfIse4ZiDRpvq +zw9sT1NvQ9zPcX/mPz+oqDLkRuSKziaK5Rj4jwVjBBTF7J7zcyFhTZpr5F51zfbl +m4ZfrjbE8NTubhPNlqhT7S9EteFyi6reOSnEM3t3XL5F0+BBcy9X0oOaCUMwNePb +HFmRJxG2QM+R8Ep8c473vh5k1iD8o9FXRHCkbKtOKdwy3wnAb9bXPm+M+JU6bsLY +Av8GetRvyefH/mP3492o30U/oFheK5uqTVAy9qxibP/kDlZjbhdGFrH1NCg5m3KL +PWkH3XwIpc2V/YFIanlJvEWy8BlyblLnOw9q47Z8I+G78Wy21iWtvif3xApkSasw +37gDkZjtJdrIOmdd3UdV04kxPrVWqMovXknmxyWrha7jwHbkck6RRcbtO9G5s+6i +9ZpkwgpQ9dZ1Mg2p1UOWyQmzcR1wHagf9kANQQjQvGu2+IZQFkcaWWpV5KJcI4cs +hKhhnbudTsXQBFMUMihtqAJ23Z8lPFwhVjj4sbjPCHdzSWyIBWtz9ShIYKxtSfis +sQnJXKuoUkCUYYYFGI9gIqFY8VLuAOUuEHEI5+NlorTMlG5Le62SU6MnBiOBoTjw +B+yi0LycsGsPa8o63v2zuaDsU6Y0wVlYENMQGvRBcKnKMfPwitZAenkIzBJlHitw +tnoAfp0KsKd1xiypNmsRtzLzKyaHTzQPbs+YgBZcj+a28SVtMhIl3PvxfH3o8+E+ +1sK+8/F9SDhHbEAKcdgIF0+VbV1Z28uroueKzUqgGzbRWtUfyLLNlvl64RKJkIAn +z6lRWFZw791T5A96gNzX9cqvYcLFMBtzDYXCcnmWGmiTKZ8SBYdH/esz3DtCbh18 +jNDUjuJMMquaQeWssDyBeLLbSbXlEG81c93iVNx6Veeh9mz7/TWVlnDEmaxrKkL3 +RFEXalxSL3BJXwvxodRr1UYw/qz1JnrNl9RSe04SvFBwYUg8Sjka5egJC8ZAYbj0 +6ck6dSm7gwKrilud+VrGo4bEe+S8z612aI+3ZIs7zfHMC5riEMaao0sop95hArgX +7XEdB0yKJosraOJ+pp/16PJKGW5N2KTxGGxKez8avOxTMYop+gpdeX1qzGKqrvjQ +RUiIzEiCCOYNZuaJZIMB+o788fzeJy9y/YB+g96ftPtJQcayjdMv7jlxP7yg9W13 +beNmZ/2HsWG3/3pEIQ7Ub8R922Xj2H5DkDQfsyn4GoIaEeKqAsvLMsdV3CPvAl9+ +L4AseZlDrwoMK/IeKXq3wr5E45DKekC0/V2cePoWe2yD1kVCgDBXtBZZM8vSpkFk +F11+TYh+EaF71HVzWS5AUoqFlo0pqg2TG9iRB6Z3u9hGECWHe3brveyhZUtAruyG +e+dV6oYaLsACjTA53Kxwes+va+kXU3ze7pR/9JgGGVYBD7BukAFJp0OfatLy+at/ +J+3/f8Wf3YP+AYCRFBc= + + + +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 +XQ== + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABS0rVM+n3h96RHvwIiVRoL0fMjHemp9yvk1z0wBdklQk+e8mC6nmFV2jkT4uv +eRYApqlhKna4mpYjB097E6csL1WDXNGGAsXfc0oQvrN1orQ6iS42lYjp+NLVPCbe +kUp770cvNAiIwXlZEVuvJqF7cML3GdbbgchQHNaiuDwIVnk= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success new file mode 100644 index 000000000..60bcd1d87 --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success @@ -0,0 +1,301 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVECPdO4kBLSpOEyeO2b5J8CMZWmvpPrDdcZ1X/X2u6uaI+AlxJs8MpP/9rKY +dtL/52+NNXdc4v7ivHd3tR0Wflhuk8FQF9rrf+XMC+bljqZzOjAvCY0zqW6luSlI +RUkO9smrVnjmBliHSDXxFD8prTmUjtqCc8sjqA9w+Mmdsiw= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success new file mode 100644 index 000000000..fa37c6087 --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success @@ -0,0 +1,78 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB22TAq4wnC6r6VpyFhtVe8UgvckcVmUqcZXt4QfvC/+3qBXBD/sVGcf+troYJ +mpLDD9JNzD1+OAzdnMvdmQo6BRb6EL0557+KdWDc6RxX/6+9UZ6I7yTi9bR/orjW +k6WdG5JDpfH8Yf+oHv7BGI3wCNuHViw4w3AYrRwt0h5fZ18= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success new file mode 100644 index 000000000..812bc4851 --- /dev/null +++ b/ot-sample-data/client_data/receipts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success @@ -0,0 +1,90 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6mWyGUp+SwMzGgM1k2DEkYOYZzIv067ZPlfreUt1c +ZUbEH8r4U/oS+vs/f3wtTpAU/WApki7wB/vO6hZ7thVDPyi2cP1RAcnhmH87WOzV +h6C/nhOoD9OrA58f4cSFVdjEwJrCdxQ00wd0GN/7eXwn47Jp1wok2b+ZaQibMYyn +Z9voc/35gaMU8SUAwwIGhf/8oJPqrjbSueidU7FSURCuOCtiGO4M5+ApppzFnBt1 +uHpW99bN409VF+NE5vTmzHAl5lbo5VTthNphV19JC0nhHq7Hd1gWhcz5rUqHtmbj +uJ2b6Us8Wlzc2pVd+j7dmQu55PiFJ2vFHe6JsrZJNnp8q+5K2rlfE7S/SN/nZ3MH +KRjA2wK7/e9AYf1V8vmBfhy+fxn2a9F3CKhb5dC1UaOsswgBzaWaa1UZLc/63eQu +lLTNNHuNjtukSDx/j/w1gtWUDl/c+rImqoMW0D3UCLP0VB5wBHScWIpcXZ6xgK3Q +YtjzsdbEIvNVjSuRmJbG1AthBUVBglZPlVahvKhVeFPnYCAfwHqy6hJI/FmhFTqv +KX2qr+SUY7Fa3xp+amNfi0Ula2mUuJ4CoIWBCHk8k/OhrRfsvI/HwKFdOXihgKBr +BmyIclkpDteSo3WySD/cxG4CpH+K86FGYW8LVg8iYlxtJefRLJhAnnaVG7jIH+wx +Ux1dRo1Jas/DKMeBlwLyZZbZRewFlVCLcynmgRv10Fxtp1Q7wj7hNwuIMqdjeJRz +c4zPrfZGZI/yVD7kV140xnlfWCPcnyDKvUiysfOjIBkowv2rmXjXlIN1uuDxrCle +pwBnvZEpLxHQnIJUKILz6TABLcdERqWzALQgv42h3HoGVOpHY5vxo1nttwnABUn5 +Lu2p8IOT55vbDxuBDuyN4GIdxkV02oa2TJo6X/iSJJ1ZTiA0A7mm6THxuhDt+YVg +tsE4Be1hyeYLXbrzU3osFuKEilmcPDEGWbPEmNYZLLQ33BIXchaFTLBVvBASbsNa +GUuVdeoNsophWb4fyXVReivS/ArWBC14TYYZ5Bjc9y2vMHKAbdBGIS3SLvh+boyl +K4IkqsSuL1Ng5fKLciz93nMV3R1JqaqoXmc0QSjvrP/qomxhs8iGXLg1XsVDDhEM +pqLT+FQRx0UWKfaHxECEakwZiXFgAcQj/DrB+RKfSck2iXt+ujyFYoCitY3Khdza +AjtrpqoiPn69WlR6OXeXWN9J86g8u83yA8ch4u64ZruDXR470pccZgXtDWpXZQGX +4X25xtP2kakfxqvMC6IqMFy7tfMLVVFEpMpZdtf7c46CJnCvyy24vOoBM4UBggPP +7xAqdrjLRvXz9c0rs5OqBnWo4Sx7J3k/Kwk99vQwhXH68FmjAbvKOLjGPayCgSFe +A4q6KYiR1W6VKhqXleTDfD7VcRUt5z5NPRsXShjFjXoUgmJWbFZLF71rpZ1GGBOB +Jh858omgugL6Cf2F/EaLr8gbrd+hX1j9O6R/wJu1nbvwE9cuGMY3Y78djA40B/t/ +1B0P6J8UGkLntv5C8rdDPk3dNwTJnlM+R3/GbY2IoKra9a1ZQAUG5KvDH792QNZn ++YTeHVgu0W2xCxIjW7nL6XbKVNguL1re4gkvKlbG9zetbGbuTnJMaWUoy7ErQ47l +jdeYHOIkj6CoultEfsB49v2s9qMJ37U7VzpYuuN5Q0qIdXfRQbmy1olyxsVcBdHs +Mrurnwo0BWye9ryA93LJo319p02M19BoumKKyW2WyY1b5Ja7zBKScYs/fxoo6P// +x/1uH/QPQ4pLxQ== + + + +eJxllNmum0gQQN/RfIR1X1GCWYwhyo3EbsxiMI1teGNpFrPvNt80Hzl2Is1EmX7r +rjqlqpL6IH//9eV9eElRzY2jKqYkbsCZMx1OAOrJ3KhAMn5mIIdgyL5tHM7wEOR7 +PsJqMz5b+PkRjFwUwXa0YB3ndfqBbIYxGKfhFYmKullKGKewgvX4iox9UA9BNOZN +bU7V5wex3ZNvAPYz7FXx84OJy/OxVoR75+7uyz70g4XgZBwn3F7wcznhHVaoj71x +ddoXNw2/qDYiyNTtrInlC/xSbrVduZLHFjc8NbkrKn+7XMUWT8OAFV5U0jfVq+Vm +qsc3PDh81IASFJ7HtNZMzxmhiXSlXvpzrC5NnA5XsTmuatJe3hM0v6Gve16fYQJ7 +WEcQNP8OFFTvlM+P7cfmx3tbvyf9QODxURbM5DR3zs1quFJC0Yy4FVPcRe7Qbceb +ipoPBB57kcerkmSvopYy5CqGjk7DZod0KHDRhO5qDROwpMa3oz/MKR+SaaDvL+v9 +4M4+0fQdd7B0joAo6vdpWUg+ILOQgMsO2edEZpyStqFEADJBGTRun0vU8VRH1NzZ +fB+1bcbwPe/OQSykR5evJNOQmyt6A6BgIoSNR95RaJtTyKBwUX90VZ29HfHWHsKD +zfD0s6RHdlzzW6uySlbd8etWzeZEz7pJa1EX2WJkM1AmljW0zmFQedQF2VFS5jr2 +g1IAPjuBrvvCbFpcoOUqdWFU+0LlRKTUlj09CgT0ffJkbpPZr7LlGuFu4O54WiyJ +2N3mxr+ZXq7JXUgpbB9JBOAFXlPt6Z72S2RWFW0j49MCoIyHjjlhJjUKlXEkxW7f +PTGXuY5VCHvyJE7iQzFn5ZiafWLXXaQvVT3dNIeOZmTADuKJqKBMVDg+RmwMCrAQ +aRvlir6vJG9YbS9Qe94QOawdnyEjPWaxI6wYpcNny5yQmV26ezWb9eqxjtErD8om +BSqjdjs0K7I4ORM614G7pQYqsLpgW3F34RTIj/i2mJGzbxDDGJZgl4arwJ2Jxrnt +l0JwWE0KHpp7jcIpyUX22HWEp4TWiXMT96oV2P0KWFmMHE+hEKx7OkSYby2h6OiE +sC/3/dr7Lge0W7WeLG4QbOsalVCek+eg71w6iNZJeRTh83DzqhoiYB23h2dGxWcS +Dx9XVvF8yE/cWWcs92Sk19fYjuEE1dk5r13k+I/nXgapcbAUMD0gXiIoC3DTLe0B +p8sUW5h6pW4nE0Ox5YL2DbYXcB3ysfSJfMf++EXvl5eFfiC/CexPc/00Ggfcs/TL +YRfYDy/3fNucWlhvwH82Gjbbr/ttgAhN9VbVt002ju03DEvzMZvCr1FTYTIsy2Z5 +MTMsYY+9K3z5vQK25EWOvCpw/EWFbujrRr5iY9amM0HtzrDTFnyHVS5NEm7Q6fyh +HwQlMRn68gzUOkD1tZTQLEEoTiNtyVgjqNlbeTVz8WxiA+ofm7r3uHEYDDE8Codu +p9kz6xqnud0Du2gAvNnYWI4CEkwi7s+nhNOEaZX9+oA1lT/cDEE2JzmBjo7ftag6 +9GKq76od9flrgZL5f/H/uT7kH4SYALE= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBSstkMhL1VAZyMdIFsHP03xamtQECxsSBMsfFq9+z5Nunvqtq5TiuXvMrTvu +UcjbIHO07iRdr9pYNEYKJx8/JOk4quZMPEGXMltcNAzBJxsPqLNftxYLCczDs/M3 +Z3y9vcUYY5vWllC8LLSfCKzdzk8lY424XiKYWxRkOFW5i+4= +-----END TRANSACTION SIGNATURE----- + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABIGFQ/xQgst4JgISX+CbvtyfxIS8UGvLx9iFz7rXv2n1/T7RxC+gPvd0Wiz/j +sQ0TvQGDtmwQm92JkHc3DYfL3MwsC0Zgl/ad+fPjk6IIuDjWlRAzf+I4CeBWjy6b +FrvESb+eQGKyBDtIjBjkKTk/Jw0K/9sIfEFu1hx6klBCEMc= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/client_data/wallet.xml b/ot-sample-data/client_data/wallet.xml new file mode 100755 index 000000000..b28445659 --- /dev/null +++ b/ot-sample-data/client_data/wallet.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ot-sample-data/command-line-ot.opt b/ot-sample-data/command-line-ot.opt new file mode 100644 index 000000000..a5553d48a --- /dev/null +++ b/ot-sample-data/command-line-ot.opt @@ -0,0 +1,15 @@ + +# The OT command line uses these for default values +# If you don't specify --mynym ID or --myacct ID, then +# it comes from here instead. + +defaultserver : 8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp + +defaultmynym : T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV +defaultmypurse :lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa +defaultmyacct : sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV + +#defaulthisacct: +#defaulthisnym: +#defaulthispurse: + diff --git a/ot-sample-data/ot_init.cfg b/ot-sample-data/ot_init.cfg new file mode 100644 index 000000000..1644cc2ae --- /dev/null +++ b/ot-sample-data/ot_init.cfg @@ -0,0 +1,7 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions ini file + +[paths] +client_path=~/.ot/client_data +server_path=~/.ot/server_data + diff --git a/ot-sample-data/server.cfg b/ot-sample-data/server.cfg new file mode 100644 index 000000000..9af48ccf9 --- /dev/null +++ b/ot-sample-data/server.cfg @@ -0,0 +1,25 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Open-Transactions Server ini file + + +[logging] +logfile_path=~/.ot/log-server.log +log_level=0 + + +;; no_requests is the number of client requests the server processes per heartbeat. +;; ms_between_beats is the number of milliseconds between each heartbeat. + +[heartbeat] +no_requests=10 +ms_between_beats=100 + + +;; For sending: +;; no_tries is the number of times OT will try to send or receive a message. +;; ms is the number of milliseconds it will wait between each attempt. + +[latency] +send_no_tries=5 +send_ms=200 + diff --git a/ot-sample-data/server_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/server_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..4e0b6deb9 --- /dev/null +++ b/ot-sample-data/server_data/accounts/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABbV2jt7uhQdDeeRfAvALoCIo0ShUJlxjJ2+e7EmXK3mqVhbq3u/vUs9X1VZ3V +UeIFDL2mf0gaLFe9gFoUxazejjEW/7t8dQLGFwInBsFcIfgj+EF6Y/Hu/NTo5vrg +p9SpUTpjm7OsYTONddyo/vL4XWm1/F9kmzt8zhHBrDyPSKs= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..9029bb531 --- /dev/null +++ b/ot-sample-data/server_data/accounts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABJUqEE/BNip4deKhY9C751CcCr2tvKDOIo8S8zhBxDbzorJs8vc5DJlPiTLbb +SmB4xX7USUDOpdDpYeKzRG0NQbU/kGeSzD0bgl2y+9MFcrt73hfhE4uHntRScxNv +1N1oe5DBe+O09c6OTq3nD+uy+fvsukc3HnaJU9Grz7xsXoE= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/server_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..66387354a --- /dev/null +++ b/ot-sample-data/server_data/accounts/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABDJPwe38e982JOiTNro8lnlkXF/KoKcHL4iLFM17AzkaWKmoFWn1ww+BtQtYl +inB/tFoKKqXiIOjzrfpzG0HDTZoygAkBq+DLd3GSLrfaljRUFnDUlk0geYawDHct +FboflKO49S5jk8Pf3ZLNWDZFXFM9W6SQZqMXXklrV5PqddU= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/WEabE80EP4MYiUEOLSMKlUfaLmsWjxg3xixOmpzRQsp b/ot-sample-data/server_data/accounts/WEabE80EP4MYiUEOLSMKlUfaLmsWjxg3xixOmpzRQsp new file mode 100644 index 000000000..bf38fb63e --- /dev/null +++ b/ot-sample-data/server_data/accounts/WEabE80EP4MYiUEOLSMKlUfaLmsWjxg3xixOmpzRQsp @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABNxXhAxyW4NJxLfXw8ogOZBrQHUPVnyTz637FNIvkBQpqrlzG2wa61i9Afcy0 +xE8V/gg2KDoErt6E9FVe1l+roO5aiVMzCXAmPPjysEGbGpMzfEErwvfygL6cyL5h +CvurGFIIxEQhn6n1+qARRPozWWWCppEJ3/AVNltAfW9XOT4= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN b/ot-sample-data/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN new file mode 100644 index 000000000..6b879c128 --- /dev/null +++ b/ot-sample-data/server_data/accounts/d98mBV4Nztu5C10arWpk0MdKqekUOJN2thSD4dS8uzN @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABQOmLuPVsHk3jOYLvkf9oeqcCMG/klJIJ6RIMxxq2juck5dvyKskzz3PflhdO +kCUb2DsWch5Nikru33EwTlApwkURRFynvtd6YCrfZi8lekOH58Hgwp2NNyzuJAKR +H7T/0sfpfPOQJArLrPHl6dlqIUekLKv6UHE4TUbpvhlxgco= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/server_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..bef250145 --- /dev/null +++ b/ot-sample-data/server_data/accounts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABrSDNy3xvHqadDgXlbajj/Z1Zrmk/4NCjbudiOmyL9wjeEuz2JrAfCj8n54NP +rXRCKAJ1Gg4aC8ou8zAozGkqIht1Ncnd1pcw8iOwKUy6KY8m/VaJduDky4JkK/5T +lqiNI5H6cesPHiPJoSR5gQp4wT+KI+Tk1ZAk9RsmlYnOrA8= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/server_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..52d7087df --- /dev/null +++ b/ot-sample-data/server_data/accounts/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABgp4At/FMWGSUvEAhB832ViITxgx0zsaW0/2C+NlXzZJAw12WrMNsgGzA2QGn +DPDDNTORug81EKt8yX7UR2g5cWMg3MNNVTM8edVgMtb/PRklkCFdgUZaqGjvD7mv +9LqxMD79d07Qozybn2A1SZF1J4+j2H+VZ8NigWq+EKj0hC8= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/i7Ar8H0ppA9TRiFfLVbf5STq44JaivmPYUO0npyoArb b/ot-sample-data/server_data/accounts/i7Ar8H0ppA9TRiFfLVbf5STq44JaivmPYUO0npyoArb new file mode 100644 index 000000000..4d7781c29 --- /dev/null +++ b/ot-sample-data/server_data/accounts/i7Ar8H0ppA9TRiFfLVbf5STq44JaivmPYUO0npyoArb @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABwY0Y1WDChXWTjJOtSVRsTxioMU7m4YLBoY5k532873cZxB+2UNqNH0lffi1L +LzCpAqjHfeVgXz2kcbN1BR09kW7O6u4Evjsg9h9nq+tg6EZs8nY7onzQ9zPAt3eH +iIhVDliH1MVuLkJdbkO18cfvzNgk7BdbCj6Ukh4b603ErLM= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/jJfjQPFUpfF0M6rYA9tX4KOxxZVMg0WczTTTMYsC2K2 b/ot-sample-data/server_data/accounts/jJfjQPFUpfF0M6rYA9tX4KOxxZVMg0WczTTTMYsC2K2 new file mode 100644 index 000000000..a27f94b10 --- /dev/null +++ b/ot-sample-data/server_data/accounts/jJfjQPFUpfF0M6rYA9tX4KOxxZVMg0WczTTTMYsC2K2 @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABtaUPtc93EUL3CRBzdM93EXZpoYXMrWtFmzVNWDiR0/yZxc+tcpEzn5Hu0k8A +2jNwKCdvq+yN6HnjlNNWxjoSd1FwGGBH5ccpQQOaBEXK0OYjLuqJXFDjT1TPFjxU +Wc8O061oS7F8xGlI1mCz4Nu0ttCKO2s8cKMteABgyHfNXlA= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/server_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..dd5e5f169 --- /dev/null +++ b/ot-sample-data/server_data/accounts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzkNBeoD3OTstDKSqUo+0Pw/Pz3PtvPFrkE8/AciBPc31NaMJQo2IsxGTneH8 +WkqJ/IAmtDJvNfWWWUlc2DrDS7YTLhyBCx5eYrl1mxKhQ91X5K5L6Dl7/yJ/+lIJ +Ftm6vzCLcjL/KVjxt+fQN8yN8caEgIBnR3v8ed+ShQu34tw= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..3d8c6244a --- /dev/null +++ b/ot-sample-data/server_data/accounts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,25 @@ +-----BEGIN SIGNED ACCOUNT----- +Hash: SAMY + + + + + + + + +-----BEGIN ACCOUNT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzKbz6VuPK4ZdmdHD1C7o+LNITVIYcQZ+4ioR1dYtcknZsuwu2YyX7G+uRq5c +2QX9dLXR/JuBZjVeOi968bgiff1OutlztuhzpraaPhwS7WoBGzHSfeYsnlDhaJe8 +HcIp7srZelLOoZLu112jqH1+mIOhdwtD+m/QkWV4weProik= +-----END ACCOUNT SIGNATURE----- + diff --git a/ot-sample-data/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data/server_data/certs/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/server_data/certs/special/ca.crt b/ot-sample-data/server_data/certs/special/ca.crt new file mode 100755 index 000000000..d1a3fdc1e --- /dev/null +++ b/ot-sample-data/server_data/certs/special/ca.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/server_data/certs/special/dh_param_1024.pem b/ot-sample-data/server_data/certs/special/dh_param_1024.pem new file mode 100755 index 000000000..8459c5460 --- /dev/null +++ b/ot-sample-data/server_data/certs/special/dh_param_1024.pem @@ -0,0 +1,17 @@ +Diffie-Hellman-Parameters: (1024 bit) + prime: + 00:a6:b5:e3:7a:99:1f:c9:ea:47:83:d2:0f:db:9e: + 0e:02:e6:33:e8:b1:a6:d6:21:9d:3e:4a:bc:97:6a: + 15:5b:c4:7a:ed:aa:e8:86:c0:2f:57:f0:df:03:d3: + 0c:56:e4:49:ac:96:ab:6a:82:cc:80:40:f7:40:ff: + 1e:78:57:93:ca:96:5a:31:21:e8:95:de:5b:20:6d: + dc:bb:b7:2e:03:09:a3:0a:74:53:47:da:57:bf:80: + ce:99:0f:e7:0b:25:ea:b2:80:29:17:ac:b3:72:94: + 02:26:c1:6d:9f:cd:45:92:70:18:24:7c:c6:57:7c: + eb:c4:de:6d:6c:c9:10:ac:cb + generator: 5 (0x5) +-----BEGIN DH PARAMETERS----- +MIGHAoGBAKa143qZH8nqR4PSD9ueDgLmM+ixptYhnT5KvJdqFVvEeu2q6IbAL1fw +3wPTDFbkSayWq2qCzIBA90D/HnhXk8qWWjEh6JXeWyBt3Lu3LgMJowp0U0faV7+A +zpkP5wsl6rKAKRess3KUAibBbZ/NRZJwGCR8xld868TebWzJEKzLAgEF +-----END DH PARAMETERS----- diff --git a/ot-sample-data/server_data/certs/special/server.pem b/ot-sample-data/server_data/certs/special/server.pem new file mode 100755 index 000000000..3e2728209 --- /dev/null +++ b/ot-sample-data/server_data/certs/special/server.pem @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ot-sample-data/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp b/ot-sample-data/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp new file mode 100755 index 000000000..76e556011 --- /dev/null +++ b/ot-sample-data/server_data/contracts/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp @@ -0,0 +1,131 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVzz3XhlBBKUmd74RKfM1SQp2HtPsdjaz8QtRXLGpYFi0SXq1bLPCz8ZOpa8U +IzJOGLUVwgH9FAzy1LVs+bKa4RqoMqgyjciqqFcfc7vQ0MjuxamLsfBK2vy6W6T6 +xp6qDWBfdCMQF/SZrmmosEOR6hlgwStSQn5YcaJjXQTKBos= +-----END CONTRACT SIGNATURE----- diff --git a/ot-sample-data/server_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW b/ot-sample-data/server_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW new file mode 100644 index 000000000..e4340510a --- /dev/null +++ b/ot-sample-data/server_data/contracts/Bph6oZoC14CxafShXhZPMl1p2o1YE9MgwsEUXSQ5bWW @@ -0,0 +1,159 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + Chuck-E-Cheese's Game Tokens are payable to bearer in fun video game + entertainment, on demand, subject to the conditions specified in this + currency contract. + + Chuck will maintain at all times a primary reserve of old 1980s + video games in an amount sufficient to satisfy all the tokens in circulation. + + + + Chuck-E-Cheese's Game Tokens are primarily backed by Chucky's + reputation as a connossieur of fine pizza. + + No primary reserve is established for this currency. + + + + In order to obtain Chuck-E-Cheese's Game Tokens, you must + persuade Chuck to part with same, by any means fair + or foul. Common means are in exchange for favours + done to Chuck or in exchange for national currency. + + + + In order to redeem Chuck-E-Cheese's Game Tokens, you must + negotiate a suitable time and place, and then ask + nicely. Because most suitable redemption locations + (game section of pizza parlor) do not have Internet access, + it is likely that there will be a time delay between + currency redemption and arrival of available games. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Chuck the rat is solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Chuck-E-Cheese's Game Tokens + outstanding - is created by a Mint account, + specially set by the Operator. Authorization to the Operator + is hereby included to specially set one Mint account for creation + of Chuck-E-Cheese's Game Tokens. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from Chuck the Rat. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return Chuck-E-Cheese's Game Tokens to the Mint + for the express purpose of reducing the float. Chuck-E-Cheese's Game Tokens + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading of Chuck-E-Cheese's Game Tokens normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB26rojg2jlm6SPEH4QyJFSMdMbegMZ9Ha5T/lBDqhU2nC5IpZuRXfVgukMtUd +gi/snHKAu5GZb9AxmHg6dCrI1IuE5yNvrDK+qq+JOCBvekFAlSpNb89LOuhBBUiq +gxJsw35oOzBVTE9msc3fp+TmeSdo++KJ4+o0G1tincQHrrM= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/server_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz b/ot-sample-data/server_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz new file mode 100644 index 000000000..7537fc632 --- /dev/null +++ b/ot-sample-data/server_data/contracts/XBCTdnxYMLKaP6m1cSpvgViOFfdjoVCffbnZ7VIAEQz @@ -0,0 +1,43 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + +eJyFkUtvm0AUhVfd8CuQt1ECOPipOhIeY0L8wDFv74ZhzGAegxmwDT8+qu20Utqq +6l3One/o3HO4j2+Pt5mqmr7mTV1bqzMeGGtrqwDrvuFeISNj3lRWPsd9R3VZ4hw1 +U8gSXPGI5lUJUQVonVeTTrfD8Vmcx1mdWSXM2R6Xk44kih3+5coGd0avcPb3p654 +RSFCNx19Num4KgzUoahu5JUf26qxNFeL1N7DZcbcwyV6vsQXIyva7TsrbiBj+I6l +Th+ivUvdxXQwRbXugfZkytCMj7ZxSLXIsRpcRBJUGOzwwv9M9f4wFQ+UcvgqFoUy +srbxfL90gn3PtI6y/AbjU7bxbUPMi4YqZfDV1LQgfbqjQJLBBe5N4pHdZpVKRZdK +vjpaRWem2p753gtc96cp4feYX7gvHf0q516WYtlb9bMmB5cspvmYNwqc8/cjrsVc +XxgvPg26HKBZhvNqzJOqKsaCEMUVqYMnRDNhjtOUnq/ICae4FG4Cj18FhHOcxNxV +QZmiRtJGA58ymczOXiu3g/YEJGI4iWOc9eH7yGj7D+VMeWvW2/ogeGSeaGitRTB5 +mHPG5pU+18a85zM9eJZrlZHaHVZqmKwORrPLk2a0SAg+134LCrIVTgsXaPoRUSdW +xT4AHNJ3oA57JukP9bI5WqPuBYMqFEJybENcZaFXXzzRCLut3Y9yNPnMTV3P/pka +9wNd6PjJ + + + +- -----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +- -----END PUBLIC KEY----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABih2pycKZQBQwhUTiSFugJrpy4U1VVgvXn93TXqMXCq9eg3PHZEJoqoRtVrTl +VCh6M85M6PUDgSCLsbJLDuFLCQxKiBVnhtE05QMZ5ugjXV75oDP0Uw/Fb3ZZ0GG8 +P5qo0WPALwFhLye4QgQmMqydeoYaeIl9FCidWCvxI7QNEuI= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..a8faee2d9 --- /dev/null +++ b/ot-sample-data/server_data/contracts/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,143 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOTSi/LXilVNhOWAi/poHk7YstayyRwAOqBBIJgSD1eOODlHMuHZO6s/l9fuY +p2NeMenp3g/jAG6atY+5s0sK4NAyTWAafaT2FvBdcetTyqulROrMSz1j5xJgaQBx +49YyjMbhPH+WFrK4ZzLbwqy3ll3bmVqf6Ww8UduHBQl6aZo= +-----END CONTRACT SIGNATURE----- + diff --git a/ot-sample-data/server_data/cron/OT-CRON.crn b/ot-sample-data/server_data/cron/OT-CRON.crn new file mode 100644 index 000000000..6f2358880 --- /dev/null +++ b/ot-sample-data/server_data/cron/OT-CRON.crn @@ -0,0 +1,59 @@ +-----BEGIN SIGNED CRON----- +Hash: SAMY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-----BEGIN CRON SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABklx82gJE+HPBoPvgirN9Sqf9KXnw12EmrliswW727xPwbasOW5e6Xeh65Y2V +ZE+W/sRONmyJCm4xuVQW1/QhW2QHILO3CWKPYnAYjT55jj/Ng+gR5O92mXbawFH0 +MgL1H71E0R7u5TbGpuPjfCAz0JjPoa3twbVs/Mz5iV3t2Mw= +-----END CRON SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/server_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..346ebb0a3 --- /dev/null +++ b/ot-sample-data/server_data/inbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABU6OvqJ3GSihpbbJSfB1LvCX4qhYUfDNegWgokZiuQo+V9GPb8/K/6OXVpWmz +CKgy+88lQxuNFkhjkE3/Z5hCs3etvI2NhHy4kloZrohKGr1Dfm0GXoi456daohqi +uTRbcEEHfred4XsmerxDLcLWgH39ClpAaBWYos23bOkV60s= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..8c1033d49 --- /dev/null +++ b/ot-sample-data/server_data/inbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,45 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +eJx9lEmSo0gQRff0JWS5lVUhBglIqywzJiHEKCZJ7BiCeRIECHGZumpTWYvO7kXH +8nu8b+FuHh/59de334cTJVnf2LKki8LGsVjdZnlHNvTPInIKhux9Y7PaHUF+wD5o +hiCCedts4KsDH2+fSgJ6C0Qg7+AbsokDCOw8bUD88YYRGEXQJMEQayGIonZsoCx8 +vOFsAu7E8nJipcTvGHlk/Vb3uZIeSsW6g+BgCLdWM+ndKVvBcQD9b8rBLsTTv6bA +cdvAnRqmxqpFVvaw2T9lp1rmpZd0mX7AwFupFZr+cHRcWedG4ouHuy+eVOgHT5w9 +Yhju9ryfHxPOZvjm3GtXu1u5Lz3qY72+dUfTq5w3Flj7BE0EnPZTpd42P9eZ/Kvw +EwHnuSqH0WhL1s0qsJB2KV8ZTbdzvZ3LA5k/28dRJ3ih7WyXL0Z8yl16lwpjlxkL +03jIK0GZV1LZ85lJVFqXH/X+3klmWz0elyd3h9be5obQk9lDUcs7cUiXByjJfQtS +Zzbw6oJYhR+nlu+yvPioM4J372fzKJ6uTszvmLvycPU6H8eScKxbarScXtZGv1ih +m3EnUr7nD0Q5tJrvimf3+pgG/pDY+4gi0OIi4KTjWqN5xslqS1Z4dX75xRF4W1C6 +ZpxcnVeLpdc8Rq6nRMqWOL6SDTAKXEifKeWMj1qh8jOhRi0ZWVGiTgSmnhRtPvGT +dtPZc/yUrDzlzlGMjEszYRczzctnXwn5QelFonCZLAQkZiWtO0oHUja3EjPSIr7N +ZaW9ZOxUPUUB7eBOxBGLC936VGpWSBHdmHGYM81LcjanCwrlhoOM3RxYzMN6vDPC +dBTthDNv5e7Vo697aWoDcqFyvyROzvFkBGbu6YQcTJrGtELgdck4Wsqus6wLfVQZ +Wj0c4cu+59uLbx/2wSJEkXNB0jF4UKXT3KKgCPFFncMqkaCnbBOZj5hmrzeDdsD7 +YTuSHKhQeXSpW8oW0+7ugFxaJCSgKcWF6iEaI0eRtxmr2uPMJz25pfSnFOP3o5oB +DtPx22sX72Uz6WmK9uGrt8ys850rgvu32YgHYlRqA+JxsAwE1NrFwOo8pGxHDqBR +ksxJY9I5oxO7uU4MunQonqvMJBnsDvmB/me3V+XL7/iJfImPL7nxGSXsuininwTx +QD+s1983RgeajfOPwbDZfacwhG/rGjTwfZNB2L2jaJrDbAy/R22NHkFVtc8VmUAF +evS3wbevBugzL3NkdWA5tUJzTliysGFQbCo7li+IY9yQ10j1eHOU198nLTsfD4Cj +MH4clh6rOvqw9cYSIKU/27au5i9DyLAbv4dwi1GyYkjboIJZO9V4fB5tCMlDOGCF +L6u+TaPcPM9WLjCHVkA8pXA4CqMouxEbqQwu+d7T9MmMsG0kFqewlmSDbjQbloVj +a+nHn9GJuvB/g0P+BuYZ09A= + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABUj45KirWtrpIE4VL7FLLyhaNuBfEAtOnClSZ/TC24+6Us6KdZDaEficJPqDn +Svrxe4wm2EHMvymI6ps/YRCn1f5ykz1NOo6vinxwlF3Yzebq6+jLXJL29Ip35ZMD +UUwVdsMlLIVYvEiMjFOP8lgbzyQpgFQXomJEI9prONGP9HU= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/server_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..0abb2b160 --- /dev/null +++ b/ot-sample-data/server_data/inbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABlTKDfWpFqvaZljDu6Lx/xW+bovsLG47/5HHqGm1rrVNgrPO3l0FqT5gzIphb +gBKMM9rTzDB+BjLqXUK0b+w3pNJvfHSaMaBXN/JSDkJRsse+4KZnUUZaqM7THy8p +DHQDYHUummu7kOcN+IxiG/6cggdKrA62JVnv5vGzemx6d8U= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/server_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..b39a0ce36 --- /dev/null +++ b/ot-sample-data/server_data/inbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABhA2pFUxf47n1QdAS3jsFy49fC3ubjItH/oyhXviNXLDSQp3uBU+7UjedTsLX +2+wAvKc4P44kBK9Fza7yDnl/hGihN4Vn+KwIf3EQ2/ZmQH4qmMh0aBGz4atMGvBn +AJBy0F9XDA5ibne8ydZHI36Jwjy4bgKwL74N6/E4AVayroM= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/server_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..29f9acca4 --- /dev/null +++ b/ot-sample-data/server_data/inbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,45 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +eJx9VMmSm1gQvDM/oegrYbML1OF2BEgggSSQ2OHG8tj3XfyMf3Vo+zA9c5h3zKrM +WqJeQr/++vb5OP4syjtNPMv8aaerrKyxR11U5N9B6OL1yftOY+8OBP0YOq/qvWBI +62o3vBrw8fYbiUCnggCkzfAG7UJvAFoaVyD8eMMIjCYYkqLRLeAFQT1Wg3j6eAv1 +0LlQhnCYQmEr9zBpuyt7iVMpl1a7gvJpxtDLmCF0bSOOPeg+WTr2JGbXioFu1J4x +VYcSK1bxSg0VNYt6sS5rd5ZFph08c2NtpOkPjwkLVarOx6w1qGymfdebcVbAMNzo +jm4qRJx2OFZSd7e0ZuN9mVEey483HEM/u08rFWxzgioAer2h6IF+2/3cdvKvwE8I +SEuR96NS56yRFGAltVzE0ZxIS7Rzx5RPX9e6FjjScUJHzGvT4LT4UT4RlGTHZdIC +yHYJhkArJSQ7Cplsq8hu1skZsFOIet5rmd37aJobIpQjy4Cr6lxdLlDbpetW5x68 +Iqjkbzxa9GdJI8UnlalSoF3OfBDMi4PWZyMJnnopaUuN7vl85o0nmmWCWee5PqZi +vDoipD0tqTaqgJFYUhp8M4BpbEXMmJ4BJvLw3g74rE0Oj6yuu3aI85TEfdlc3Mex +etqR2ULRInPk1eJMnFdDV6HvYNCJKyPn8msK95K/ZMdq9tskS1UhSNJS8pwh4k4c +UzR8gT5rKC9wx4v3+aAf7Fm99EM9XW3N2udF4pkCjU+2dzqw5kBkAk5yvJbydxHt +w+O8d/z65KRQEGGKsaw0ZmephQnRKk5ZRYgRWtqxApSKyoxc1eR2kWt3Oa5ks6di +BYZPt1Ypj7xwh1T4JaHlyjOYcNdhG34Ys/ogBSkfHNnoeZ7vyJB5OPv4imQaM6M8 +rgvVAmjyIlmcXL0giozKpnOtVIvXdWbdAi57CqWoh6atyr5GJIyEDwxcGqi1In3E +DDC/xjAOqkMgHoMph7aGi9gDnIXRWYYnol86GGHP4sUWX8kwwHaL4IG6VZDTZBEC +gmIMeHrlHTVKrnu5DZBvm9OQe6UQdzfxjoeUB7rUdzM3oMKlkJMrv4TbTTBK4wGk +9y0EQ9ZmJcobJpPk4fkB/UD+c9sb8uV3/IS+2McX3/htJaxuqPwfBzFB12/p7zul +AdVO/0eg36HfaQw61mUJquF9t03VvCNInA7J6H8P6hIRQFHU80aZQAE65FPg21cB +ZE7zFNoUWC6wCtN4YVG1UKal6Q6eNEfVsidYcuCxBXH3uJJKolGvZ+7i95G3KxY4 +txOit90NYpvxWtjndpb3dpSIzpQdzhcwiWLXKpjeHM595ES+VBwzojmi1wOdPfMW +uzmRm79kf44hImqfyP2iBdU6zyE1jZ0VjaauOAGDSkhnPXJlFR6ADAjx7ijkx5/V +8fLp/xYH/Q2betVp + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB1ribAJ4VHstpqY2vcY3Uke05B58aWbW+oGwQRdl+YEjEHojKpkPKtz0x/FfM +4SXMpOGyC9H7Z/S91Pk9kMtrKy1yo0Fvx3CgS+HlRLUWcNkH+6BEFkBSjxTwg3fJ +lHz8uMOwZ54i0El6pgxX3lVViuEJrp9se90baV0X7y31N9I= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/server_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..6b7b68cab --- /dev/null +++ b/ot-sample-data/server_data/inbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABelqG9om8sun2QBwcxPGdg7sILf/Dh3VZAPLpaxhC3xsNzJwChqHVcUuDe9T2 +4PL8JD3l7FByubEJkVdYXo6FpmHyNzCR2BtNkc9agK4cEy2AVP7+V3i/ULKUfr7d +e67lKOJSOD7bIyGhg9JV5RzeYpx/7G4V+13+8B8YnL6dp9I= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..4ae04af3b --- /dev/null +++ b/ot-sample-data/server_data/inbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABahyVg7Dmhmu2KOTeukNiN7VRLSCr5kKKg8Jh7K7rFlznnl4MGDLhgwQvIWpd +nrHlO9cvEO9bu2UkfXHPlGg3oeDJ0Vy9i1MGZqy6RERKLiX4cVwP1g/vfn+Lj8tR +jDx8F2olUjWhCBlyha6W+X8jqgrhP4/O4w38NDiL79fXBT8= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa new file mode 100644 index 000000000..7a9c95f7a --- /dev/null +++ b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa @@ -0,0 +1,364 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +CrQHAAAAgMsVopVl4GB7RSa50z4FOlwNcCHAZIQh1Pzn5qgEL8tW8McImOF1SHAA +wfFNjzk01H4HJEsDkY/adHsDtnagzZDVhSpZHe6UfH2gp2LYFOvxecYG3NhrnMTa +c8xsiW0RcHtRY8i40iLVqkJuCTQFpxy+wtlVHGB+kfY8864vTdwo0cbQvK/GZTPo +njoIDWTrNKdcROaPcOqGj0ZeziGqzyRU/bhR18GEM6hsgEeiYVnQ1GaGs+1615a8 +y2SnAZg7v1jRbZ8BB+PQq/6cw37kHmFNdNOlm2qiJlz1wfaTZw9Y05HTzHr/R0+q +uFM+LzRExtdki85IB8eS4QM5ZH8MvyriuliWwxoUd82mfjkHkYrWttxRs6lMfkdU +QeV8i81ip6yVSm2bWoA4BrZL3ECj11UqsFsVS6XL97+RPKxxLkqAvXaqEVy/O6m7 +2RELq1+sFrtbBffJAn+ux/u6Y8mWXDtnUN5Ni05L/WwQ0Es1cwLGzlobUnI04hS5 +0H7LYtYOA6Wtzckp5ROIwoz5TRIjolRdoipMT0NAmjcSGDBE2/VggiFFhOOiHS0U +KEDBWBEoyUqZEe1ruLlI6uEhj0n54+zp8CVxtWI9gRVlggS+nFhbdPotQPAK23UW +9Ox2Tk+NpUAyjxuu58o3Xa6hPNpKG9TLrXe8JdYish+g6kYbVf/HBwFwRhsRxSRl +o3bDuLfDNyyQGUv+Sg5XwnK94mlAxkdW+ZY4/akXyuEBc3HrZQw07XeuouvNwhte +oE35CwOIcpGKmkwpae/P9L2ozKoVMIUM+SrIxeMWsJJxVgvp3J0E2G4/3jHkyOrM +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABuj26XO5Z/Y9KFCLVrrUW8LtMUgrEI3S+ZCEs521Y7uuyo4Xtd2phjly5uSsr +vdB2EI5m5O5DWrsZPULi+/rQA2/8oOWcBGiDCY9HtjZI6gX2KsTuSP4kVYv4gvUO +Fch0yJ93fDtAj+jMfKFFiKGPV/nGGSW8IZEauDJS+vNPc0M= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 new file mode 100644 index 000000000..7a9c95f7a --- /dev/null +++ b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.0 @@ -0,0 +1,364 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +CrQHAAAAgMsVopVl4GB7RSa50z4FOlwNcCHAZIQh1Pzn5qgEL8tW8McImOF1SHAA +wfFNjzk01H4HJEsDkY/adHsDtnagzZDVhSpZHe6UfH2gp2LYFOvxecYG3NhrnMTa +c8xsiW0RcHtRY8i40iLVqkJuCTQFpxy+wtlVHGB+kfY8864vTdwo0cbQvK/GZTPo +njoIDWTrNKdcROaPcOqGj0ZeziGqzyRU/bhR18GEM6hsgEeiYVnQ1GaGs+1615a8 +y2SnAZg7v1jRbZ8BB+PQq/6cw37kHmFNdNOlm2qiJlz1wfaTZw9Y05HTzHr/R0+q +uFM+LzRExtdki85IB8eS4QM5ZH8MvyriuliWwxoUd82mfjkHkYrWttxRs6lMfkdU +QeV8i81ip6yVSm2bWoA4BrZL3ECj11UqsFsVS6XL97+RPKxxLkqAvXaqEVy/O6m7 +2RELq1+sFrtbBffJAn+ux/u6Y8mWXDtnUN5Ni05L/WwQ0Es1cwLGzlobUnI04hS5 +0H7LYtYOA6Wtzckp5ROIwoz5TRIjolRdoipMT0NAmjcSGDBE2/VggiFFhOOiHS0U +KEDBWBEoyUqZEe1ruLlI6uEhj0n54+zp8CVxtWI9gRVlggS+nFhbdPotQPAK23UW +9Ox2Tk+NpUAyjxuu58o3Xa6hPNpKG9TLrXe8JdYish+g6kYbVf/HBwFwRhsRxSRl +o3bDuLfDNyyQGUv+Sg5XwnK94mlAxkdW+ZY4/akXyuEBc3HrZQw07XeuouvNwhte +oE35CwOIcpGKmkwpae/P9L2ozKoVMIUM+SrIxeMWsJJxVgvp3J0E2G4/3jHkyOrM +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 + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABuj26XO5Z/Y9KFCLVrrUW8LtMUgrEI3S+ZCEs521Y7uuyo4Xtd2phjly5uSsr +vdB2EI5m5O5DWrsZPULi+/rQA2/8oOWcBGiDCY9HtjZI6gX2KsTuSP4kVYv4gvUO +Fch0yJ93fDtAj+jMfKFFiKGPV/nGGSW8IZEauDJS+vNPc0M= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC new file mode 100644 index 000000000..66b9a972c --- /dev/null +++ b/ot-sample-data/server_data/mints/8dlRJnGCjqU5jw7bZaw2AF112UrCZiFfBS9CnJrMWSp/lV6acfWoWKB7BcuIXCzvS4aSiqUOjlGgVTyepg1aAsa.PUBLIC @@ -0,0 +1,134 @@ +-----BEGIN SIGNED MINT----- +Hash: SAMY + + + + + + +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= + + + +eJwVkDmSEEAIRROjOQ1L00AwAetBNLCsMpjEc3hl2wSKAv6H9/H3289P+fj6dOGy +ZhgDRzrtF+rSlISjSfoSHrM4gckClxdSZ3uFapXasYsgOqWjj654bLg8EdEZfX2R +QoywtzrYN/tcPaYWwG1jEqUX4eoElb/xOSVPqbOaOlHUrw0dL7Zs7mm91WEjDLHs +RbqFB5haDoEcD3s2ISuiqnvXxrtxwaY78+keaT4arkLDH19/vv/+9eOT0nl0GVhp +VJgW1tDy2b56KDLShLUJ8OnBoL3IYebqGnvnyDJeB+lrdUd9R/F/pjJbAgO9BpQh +pB1ya5HQINFLdt4fN9wBTNz4YR4EzVjbUD5hAOOn1DS9cB4DOTNJlnPrytlqeK+q +ss/GPLYVgf7uET4jdEkiKWotyodXIUswkZnPg7zx8Q+If3mm + + + +eJwVkTmOEEAMBBOifY3PGTvYwOdDIEBIBJvwDr7MkFhy4nZVf/z99vNTP74+ZwY2 +jfBgNr9BAI21eGfwGJinCNqeZI9LShwMBctHQtYEwE5z4EVTNpe8FFt6M1XS197V +7O40hKQGot3Q6C7eY3aZZRXZEVkuC2UkVmM3QR7EGC3hS4MTSz0xAA5a7HlabQTy +BcUBN5Y8IJekwXt1UuJQGT6ABj2qGnLOPS+3yd/zTNqxH19/vv/+9eMTdVak0jwc +D5nooMxD9RuLli49BXeA71yT56eSDAu8SLBOh82lusUF594mZia0gHYqJ39sh02X +Vz3gpc15CjVhx2HW3On4Kgy9Ro6T8sMuP3sRVQ5lOaaTPIHlbwnuuT1gGYEAVcPD +Gf8R6rVl06gYejF6Mu2ZIwIPDE9d1V5+78Oz3tIXBD7+ATd5eKM= + + + +eJwNkTvSFTAIRhuruxrehOIvgMBCtHCcsbBxG67ZdBnClxwOn3/ffn7p589XQCOu +7Cbw1Tx1KMMYkCZa8OSR5LxBUBndgG4rIYy3F1qjdqRT6GpE3DrHPKVK8Jog0fTg +pJFfyxwNyT5qGOc9IWXUsKl7dkBxoqqMee00FbcN1kVvVEBhOlHKMVfGd1iDu+Iu +Meg7l6IYHjLxczwhYID4juFGQoaA5MtiKwDuzOOQpDT//Pn7/fevH18sYlFmXRV5 +wVnOm3iph335zCN6lLgcfFEqOqHjsiOSDJRJJpajv8ytLeeIVe6zDz5yUTH1bNvr +UqP05JMVvu9bT6enepBfTkqfifsWYV4iPkhH+ZLBpYq6UX6eH41166uwryD5xLz7 +NQ8VHRhEs8iJw9zuOmy8rySnnrC0FHtUm/S2h6BA9PkPlSV4wA== + + + +eJwVkLmNXEEMRB1ZEw3J5mmM8ZtHICtDECBjHcWhlMVBoz3iVdV7/fvx6y2v73eh +WeBc88tFTfehyiMcEXrKrjazlMkFGLxX7LDZgXEyY6imBL2MxsRXkD1OwHWKR0hq +BvYW3Z7JkdOtxFmMUDkF3MnyyFGIyhSVK25izNSNnAlCCiCJ8oBsUN0HCF2jVGYs +z0HCAy1S0E9JDCfysB7f2sezA2+YEeIOkEMG+/TxEKDdjBhor++/X39+/3wbPrBo +U+ghkbRDbibdrioZ8cHd0t0RuuGseQm52/rk3d8RGT4c4nG7T99tgsctqiDRGw+R +mBVAa8X0icFkv6Ct6Qsa0o/mXORK655dErmFJHWqGGZDhknC5DixS0hlIdMI5ho0 +n8Tw6nhqrJSqYtEfOdEKO/AJg7NXwvRIPdudcWUYJb7+A+vbeN0= + + + +eJwVkTmSEEAIRROjOQ37EkzQ0HAQDSyrDCbxHF7ZNmR7/wMff7/9/NSPr8/cIVBU +4wJjWdgqG2DEUwmJLZl17tWUWKOmPo06VHgkA4kO9qWz6g11faN6EiZF6u6LzDpN +UAPsRoeeWFZ4GtBYDEt0SWkP2mDqXXi1fl2AcDs1eQO806fYcecAqT2pk4PS1561 +FHwK9pZgOd01HAAmKrOK1BOyYWfFAbiH00gW79J1O1IfX3++//7141PTcgofh+qc +YSbt2sOrTaf4zbOzHmQXbJfd4UIOpxtB4sdgnHk2hbDSPSsYiD24LsiY0yPn/5xS +slDSTZvIxW2K2bn4AJXvAWSsjuEt5mOmIkeBlwPflaUZtxrmBmVCH7xs+TZsH7mx +vuXptHhgYeR5QYNUDfaDIEJhBGz6+PI8CRnyBPXHP4eud+4= + + + +eJwNkTuyFUAIRBOju5ph+Acv4DMsRAPLKgMT1+GWZUJguunD59+3n1/8+fPVbZ4q +6kXuUOZuTxm9uPk1NxrCffrY0Y2ADrTa6zG2waIplZvVMn19OkIwrbCM+RHolhB9 +5vKZVhVgwU5PwbOttYTnAb2+IzOm1m9Cd+rWjJCkZfoBjvOK4FRRaz6iSvUzcFen +dr1dFVIjT8bxQ4gSwVxmFo1XSbGHEW8a8Ei6X6G6inDm8+fv99+/fnypcCvzuFzV +JB+cCRN4ja+SlkhS8KEumGUUHOaTgRnL4AgdfKoXHyiWoBjlwSlHJFRJfm9wc4XE +7cFoxWu0dlVSyPFCViLB6jjKyN5BXprIlgwcFpDes98nTnhLLWzY7tiJVDhOZ5w3 +rZGmlktsnts3VyCm2Et6KvxhcsaIVL1ayrnjsQ/f5z+s43nq + + + +eJwVkTmSEEAIRROjOQ00zRZMwNIcRAPLKoNJPIdXFklZ/v+Pj7/ffn7yx9fnIB2A +fHxksiQSrDJuWrxsfZlJpoHCwHxPd7AKPbTDGFHgfna06wKoNkP4bptl5SM+e5E0 +6tVwVaM7WBII01VLQVS9SEJA1q2AXTPiT4vhgLx3sO3ksSZMUrBYEReU4ajVbAl3 +RUm4VGv3edWTtq6KOzPeEOD5QhOvxTmKD0HvjgzBsZh8+fH15/vvXz8+X6zW6fLd +5TX9lGXMhkG6Ta8mIQ+IzutKTSMvE1R/We2XJ+4C1KVjxOKJIlMvb/kwLVAUirvt +tor6f9jPLB+a4J6O9SUlBzYNkd3/VXMVA3EdYT9EmIMv+LhSFbKa0aVNZby6mpcX +PG1scDyn9pHHZjHbFfbTihuaq5ehiTsn6JDgyqzPsvfxDw9eeeQ= + + + +eJwV0DmOEDAMBdCGak4T73ExhePlIFAgJIppOAdXxjRJFEXOf//j77efn/Lx9Zlq +9rwoFO5TdubCUC1ymRaHwEzqsAFoK8GC8ox3OLnSjAMPn1swZ4eAp7IJgh66FOic +IhFzbIhSwxrQPY+dpJfTlEanTZKukD2EVABkfy8b3rV+wwimSjF3c0op7s6D+7AH +4gaVAWnpXnAzoESxvSbp6JJkyXRXSCHtm/UcL6y2WixvDX18/fn++9ePz/0HXl65 +ptUUt5qLlHEaS+vA6FEkkZmglB2pqPu74VKcdDzyRYCK/1/WUstc1AItzBWfs9FV +qpM+IqDz0nCjCuFdCmCzXOkh1Dwgfd/6XIAGasvWqb43m2OjQ20p/WAkZxknNrYi +b1xrdtvKefRuK5NZ+NAJz9mj3hfLWp6JX3F9+kSexf34B7LoeTo= + + + +eJwNkTvSFjAIRRurbzXhFaD4C15ZiBaOMxY2rsMtS5cEwj338vn37eeXfP58PQgd +bVEhhzgaCfZs3BEtVePe+zqPlRkh4YuAIbIiADnCHRUH0/wduw7I+dpN0arD3js7 +lDrn9PZM023gA/cSvBeN1OxNOhbEkDRY3ndEVq6PizfHMoBr8c3D9wb7tkivGCvT +hL46Egyzt2zDKEC5iM3sGLkD540H6Jv9NnKFJ5KOXrXQFPr8+fv9968fX9RTSFm6 +FuhZ3DohC6XNjevVZl28IEENKWmMPY29rLzxOs5yr5uiXmxduvtuVwswUnA/5xKA +dbdIbzPqTbjOgA9KtR3dsqvaDTIYABt1M61dzUVPZHwcEdUL1/tOR17iSRcuJ+66 +6SCuU2fXJJyrSXA8NkvK2Q3RyUey+ie3PzzWZcFk8qZ7Pv8BM655nw== + + + +eJwVUTmSGDAIa1Lta7hsoNgCczwkKTKZSbFNvpE3h7jBM0hIiI+/335+no+vT6fR +Iy5Y4wUNkAf0jdZRBWWfUJBr7fuaTXDAw+9hIufkhgItCRdSqkadCbtp7jE5UHmx +ibTxJZdLdcaYikW8sbufolKo0mcaUO8qUXemqnIUIY4n4XWG8VeHlhyIHY9krLQn +yyv72baDOxvDWtGrMrZqevoDIulzsP9LpB4IPS18+N35+Prz/fevH58cwC6c5122 +wp3F1puHGcCupztNtQLhrKA9Mn2nU2ken9K4TNcj6rrxBoDphJLPUHCp4tN1ouk9 +doz35FA72/SNnpdgInybatn98Cb0AvsW8Jjk+g/B7FztDQtCDP67APd5HrhgeLFo +gHtl1sve0lllF3Yixs1eQMQDCPzNbK406SrBlpKL/PgHlt15nQ== + + + +-----BEGIN MINT SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABpPwb6mddbpB4vMCkl0q6pLaqqkMqUcgaRH7j57lsr9jA8WBuU+4typdOuznD +OTGilYFYaVLAmTddnj70YQ5ZA/5Y1939Uo0heWxs1AnlPKECsc3XG30QveaukqQl +OKACy0xj2hxFVlCflRJfq217D598VVrjV0/IQ6eSEbisgCk= +-----END MINT SIGNATURE----- + diff --git a/ot-sample-data/server_data/notaryServer.xml b/ot-sample-data/server_data/notaryServer.xml new file mode 100755 index 000000000..45a968dab --- /dev/null +++ b/ot-sample-data/server_data/notaryServer.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/ot-sample-data/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..62dac8de6 --- /dev/null +++ b/ot-sample-data/server_data/nymbox/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB1ZsPicG+W2fRjhaoKzTmoVkTTHWQIuMuOhXxAJ84a90CJ/ET2o4YiqcdWi7g +N4DDEX8M+IjIeIw1c/+JNkC1VsjjvOhmVGf1SJA79oQdTdexaQiauN823QKl4wHq +ypAZhX1aXP3rTXAIFodprfREPmmC0d+19mieHiF2juHiaeU= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/server_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..ca5408a51 --- /dev/null +++ b/ot-sample-data/server_data/nymbox/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABZvJS+EzcbRM2vCCIR2fPBq/YkZJJUUVr4YStrmzSS2IepUOsnDxlpWi9p+nl +TrR2fAAr9s+jq69S2T3QDi6HCkAVGqmSNBCrVtx+e3hURLMDsuI5Fw1swtUnRUtA +HNM3iBnWffBUA9XmuT/NbUOFEdeWT1WfLHZMdlYXlvQBSPg= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..d486552f7 --- /dev/null +++ b/ot-sample-data/server_data/nyms/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,30 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJy1l81ugkAUhfc8QxeGB6gMys9NRNPSaLCpTRVqwo7qtMHAWIZBLI/cpyik2sSk +XTVnPeH7QuacezPa59Vocsyz3oHLMt0LT2fXhj4Za9roMaxKLi8PtJ74yIM7Tw/Z +06CO1288jPZJdBCUs6wJ7i0lrDoIs+bYyNkicAuVPOsdTPKi4qVaVLnWa6kttKO0 +vE0lJRdq+XPu6Ybe//sTd5st52Lm74rI2tXOS5zU5s2UMTOSfpxOX29X5Iu5fFiv +3n+nm8aJr2QiymSj2p/7l+OS0wnsAdwwhBssuMGGGxy4wYUbCG1w4H1wGNpA8CwR +vA8E7zTB5xKZcAM+S/A+uKdOp2VZ8S1o+WDgQyTcQsJtJNxBwl0kHBnF82bBwBkS +bgLhhLxQQuackA0l5Gwh5FQkaFqQOSdkQ89rrv/9khxrX85Lo+k= + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABZTdqkwVBPjbN/7pjUi4l3K7G3NUJbrBAIrdDuNYXeA0W53DM72tDBUNLSfzF +xCSer0Qg1pJlkZs3CUGBW0mgIj8AvhgTRPcKgpGQKgJnBKXwRXyDEotbCYfq136f +kTagFp1XrjK69HjqzM44vTiqL4NFxlJHNZbbx04lo352+ho= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/server_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/server_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..a84834a6f --- /dev/null +++ b/ot-sample-data/server_data/nyms/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,29 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJy11d1ugjAUwPH73uwVSB9g8lWBRDSVBTM2NVHINu8QugUCdbZ0DF9srzeMzsRk +u1rO9Ul//7TJSdHXzWjyWVfaBxOy2HEfG7c6nowRGi1jJZm4HiCNd/X9nY+reUwX +b1biOdt2Fkb05aEq42eadWTaDaPsMU/svCB0R+0DPmKC7RWTzULVSOvVHj0qvZcp +IRhvVpe5j3U8+PuIm1eriM+Ccp+QsnW2m7Q1aWgYZiKCTRG+TtdewCMxf1q//66T +M9+IlMs0a/q7/Stx7fjY1B0XvOBBF1zwV3IN8IIJXrDACzZ4gYAXhqdCIaViOdCy +weAeIP6zYjC4AYmbkLgFiduQOIHEz0s0OH3LY/QNNr568g== + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABeE6QxLBs6efhHez0bwVAToRYBXoK+n4T/bRkCOLnGEsW7c1gjJZbax3zwv/Q +kaaS8jqDRGlsiK3zjJhJYQ3vyYFKHGwdF9vdz5vmFnjIMt5qLP5/6HTCzDj6uvwt +288uhGpnfUEFD1GVZJUhSdezEe32NgE0y292a4nxqCbxcgY= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C b/ot-sample-data/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C new file mode 100755 index 000000000..c8dc82ded --- /dev/null +++ b/ot-sample-data/server_data/nyms/pc23gUqPu9Bk1Vl0K5lz3Jp1MYIfjGIBXVWDp1gba9C @@ -0,0 +1,26 @@ +-----BEGIN SIGNED FILE----- +Hash: SAMY + + + + + + +eJzjyrOxr8jNUShLLSrOzM+zVTLUM1Cyt+PisvEPKS1OLUKV4FLIq8z1dLFVKkg2 +Mk4PLQwotXTKNgzLMfA2zaky9iow9I30TMty93SKCAt3KTBMT0q0dFYCGaYPMc2O +CwCC8SGr + + + +-----BEGIN FILE SIGNATURE----- +Version: Open Transactions 0.64 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABHxjvdOyOINl3wZBb0jStA+SQKhLy7naabO6kRCORz0fdab2KIqcORCA5ghQ6 +wGAxhxLzZdzq+Sq9F60sou1m00NPaPcpiPBQ3Fu68YVHgurpXY+BBSRK5tyh3pe+ +k2Y4ho+aZeF92i+ogDEH5uv3Kt1/DfMtWm4gQvYPOqA8HVc= +-----END FILE SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl b/ot-sample-data/server_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl new file mode 100644 index 000000000..f1d96a4ef --- /dev/null +++ b/ot-sample-data/server_data/outbox/1N1dUVjNv4suu0hRH8OWUJrMWvNCfiCFCr6dX4jessl @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.72 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABzdPRAZ+A12kdNegJpLWtZjLH5iWAc9V/kTKvknc9EZuIz+iIOwMWZ9tTwCVz +ZN6P2P/yJTbYOYoTjTPlbCrdz2H/AQgXIykvlt6CBeU5nq7zJ0JEZVktWCkzPpyq +RYeDf2t4QU+T4tJyLPCyXilvsZBcs91NZEt3aXczJhVflbw= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh b/ot-sample-data/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh new file mode 100644 index 000000000..9e43daa65 --- /dev/null +++ b/ot-sample-data/server_data/outbox/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABze9Nr39PtpNow4ToWZxpUFGWu10SEyg47swjER2k1kYU3OEpMaEc3PpZ/s0+ ++k7pSQGlm2Yg0P0GD2ohQxA6reSbWwqBW7zWgTNZo6/h562shOJifzTGxWcxgIpW +C8aPweH6nnujxcDO3zllinDqje98SXTug4VBtRl/nZpoSw4= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 b/ot-sample-data/server_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 new file mode 100644 index 000000000..40830debf --- /dev/null +++ b/ot-sample-data/server_data/outbox/7BFSwbMVNfmV7AkYzpWEUglD2UIdhDExU0o2fp4ndu1 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB0tfKtfxtY/TqO0aQd4s2P2WocbMdbUkmh5C8/WWyKEnQzY0M7J8rZOSU2+Dj +dSr1xw2LSVTsYI0MPSKetGyTvghgJB4kBRSWSK7VAhLzENvoIe5d/DsBSyLwDPPX +TjhF4H3p6mKC0XxePjMehwQdDGTmnNBXGPWQ+mZhBn+TMZk= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 b/ot-sample-data/server_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 new file mode 100644 index 000000000..999bdc2db --- /dev/null +++ b/ot-sample-data/server_data/outbox/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3 @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABZx5rt/Ngz7waWq08Oz8t/UyCTUNqJPYSiyxXs5K2/ibTVhtx9f4YTf/AD6tS +//+cNZUIUzBDPUyJppR5KLZoY7gGpI9eo1emYlJEmgvSNN+MWYUq1h1JwkZKRosX +l2/S3YqpPOStukWF23VD2kWLbQ3FENtlaMYh2fMIcahG6IE= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS b/ot-sample-data/server_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS new file mode 100644 index 000000000..75f7a6a93 --- /dev/null +++ b/ot-sample-data/server_data/outbox/dTdYH5UF9vdFNSAPV7XrmsJBR5Z7Rrl5b78UTmg83TS @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABIPSPHapiYN3iKdXkSDzfy8e6plWgpyt2yTV4f7ztIgqEmulJH/AxBpWS/Srw +4R+C2Q5A9pVrOiMn2XQ88u/XK+l6oqV/pFKJ69zHWsA2Y6rrm9lvVbueLpo7Kp8d +SD51jIqMkglq80fVWQyTkCl1fF9OBHBd9GzL6Pfp5QDY860= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y b/ot-sample-data/server_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y new file mode 100644 index 000000000..816c84d31 --- /dev/null +++ b/ot-sample-data/server_data/outbox/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABD2ZXWueBdomuMZYO579eCE+6Yd6tmgDQWxIBkfBUo0+jFCdUCPBx3+mjg50k +QSXFZnb9uMqYyEBYPkS8BjdKp3KvqPwbc1T+i6jdUuBlqxjpfeGlyO3rCUDITeGG +RW0QcJCQPNkhRnwECXsx3Gy/OGX6rG5b5d2ERhZUSUgaJqA= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV b/ot-sample-data/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV new file mode 100644 index 000000000..6262e79d6 --- /dev/null +++ b/ot-sample-data/server_data/outbox/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV @@ -0,0 +1,19 @@ +-----BEGIN SIGNED LEDGER----- +Hash: SAMY + + + + +-----BEGIN LEDGER SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABDSy8YqquFfr60I0HH7zqCq1AxwCPqAhTR7S4siyu7PNHuWPeJCiTQFlyjsQh +Ux0uhsHpM2RFRNgot0CKGt5us1ohDtHW2LyH6pNftF+V5XxSEmGk4+WpWY5ZdIX0 +oqWMKa0mAG6ERZOrRDHz+mTni2E0FXTB8aQvMxViQ0U6Jh8= +-----END LEDGER SIGNATURE----- + diff --git a/ot-sample-data/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..b285f0ff4 --- /dev/null +++ b/ot-sample-data/server_data/pubkeys/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZThQMTg3aWkvanpuZ3Z6QmV1QisvYTJXMApQ +UFNKNVd0TTFJdTdMWEc1REp2Ly80ekJuUVJqQzd5TXd4Q3VwdFJwZ2JyTHpNbTdm +YklFcXNFMDgvQW41OGtUCjYxK0JXRHpyUjBaVnZBeDNncUdtUXEybWtsZVpsb2Fv +dXE4UXRwZHJoVEQwM2VxRDk5cVBRMHdRTWdHRy8rMFAKOEhsVHJtOGY1VFFtVkVu +VHVRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data/server_data/pubkeys/TESTPUBKEY.txt b/ot-sample-data/server_data/pubkeys/TESTPUBKEY.txt new file mode 100755 index 000000000..c28274c78 --- /dev/null +++ b/ot-sample-data/server_data/pubkeys/TESTPUBKEY.txt @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZ0E2TDkwNzRNN2dzYVVtTE5aVy9aeXFBeApT +QWJyYnhDU2hYMC94S1Q4SzFiakQ5cjJkR29jdEFhRlFPTGgvaFVNSXkyQ1JBVXlB +enZpTWJrWE9BY1orTnAxCkNncXdTRUtZclRaUURITCtqNXphd2xjZ0oreGtPZlc0 +bng1RmV6YzFxU3g5TVJhUzhHdXhvbmdndUpNOWhyb1MKdzdHZzZua3RpdlZwVnJh +WTh3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data/server_data/pubkeys/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/server_data/pubkeys/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..1388ab656 --- /dev/null +++ b/ot-sample-data/server_data/pubkeys/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,8 @@ +-----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEUXhTSVI0K0lVVlp0YXJvQzR3a0lwN2lqWApI +OHN4U01QWjlRbVY1eDdDbFBKUEppZUl3dlBHdFFlSVd1ekZKQndFUGtXNEVRaUZy +N28wYlo4SFMzZldlTG42CkRNdVdsazJKeWtLV3h6Q0dTeFROZlJLeENxVkxzMmlG +RVZvVW05cWZEODBzNi9tTVhuM00yMDIzd1I1dFlpMnEKUzdseldXNVI1TS9vSFRF +bmtRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +-----END PUBLIC KEY----- diff --git a/ot-sample-data/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success b/ot-sample-data/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success new file mode 100644 index 000000000..8e99723ea --- /dev/null +++ b/ot-sample-data/server_data/receipts/2AfeY3zyTdKk2Y14FAZoNZBk8skKRYea6ODXoMP80Hh.success @@ -0,0 +1,79 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6GW2g1Kck5hljZrMDDJh5HsxL9Cu3T5X63lLdXGVm +xB9S/hn5JfD3f/74GgwvysbJlkWD506ORRs2zTry1TjJDq//yACkaHp+O9m0fgeA +v4o5bU7zq08/P6KZieqoTVJ7jt67aTt/AKfpPV+mdzCp2m6r00f+b2Qeo3aKkrno +WmNpPj9Q+IJ+CdJxTUeZ+/wgH7WltCJbDu653Ig4jDaUFhAEdUc2LISMsSm2VUbd +t/u3bpl+qvoExXJ3MBeKqRCvhtVzfWBKj+h3OStFmQk8n+uRPI4o9q3Kxq6hk6Rb +2vlLjNJZeseOl/NQK/SO4AIddkbIVORUqdY9jS5XLuh0k4Sl59cJul+k73XRWmmW +junbAqf774Gi5ivl8wP+OH3/MuzXpO9Aquy1Sy52V3UuxhObcLfiDk8D2Mj3R27L +skp3DsU/bgVvahGDqxa5Y9j+TFueCKfLADhzrJTcM/Qf5SqhlFNYs2AETOzdX8aT +W/y7UbJozZvMgF8aCM1Yf4sRvZLifCV0PKYA+7lumzIHrBcdEUabd7qclGe+08oU +PuesXCIk0Dd7EOabAw80jVTSvaddGJ0eg9XrCWDeYBahxcoeplCi4Jmzx3GUtHCU +QCjo1FRobLWrUXgdrJdmjJrxcG5QYwfyBZxXJL8CoaNR5+DGlfXEx3kacGAHDtwY +37QwaLN1kxSmGKTDYwxCLmpp53V1i0T+qPzqyTSPBki5xmpno40KXqtJFS+4OjsT +PcLkAlaZe5GBjhI7yuxKr7JsYVWzaI7RY6/1ZUSGkw5I+QMbqCq2XBzZDkrqcbVh +E6XSl7tDU4PW1Xu6gj4Lvmz0BS6Ln4NswKEEVlC1lVQU4IbOccRrKmKaIudrz8zu ++9IDtr4mCW+Dm0+HUgGqBePmE1IU/uLBM4KMJFoHhCZea0DR8sxuZgyrx4IMyqvP +D+aQdctgJxQOX7gW2TY0dm9eEBuT9to1sdRxp3Sd4P7uyhcFBDUjaJrMXSfkaZG4 +YJY+B2Zj3juKECzTec1o9ybqV0I8s3w2quO4KzeFEYplCvpxPQD9VVnOzdh87Byk +YRdgq9VhCPgcM7eQdlPTdxuNHnYnambYe0Ohr9V+gY/7nkDn16FcAHBzbm8dJY9E +bMRvQ8rLHu8SdT3PkF5M+DgGZ3uoJJdDRYLWoZrmimMF9wGTXudjCoH7dS30qIZw +vnVqhuQTd4l7DQM5eZLku0ms6VNy8myhGdHZ5hljIsUk91ss3G47XhgmAPdQ3PkR +DWPJsyEWVsHxVdRIsp1WStlvbIPy8FkhnpDer/hsJNTjNfu+9So9ZNz0zARuwWYa +Ot2xTVAhszYhZ4F+M6CyQkadydDzJ6SBp2JSD7Wi2xWzzYHHWTmuHAVdWWkBLFe8 +eFrJ8sIUptGehUW9wmrstAMEegWSrcXlkUkMHof1RvlBvq8lFkHULEH3jEE8DZDo +z0/gL+g3SnztvJH6HfiF0b/D+Qe0ace1+J+Y9tJxerP12+nap+3J+R9tpxP8JwFH +ANs1Xyj+dnrOc/8NgvJifi7xn0nXQEJa19321qxpnY7QV4U/fq0AbUVVAO8KNLOq +XD5UyGrPjO89oMBit+tSedPNrd8ttJauXetX9dlU5xkLloNVcnKFJWZ7JdwGMC// +yAh70JJ2nvAYTEqSpfKuf5xJyL4e70chvMRp6nCZrCcabNnjIjaWL9wbeqrSiwdU +hJME/VUzRSS4M+i6CPK1NKqbknt0Sjz5Gup4UcSIAYHPzAX+/Gkgb/z/3/a7fcA/ +juNLrQ== + + + +eJxllNmuozgQQN+Zn4jua9TNlkBy1WkJCBAgISwhQN5YHHbMvv3k/NIk3dLMVY/f +7KpTcpWtg/z917f3YnlRUlemJKr8cXUzGNVkuJt0VVfSjb/8ykBOXht/rkzm4iLI +j6QDxaqbK3D48DomCEDVSa8jAwQgqboPZNV2Xte3r2iQlXDMQRiBApTvSNd4ZesF +XQJLtS8OHwRGEW8ANANopOPhYxfmhlyKXFpb23Sk/Yc3EoyA44TVcI9EeLLmnivl +5mKb1Yvr299UFRBkZNVav2cz/J5jyjZfSLnCL670TEWJde72scIj39tzL+rZwOJ1 +bdiX3RsmmCdwyWW+hUpGuPhGYB5QfbDZrs0UwwUedT068KLtsFP87gB+QV/7pDTA +EzSgDMAN/tuQV7xTDh/Yx+rne2Jfk34iQJ7yrCWuMGMsIwfLxswke6+pKUUk4q1j +DaOqLI/XH8JTrzxZjy0r3pTDdT3OWLLweyTEA5JECxPg56DEdwNtTdhIG1t8Mdpn +4B4NWg19vbnkAeHrwn4t05Fms9NpUNounBYSuRI83OBFCGme2UxpvoijfYSVkaVX +djO2on0vLqwLe9lsvKN30YWFLbhAIAoXEwwAG8Q3joZCnQufm6FDFct48bFQE6iK +gHrss2Z3zlplosK4zXcaKZ4seo7MPaqK1KY9xaaOqHus3jM7CTAGdV+Wy1Yzejsl +RLC1ZGwYultE+ndud/Hjrr5hRTHd+Opid7ER9qnzDAESzWjTXJesozObT/ugVJ3E +P2Y0q/WNbXG2hzvU9ew6GQcwYD5d3el43t0Y0hVnI4JakPie+aLeDm1nXsfzjuxa +w8aXgXxodbkpUFwcmAA1BTohUqNmm6mepvg0zLc7ejQpjOMQUjYyMZDbid09Zgwk +gE/d1p2Au1XkYGsWlVi7CgYNIezFfB2IrdVcuTDAPPZKTE9shzhB6bOPI0WfmkfW +szt6Gu7c/UGAc2pnnsCfMCE73u9nx6z3pmymO7HLT/XMnkuhhj7VIbSnr+M0HJXZ +NB27LtFqDkJ7Zp4x6FFrS2pL/3hWqZVVUGAm3n528EEoleYnQRnQpYqcjg1l1uvC +p+k7AUSvr/poz0+DGuvklNqRW3KQ6nExK0f9fGvMNSfoHYqi8IbigbNjkVlz0lw/ +HJAf6B+f/H3yssJP5Itj/pTLL+kwN8vgf2vmDpr2pYbP1bUC5er2nyzaFfadxjyE +g8XbJJ+ruOuqTxSNki7u/e8BLFAB5DkcX8wActCg7wrfvlZAxyRLkFcFhlUp6onN +zrCmQFdI4fn1VqkgtKxv7B5cPpWKjAU0MUdxfMZNQ1WKe28U5WnBuzpFYhkjwkup +x9WlgPkAIoW086j1rtFUt5E+xzDUmJmsEjbjB9TZbtTzmSpkWNRUoynrLTKEjxSd ++JLMIohNpmInx0hAZxcbpbFxQ8FmXWHUXHuyfVNSpcPvAfLq/9385/iQfwAcjOTi + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABjwZHsqrKPWX7LVYXC6sroTDXlR8OT3Gblk8GRW4qwketUTavFAS7rLmmmBTp +V6WIcuVpLTxwvyvfp5XlIjnCHQ9i4Pw+78gEDRSqYa8QgKUbpCK8+D4doavIz4vc +qcAbf7XvfFlMnBNGG3zzyy+VaG9CmLGo3Qc72aFT+UQs5wA= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success b/ot-sample-data/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success new file mode 100644 index 000000000..a840d4a32 --- /dev/null +++ b/ot-sample-data/server_data/receipts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV.success @@ -0,0 +1,303 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcnOo8gShfcs7jNYtUXdOMEYKHWVxGAwYDC2GWx2DImZkxnM89wHvXaXWv2r +bq4iM84JZYRSX2L//c8fnyUcFNXc3FTFPEgb+8qbN1601bO5Ue2D8bcCOwZ9+n1z +440Hhv2VDbDaDK8G/vgWDHYX1H0QDRmqb0PwzsB6+IZt+nc89m9BVNRoLmH8/Ccz +/Gswx+rHt+1HDbsJdqr04xsbl1etVsS8deh8ZkI/mEleBoB0OtHP5ES4cWKtdYZ3 +a96+sf/laiKSejqtNXJCAdxyq9PlSmkNMB5qkiuqcHc9qQHPMODEtyvpUMVHERrr +4WO2wYWafe8JbQcFzlRzFShXVaeHmp5Vu1yXtVNMlW2HwP1cH32xvvdZfYUJ7GAd +QRv96iaoPvlPvPn5GddXxU8Mai/XNcYXKp4XymFm+XEN0TLN/D3Lp6uiqrrIX9BR +lDphB4+l/bTEiX3hUnKNc05/VZjZeP57oAdaL+00oTiwI+7kszh6kWniAa/BZX7U +iv+yNAFIPhSQxYyzeJsym5sLYMSYZI2uquVpIOZpjPz2ROIsL7pymGlT2xvRaots +BXWSjOjWO3kzdO9Q6RySZBnVXWCPnUF+wnHSmAKoFCmxu5LecFypfAR7Yne46V75 +BMzLz0bJoBKdcfaD02tgDRPd4GO3JjEm98RZRGzL9pTie2e2Vky2dqYndWXzyRUK +rtBhEhzEsc92O/0ZHK0twSoIquYZ+mqIGeoFrLyhZiPXTOcFEKhb1m1RSK/DlMnc +PlG0ixJkDkI77uXWS+Ibp7TRllmogEBNJ+xR4CseyDNUm2RbJMNtHdvzoEcVOTFV +3YSyFo8pdIYCdpyfrp2tbYmbQOxynhNnmp4weHqU+UqfFpjU7t7VNAeE9Ewf7JTk +NU8bAXlbKWlBoZiOIKFgnRbK/UFeUD4qkhlvsWZPPVifaam4nm2OB5l/vgsupeEF +3a8Vl4uaeN8qpeLzL1IrteZoxA44I4lxs5lmOw7L/ZhE7fYQtVJwSboIhifXUsxT +F5rxeJkOrNatN4aOujsKGVv24q1AeSin0MPb61P3wl6aTjVsGHLSfCNF5y4tsZcW +J02gh+ZB5XYo8mt/HAb+oDjReqich88y/HC3W/sYeAcWg/YQXsmyZLS7lF6cgya/ +GxdxO0XPHRnfZXka5MkkhPJEs/iu4ryEtjqCw/nlNUvnY4hxdtBXbDUfmRTO6Xwk +QLuboyqR1PtyTR4ZwQp5aiDriZ43+ZTg615SRUGpgli2Cn5fYb34fuASAcXHE8ed +ds4ex9ByamH3shGXx6NxdCVqvUTqs/dwSAv20Oy1d3uMdSKjgOwwW5YceXvWAZpd +LQAF7WbpiC9gqnpH1y/xPirreypZ1nSf20UAMnsGzH5NAX7082NKYSV0D36IXvjq +mJ6dW/i+nAzlJPSwf4kFqnOEWs132GkQn3xd5IwB62BX60Z4lmYgPbDGcePTMEzE +xR6mlZBrvEmJWdIir+6wv4jf6PE5eUP2J/aF3L8j+2+U87ZzPfyCtwu7/k3b75tz +A+vNF2D3m+2fDMBEVH3Y/H2TDkPznSCe2ZCO4Z8RqggZliWa35YJlrAjPgX++FqA +mLMiw94VeGEsFZM+B0rrPqi7ckp1rdnBS5GbMhlbQ1fcxEuZzlbo3m/V7trjiomX +40SjRB9GjGf9+QSvXR9dWVp8lfuRbbdLfgLFOTEW9Xqg4ACO9bWSF7JiCbcBRCsY +9yYdEQDaGWH77HHxLIaenqxfBamQ3+xBqCzqbDM7AmjmkgBCH2gpVaZlPEY/fs3v +YP7/h/f79LD/AU2IU8I= + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABvd2y+XK7sf1w2Az+T2P9ZaDrh1MwzfjgFcC4y1CMd0tYw4V4z8TlesUFH8tT +Y46F2+7cH9HRpDSR5CBsAAPIeXpwORYlUX46VxMthRBz5T+78SGtoNzNBhyEcZcS +Zq1GE0SZPje7oyliCuCngBFMFU1+JZfaIziAR7q9SJ3GI4s= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/receipts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success b/ot-sample-data/server_data/receipts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success new file mode 100644 index 000000000..5d71f024c --- /dev/null +++ b/ot-sample-data/server_data/receipts/d9TPxsgkl2slYcoDRetwZLCTfTYXMvSQlGBlNDgukb3.success @@ -0,0 +1,80 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ2t1M0+lPiUBZjKDMWCM2TGbeUgm87L9Ku1Tpb63VDdX +mRHxRyp+pb6E/v7PH1+LF2XVPDiqbIqng2tzpsMJrnoxD6orGj8qICUEz28HhzMe +EPRXMaXNYXr16edHOPFhHbZx6kzhO5q20wd0AO/9DN7JuGq7tU6T/N/MNIYtCOOp +6Fpzbj4/MISlvwTpuKSjevr8YJLaPreyUA43slzpKAhXjJNQFLuNQlBIGe+wQnse +jbvTv3Uz+KnqYwzPb4M1s3yFejWikfWOn3vUeKhZKau8791PPZpHISu8VdnYNVwc +d3M7fYkT1rU2kFc1BupH3J3sdFoDXXAz9+Ebi3OtZb42T/lcRfjXBN0v0ve5aO00 +S8f0bYHb/XegsPkq+fxAPg7fvwz7teg7lJ632jOaV1d1Vzyic20tcLtMT5qilYst +GvmQ54AxLkAU1kad+GW8wWSjZFu02PqeeFAT+K19uZ9vhM/Cc6ZcCGfq5oEYnZHy +gJoUbDL5rXurCGrc64hGCGWCL9GWJzOTgPsK+WslyA8yPSelwT1hKr0+ASkyaKUZ +wbPM3KVBMLD1N/1eppLn0ml6UTShfi0xghnkWEGYEpfDaboO7LmZRvIUksz4qAfy +RdttTi4ZQm/GLbKjgk7EMnciETbZMcCnGGjobmca1MWblO2Lsiqijh/Rlz5Y+cBT +d02CsSG3lEe4er6H+i8rbjzp6sv2UbaDuTTh8nKJoyu0iaxqwlwo9ap0Uxi6qOjK +F9gwIKerGHLzliL7XV9bTSf5ft/Pui3wcvUqL4zX2BVRQxY+ZxEW6HHXBXDZ9qRg +VU/iiOtn5oHpTPeSZKWdbXN43e7OJIwMSbUYLGmMYLPTWS8gmsfJGJfP+mUhtRMq +dtlAdPU5tHRhljHZsPjuuWO9kiXUMrdzKdMn75K1wgwidStuIWQQqEurDyH1hkC/ +39URPtc7n3X0fOz00hzok8AVg9YPMiB9gpg1deSs0xFQvnuTjpQGqekV9UX5Hmld +vaee0MQjMCbXDj15a+wZuT6yOrLzAIlrlHLz7gnPmoQOteSnQmBYGGQ6eN+x+NC4 +lTjEJcISlxdyjB2ALUZxPuq63o7gxq/oMTs+2sI02q6ZqfixUS4Yu6KGHtQxRHQe +L5FLFrZBaGBxSivhmMS9HozBtXcpeEny1hzGFuj41u2vAQdGEpi+OwYJgMbFoCQi +l1iqM5/dUaWGVmpWHCvgYoZJ5xhl8znzLQZHI5hZbWKj75hPRfjVRI12wTnIfflq +nMawtMfEMbjUhq6o+HzNjtzlyXRGTuRXFpv59i474ttPcMxbh7s+B6LCV2IHPIQ4 +mcWfwSPVRGBmOuapmyK65gBG5lrDs1Mxbv9o3OLWct2EW83dl9/vygGPC2k9x5MP +0S8JUBdzXeWXmSRVKVa7WTgqzJ1Az8qahaJUohiBTkRD7rHZU+madDqTO3lUJOY0 +lhBoMCnsJstpSyV8X7BLHppyIxI2dz5+Ht2e0fA7ZWqPR/SKzYUHJTMk9sbbHruY +KExBUebD2WbDA5GxAolUQSt+Qn/Bv2HnK/Jm9HfoF+j/TvsfvwDn3mzxJ/e9dARv +WH87XPq0Pbj/wzc4IH/SKCR0zRfavx2e09R/g+G8mJ5z9GfcNbCU1nW3viVLWqcj +/NXgj18bwGtRFdC7A8fzmdmvS3IvDECrm2BEGk8qklAqoizp5TPTCbA69W4Gzo5Z +vsjIk2cxBWcYfLhBktLEFCKcW/SEhdoma4kJK8xIBmIHnldNrp+EtBNrt5tpSR1N +ujIfTT0Veie32KgqBNQOiu5XoHvdrdATCas3LJTmiNpF9kuaoBSdXmuUzSLZApiq +XT9/+iea//9X/u4e9A9Pv2Uw + + + +eJxllNuOozgQhu/Zl4j6Fs1whqQ1PRIkkIYkJOEMd0AM4WgC5hDebt9syYy025r1 +nV31l+svWx/291/fXkuS96q+MtW9Lu9WliHqpri11LO+Ui359CsD+wy7+/vKFE8+ +hv3IEKhW6NmAj7cQiXEMGnQB9S2r0zds1aEQ9d0SiYsajiW4paACNVoiqA3rLoxR +Bmu9rz7eaHIjvASgHUCr7j7e1rfS0Or9Nn/YXD4KURCOtKhQFG232yBTEsncbGut +Pblms+j67reqiWkmtR+XfiMVlFOSB66cGa2hTr6a5HtV8hx311BpFG62iyppYbW0 +DPsavcS3jXWZurQo6a70Y7gzABqD49ZKLN87Dea13Eulvkv7ImJeDuAX6bLPagMk +oAV1DCz4r6GweqV8vJFvq5+vaX1N+okBbSqLrj/DQrTvJZhZs1BpsmCyimyDPpOz +5wFCRWJ9/+arBXRsyUwv1ZUgWbGfBjPGvIBZM2R9vrEtRwyeW+ZHd+cjancjw/A5 +jcGpdxbLvlL14hocDP8QSLHxmNp29k/xM8Eq+SiTZbfXTFa9crmhxebnXo7jcfJJ +uLfv8dWqNHOCJC8Xo2xfyTxXHFgUVp+p6eyrmHl1NWjX8VoTWQ1FTowL1Ew4qTAC +SpVx3ovl/HHfXHII2wdKi4ylI92Zgsu2vnqJ88CSSZfYgys5tGzcgrNwAshiDmu9 +0J/DjdeiKd/WY/S455mhxPes0kIfJdJOWpeNXJJXiC3v5YcpXyBr443GZ4fgcPBM +ly/Ke+goAj144W4jOojJFZqVZDOTTyrZ3bYj70dw52dYnFBne5oFysszl1KSWR3y +mlETsvLSMzjXXG4Xhqk/Jh0G03ZmG55Lzzi+Oz7O1VZWTpiBPzWymuU1pZws3MMv +9mhcWEUrkK/bnSzLLXtbX3w+PRC5uR5JmbaUegIC+6m5kl4/MY5NqqYN3MxM53kU +gxKvOo7kuItpzmceEhrF4ps1XtmkOxNdska4PKc4DepNrG7jocCWhss0BJJLCXlO +39Wo8inGG9VPT33eEcK9B0HHxnKDnt0nJWa4tY0Pz6Llei0IPo8IizxnQEVYKWl7 +VE/0jQtBm0VBHsTcbSr1+0GebsufWJ+bEBBd5BIUMTczUx0pnWU31w/sB/HH336d +LGz4iX3Byp88+cUZ0bIN+TdZHNB2CxHeV+cG1CvrP0Z0K/K7QGFbWL348b5aPDXv +BJFm6N5H32NYEQooSzgukgGUoCVeBb59LUCMWZFhSwVRii7bNEpJA+jkQE/IR8Tp +6O0Ph+GgBiHT8NrJkU1IkmfqAa4E0L3DsEmsRIdFbGJ2XZlBVTPuuDeu6Vw969nz +uIBzZ+FoZaST7nY8k1DCI/pkSB9Eszb7A9oTajQ6Ga/WWGvMZiL3V6QKWRPxQggp +/WpehxY+mT2r9ZGmN6LPO23S87zSffyen6z/n8Z/Tg/7BzPL33U= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABqlUAJoRf7ZWXk4IawyB7GylPGvPidiSfVekEOaXP41wWR4n8XR7i0//Mn6nZ +EL2EZkdo3XunjI5v2vyzAPPmswtYqxzajVrXOjFSctgeHKUVgmX4auZLbQEDOoPg +YHhXzePxEn/w0K4loVxgCACM/oCFWAoIksCgLWhlXO4lYIs= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/receipts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success b/ot-sample-data/server_data/receipts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success new file mode 100644 index 000000000..60bcd1d87 --- /dev/null +++ b/ot-sample-data/server_data/receipts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z.success @@ -0,0 +1,301 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVECPdO4kBLSpOEyeO2b5J8CMZWmvpPrDdcZ1X/X2u6uaI+AlxJs8MpP/9rKY +dtL/52+NNXdc4v7ivHd3tR0Wflhuk8FQF9rrf+XMC+bljqZzOjAvCY0zqW6luSlI +RUkO9smrVnjmBliHSDXxFD8prTmUjtqCc8sjqA9w+Mmdsiw= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/receipts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success b/ot-sample-data/server_data/receipts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success new file mode 100644 index 000000000..39998b868 --- /dev/null +++ b/ot-sample-data/server_data/receipts/qcHaITqTkP3LjQEXT5pmFpDhdvDhY6hgbsMQFDBW85y.success @@ -0,0 +1,78 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +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 + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABnC1NlYDRuSsYHI71/8YXT6wMhQAYV3RxpcTrFX7CsPMt0U4AlI5VuxhAP0c2 +sFR7E5V7KRUiQjo3xKsey0x6lbHNIfyKZs2JjyujELcQ5NP5Iifp/WDc8qKK/NJs +LwK/JWrsY5VdoNjpwWMAlTHzw2xulbHbla93jknJdk1fq0A= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success b/ot-sample-data/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success new file mode 100644 index 000000000..120c0237e --- /dev/null +++ b/ot-sample-data/server_data/receipts/sSBcoTlTkYY8pPv6vh2KD6mIVrRdIwodgsWDoJzIfpV.success @@ -0,0 +1,81 @@ +-----BEGIN SIGNED TRANSACTION----- +Hash: SAMY + + + + +eJxllcmuo8gShvcs7jNYZ4u6mWyGUp+SwMzGgM1k2DEkYOYZzIv067ZPlfreUt1c +ZUbEH8r4U/oS+vs/f3wtTpAU/WApki7wB/vO6hZ7thVDPyi2cP1RAcnhmH87WOzV +h6C/nhOoD9OrA58f4cSFVdjEwJrCdxQ00wd0GN/7eXwn47Jp1wok2b+ZaQibMYyn +Z9voc/35gaMU8SUAwwIGhf/8oJPqrjbSueidU7FSURCuOCtiGO4M5+ApppzFnBt1 +uHpW99bN409VF+NE5vTmzHAl5lbo5VTthNphV19JC0nhHq7Hd1gWhcz5rUqHtmbj +uJ2b6Us8Wlzc2pVd+j7dmQu55PiFJ2vFHe6JsrZJNnp8q+5K2rlfE7S/SN/nZ3MH +KRjA2wK7/e9AYf1V8vmBfhy+fxn2a9F3CKhb5dC1UaOsswgBzaWaa1UZLc/63eQu +lLTNNHuNjtukSDx/j/w1gtWUDl/c+rImqoMW0D3UCLP0VB5wBHScWIpcXZ6xgK3Q +YtjzsdbEIvNVjSuRmJbG1AthBUVBglZPlVahvKhVeFPnYCAfwHqy6hJI/FmhFTqv +KX2qr+SUY7Fa3xp+amNfi0Ula2mUuJ4CoIWBCHk8k/OhrRfsvI/HwKFdOXihgKBr +BmyIclkpDteSo3WySD/cxG4CpH+K86FGYW8LVg8iYlxtJefRLJhAnnaVG7jIH+wx +Ux1dRo1Jas/DKMeBlwLyZZbZRewFlVCLcynmgRv10Fxtp1Q7wj7hNwuIMqdjeJRz +c4zPrfZGZI/yVD7kV140xnlfWCPcnyDKvUiysfOjIBkowv2rmXjXlIN1uuDxrCle +pwBnvZEpLxHQnIJUKILz6TABLcdERqWzALQgv42h3HoGVOpHY5vxo1nttwnABUn5 +Lu2p8IOT55vbDxuBDuyN4GIdxkV02oa2TJo6X/iSJJ1ZTiA0A7mm6THxuhDt+YVg +tsE4Be1hyeYLXbrzU3osFuKEilmcPDEGWbPEmNYZLLQ33BIXchaFTLBVvBASbsNa +GUuVdeoNsophWb4fyXVReivS/ArWBC14TYYZ5Bjc9y2vMHKAbdBGIS3SLvh+boyl +K4IkqsSuL1Ng5fKLciz93nMV3R1JqaqoXmc0QSjvrP/qomxhs8iGXLg1XsVDDhEM +pqLT+FQRx0UWKfaHxECEakwZiXFgAcQj/DrB+RKfSck2iXt+ujyFYoCitY3Khdza +AjtrpqoiPn69WlR6OXeXWN9J86g8u83yA8ch4u64ZruDXR470pccZgXtDWpXZQGX +4X25xtP2kakfxqvMC6IqMFy7tfMLVVFEpMpZdtf7c46CJnCvyy24vOoBM4UBggPP +7xAqdrjLRvXz9c0rs5OqBnWo4Sx7J3k/Kwk99vQwhXH68FmjAbvKOLjGPayCgSFe +A4q6KYiR1W6VKhqXleTDfD7VcRUt5z5NPRsXShjFjXoUgmJWbFZLF71rpZ1GGBOB +Jh858omgugL6Cf2F/EaLr8gbrd+hX1j9O6R/wJu1nbvwE9cuGMY3Y78djA40B/t/ +1B0P6J8UGkLntv5C8rdDPk3dNwTJnlM+R3/GbY2IoKra9a1ZQAUG5KvDH792QNZn ++YTeHVgu0W2xCxIjW7nL6XbKVNguL1re4gkvKlbG9zetbGbuTnJMaWUoy7ErQ47l +jdeYHOIkj6CoultEfsB49v2s9qMJ37U7VzpYuuN5Q0qIdXfRQbmy1olyxsVcBdHs +Mrurnwo0BWye9ryA93LJo319p02M19BoumKKyW2WyY1b5Ja7zBKScYs/fxoo6P// +x/1uH/QPQ4pLxQ== + + + +eJxllNmum0gQQN/RfIR1X1GCWYwhyo3EbsxiMI1teGNpFrPvNt80Hzl2Is1EmX7r +rjqlqpL6IH//9eV9eElRzY2jKqYkbsCZMx1OAOrJ3KhAMn5mIIdgyL5tHM7wEOR7 +PsJqMz5b+PkRjFwUwXa0YB3ndfqBbIYxGKfhFYmKullKGKewgvX4iox9UA9BNOZN +bU7V5wex3ZNvAPYz7FXx84OJy/OxVoR75+7uyz70g4XgZBwn3F7wcznhHVaoj71x +ddoXNw2/qDYiyNTtrInlC/xSbrVduZLHFjc8NbkrKn+7XMUWT8OAFV5U0jfVq+Vm +qsc3PDh81IASFJ7HtNZMzxmhiXSlXvpzrC5NnA5XsTmuatJe3hM0v6Gve16fYQJ7 +WEcQNP8OFFTvlM+P7cfmx3tbvyf9QODxURbM5DR3zs1quFJC0Yy4FVPcRe7Qbceb +ipoPBB57kcerkmSvopYy5CqGjk7DZod0KHDRhO5qDROwpMa3oz/MKR+SaaDvL+v9 +4M4+0fQdd7B0joAo6vdpWUg+ILOQgMsO2edEZpyStqFEADJBGTRun0vU8VRH1NzZ +fB+1bcbwPe/OQSykR5evJNOQmyt6A6BgIoSNR95RaJtTyKBwUX90VZ29HfHWHsKD +zfD0s6RHdlzzW6uySlbd8etWzeZEz7pJa1EX2WJkM1AmljW0zmFQedQF2VFS5jr2 +g1IAPjuBrvvCbFpcoOUqdWFU+0LlRKTUlj09CgT0ffJkbpPZr7LlGuFu4O54WiyJ +2N3mxr+ZXq7JXUgpbB9JBOAFXlPt6Z72S2RWFW0j49MCoIyHjjlhJjUKlXEkxW7f +PTGXuY5VCHvyJE7iQzFn5ZiafWLXXaQvVT3dNIeOZmTADuKJqKBMVDg+RmwMCrAQ +aRvlir6vJG9YbS9Qe94QOawdnyEjPWaxI6wYpcNny5yQmV26ezWb9eqxjtErD8om +BSqjdjs0K7I4ORM614G7pQYqsLpgW3F34RTIj/i2mJGzbxDDGJZgl4arwJ2Jxrnt +l0JwWE0KHpp7jcIpyUX22HWEp4TWiXMT96oV2P0KWFmMHE+hEKx7OkSYby2h6OiE +sC/3/dr7Lge0W7WeLG4QbOsalVCek+eg71w6iNZJeRTh83DzqhoiYB23h2dGxWcS +Dx9XVvF8yE/cWWcs92Sk19fYjuEE1dk5r13k+I/nXgapcbAUMD0gXiIoC3DTLe0B +p8sUW5h6pW4nE0Ox5YL2DbYXcB3ysfSJfMf++EXvl5eFfiC/CexPc/00Ggfcs/TL +YRfYDy/3fNucWlhvwH82Gjbbr/ttgAhN9VbVt002ju03DEvzMZvCr1FTYTIsy2Z5 +MTMsYY+9K3z5vQK25EWOvCpw/EWFbujrRr5iY9amM0HtzrDTFnyHVS5NEm7Q6fyh +HwQlMRn68gzUOkD1tZTQLEEoTiNtyVgjqNlbeTVz8WxiA+ofm7r3uHEYDDE8Codu +p9kz6xqnud0Du2gAvNnYWI4CEkwi7s+nhNOEaZX9+oA1lT/cDEE2JzmBjo7ftag6 +9GKq76od9flrgZL5f/H/uT7kH4SYALE= + + + +-----BEGIN TRANSACTION SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABBSstkMhL1VAZyMdIFsHP03xamtQECxsSBMsfFq9+z5Nunvqtq5TiuXvMrTvu +UcjbIHO07iRdr9pYNEYKJx8/JOk4quZMPEGXMltcNAzBJxsPqLNftxYLCczDs/M3 +Z3y9vcUYY5vWllC8LLSfCKzdzk8lY424XiKYWxRkOFW5i+4= +-----END TRANSACTION SIGNATURE----- + diff --git a/ot-sample-data/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV b/ot-sample-data/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV new file mode 100644 index 000000000..3ed904e6a --- /dev/null +++ b/ot-sample-data/server_data/useraccounts/T1Q3wZWgeTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV @@ -0,0 +1,35 @@ +-----BEGIN SIGNED MESSAGE----- +Hash: SAMY + + + + + + + + +- -----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEZThQMTg3aWkvanpuZ3Z6QmV1QisvYTJXMApQ +UFNKNVd0TTFJdTdMWEc1REp2Ly80ekJuUVJqQzd5TXd4Q3VwdFJwZ2JyTHpNbTdm +YklFcXNFMDgvQW41OGtUCjYxK0JXRHpyUjBaVnZBeDNncUdtUXEybWtsZVpsb2Fv +dXE4UXRwZHJoVEQwM2VxRDk5cVBRMHdRTWdHRy8rMFAKOEhsVHJtOGY1VFFtVkVu +VHVRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +- -----END PUBLIC KEY----- + + + + + +-----BEGIN MESSAGE SIGNATURE----- +Version: Open Transactions 0.70a +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABsSzz/9KIsKWOXMEVpcdmRBnmUaMptjmejkFhR89EGqQShY+eA7zUgzMGjEQy +qiOKOFOSWDSLKTPm41vwv9S40Isylwiv15W2Kj8kszhf+GHfFIsOXj4lHznWeSz7 +8ftwW6OT36BO1vzDIFFcBUc630GFZitcP1sAVXAfK8TmJeU= +-----END MESSAGE SIGNATURE----- + diff --git a/ot-sample-data/server_data/useraccounts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z b/ot-sample-data/server_data/useraccounts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z new file mode 100644 index 000000000..b7386236a --- /dev/null +++ b/ot-sample-data/server_data/useraccounts/lMTANg3U97bwGFJAYKljTXAcy5By6JcLdU4di5AoA4z @@ -0,0 +1,35 @@ +-----BEGIN SIGNED MESSAGE----- +Hash: SAMY + + + + + + + + +- -----BEGIN PUBLIC KEY----- +CpACLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RR +RUJBUVVBQTRHTkFEQ0JpUUtCZ1FEUXhTSVI0K0lVVlp0YXJvQzR3a0lwN2lqWApI +OHN4U01QWjlRbVY1eDdDbFBKUEppZUl3dlBHdFFlSVd1ekZKQndFUGtXNEVRaUZy +N28wYlo4SFMzZldlTG42CkRNdVdsazJKeWtLV3h6Q0dTeFROZlJLeENxVkxzMmlG +RVZvVW05cWZEODBzNi9tTVhuM00yMDIzd1I1dFlpMnEKUzdseldXNVI1TS9vSFRF +bmtRSURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo= +- -----END PUBLIC KEY----- + + + + + +-----BEGIN MESSAGE SIGNATURE----- +Version: Open Transactions 0.71 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABJd61eYz3hOP7x4ZfR2GS6FHyVo9DxMpl48q6LbShh58oGQu6tfYhTJ7tAUkX +jezzJaAWudne6CwOLdM/eychW0JPjsb4pBP4yfzN6/Dl4LIci5C+d1P7ZsUe3gje +cyQyYD7hE7DfNjg2Bi9RJ3VniOH+oqvrKszUhdWVNkAckRY= +-----END MESSAGE SIGNATURE----- + diff --git a/sample-contracts/NOTES.txt b/sample-contracts/NOTES.txt new file mode 100755 index 000000000..cf7de128a --- /dev/null +++ b/sample-contracts/NOTES.txt @@ -0,0 +1,33 @@ + + +transactionscom.xml is actually a signed contract, so it will work. + +silver.xml and tokens.xml are also signed. But unlike the server contract, +they are signed by the USER. That's because it's users who issue currencies, +not the server. So if you wipe all the certs and recreate them, be warned, +you will not be able to use these currency contracts for ISSUING anymore. + +You will still be able to use them for creating asset accounts of the same +type, but you will NOT be able to use them for issuing new asset types. + +This is because the contract key INSIDE the contract is the same one that +was used to sign the contract. ONLY that user can issue the curency, though +ANY other user can open an asset account to TRADE in that currency. + +To sign a contract with the wallet: + +1) Load the wallet up and connect to the server. + +2) type "signcontract" and the wallet will ask you to enter an unsigned contract. + +3) The new signed contract will be displayed on the screen. + +4) From there, you can copy that, and issue a currency by typing "issue". It will + ask you to enter the (signed) currency contract, then send a message to the server + in order to create the new asset type. + + +There is also a signcontract command line utility. + + + diff --git a/sample-contracts/localhost.otc b/sample-contracts/localhost.otc new file mode 100644 index 000000000..76e556011 --- /dev/null +++ b/sample-contracts/localhost.otc @@ -0,0 +1,131 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABVzz3XhlBBKUmd74RKfM1SQp2HtPsdjaz8QtRXLGpYFi0SXq1bLPCz8ZOpa8U +IzJOGLUVwgH9FAzy1LVs+bKa4RqoMqgyjciqqFcfc7vQ0MjuxamLsfBK2vy6W6T6 +xp6qDWBfdCMQF/SZrmmosEOR6hlgwStSQn5YcaJjXQTKBos= +-----END CONTRACT SIGNATURE----- diff --git a/sample-contracts/localhost.xml b/sample-contracts/localhost.xml new file mode 100644 index 000000000..286c13c8b --- /dev/null +++ b/sample-contracts/localhost.xml @@ -0,0 +1,120 @@ + + + + + + + + + Transactions.com does not issue any currencies or digital assets, + and does not back any of the same. You are solely responsible for + whom you choose to trade with. + + +Transactions.com operates open-source OpenTransactions software, and +code audits are randomly performed by CodeNotary.com +Our insurance company is: GeicoCurrency.com + + + + Transaction credits may be purchased on our website, the fees for which + are posted there also. We make money solely from transaction processing, + that is, providing an electronic notary service for others, for a usage fee. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + Transactions.com is liable to keep transactions secure and clean. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + + diff --git a/sample-contracts/silver.otc b/sample-contracts/silver.otc new file mode 100644 index 000000000..4a5980390 --- /dev/null +++ b/sample-contracts/silver.otc @@ -0,0 +1,143 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABOTSi/LXilVNhOWAi/poHk7YstayyRwAOqBBIJgSD1eOODlHMuHZO6s/l9fuY +p2NeMenp3g/jAG6atY+5s0sK4NAyTWAafaT2FvBdcetTyqulROrMSz1j5xJgaQBx +49YyjMbhPH+WFrK4ZzLbwqy3ll3bmVqf6Ww8UduHBQl6aZo= +-----END CONTRACT SIGNATURE----- + diff --git a/sample-contracts/silver.xml b/sample-contracts/silver.xml new file mode 100644 index 000000000..b3ab3652d --- /dev/null +++ b/sample-contracts/silver.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + diff --git a/sample-contracts/test-server-contract.otc b/sample-contracts/test-server-contract.otc new file mode 100644 index 000000000..1d818ce14 --- /dev/null +++ b/sample-contracts/test-server-contract.otc @@ -0,0 +1,127 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + Neither FellowTraveler, nor Open Transactions, actually issue any + currencies or digital assets, and does not back any of the same. + You are solely responsible for whom you choose to trade with. + + + + Open Transactions software is open source, and + code audits are randomly performed by hackers in the + open source community. Fellow Traveler also uses Valgrind. + + + + There is no rate: I wrote this as free software for the open source + community. However, funding or coding contributions are welcome. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoABwGTFH0qXdzN9THMKGv8IcwjT8UtvIApzvQVtrK+wC6F5SzPp0CY+G5a/w+Gr +IcAEJPeHTEphgauP1EU/PhNOzseIq4wPgxVbhIckQ+4BR87U98bhTZx9ggnzTV9M +x+4BKk/cxkQxlfQVPxEevx1M0salHHGqEEb+OkeExXq4oNE= +-----END CONTRACT SIGNATURE----- diff --git a/sample-contracts/test-server-contract.xml b/sample-contracts/test-server-contract.xml new file mode 100644 index 000000000..bc6d87c15 --- /dev/null +++ b/sample-contracts/test-server-contract.xml @@ -0,0 +1,116 @@ + + + + + + + + + Neither FellowTraveler, nor Open Transactions, actually issue any + currencies or digital assets, and does not back any of the same. + You are solely responsible for whom you choose to trade with. + + + + Open Transactions software is open source, and + code audits are randomly performed by hackers in the + open source community. Fellow Traveler also uses Valgrind. + + + + There is no rate: I wrote this as free software for the open source + community. However, funding or coding contributions are welcome. + + + + Issuers are solely liable to perform according to + the conditions specified in their asset contracts. + + + + Float - the total quantity of any digital asset outstanding - + is created by the issuer from his own mint, and signed by his private key. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from the Issuer. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return digital assets to the Mint + for the express purpose of reducing the float. Digital assets + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading at Transactions.com normally + are done on the basis of strong privacy. We will never release any of + your information unless compelled by law. + + + + + +- -----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + diff --git a/sample-contracts/tokens.otc b/sample-contracts/tokens.otc new file mode 100644 index 000000000..183675b8a --- /dev/null +++ b/sample-contracts/tokens.otc @@ -0,0 +1,158 @@ +-----BEGIN SIGNED CONTRACT----- +Hash: SAMY + + + + + + + + + + + + + + Chuck-E-Cheese's Game Tokens are payable to bearer in fun video game + entertainment, on demand, subject to the conditions specified in this + currency contract. + + Chuck will maintain at all times a primary reserve of old 1980s + video games in an amount sufficient to satisfy all the tokens in circulation. + + + + Chuck-E-Cheese's Game Tokens are primarily backed by Chucky's + reputation as a connossieur of fine pizza. + + No primary reserve is established for this currency. + + + + In order to obtain Chuck-E-Cheese's Game Tokens, you must + persuade Chuck to part with same, by any means fair + or foul. Common means are in exchange for favours + done to Chuck or in exchange for national currency. + + + + In order to redeem Chuck-E-Cheese's Game Tokens, you must + negotiate a suitable time and place, and then ask + nicely. Because most suitable redemption locations + (game section of pizza parlor) do not have Internet access, + it is likely that there will be a time delay between + currency redemption and arrival of available games. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Chuck the rat is solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Chuck-E-Cheese's Game Tokens + outstanding - is created by a Mint account, + specially set by the Operator. Authorization to the Operator + is hereby included to specially set one Mint account for creation + of Chuck-E-Cheese's Game Tokens. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from Chuck the Rat. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return Chuck-E-Cheese's Game Tokens to the Mint + for the express purpose of reducing the float. Chuck-E-Cheese's Game Tokens + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading of Chuck-E-Cheese's Game Tokens normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + +-----BEGIN CONTRACT SIGNATURE----- +Version: Open Transactions 0.63 +Comment: http://github.com/FellowTraveler/Open-Transactions/wiki + +CoAB26rojg2jlm6SPEH4QyJFSMdMbegMZ9Ha5T/lBDqhU2nC5IpZuRXfVgukMtUd +gi/snHKAu5GZb9AxmHg6dCrI1IuE5yNvrDK+qq+JOCBvekFAlSpNb89LOuhBBUiq +gxJsw35oOzBVTE9msc3fp+TmeSdo++KJ4+o0G1tincQHrrM= +-----END CONTRACT SIGNATURE----- diff --git a/sample-contracts/tokens.xml b/sample-contracts/tokens.xml new file mode 100644 index 000000000..f1ddc4dff --- /dev/null +++ b/sample-contracts/tokens.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + Chuck-E-Cheese's Game Tokens are payable to bearer in fun video game + entertainment, on demand, subject to the conditions specified in this + currency contract. + + Chuck will maintain at all times a primary reserve of old 1980s + video games in an amount sufficient to satisfy all the tokens in circulation. + + + + Chuck-E-Cheese's Game Tokens are primarily backed by Chucky's + reputation as a connossieur of fine pizza. + + No primary reserve is established for this currency. + + + + In order to obtain Chuck-E-Cheese's Game Tokens, you must + persuade Chuck to part with same, by any means fair + or foul. Common means are in exchange for favours + done to Chuck or in exchange for national currency. + + + + In order to redeem Chuck-E-Cheese's Game Tokens, you must + negotiate a suitable time and place, and then ask + nicely. Because most suitable redemption locations + (game section of pizza parlor) do not have Internet access, + it is likely that there will be a time delay between + currency redemption and arrival of available games. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Chuck the rat is solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Chuck-E-Cheese's Game Tokens + outstanding - is created by a Mint account, + specially set by the Operator. Authorization to the Operator + is hereby included to specially set one Mint account for creation + of Chuck-E-Cheese's Game Tokens. + + Disbursements from the Mint account are to be made on receipt of + duly signed and public authorization from Chuck the Rat. All + disbursements from the Mint account are to be made to the single + Currency Comptroller account identified by the authorization. + + From time to time, the Currency Comptroller may direct the + Currency Manager to return Chuck-E-Cheese's Game Tokens to the Mint + for the express purpose of reducing the float. Chuck-E-Cheese's Game Tokens + so delivered are to be deposited into the Mint account, + thus reducing the float by that amount. + + + + The purchase, redemption and trading of Chuck-E-Cheese's Game Tokens normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + diff --git a/ssl/Makefile b/ssl/Makefile new file mode 100755 index 000000000..b16b4a021 --- /dev/null +++ b/ssl/Makefile @@ -0,0 +1,42 @@ + +RM = /bin/rm +CAT = /bin/cat +OPENSSL = /usr/bin/openssl + + +CERTS = root.pem serverCA.pem server.pem client.pem + +DHPARAMS = dh512.pem dh1024.pem + +all: $(CERTS) $(DHPARAMS) + +$(CERTS): $(CERTS:.pem=.cnf) + $(OPENSSL) req -newkey rsa:1024 -days 3650 -sha1 -keyout rootkey.pem -out rootreq.pem -config root.cnf + $(OPENSSL) x509 -req -in rootreq.pem -days 3650 -sha1 -extfile root.cnf -extensions certificate_extensions -signkey rootkey.pem -out rootcert.pem + $(CAT) rootcert.pem rootkey.pem > root.pem + $(OPENSSL) req -newkey rsa:1024 -days 3650 -sha1 -keyout serverCAkey.pem -out serverCAreq.pem -config serverCA.cnf + $(OPENSSL) x509 -req -in serverCAreq.pem -days 3650 -sha1 -extfile serverCA.cnf -extensions certificate_extensions -CA root.pem -CAkey root.pem -CAcreateserial -out serverCAcert.pem + $(CAT) serverCAcert.pem serverCAkey.pem rootcert.pem > serverCA.pem + $(OPENSSL) req -newkey rsa:1024 -days 3650 -sha1 -keyout serverkey.pem -out serverreq.pem -config server.cnf -reqexts req_extensions + $(OPENSSL) x509 -req -in serverreq.pem -days 3650 -sha1 -extfile server.cnf -extensions certificate_extensions -CA serverCA.pem -CAkey serverCA.pem -CAcreateserial -out servercert.pem + $(CAT) servercert.pem serverkey.pem serverCAcert.pem rootcert.pem > server.pem + $(OPENSSL) req -newkey rsa:1024 -days 3650 -sha1 -keyout clientkey.pem -out clientreq.pem -config client.cnf -reqexts req_extensions + $(OPENSSL) x509 -req -in clientreq.pem -days 3650 -sha1 -extfile client.cnf -extensions certificate_extensions -CA root.pem -CAkey root.pem -CAcreateserial -out clientcert.pem + $(CAT) clientcert.pem clientkey.pem rootcert.pem > client.pem + +certclean: + $(RM) -f rootkey.pem rootreq.pem rootcert.pem root.pem root.srl + $(RM) -f serverCAkey.pem serverCAreq.pem serverCAcert.pem serverCA.pem serverCA.srl + $(RM) -f serverkey.pem serverreq.pem servercert.pem server.pem + $(RM) -f clientkey.pem clientreq.pem clientcert.pem client.pem + +dh512.pem: + $(OPENSSL) dhparam -check -text -5 512 -out dh512.pem + +dh1024.pem: + $(OPENSSL) dhparam -check -text -5 1024 -out dh1024.pem + +dhparamclean: + $(RM) -f $(DHPARAMS) + + diff --git a/ssl/NOTES.txt b/ssl/NOTES.txt new file mode 100755 index 000000000..84f16f9fb --- /dev/null +++ b/ssl/NOTES.txt @@ -0,0 +1,18 @@ +So far, this directory should have a Makefile, and some configuration files + +The config files have .cnf as the extension. + +The Makefile needs them to be there. It goes through and creates all the various keys +and certs and client/server CA keys blah blah. + +This is all just for testing for right now. Use this folder to create your keys. +Edit the configure files first, all that you want, then run Make. + +----- + +In addition to the Makefile and the .cnf files, which you should never erase, +you may also notice some .pem files and so on. That's because I generated some +test certs to go with the distribution. + +THE PASSWORD, FOR ALL CERTS, IS test (LOWER CASE). + diff --git a/ssl/client.cnf b/ssl/client.cnf new file mode 100755 index 000000000..6c2a9264d --- /dev/null +++ b/ssl/client.cnf @@ -0,0 +1,53 @@ +# default settings for our example. see chapter 3 section 3 for more details +[ ca ] +default_ca = exampleca + +[ exampleca ] +dir = /opt/exampleca +certificate = $dir/cacert.pem +database = $dir/index.txt +new_certs_dir = $dir/certs +private_key = $dir/private/cakey.pem +serial = $dir/serial + +default_crl_days = 7 +default_days = 365 +default_md = sha1 + +policy = exampleca_policy +x509_extensions = certificate_extensions + +[ exampleca_policy ] +countryName = supplied +stateOrProvinceName = supplied +localityName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +default_md = sha1 + +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = req_extensions + +# the following sections are specific to the request we're building + +[ certificate_extensions ] +basicConstraints = CA:false +subjectAltName = DNS:shell.zork.org,DNS:localhost + +[ req_distinguished_name ] +countryName = US +stateOrProvinceName = Virginia +localityName = Fairfax +organizationName = Zork.org +commonName = shell.zork.org + +[ req_extensions ] +basicConstraints = CA:true +subjectAltName = DNS:shell.zork.org,DNS:localhost diff --git a/ssl/client.pem b/ssl/client.pem new file mode 100644 index 000000000..20a8b6d8b --- /dev/null +++ b/ssl/client.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ssl/clientcert.pem b/ssl/clientcert.pem new file mode 100644 index 000000000..9b3b65341 --- /dev/null +++ b/ssl/clientcert.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +-----END CERTIFICATE----- diff --git a/ssl/clientkey.pem b/ssl/clientkey.pem new file mode 100644 index 000000000..835ce8d3a --- /dev/null +++ b/ssl/clientkey.pem @@ -0,0 +1,17 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQId5ojpfow8SYCAggA +MBQGCCqGSIb3DQMHBAhWaOXctQvF/gSCAoDWlELA+ynvi+Z8efsQmmATiy8jz/n1 +WBMjgxbK/ZBsfXaz2Uvk8Pxe+s8woCDd5u8o55ZNdmKzgQNOymJT2PVJcdGmrLUJ +ZLSY2TTaaTt4YqThrGzIuYQOUF/sEsVfs49e107D6grzNrj9JfFaZQjjjnHkfWp7 +SLXcTCr9MOR/imGuPATBJDS+G1rzRhk6OAJHe9yGVySwyOmM4m0mkvKwwEfb9fBH +IPvE2BrBa4EiOnGerm94GhHPDguLgU4IGmPEsY7jEfOzNLFbq4OOebXgkXJLATd7 +akEAniq1P10viWLAZXfu7BGVvdMe9QsUT9G3bHclreBj+vsF02Il24A6OV42XADc +eNQzNLLaKYlotFRea5OQrfq3tWEEu2HlqIzOyZDKgWby4QZdAeZlC5SlteETJrRy +NOVuIZhaZ/9irdnsD1USB1zc7yPSwN6LolXeFajSxERKncd6hFuLutnW+ZuSua+m +bQeN1RQNvZL1C2JNYqSoQteVJeaEJGLUVszFMnwMpLBdrqxVStz8gCmRYDcJIOVs +UxCTok+Y3zINYQWxo3/UdHc2JUCKC2oBSNm9rt7CsKhAlTBkCerrKIjFNivir7zt +bHOXZM9wHqNaKC/HSdDzzLS4179jxwprfK3KqTP4lai26wh8ICcGK1+F6NlcGTrQ +NG/lXpw8rJ9u6qRbi3tEdO8qPO2AAOpglP8c0LoB3zTNxrrfwnyKglzPrv5/0+Hd +lNVNRSPTk9FiTt59i8zY+u9ot0WMDQ2piG7dd3DPfNzwoxlcIgzuMoXUh2WemB0R +ZXhRuAU9PL99NMvFXEb+G85QjAk8CcXS0nFxEXrwOreb0Xfv0+OvSBAE +-----END ENCRYPTED PRIVATE KEY----- diff --git a/ssl/clientreq.pem b/ssl/clientreq.pem new file mode 100644 index 000000000..7976e6973 --- /dev/null +++ b/ssl/clientreq.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB4zCCAUwCAQAwXjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAw +DgYDVQQHEwdGYWlyZmF4MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc2hl +bGwuem9yay5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN7w/XzuKL+P +OeC/MF64H79rZbQ89Inla0zUi7stcbkMm///jMGdBGMLvIzDEK6m1GmBusvMybt9 +sgSqwTTz8CfnyRPrX4FYPOtHRlW8DHeCoaZCraaSV5mWhqi6rxC2l2uFMPTd6oP3 +2o9DTBAyAYb/7Q/weVOubx/lNCZUSdO5AgMBAAGgRTBDBgkqhkiG9w0BCQ4xNjA0 +MAwGA1UdEwQFMAMBAf8wJAYDVR0RBB0wG4IOc2hlbGwuem9yay5vcmeCCWxvY2Fs +aG9zdDANBgkqhkiG9w0BAQUFAAOBgQAeO5oRvaS89t1K2nL4Ypxte0taUzMV0Yjn +qcgzGECLPd0b/yxs/0b8har/hihxyl2dqlDAeSCq3UEl7TBssSJMMeFTdQvlFKrF +o616uxW86wsTsypySty9qNtJuFI84sc8WX5MK8qr/QSwFcwGIn2YWkHZSrHpFXK1 +PpbYMnnNBA== +-----END CERTIFICATE REQUEST----- diff --git a/ssl/dh1024.pem b/ssl/dh1024.pem new file mode 100644 index 000000000..8459c5460 --- /dev/null +++ b/ssl/dh1024.pem @@ -0,0 +1,17 @@ +Diffie-Hellman-Parameters: (1024 bit) + prime: + 00:a6:b5:e3:7a:99:1f:c9:ea:47:83:d2:0f:db:9e: + 0e:02:e6:33:e8:b1:a6:d6:21:9d:3e:4a:bc:97:6a: + 15:5b:c4:7a:ed:aa:e8:86:c0:2f:57:f0:df:03:d3: + 0c:56:e4:49:ac:96:ab:6a:82:cc:80:40:f7:40:ff: + 1e:78:57:93:ca:96:5a:31:21:e8:95:de:5b:20:6d: + dc:bb:b7:2e:03:09:a3:0a:74:53:47:da:57:bf:80: + ce:99:0f:e7:0b:25:ea:b2:80:29:17:ac:b3:72:94: + 02:26:c1:6d:9f:cd:45:92:70:18:24:7c:c6:57:7c: + eb:c4:de:6d:6c:c9:10:ac:cb + generator: 5 (0x5) +-----BEGIN DH PARAMETERS----- +MIGHAoGBAKa143qZH8nqR4PSD9ueDgLmM+ixptYhnT5KvJdqFVvEeu2q6IbAL1fw +3wPTDFbkSayWq2qCzIBA90D/HnhXk8qWWjEh6JXeWyBt3Lu3LgMJowp0U0faV7+A +zpkP5wsl6rKAKRess3KUAibBbZ/NRZJwGCR8xld868TebWzJEKzLAgEF +-----END DH PARAMETERS----- diff --git a/ssl/dh512.pem b/ssl/dh512.pem new file mode 100644 index 000000000..45a2fa0e4 --- /dev/null +++ b/ssl/dh512.pem @@ -0,0 +1,12 @@ +Diffie-Hellman-Parameters: (512 bit) + prime: + 00:84:7c:fc:a5:52:29:a4:2d:70:f4:7d:a8:1d:ea: + e1:33:87:55:bf:12:60:a4:fc:68:40:7a:be:77:c4: + c9:c0:94:e0:62:a3:6f:fb:44:06:7b:91:bb:7c:97: + 19:41:a0:fa:35:18:f1:f0:97:cf:23:3c:0c:13:83: + 31:89:ac:63:bb + generator: 5 (0x5) +-----BEGIN DH PARAMETERS----- +MEYCQQCEfPylUimkLXD0fagd6uEzh1W/EmCk/GhAer53xMnAlOBio2/7RAZ7kbt8 +lxlBoPo1GPHwl88jPAwTgzGJrGO7AgEF +-----END DH PARAMETERS----- diff --git a/ssl/root.cnf b/ssl/root.cnf new file mode 100755 index 000000000..ee0a6f1d8 --- /dev/null +++ b/ssl/root.cnf @@ -0,0 +1,52 @@ +# default settings for our example. see chapter 3 section 3 for more details +[ ca ] +default_ca = exampleca + +[ exampleca ] +dir = /opt/exampleca +certificate = $dir/cacert.pem +database = $dir/index.txt +new_certs_dir = $dir/certs +private_key = $dir/private/cakey.pem +serial = $dir/serial + +default_crl_days = 7 +default_days = 365 +default_md = sha1 + +policy = exampleca_policy +x509_extensions = certificate_extensions + +[ exampleca_policy ] +commonName = supplied +stateOrProvinceName = supplied +countryName = supplied +emailAddress = supplied +organizationName = supplied +organizationalUnitName = optional + +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +default_md = sha1 + +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = req_extensions + +# the following sections are specific to the request we're building + +[ certificate_extensions ] +basicConstraints = CA:true +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always + +[ req_distinguished_name ] +countryName = US +stateOrProvinceName = Virginia +localityName = Fairfax +organizationName = Zork.org +commonName = Root CA + +[ req_extensions ] +basicConstraints = CA:true diff --git a/ssl/root.pem b/ssl/root.pem new file mode 100644 index 000000000..f6458aea2 --- /dev/null +++ b/ssl/root.pem @@ -0,0 +1,36 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,E57C95AFB507509A + +4geketdczR4U/UXKs30jsNeQhZA2Uwp2cAIW1eYuKG9GnjiLfISkAnAXwUyrKELr +eVTmnPpNkaJOHR8FncGXMlJ5fENaZQC4Z8t9q6ZwTpVzDRZtNcYw5jDNTTbleL6M +5xTv0wmFPhZryKV42p3A9Zvljsc40Laz4ibvEDGkqOp3/vh2QNl+Rv+20zUoJsCz +7EECR+LT6O3X/kZY7X6pYEf9PIwHaX3OoNOMGyD2F+Wqv4oT4lXMHxprgsLjE6aP +R63oqRygtnCBOGOjBjMLrtVM2occgJy2y3ZHMPE5VHXeK5msiTFLxn1HLlA6gek6 +Xbix6awcMRj5oKzF4l3ZBPE9SJUhVuoSLYdsQzkXrqSmnNocoKmm6i8Omo1xhGYc +KcnF6rNGvFtPXSsKIUuzTXz2WsuSKF0wm4+OzOgWfTMoSVm74V9YBkRbSvl8ee1y +1K5+9ZzTnj3DdVslx7WQK6EQsKritVqLqXWsbSuL5Hg0lKAEpqLaQhzypAzDqE5a +oAFwtvIX0XIs8WboF7wtns3+GjBKR9tvdDTB9KoUGMo0NPnTZHk+3MVnrqY6r4b0 +G7KtyNpIlTKTjHIIJjfXHs9evE5p+rQXCTQLuKPNVzoVBSY0uZue16D1cuO9ROZa +DLydzIRu6kQ/g95xmsl06UoNIj1BdQauJs7wWISwDjGWq6hhp3xKQTRGFqDZZ5hF +VI7H+Ux19PAFt2mw3ELW54wQlIs4uKFtGOwFRavPXEJ9Ak+pVc2oAXDmjZ9gCGKQ +7PvY+KbnJQGrdfRlyhPlNPkNEq6gNTHNHj6a1zltmOOurLDXT/GePQ== +-----END RSA PRIVATE KEY----- diff --git a/ssl/root.srl b/ssl/root.srl new file mode 100644 index 000000000..ce9f68bab --- /dev/null +++ b/ssl/root.srl @@ -0,0 +1 @@ +ED782F5F53260CDC diff --git a/ssl/rootcert.pem b/ssl/rootcert.pem new file mode 100644 index 000000000..d1a3fdc1e --- /dev/null +++ b/ssl/rootcert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ssl/rootkey.pem b/ssl/rootkey.pem new file mode 100644 index 000000000..35019ed99 --- /dev/null +++ b/ssl/rootkey.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,E57C95AFB507509A + +4geketdczR4U/UXKs30jsNeQhZA2Uwp2cAIW1eYuKG9GnjiLfISkAnAXwUyrKELr +eVTmnPpNkaJOHR8FncGXMlJ5fENaZQC4Z8t9q6ZwTpVzDRZtNcYw5jDNTTbleL6M +5xTv0wmFPhZryKV42p3A9Zvljsc40Laz4ibvEDGkqOp3/vh2QNl+Rv+20zUoJsCz +7EECR+LT6O3X/kZY7X6pYEf9PIwHaX3OoNOMGyD2F+Wqv4oT4lXMHxprgsLjE6aP +R63oqRygtnCBOGOjBjMLrtVM2occgJy2y3ZHMPE5VHXeK5msiTFLxn1HLlA6gek6 +Xbix6awcMRj5oKzF4l3ZBPE9SJUhVuoSLYdsQzkXrqSmnNocoKmm6i8Omo1xhGYc +KcnF6rNGvFtPXSsKIUuzTXz2WsuSKF0wm4+OzOgWfTMoSVm74V9YBkRbSvl8ee1y +1K5+9ZzTnj3DdVslx7WQK6EQsKritVqLqXWsbSuL5Hg0lKAEpqLaQhzypAzDqE5a +oAFwtvIX0XIs8WboF7wtns3+GjBKR9tvdDTB9KoUGMo0NPnTZHk+3MVnrqY6r4b0 +G7KtyNpIlTKTjHIIJjfXHs9evE5p+rQXCTQLuKPNVzoVBSY0uZue16D1cuO9ROZa +DLydzIRu6kQ/g95xmsl06UoNIj1BdQauJs7wWISwDjGWq6hhp3xKQTRGFqDZZ5hF +VI7H+Ux19PAFt2mw3ELW54wQlIs4uKFtGOwFRavPXEJ9Ak+pVc2oAXDmjZ9gCGKQ +7PvY+KbnJQGrdfRlyhPlNPkNEq6gNTHNHj6a1zltmOOurLDXT/GePQ== +-----END RSA PRIVATE KEY----- diff --git a/ssl/rootreq.pem b/ssl/rootreq.pem new file mode 100644 index 000000000..5b6f57eaa --- /dev/null +++ b/ssl/rootreq.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBlzCCAQACAQAwVzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAw +DgYDVQQHEwdGYWlyZmF4MREwDwYDVQQKEwhab3JrLm9yZzEQMA4GA1UEAxMHUm9v +dCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvBsbECjht2BdRBZm8+ST +F9iXb4BSSD7xnTLLHyJhhGv6EaRZSSoqu9DKTZwdv1y9cUgIuN0sNlJLCA+Hp02a +8OUHmjQUbsE4eh//uk6epIcoOfSrDSGSy4PM5M5MwRFuDr1mx+Fhmv5ZMcO5oQbr +ze+MNodL4GpQ8xwnwCH/hY0CAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4GBAHB0n3A7 +4XeGCi+XPAxwlgC+LCrRihIFdtU6yubcxEomd2xBYHnziqW0KGTcCM227O2Msoi6 +ndq+OvcnaDWaAcv6/0yWYiKsTl+fmeUj58j/jo+TEDsXBzupaW2/9DE05IqZ6HpR +iKw3/OeUPMzpYqdGNutdUHc8DTdoWJkRYN38 +-----END CERTIFICATE REQUEST----- diff --git a/ssl/server.cnf b/ssl/server.cnf new file mode 100755 index 000000000..46da4a02f --- /dev/null +++ b/ssl/server.cnf @@ -0,0 +1,53 @@ +# default settings for our example. see chapter 3 section 3 for more details +[ ca ] +default_ca = exampleca + +[ exampleca ] +dir = /opt/exampleca +certificate = $dir/cacert.pem +database = $dir/index.txt +new_certs_dir = $dir/certs +private_key = $dir/private/cakey.pem +serial = $dir/serial + +default_crl_days = 7 +default_days = 365 +default_md = sha1 + +policy = exampleca_policy +x509_extensions = certificate_extensions + +[ exampleca_policy ] +countryName = supplied +stateOrProvinceName = supplied +localityName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +default_md = sha1 + +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = req_extensions + +# the following sections are specific to the request we're building + +[ certificate_extensions ] +basicConstraints = CA:false +subjectAltName = DNS:splat.zork.org,DNS:localhost + +[ req_distinguished_name ] +countryName = US +stateOrProvinceName = Virginia +localityName = Fairfax +organizationName = Zork.org +commonName = splat.zork.org + +[ req_extensions ] +basicConstraints = CA:true +subjectAltName = DNS:splat.zork.org,DNS:localhost diff --git a/ssl/server.pem b/ssl/server.pem new file mode 100644 index 000000000..3e2728209 --- /dev/null +++ b/ssl/server.pem @@ -0,0 +1,71 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ssl/serverCA.cnf b/ssl/serverCA.cnf new file mode 100755 index 000000000..559414098 --- /dev/null +++ b/ssl/serverCA.cnf @@ -0,0 +1,54 @@ +# default settings for our example. see chapter 3 section 3 for more details +[ ca ] +default_ca = exampleca + +[ exampleca ] +dir = /opt/exampleca +certificate = $dir/cacert.pem +database = $dir/index.txt +new_certs_dir = $dir/certs +private_key = $dir/private/cakey.pem +serial = $dir/serial + +default_crl_days = 7 +default_days = 365 +default_md = sha1 + +policy = exampleca_policy +x509_extensions = certificate_extensions + +[ exampleca_policy ] +countryName = supplied +stateOrProvinceName = supplied +localityName = supplied +organizationName = supplied +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 2048 +default_keyfile = privkey.pem +default_md = sha1 + +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = req_extensions + +# the following sections are specific to the request we're building + +[ certificate_extensions ] +basicConstraints = CA:true +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid:always,issuer:always + +[ req_distinguished_name ] +countryName = US +stateOrProvinceName = Virginia +localityName = Fairfax +organizationName = Zork.org +organizationalUnitName = Server Division +commonName = Server CA + +[ req_extensions ] +basicConstraints = CA:true diff --git a/ssl/serverCA.pem b/ssl/serverCA.pem new file mode 100644 index 000000000..8f1f24bcc --- /dev/null +++ b/ssl/serverCA.pem @@ -0,0 +1,55 @@ +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,4BEAE58485B3AC79 + +gd3Xrj5wbwwps49L72aYA7dgthpwNHr7EUEfXthf3UPgMQoM3Xv1IWyUlPf9SUpa +800sUKYb56D3u/M/8+pZZjs3QJFFb1M9K9iusBly+NV2YyayfBmHd37Bpw4K6aQP +w26Pt1+R2TJk4WMbx9Ees1hL3OHSYHsd3+uDms6BDG2UCK91W104xxl/iDOvY2D8 +ZNhwL9wJmzlZMujqRMunWdVnD/f723VtEzXHZeOXTzHzkuk5fX0KjRFK53qEnCGO +dLW5r567En3N11261XSP15FS+dz41UvnO/TEe4KAEDm7cg6Ea5LQ6zZ55tnb8Od0 +zQ9ews1RiShilKd709awIgxJBHzO7s8QReASex4C/ue4W+U6Pvh/UV1BfNRl1xDP +JM21IiJSl2SWE5oCqCHruNMllS/wyDxHRkVbIRmzruihPUvpDanbOp2rdo9tSYRy +Fm2FuqTZ9lhWKnpwZaFzjqR7izDOLxrd2HftJ/1iOhENQsnAG7NRr64RZ7h/gu7+ +rHduL263n0sule2vG/+qeecu4ZJFBYhmVYtNpeouXDx16D7QWBX6IiQNrxh7HK1j +h19Lii4aNzf/GZ5kVHwyc5JaT2s15LCJX5Y/P9Nycnm2+qiSQWsx2sIUjfV9fNQG +uN00hUlQSclPCeB6ERVNsByIwohmIIHrF/3pvQkuCcn8+z9Kyxu9JZPFbJg20lzK +Dgil9zu4UYMnyliqQejNC18cpbraOX57APN26mm430MKQ3br32t5a7PtGbXqwHqg +T9U0Rxp7XPOz+IY7vK+BZoghOpkqiC44ei5wPoUvE53muGgkHEFMoA== +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC6DCCAlGgAwIBAgIJAJzeQ7UeJ5MBMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzIw +WhcNMjAwOTI2MDI0MzIwWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQD +EwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8GxsQKOG3YF1E +Fmbz5JMX2JdvgFJIPvGdMssfImGEa/oRpFlJKiq70MpNnB2/XL1xSAi43Sw2UksI +D4enTZrw5QeaNBRuwTh6H/+6Tp6khyg59KsNIZLLg8zkzkzBEW4OvWbH4WGa/lkx +w7mhBuvN74w2h0vgalDzHCfAIf+FjQIDAQABo4G7MIG4MAwGA1UdEwQFMAMBAf8w +HQYDVR0OBBYEFFk1DIRC/Fz641nHZn8OqLGhkjDvMIGIBgNVHSMEgYAwfoAUWTUM +hEL8XPrjWcdmfw6osaGSMO+hW6RZMFcxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhW +aXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8GA1UEChMIWm9yay5vcmcxEDAO +BgNVBAMTB1Jvb3QgQ0GCCQCc3kO1HieTATANBgkqhkiG9w0BAQUFAAOBgQCRtXGC +lfeG3msVGNf6hq6f8Q+QQzpWHYcyIWCegR1u2PU97xGvCKf4t95LWZaKXm1KDPle +UcLkjxFnx6JPmOdLhyx5NCz3A6HngzFl4Q2Jwdj7vNNf9/7k2AfiV4rs+zZ34bHz +pZxux/b5LFCQe9osKnrmIoAQO0SHbqcgAR/fEw== +-----END CERTIFICATE----- diff --git a/ssl/serverCA.srl b/ssl/serverCA.srl new file mode 100644 index 000000000..39074a983 --- /dev/null +++ b/ssl/serverCA.srl @@ -0,0 +1 @@ +C68B77566CA83BCA diff --git a/ssl/serverCAcert.pem b/ssl/serverCAcert.pem new file mode 100644 index 000000000..777cbb013 --- /dev/null +++ b/ssl/serverCAcert.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDBDCCAm2gAwIBAgIJAO14L19TJgzXMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDI0MzI0 +WhcNMjAwOTI2MDI0MzI0WjBzMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRgwFgYDVQQL +Ew9TZXJ2ZXIgRGl2aXNpb24xEjAQBgNVBAMTCVNlcnZlciBDQTCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4KgBf/LKlvJJXo1eR6BAKcZuXzq+3OBRtq8Z7E5T +w5nAMu9ZIrq6X7X0F1HOTMH1qWAP/TcC4XlXQEcDZg4ptpfviaQtxdwB5sTjPmGS +CgA3GA1t6bw3xs/A1LaCtn/G73wwwFVR2da5Fu7l4kSgAJHi9mNfa58Y1YewG9xr +mmsCAwEAAaOBuzCBuDAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRt+WA/2oWLIMLd +L6rEogUVCRIRqzCBiAYDVR0jBIGAMH6AFFk1DIRC/Fz641nHZn8OqLGhkjDvoVuk +WTBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0Zh +aXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRAwDgYDVQQDEwdSb290IENBggkAnN5D +tR4nkwEwDQYJKoZIhvcNAQEFBQADgYEAPaAtSTPLuFIVOfBtl4RsBcah+NETKYvl +wwApQfZIO61RYM9MRX9Lary6cFnvWKmmK7gubQnzYjO97QdTPJhgif+tS8INBijn +fbQjUS2PDVN2tMrrVpq7m3NeFmaj4dQOAZecTSAKtB7/8RZmmyHX/GsOE088lt3c +XVisauzTz4E= +-----END CERTIFICATE----- diff --git a/ssl/serverCAkey.pem b/ssl/serverCAkey.pem new file mode 100644 index 000000000..1645b4ebe --- /dev/null +++ b/ssl/serverCAkey.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,4BEAE58485B3AC79 + +gd3Xrj5wbwwps49L72aYA7dgthpwNHr7EUEfXthf3UPgMQoM3Xv1IWyUlPf9SUpa +800sUKYb56D3u/M/8+pZZjs3QJFFb1M9K9iusBly+NV2YyayfBmHd37Bpw4K6aQP +w26Pt1+R2TJk4WMbx9Ees1hL3OHSYHsd3+uDms6BDG2UCK91W104xxl/iDOvY2D8 +ZNhwL9wJmzlZMujqRMunWdVnD/f723VtEzXHZeOXTzHzkuk5fX0KjRFK53qEnCGO +dLW5r567En3N11261XSP15FS+dz41UvnO/TEe4KAEDm7cg6Ea5LQ6zZ55tnb8Od0 +zQ9ews1RiShilKd709awIgxJBHzO7s8QReASex4C/ue4W+U6Pvh/UV1BfNRl1xDP +JM21IiJSl2SWE5oCqCHruNMllS/wyDxHRkVbIRmzruihPUvpDanbOp2rdo9tSYRy +Fm2FuqTZ9lhWKnpwZaFzjqR7izDOLxrd2HftJ/1iOhENQsnAG7NRr64RZ7h/gu7+ +rHduL263n0sule2vG/+qeecu4ZJFBYhmVYtNpeouXDx16D7QWBX6IiQNrxh7HK1j +h19Lii4aNzf/GZ5kVHwyc5JaT2s15LCJX5Y/P9Nycnm2+qiSQWsx2sIUjfV9fNQG +uN00hUlQSclPCeB6ERVNsByIwohmIIHrF/3pvQkuCcn8+z9Kyxu9JZPFbJg20lzK +Dgil9zu4UYMnyliqQejNC18cpbraOX57APN26mm430MKQ3br32t5a7PtGbXqwHqg +T9U0Rxp7XPOz+IY7vK+BZoghOpkqiC44ei5wPoUvE53muGgkHEFMoA== +-----END RSA PRIVATE KEY----- diff --git a/ssl/serverCAreq.pem b/ssl/serverCAreq.pem new file mode 100644 index 000000000..cb5566f5c --- /dev/null +++ b/ssl/serverCAreq.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBszCCARwCAQAwczELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAw +DgYDVQQHEwdGYWlyZmF4MREwDwYDVQQKEwhab3JrLm9yZzEYMBYGA1UECxMPU2Vy +dmVyIERpdmlzaW9uMRIwEAYDVQQDEwlTZXJ2ZXIgQ0EwgZ8wDQYJKoZIhvcNAQEB +BQADgY0AMIGJAoGBAOCoAX/yypbySV6NXkegQCnGbl86vtzgUbavGexOU8OZwDLv +WSK6ul+19BdRzkzB9algD/03AuF5V0BHA2YOKbaX74mkLcXcAebE4z5hkgoANxgN +bem8N8bPwNS2grZ/xu98MMBVUdnWuRbu5eJEoACR4vZjX2ufGNWHsBvca5prAgMB +AAGgADANBgkqhkiG9w0BAQUFAAOBgQAz7cfrWhlc4nfe0zO/S2+XJsa12yJJA5Pe +DnE8PPT/vN83y9yJE80CYTroK2/3mPhh6y3DRbdf6GeEd/Q77A+7wbIpgpyNR+hV +zUQJ5kfy4At/O5uX/vb6qSo+Nnt0FNBdqSAiLGAsMDSQwRhtTO+WvCvJTiQuGim2 +J8ZBdoN52A== +-----END CERTIFICATE REQUEST----- diff --git a/ssl/servercert.pem b/ssl/servercert.pem new file mode 100644 index 000000000..8b75da85e --- /dev/null +++ b/ssl/servercert.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIJAMaLd1ZsqDvKMA0GCSqGSIb3DQEBBQUAMHMxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxGDAWBgNVBAsTD1NlcnZlciBEaXZpc2lvbjESMBAGA1UE +AxMJU2VydmVyIENBMB4XDTEwMDkyOTAyNDMyN1oXDTIwMDkyNjAyNDMyN1owXjEL +MAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAwDgYDVQQHEwdGYWlyZmF4 +MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3BsYXQuem9yay5vcmcwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3TvgzuCxpSYs1lb9nKoDFIButv +EJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTIDO+IxuRc4Bxn42nUKCrBI +QpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLwa7GieCC4kz2GuhLDsaDq +eS2K9WlWtpjzAgMBAAGjMzAxMAkGA1UdEwQCMAAwJAYDVR0RBB0wG4IOc3BsYXQu +em9yay5vcmeCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQUFAAOBgQBQ/NgyjFEtBWsF +omfXVPX7aHKa4UkyHp6a2nCEEdSecNsAbe+s72yESpAwwc7KZCooBRvDX3P4O1bS +bCzXFePdm7wisgV23DqycxmDAySbsn58dhKvRXf9Xy8l+mziYN6O+KAWXqvrO9W4 +KyHHBsoH+23N4dE7ho1sNBnrhvSmXw== +-----END CERTIFICATE----- diff --git a/ssl/serverkey.pem b/ssl/serverkey.pem new file mode 100644 index 000000000..5e6a87655 --- /dev/null +++ b/ssl/serverkey.pem @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,F36264D063E32E7E + +tua5qzYQuGVHtlptL/iUler39stBu5byFLXDGVkk/SYC5Vvn78Wj1W+Tqt2FitRC +RC54KpRtGsZvaCDGCfPnYAYUGL4i8WHhJbTxp2bYIOYX0QTUxdthpSMSJvaODEJK +F56GXxlc4ZzG5yi2rH5pcdFyONUKpScn6vSrxjRg/xxQXmViSeOnuSawgrm3X+Yw +1q0D0BNJcL9VTI5nL/pMEeSGLe5Z0MZXii9QJLoEb6v3SCkrfirFpQ7YGu2qzWI+ +/rSiPZEHSP6A0sc57C2aDJfY2sRU1bqIiOW8f0Z0eRGCRMHW0duyN+DAruRls9wh +pwPlAQB77GazqcuCI8d2pHs/JhZy9lqT9D8ZSbJ5JApx3tAAXhz/31JcyMH7FaBm +Zi5K+OKMRYPZ2zWC9TEF+svZq2MwctiiI2wyy3mXmMBNVg2SuS0MZGQFyuDP/RsD +ZHv6v7n0XQyomBdDpckXHTqnZnaXx9G73LSqmqOT6tTxRk4Cv/NtjJ6i11eolnh9 ++b2YtoXxLJ8qlhamy1Eq3i/yVxKuHm2oKJ425B++4u+oGoKaG97Vbi5MoW0Z/seN +HXvswMua7bPTWvRK2HvrDOY31gxE5lYebJYuOANG69b6bkUA/lqLUebDgl76Fyjs +JnOsGWTdZlDTuhvNfTtoDGIGalQIG/YvoMSluNExauMicIP8wa3Ik4Ub1FE5oCRW +ulkmWb2X3TO1wMu7MTT/maSEiKasJpl1edP5jKNfiyjaGQ4xlWnPTxkBYKwt7KgJ +TM+FrHHiT4XFpkGRFte/F2adDgrIuH9k4sHriOggeBl7l+PS+RMSwA== +-----END RSA PRIVATE KEY----- diff --git a/ssl/serverreq.pem b/ssl/serverreq.pem new file mode 100644 index 000000000..83caa25a2 --- /dev/null +++ b/ssl/serverreq.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB4zCCAUwCAQAwXjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRAw +DgYDVQQHEwdGYWlyZmF4MREwDwYDVQQKEwhab3JrLm9yZzEXMBUGA1UEAxMOc3Bs +YXQuem9yay5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOADov3Tvgzu +CxpSYs1lb9nKoDFIButvEJKFfT/EpPwrVuMP2vZ0ahy0BoVA4uH+FQwjLYJEBTID +O+IxuRc4Bxn42nUKCrBIQpitNlAMcv6PnNrCVyAn7GQ59bifHkV7NzWpLH0xFpLw +a7GieCC4kz2GuhLDsaDqeS2K9WlWtpjzAgMBAAGgRTBDBgkqhkiG9w0BCQ4xNjA0 +MAwGA1UdEwQFMAMBAf8wJAYDVR0RBB0wG4IOc3BsYXQuem9yay5vcmeCCWxvY2Fs +aG9zdDANBgkqhkiG9w0BAQUFAAOBgQA7EEdMAxDVDUSnzz9f3uKy7gQkombBbwCt +/caUeQrgii/7sdNXo840hhfaDF3Fzq4VbHGHUjatxlDYNyXuZqLuoqF8Hgj5Jt+W +v4TvYb6Z71yYAPiXKn9+3KP+36SHv+cvyVFnvz+CJ/T4rVOu4wwiFR0nOVhE36Pp +CpZTR3MDJw== +-----END CERTIFICATE REQUEST----- diff --git a/testwallet/API-README.txt b/testwallet/API-README.txt new file mode 100644 index 000000000..38db74673 --- /dev/null +++ b/testwallet/API-README.txt @@ -0,0 +1,332 @@ +These instructions cover: BUILDING the API. + +You can now build the API from the top folder. +From where you are now, just do this: + +> cd .. +> make clean + +Then choose a language: +> make php5 +> make perl5 +> make ruby +> make c +> make java + +If you don't see your favorite language, fear not: it may still be +supported, just further down in this document! (I.e. not available +as a top-level build option.) + +OTHERWISE, YOU'RE DONE!!! + +(See below for more details.) + +--------------------------------------------------------- + + +How to USE the API: +https://github.com/FellowTraveler/Open-Transactions/wiki/API +https://github.com/FellowTraveler/Open-Transactions/wiki/Use-Cases + + + +------------------------------------------ + +===> BUILD THE TEST CLIENT - (Makefile) +(command line utility) + +You probably prefer to build in XmlRpc/HTTP mode: + + make TRANSPORT=XmlRpc + gmake TRANSPORT=XmlRpc + +Otherwise there is the old TCP/SSL (not recommended): + +MAC OR LINUX: make +FREEBSD: gmake + +----------------------------------------- + +WINDOWS ONLY: inside the Open-Transactions\testwallet\testwallet folder +is an MS Visual C++ 2010 Express project that will build this project +for Windows. + +The output will be an executable called "testwallet.exe". +Run it from this directory like so: ./testwallet.exe + +On Windows you may have to copy it to this directory first, as it may +be in a Debug or Release folder. + +********************************************** + + +===> BUILD THE API - (Makefile.API) + +Open Transactions now supports native interfaces to the +following languages: + +C, Obj-C, C++, C#, Java, Ruby, Python, Perl, Php, Tcl, Lisp + +(Instructions for each language are below.) + +** You likely wish to add TRANSPORT=XmlRpc to the below commands, as well. +And: MAKE SURE you do a make clean when switching languages, since they +can interfere with each other. + +---------------- +LINUX WARNING: On Linux, you must rebuild OTLib with the proper flags, +before you can build the OTAPI, or you'll get errors. If you are using +linux, do this now: + +cd ../OTLib; make clean; make DYNAMIC_OTLIB=1; cd ../testwallet + +Now you may continue with the rest of these instructions... +---------------- + + +THE 'C++' HIGH-LEVEL CLASS + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=c + +-- link to libOTAPI.a + +-- include OpenTransactions.h in your code. + +-------------------------------- + + +THE 'Straight C' API + +(To be used in C, Obj-C, and C++ projects) + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=c + +-- link to libOTAPI.a + +-- include OTAPI.h in your code +-- You'll also need a copy of OTAPI_funcdef.h + (but DON'T #include it--just make sure that it's there.) + +-------------------------------- + +C# + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=csharp + +This builds the shared lib: +libotapi.so + +-- Use otapi.cs in your C-Sharp project. + +-------------------------------- + +Java + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=java + +This builds the shared lib: +libotapi.jnilib + +-- Use otapi.java in your Java project. + +For Linux, MAKE SURE that the "JAVA_HOME" environment variable is set properly, +since the Makefile depends on it! The value is usually something like /usr/lib/jvm/default-java +or /usr/lib/jvm/java-6-openjdk. + +Instructions to set it in linux: + +-- For your current user, +Open up a shell / terminal window +vi ~/.profile (replace vi with your favourite text editor) +Add export JAVA_HOME=/path/to/java/home/dir on its own line at the end of the file +Add export PATH=$JAVA_HOME/bin:$PATH on its own line immediately after +Save, and restart your shell +Running java -version should give you the desired results + +-- For all users in the system, +Open up a shell / terminal window +vi /etc/profile (replace vi with your favourite text editor) +Add export JAVA_HOME=/path/to/java/home/dir on its own line at the end of the file +Add export PATH=$JAVA_HOME/bin:$PATH on its own line immediately after +Save, and restart your shell +Running java -version should give you the desired results + + +--------- +Note: the current OT GUI ("Moneychanger", in java) requires a slight modification +to one file: OTAPI_java.c + +Basically search for this string: Java_otapiJNI +And replace it with this string: Java_com_wrapper_core_jni_otapiJNI +Replace all, it appears over a hundred times. (It's probably already done for you.) + +Then go to the Open-Transactions folder and type: make clean && make java + +Then the OT Java GUI will work; just put the jar in the testwallet folder +(and run it from there as well.) + +-------------------------------- + +Ruby + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=ruby + +This builds otapi.bundle on Mac, and otapi.so on Linux, which you can use +in your Ruby project like any other native library. + +On Linux I installed Ruby and Ruby-Dev: +apt-get install ruby +apt-get install ruby-dev + + +NOTE: The Ruby API now features a top-level build target! Especially on Linux, +this is the easiest way to build the Ruby API. To build for ruby, do it from +the MAIN folder: + + cd Open-Transactions; make clean; make ruby; + + +To test the Ruby API, follow these tests from there: + +1) cd testwallet; ruby + +2) After you hit enter, paste the below ruby code, followed by a Ctrl-D as +depicted below: + +require 'otapi' + +Otapi.OT_API_Init "/absolute-path-goes-here/.ot/client_data" + +Otapi.OT_API_LoadWallet "wallet.xml" + +^D + +NOTE: Use an actual Ctrl-D, and do not simply paste the one that appears above. +ADDITIONAL NOTE: Make sure you use the correct path, above where it says "full- +path-goes-here" you should substitute that for the appropriate path on your own +system. (On the command line, use the pwd command to see what the path is on your +own system.) + +If everything is successful, you will see the wallet loaded on the screen! + + +-------------------------------- + + +Python + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=python + +This builds _otapi.so, a shared library that you can call from your Python +project using the otapi.py file. + +To do this on linux, I had to install Python-dev: +apt-get install python-dev + +From the testwallet folder, you can verify the Python API like this: + +$ +$ +$ +$ python +>>> import otapi +>>> otapi.OT_API_Init("/full-path-goes-here/Open-Transactions/testwallet/data_folder") +>>> otapi.OT_API_LoadWallet("wallet.xml") + + +Let me know if it works for you! + +-------------------------------- + +Perl5 + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=perl5 + +This builds otapi.bundle, which you can use in your Perl project via + the file otapi.pm + +Problems BUILDING? Check the version of Perl being included / linked +in the Makefile, and make sure it matches the location on your system. +You might have 5.10.1 instead of 5.10.0 + +Problems RUNNING? One user reported a segmentation fault on his MAC OS X. +It was later determined that the user was building with perl 5.10.1, +but running perl version 5.8.8, which was segfaulting. So, try EXPLICITLY +running the correct version of perl at the command line, by typing +perl5.10.0 or perl5.10.1, instead of just typing perl, when you run the +software. (This fixed the problem for me on my Mac.) +Example: +$ +$ perl -e "use otapi;" +Segmentation fault +$ +$ +$ perl5.10.0 -e "use otapi;" +$ +$ +$ + + +Notice: no segfault when I do it the second way -- because I am +running the correct version of perl that time. Try it both ways +to test on your own computer which one is right. + + +PERL NOTE!!! There is now a TOP LEVEL option for building perl5! +Since some platforms require XmlRpc and OTLib to be rebuilt with +certain flags, I made it easy by adding a top-level target, since +we have a client developer who is actively targeting perl. + +TO USE IT: + + cd Open-Transactions; make clean; make perl5; + + +It's that easy! To test it on the command line: + +$ cd testwallet +$ +$ perl5.10.0 +use otapi; +otapi::OT_API_Init("/full-path-goes-here/Open-Transactions/testwallet/data_folder"); +otapi::OT_API_LoadWallet("wallet.xml"); + +^D + +Loading wallet: Fellow Traveler's test wallet, version: 1.0 + +(Etc. The entire wallet loaded.) + +-------------------------------- + +PHP + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=php5 + +This builds otapi.so, which you can use in your PHP project via the file otapi.php + +On linux, make sure you have done this first: +apt-get install php5-dev + +-------------------------------- + +Tcl + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=tcl + +This builds otapi.so, which you can use in your Tcl project like so: +load ./otapi.so otapi + +On Linux, I had to install Tcl and Tcl-Dev: +apt-get install tcl +apt-get install tcl-dev + +-------------------------------- + +LISP + +make -f Makefile.API [TRANSPORT=XmlRpc] LANGUAGE=lisp + +This builds otapi.so, which you can use in your LISP project via otapi.lisp + + diff --git a/testwallet/Acct.cs b/testwallet/Acct.cs new file mode 100644 index 000000000..b0b63dd62 --- /dev/null +++ b/testwallet/Acct.cs @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Acct : Displayable { + private HandleRef swigCPtr; + + internal Acct(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.Acct_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Acct obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Acct() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Acct(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.Acct_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Acct_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string acct_id { + set { + otapiPINVOKE.Acct_acct_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Acct_acct_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.Acct_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Acct_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static Acct ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Acct_ot_dynamic_cast(Storable.getCPtr(pObject)); + Acct ret = (cPtr == IntPtr.Zero) ? null : new Acct(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Acct.java b/testwallet/Acct.java new file mode 100644 index 000000000..e2263eaf2 --- /dev/null +++ b/testwallet/Acct.java @@ -0,0 +1,67 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Acct extends Displayable { + private long swigCPtr; + + public Acct(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.Acct_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(Acct obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Acct(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } + + public void setGui_label(String value) { + otapiJNI.Acct_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.Acct_gui_label_get(swigCPtr, this); + } + + public void setAcct_id(String value) { + otapiJNI.Acct_acct_id_set(swigCPtr, this, value); + } + + public String getAcct_id() { + return otapiJNI.Acct_acct_id_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.Acct_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.Acct_server_id_get(swigCPtr, this); + } + + public static Acct ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Acct_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Acct(cPtr, false); + } + +} diff --git a/testwallet/AddressBook.cs b/testwallet/AddressBook.cs new file mode 100644 index 000000000..1248fc38c --- /dev/null +++ b/testwallet/AddressBook.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class AddressBook : Storable { + private HandleRef swigCPtr; + + internal AddressBook(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.AddressBook_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(AddressBook obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~AddressBook() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_AddressBook(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetContactCount() { + uint ret = otapiPINVOKE.AddressBook_GetContactCount(swigCPtr); + return ret; + } + + public Contact GetContact(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.AddressBook_GetContact(swigCPtr, nIndex); + Contact ret = (cPtr == IntPtr.Zero) ? null : new Contact(cPtr, false); + return ret; + } + + public bool RemoveContact(uint nIndexContact) { + bool ret = otapiPINVOKE.AddressBook_RemoveContact(swigCPtr, nIndexContact); + return ret; + } + + public bool AddContact(Contact disownObject) { + bool ret = otapiPINVOKE.AddressBook_AddContact(swigCPtr, Contact.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static AddressBook ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.AddressBook_ot_dynamic_cast(Storable.getCPtr(pObject)); + AddressBook ret = (cPtr == IntPtr.Zero) ? null : new AddressBook(cPtr, false); + return ret; + } + +} diff --git a/testwallet/AddressBook.java b/testwallet/AddressBook.java new file mode 100644 index 000000000..c046eb7bc --- /dev/null +++ b/testwallet/AddressBook.java @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class AddressBook extends Storable { + private long swigCPtr; + + public AddressBook(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.AddressBook_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(AddressBook obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_AddressBook(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefContact(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + Contact refActualElement = GetContact(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof Contact)) + continue; + + Contact tempRef = (Contact)(theObject); + + if ((Contact.getCPtr(tempRef) == Contact.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefContact(Contact element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof Contact)) + continue; + + Contact tempRef = (Contact)(theObject); + + if ((Contact.getCPtr(tempRef) == Contact.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + Contact tempLocalRef = element; + elementList.add(tempLocalRef); + return Contact.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetContactCount() { return otapiJNI.AddressBook_GetContactCount(swigCPtr, this); } + + public Contact GetContact(long nIndex) { + long cPtr = otapiJNI.AddressBook_GetContact(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new Contact(cPtr, false); + } + + public boolean RemoveContact(long nIndexContact) { + return otapiJNI.AddressBook_RemoveContact(swigCPtr, this, removeRefContact(nIndexContact)); + } + + public boolean AddContact(Contact disownObject) { + return otapiJNI.AddressBook_AddContact(swigCPtr, this, Contact.getCPtr(disownObject), disownObject); + } + + public static AddressBook ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.AddressBook_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new AddressBook(cPtr, false); + } + +} diff --git a/testwallet/Android.mk b/testwallet/Android.mk new file mode 100644 index 000000000..e57c1f1c5 --- /dev/null +++ b/testwallet/Android.mk @@ -0,0 +1,38 @@ +# +# OTAPI +# +# Open Transactions by Fellow Traveler +# +# This is the high-level API and socket code. The rest of the Open Transactions lib +# is found in OTLib, which must be linked with this one (for this one to work.) +# +# See copyright notice that came with this distribution. +# Distributed as open-source under the AGPL. + +OTAPI_PATH := $(call my-dir) + +# OpenSSL 0.9.8 +OPENSSL_DIR := external/openssl +OPENSSL_INCLUDE_DIR := external/openssl/include + +# OpenSSL 1.0.0a +#OPENSSL_DIR := sources/openssl +#OPENSSL_INCLUDE_DIR := sources/openssl/include + +OTLIB_DIR := sources/Open-Transactions/OTLib + +include $(CLEAR_VARS) + +LOCAL_PATH := $(OTAPI_PATH) + +LOCAL_MODULE := libOTAPI + +LOCAL_LDLIBS += -ldl -lz -llog + +LOCAL_C_INCLUDES += $(OPENSSL_DIR) $(OPENSSL_INCLUDE_DIR) $(OTLIB_DIR) $(LOCAL_PATH) $(LOCAL_PATH)/SSL-Example + +LOCAL_SRC_FILES := SSL-Example/SFSocket.c OTServerConnection.cpp OTClient.cpp OpenTransactions.cpp OTAPI.cpp OTAPI_java.c + +LOCAL_STATIC_LIBRARIES := libssl libcrypto libOTLib libssl libcrypto libOTLib libssl libcrypto + +include $(BUILD_SHARED_LIBRARY) diff --git a/testwallet/AskData.cs b/testwallet/AskData.cs new file mode 100644 index 000000000..08f59f318 --- /dev/null +++ b/testwallet/AskData.cs @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class AskData : OfferDataMarket { + private HandleRef swigCPtr; + + internal AskData(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.AskData_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(AskData obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~AskData() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_AskData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.AskData_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.AskData_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.AskData_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.AskData_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price_per_scale { + set { + otapiPINVOKE.AskData_price_per_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.AskData_price_per_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string available_assets { + set { + otapiPINVOKE.AskData_available_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.AskData_available_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string minimum_increment { + set { + otapiPINVOKE.AskData_minimum_increment_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.AskData_minimum_increment_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static AskData ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.AskData_ot_dynamic_cast(Storable.getCPtr(pObject)); + AskData ret = (cPtr == IntPtr.Zero) ? null : new AskData(cPtr, false); + return ret; + } + +} diff --git a/testwallet/AskData.java b/testwallet/AskData.java new file mode 100644 index 000000000..2d16aea49 --- /dev/null +++ b/testwallet/AskData.java @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class AskData extends OfferDataMarket { + private long swigCPtr; + + public AskData(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.AskData_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(AskData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_AskData(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private OfferListMarket containerRefOfferListMarket; + // ---------------- + protected void addReference(OfferListMarket theContainer) { // This is Java code + containerRefOfferListMarket = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.AskData_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.AskData_gui_label_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.AskData_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.AskData_transaction_id_get(swigCPtr, this); + } + + public void setPrice_per_scale(String value) { + otapiJNI.AskData_price_per_scale_set(swigCPtr, this, value); + } + + public String getPrice_per_scale() { + return otapiJNI.AskData_price_per_scale_get(swigCPtr, this); + } + + public void setAvailable_assets(String value) { + otapiJNI.AskData_available_assets_set(swigCPtr, this, value); + } + + public String getAvailable_assets() { + return otapiJNI.AskData_available_assets_get(swigCPtr, this); + } + + public void setMinimum_increment(String value) { + otapiJNI.AskData_minimum_increment_set(swigCPtr, this, value); + } + + public String getMinimum_increment() { + return otapiJNI.AskData_minimum_increment_get(swigCPtr, this); + } + + public static AskData ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.AskData_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new AskData(cPtr, false); + } + +} diff --git a/testwallet/BidData.cs b/testwallet/BidData.cs new file mode 100644 index 000000000..f09d68b3c --- /dev/null +++ b/testwallet/BidData.cs @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class BidData : OfferDataMarket { + private HandleRef swigCPtr; + + internal BidData(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.BidData_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(BidData obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~BidData() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_BidData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.BidData_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BidData_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.BidData_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BidData_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price_per_scale { + set { + otapiPINVOKE.BidData_price_per_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BidData_price_per_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string available_assets { + set { + otapiPINVOKE.BidData_available_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BidData_available_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string minimum_increment { + set { + otapiPINVOKE.BidData_minimum_increment_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BidData_minimum_increment_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static BidData ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.BidData_ot_dynamic_cast(Storable.getCPtr(pObject)); + BidData ret = (cPtr == IntPtr.Zero) ? null : new BidData(cPtr, false); + return ret; + } + +} diff --git a/testwallet/BidData.java b/testwallet/BidData.java new file mode 100644 index 000000000..52bb7d96f --- /dev/null +++ b/testwallet/BidData.java @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class BidData extends OfferDataMarket { + private long swigCPtr; + + public BidData(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.BidData_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(BidData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_BidData(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private OfferListMarket containerRefOfferListMarket; + // ---------------- + protected void addReference(OfferListMarket theContainer) { // This is Java code + containerRefOfferListMarket = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.BidData_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.BidData_gui_label_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.BidData_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.BidData_transaction_id_get(swigCPtr, this); + } + + public void setPrice_per_scale(String value) { + otapiJNI.BidData_price_per_scale_set(swigCPtr, this, value); + } + + public String getPrice_per_scale() { + return otapiJNI.BidData_price_per_scale_get(swigCPtr, this); + } + + public void setAvailable_assets(String value) { + otapiJNI.BidData_available_assets_set(swigCPtr, this, value); + } + + public String getAvailable_assets() { + return otapiJNI.BidData_available_assets_get(swigCPtr, this); + } + + public void setMinimum_increment(String value) { + otapiJNI.BidData_minimum_increment_set(swigCPtr, this, value); + } + + public String getMinimum_increment() { + return otapiJNI.BidData_minimum_increment_get(swigCPtr, this); + } + + public static BidData ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.BidData_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new BidData(cPtr, false); + } + +} diff --git a/testwallet/BitcoinAcct.cs b/testwallet/BitcoinAcct.cs new file mode 100644 index 000000000..fbdb0a31a --- /dev/null +++ b/testwallet/BitcoinAcct.cs @@ -0,0 +1,96 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class BitcoinAcct : Acct { + private HandleRef swigCPtr; + + internal BitcoinAcct(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.BitcoinAcct_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(BitcoinAcct obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~BitcoinAcct() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_BitcoinAcct(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.BitcoinAcct_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinAcct_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string acct_id { + set { + otapiPINVOKE.BitcoinAcct_acct_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinAcct_acct_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.BitcoinAcct_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinAcct_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string bitcoin_acct_name { + set { + otapiPINVOKE.BitcoinAcct_bitcoin_acct_name_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinAcct_bitcoin_acct_name_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static BitcoinAcct ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.BitcoinAcct_ot_dynamic_cast(Storable.getCPtr(pObject)); + BitcoinAcct ret = (cPtr == IntPtr.Zero) ? null : new BitcoinAcct(cPtr, false); + return ret; + } + +} diff --git a/testwallet/BitcoinAcct.java b/testwallet/BitcoinAcct.java new file mode 100644 index 000000000..6a5a35ee1 --- /dev/null +++ b/testwallet/BitcoinAcct.java @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class BitcoinAcct extends Acct { + private long swigCPtr; + + public BitcoinAcct(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.BitcoinAcct_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(BitcoinAcct obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_BitcoinAcct(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private WalletData containerRefWalletData; + // ---------------- + protected void addReference(WalletData theContainer) { // This is Java code + containerRefWalletData = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.BitcoinAcct_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.BitcoinAcct_gui_label_get(swigCPtr, this); + } + + public void setAcct_id(String value) { + otapiJNI.BitcoinAcct_acct_id_set(swigCPtr, this, value); + } + + public String getAcct_id() { + return otapiJNI.BitcoinAcct_acct_id_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.BitcoinAcct_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.BitcoinAcct_server_id_get(swigCPtr, this); + } + + public void setBitcoin_acct_name(String value) { + otapiJNI.BitcoinAcct_bitcoin_acct_name_set(swigCPtr, this, value); + } + + public String getBitcoin_acct_name() { + return otapiJNI.BitcoinAcct_bitcoin_acct_name_get(swigCPtr, this); + } + + public static BitcoinAcct ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.BitcoinAcct_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new BitcoinAcct(cPtr, false); + } + +} diff --git a/testwallet/BitcoinServer.cs b/testwallet/BitcoinServer.cs new file mode 100644 index 000000000..f385afc0f --- /dev/null +++ b/testwallet/BitcoinServer.cs @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class BitcoinServer : Server { + private HandleRef swigCPtr; + + internal BitcoinServer(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.BitcoinServer_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(BitcoinServer obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~BitcoinServer() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_BitcoinServer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.BitcoinServer_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.BitcoinServer_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.BitcoinServer_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_host { + set { + otapiPINVOKE.BitcoinServer_server_host_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_server_host_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_port { + set { + otapiPINVOKE.BitcoinServer_server_port_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_server_port_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string bitcoin_username { + set { + otapiPINVOKE.BitcoinServer_bitcoin_username_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_bitcoin_username_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string bitcoin_password { + set { + otapiPINVOKE.BitcoinServer_bitcoin_password_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.BitcoinServer_bitcoin_password_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static BitcoinServer ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.BitcoinServer_ot_dynamic_cast(Storable.getCPtr(pObject)); + BitcoinServer ret = (cPtr == IntPtr.Zero) ? null : new BitcoinServer(cPtr, false); + return ret; + } + +} diff --git a/testwallet/BitcoinServer.java b/testwallet/BitcoinServer.java new file mode 100644 index 000000000..d2e2fbec9 --- /dev/null +++ b/testwallet/BitcoinServer.java @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class BitcoinServer extends Server { + private long swigCPtr; + + public BitcoinServer(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.BitcoinServer_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(BitcoinServer obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_BitcoinServer(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private WalletData containerRefWalletData; + // ---------------- + protected void addReference(WalletData theContainer) { // This is Java code + containerRefWalletData = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.BitcoinServer_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.BitcoinServer_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.BitcoinServer_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.BitcoinServer_server_id_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.BitcoinServer_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.BitcoinServer_server_type_get(swigCPtr, this); + } + + public void setServer_host(String value) { + otapiJNI.BitcoinServer_server_host_set(swigCPtr, this, value); + } + + public String getServer_host() { + return otapiJNI.BitcoinServer_server_host_get(swigCPtr, this); + } + + public void setServer_port(String value) { + otapiJNI.BitcoinServer_server_port_set(swigCPtr, this, value); + } + + public String getServer_port() { + return otapiJNI.BitcoinServer_server_port_get(swigCPtr, this); + } + + public void setBitcoin_username(String value) { + otapiJNI.BitcoinServer_bitcoin_username_set(swigCPtr, this, value); + } + + public String getBitcoin_username() { + return otapiJNI.BitcoinServer_bitcoin_username_get(swigCPtr, this); + } + + public void setBitcoin_password(String value) { + otapiJNI.BitcoinServer_bitcoin_password_set(swigCPtr, this, value); + } + + public String getBitcoin_password() { + return otapiJNI.BitcoinServer_bitcoin_password_get(swigCPtr, this); + } + + public static BitcoinServer ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.BitcoinServer_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new BitcoinServer(cPtr, false); + } + +} diff --git a/testwallet/Blob.cs b/testwallet/Blob.cs new file mode 100644 index 000000000..7a2703ec5 --- /dev/null +++ b/testwallet/Blob.cs @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Blob : Storable { + private HandleRef swigCPtr; + + internal Blob(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.Blob_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Blob obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Blob() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Blob(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public SWIGTYPE_p_std__vectorT_unsigned_char_t m_memBuffer { + set { + otapiPINVOKE.Blob_m_memBuffer_set(swigCPtr, SWIGTYPE_p_std__vectorT_unsigned_char_t.getCPtr(value)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + SWIGTYPE_p_std__vectorT_unsigned_char_t ret = new SWIGTYPE_p_std__vectorT_unsigned_char_t(otapiPINVOKE.Blob_m_memBuffer_get(swigCPtr), true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static Blob ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Blob_ot_dynamic_cast(Storable.getCPtr(pObject)); + Blob ret = (cPtr == IntPtr.Zero) ? null : new Blob(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Blob.java b/testwallet/Blob.java new file mode 100644 index 000000000..cab6389e7 --- /dev/null +++ b/testwallet/Blob.java @@ -0,0 +1,51 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Blob extends Storable { + private long swigCPtr; + + public Blob(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.Blob_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(Blob obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Blob(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + public void setM_memBuffer(SWIGTYPE_p_std__vectorT_unsigned_char_t value) { + otapiJNI.Blob_m_memBuffer_set(swigCPtr, this, SWIGTYPE_p_std__vectorT_unsigned_char_t.getCPtr(value)); + } + + public SWIGTYPE_p_std__vectorT_unsigned_char_t getM_memBuffer() { + return new SWIGTYPE_p_std__vectorT_unsigned_char_t(otapiJNI.Blob_m_memBuffer_get(swigCPtr, this), true); + } + + public static Blob ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Blob_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Blob(cPtr, false); + } + +} diff --git a/testwallet/CPP_API_Windows/CPP_API_Windows.vcxproj b/testwallet/CPP_API_Windows/CPP_API_Windows.vcxproj new file mode 100644 index 000000000..55a855da8 --- /dev/null +++ b/testwallet/CPP_API_Windows/CPP_API_Windows.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + TCP Debug + Win32 + + + TCP Release + Win32 + + + + + + + + + + + + + + + + + + + + {B1CC610E-632B-4703-A455-D579342C99CA} + Win32Proj + CPP_API_Windows + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + C:\~\protobuf\src;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\XmlRpcC4Win;C:\~\Open-Transactions\OTLib;$(IncludePath) + + + C:\~\protobuf\src;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + + + C:\~\Open-Transactions\OTLib\OTLib\Debug;$(LibraryPath) + + + C:\~\Open-Transactions\OTLib\OTLib\TCP Debug;$(LibraryPath) + + + C:\~\Open-Transactions\OTLib\simpleini;C:\~\zeromq\include;C:\~\protobuf\src;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\XmlRpcC4Win;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\Open-Transactions\OTLib\OTLib\Release;$(LibraryPath) + + + C:\~\protobuf\src;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\Open-Transactions\OTLib\OTLib\TCP Release;$(LibraryPath) + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + + + Windows + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/testwallet/Contact.cs b/testwallet/Contact.cs new file mode 100644 index 000000000..e09b67b3b --- /dev/null +++ b/testwallet/Contact.cs @@ -0,0 +1,152 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Contact : Displayable { + private HandleRef swigCPtr; + + internal Contact(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.Contact_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Contact obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Contact() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Contact(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.Contact_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Contact_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string contact_id { + set { + otapiPINVOKE.Contact_contact_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Contact_contact_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string email { + set { + otapiPINVOKE.Contact_email_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Contact_email_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string memo { + set { + otapiPINVOKE.Contact_memo_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Contact_memo_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string public_key { + set { + otapiPINVOKE.Contact_public_key_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Contact_public_key_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public uint GetContactNymCount() { + uint ret = otapiPINVOKE.Contact_GetContactNymCount(swigCPtr); + return ret; + } + + public ContactNym GetContactNym(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.Contact_GetContactNym(swigCPtr, nIndex); + ContactNym ret = (cPtr == IntPtr.Zero) ? null : new ContactNym(cPtr, false); + return ret; + } + + public bool RemoveContactNym(uint nIndexContactNym) { + bool ret = otapiPINVOKE.Contact_RemoveContactNym(swigCPtr, nIndexContactNym); + return ret; + } + + public bool AddContactNym(ContactNym disownObject) { + bool ret = otapiPINVOKE.Contact_AddContactNym(swigCPtr, ContactNym.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public uint GetContactAcctCount() { + uint ret = otapiPINVOKE.Contact_GetContactAcctCount(swigCPtr); + return ret; + } + + public ContactAcct GetContactAcct(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.Contact_GetContactAcct(swigCPtr, nIndex); + ContactAcct ret = (cPtr == IntPtr.Zero) ? null : new ContactAcct(cPtr, false); + return ret; + } + + public bool RemoveContactAcct(uint nIndexContactAcct) { + bool ret = otapiPINVOKE.Contact_RemoveContactAcct(swigCPtr, nIndexContactAcct); + return ret; + } + + public bool AddContactAcct(ContactAcct disownObject) { + bool ret = otapiPINVOKE.Contact_AddContactAcct(swigCPtr, ContactAcct.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static Contact ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Contact_ot_dynamic_cast(Storable.getCPtr(pObject)); + Contact ret = (cPtr == IntPtr.Zero) ? null : new Contact(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Contact.java b/testwallet/Contact.java new file mode 100644 index 000000000..7c0c390da --- /dev/null +++ b/testwallet/Contact.java @@ -0,0 +1,245 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Contact extends Displayable { + private long swigCPtr; + + public Contact(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.Contact_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(Contact obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Contact(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private AddressBook containerRefAddressBook; + // ---------------- + protected void addReference(AddressBook theContainer) { // This is Java code + containerRefAddressBook = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefContactNym(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + ContactNym refActualElement = GetContactNym(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ContactNym)) + continue; + + ContactNym tempRef = (ContactNym)(theObject); + + if ((ContactNym.getCPtr(tempRef) == ContactNym.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefContactNym(ContactNym element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ContactNym)) + continue; + + ContactNym tempRef = (ContactNym)(theObject); + + if ((ContactNym.getCPtr(tempRef) == ContactNym.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + ContactNym tempLocalRef = element; + elementList.add(tempLocalRef); + return ContactNym.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefContactAcct(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + ContactAcct refActualElement = GetContactAcct(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ContactAcct)) + continue; + + ContactAcct tempRef = (ContactAcct)(theObject); + + if ((ContactAcct.getCPtr(tempRef) == ContactAcct.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefContactAcct(ContactAcct element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ContactAcct)) + continue; + + ContactAcct tempRef = (ContactAcct)(theObject); + + if ((ContactAcct.getCPtr(tempRef) == ContactAcct.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + ContactAcct tempLocalRef = element; + elementList.add(tempLocalRef); + return ContactAcct.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public void setGui_label(String value) { + otapiJNI.Contact_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.Contact_gui_label_get(swigCPtr, this); + } + + public void setContact_id(String value) { + otapiJNI.Contact_contact_id_set(swigCPtr, this, value); + } + + public String getContact_id() { + return otapiJNI.Contact_contact_id_get(swigCPtr, this); + } + + public void setEmail(String value) { + otapiJNI.Contact_email_set(swigCPtr, this, value); + } + + public String getEmail() { + return otapiJNI.Contact_email_get(swigCPtr, this); + } + + public void setMemo(String value) { + otapiJNI.Contact_memo_set(swigCPtr, this, value); + } + + public String getMemo() { + return otapiJNI.Contact_memo_get(swigCPtr, this); + } + + public void setPublic_key(String value) { + otapiJNI.Contact_public_key_set(swigCPtr, this, value); + } + + public String getPublic_key() { + return otapiJNI.Contact_public_key_get(swigCPtr, this); + } + + public long GetContactNymCount() { return otapiJNI.Contact_GetContactNymCount(swigCPtr, this); } + + public ContactNym GetContactNym(long nIndex) { + long cPtr = otapiJNI.Contact_GetContactNym(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new ContactNym(cPtr, false); + } + + public boolean RemoveContactNym(long nIndexContactNym) { + return otapiJNI.Contact_RemoveContactNym(swigCPtr, this, removeRefContactNym(nIndexContactNym)); + } + + public boolean AddContactNym(ContactNym disownObject) { + return otapiJNI.Contact_AddContactNym(swigCPtr, this, ContactNym.getCPtr(disownObject), disownObject); + } + + public long GetContactAcctCount() { return otapiJNI.Contact_GetContactAcctCount(swigCPtr, this); } + + public ContactAcct GetContactAcct(long nIndex) { + long cPtr = otapiJNI.Contact_GetContactAcct(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new ContactAcct(cPtr, false); + } + + public boolean RemoveContactAcct(long nIndexContactAcct) { + return otapiJNI.Contact_RemoveContactAcct(swigCPtr, this, removeRefContactAcct(nIndexContactAcct)); + } + + public boolean AddContactAcct(ContactAcct disownObject) { + return otapiJNI.Contact_AddContactAcct(swigCPtr, this, ContactAcct.getCPtr(disownObject), disownObject); + } + + public static Contact ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Contact_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Contact(cPtr, false); + } + +} diff --git a/testwallet/ContactAcct.cs b/testwallet/ContactAcct.cs new file mode 100644 index 000000000..c50f6362f --- /dev/null +++ b/testwallet/ContactAcct.cs @@ -0,0 +1,144 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class ContactAcct : Displayable { + private HandleRef swigCPtr; + + internal ContactAcct(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.ContactAcct_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(ContactAcct obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~ContactAcct() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_ContactAcct(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.ContactAcct_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.ContactAcct_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.ContactAcct_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string asset_type_id { + set { + otapiPINVOKE.ContactAcct_asset_type_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_asset_type_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string acct_id { + set { + otapiPINVOKE.ContactAcct_acct_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_acct_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string nym_id { + set { + otapiPINVOKE.ContactAcct_nym_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_nym_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string memo { + set { + otapiPINVOKE.ContactAcct_memo_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_memo_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string public_key { + set { + otapiPINVOKE.ContactAcct_public_key_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactAcct_public_key_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static ContactAcct ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.ContactAcct_ot_dynamic_cast(Storable.getCPtr(pObject)); + ContactAcct ret = (cPtr == IntPtr.Zero) ? null : new ContactAcct(cPtr, false); + return ret; + } + +} diff --git a/testwallet/ContactAcct.java b/testwallet/ContactAcct.java new file mode 100644 index 000000000..e20ba5655 --- /dev/null +++ b/testwallet/ContactAcct.java @@ -0,0 +1,116 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class ContactAcct extends Displayable { + private long swigCPtr; + + public ContactAcct(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.ContactAcct_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(ContactAcct obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_ContactAcct(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private Contact containerRefContact; + // ---------------- + protected void addReference(Contact theContainer) { // This is Java code + containerRefContact = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.ContactAcct_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.ContactAcct_gui_label_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.ContactAcct_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.ContactAcct_server_type_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.ContactAcct_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.ContactAcct_server_id_get(swigCPtr, this); + } + + public void setAsset_type_id(String value) { + otapiJNI.ContactAcct_asset_type_id_set(swigCPtr, this, value); + } + + public String getAsset_type_id() { + return otapiJNI.ContactAcct_asset_type_id_get(swigCPtr, this); + } + + public void setAcct_id(String value) { + otapiJNI.ContactAcct_acct_id_set(swigCPtr, this, value); + } + + public String getAcct_id() { + return otapiJNI.ContactAcct_acct_id_get(swigCPtr, this); + } + + public void setNym_id(String value) { + otapiJNI.ContactAcct_nym_id_set(swigCPtr, this, value); + } + + public String getNym_id() { + return otapiJNI.ContactAcct_nym_id_get(swigCPtr, this); + } + + public void setMemo(String value) { + otapiJNI.ContactAcct_memo_set(swigCPtr, this, value); + } + + public String getMemo() { + return otapiJNI.ContactAcct_memo_get(swigCPtr, this); + } + + public void setPublic_key(String value) { + otapiJNI.ContactAcct_public_key_set(swigCPtr, this, value); + } + + public String getPublic_key() { + return otapiJNI.ContactAcct_public_key_get(swigCPtr, this); + } + + public static ContactAcct ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.ContactAcct_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new ContactAcct(cPtr, false); + } + +} diff --git a/testwallet/ContactNym.cs b/testwallet/ContactNym.cs new file mode 100644 index 000000000..4603fb7d9 --- /dev/null +++ b/testwallet/ContactNym.cs @@ -0,0 +1,130 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class ContactNym : Displayable { + private HandleRef swigCPtr; + + internal ContactNym(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.ContactNym_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(ContactNym obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~ContactNym() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_ContactNym(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.ContactNym_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactNym_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string nym_type { + set { + otapiPINVOKE.ContactNym_nym_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactNym_nym_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string nym_id { + set { + otapiPINVOKE.ContactNym_nym_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactNym_nym_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string public_key { + set { + otapiPINVOKE.ContactNym_public_key_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactNym_public_key_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string memo { + set { + otapiPINVOKE.ContactNym_memo_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ContactNym_memo_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public uint GetServerInfoCount() { + uint ret = otapiPINVOKE.ContactNym_GetServerInfoCount(swigCPtr); + return ret; + } + + public ServerInfo GetServerInfo(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.ContactNym_GetServerInfo(swigCPtr, nIndex); + ServerInfo ret = (cPtr == IntPtr.Zero) ? null : new ServerInfo(cPtr, false); + return ret; + } + + public bool RemoveServerInfo(uint nIndexServerInfo) { + bool ret = otapiPINVOKE.ContactNym_RemoveServerInfo(swigCPtr, nIndexServerInfo); + return ret; + } + + public bool AddServerInfo(ServerInfo disownObject) { + bool ret = otapiPINVOKE.ContactNym_AddServerInfo(swigCPtr, ServerInfo.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static ContactNym ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.ContactNym_ot_dynamic_cast(Storable.getCPtr(pObject)); + ContactNym ret = (cPtr == IntPtr.Zero) ? null : new ContactNym(cPtr, false); + return ret; + } + +} diff --git a/testwallet/ContactNym.java b/testwallet/ContactNym.java new file mode 100644 index 000000000..b5f9eb49e --- /dev/null +++ b/testwallet/ContactNym.java @@ -0,0 +1,170 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class ContactNym extends Displayable { + private long swigCPtr; + + public ContactNym(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.ContactNym_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(ContactNym obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_ContactNym(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private Contact containerRefContact; + // ---------------- + protected void addReference(Contact theContainer) { // This is Java code + containerRefContact = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefServerInfo(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + ServerInfo refActualElement = GetServerInfo(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ServerInfo)) + continue; + + ServerInfo tempRef = (ServerInfo)(theObject); + + if ((ServerInfo.getCPtr(tempRef) == ServerInfo.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefServerInfo(ServerInfo element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof ServerInfo)) + continue; + + ServerInfo tempRef = (ServerInfo)(theObject); + + if ((ServerInfo.getCPtr(tempRef) == ServerInfo.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + ServerInfo tempLocalRef = element; + elementList.add(tempLocalRef); + return ServerInfo.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public void setGui_label(String value) { + otapiJNI.ContactNym_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.ContactNym_gui_label_get(swigCPtr, this); + } + + public void setNym_type(String value) { + otapiJNI.ContactNym_nym_type_set(swigCPtr, this, value); + } + + public String getNym_type() { + return otapiJNI.ContactNym_nym_type_get(swigCPtr, this); + } + + public void setNym_id(String value) { + otapiJNI.ContactNym_nym_id_set(swigCPtr, this, value); + } + + public String getNym_id() { + return otapiJNI.ContactNym_nym_id_get(swigCPtr, this); + } + + public void setPublic_key(String value) { + otapiJNI.ContactNym_public_key_set(swigCPtr, this, value); + } + + public String getPublic_key() { + return otapiJNI.ContactNym_public_key_get(swigCPtr, this); + } + + public void setMemo(String value) { + otapiJNI.ContactNym_memo_set(swigCPtr, this, value); + } + + public String getMemo() { + return otapiJNI.ContactNym_memo_get(swigCPtr, this); + } + + public long GetServerInfoCount() { return otapiJNI.ContactNym_GetServerInfoCount(swigCPtr, this); } + + public ServerInfo GetServerInfo(long nIndex) { + long cPtr = otapiJNI.ContactNym_GetServerInfo(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new ServerInfo(cPtr, false); + } + + public boolean RemoveServerInfo(long nIndexServerInfo) { + return otapiJNI.ContactNym_RemoveServerInfo(swigCPtr, this, removeRefServerInfo(nIndexServerInfo)); + } + + public boolean AddServerInfo(ServerInfo disownObject) { + return otapiJNI.ContactNym_AddServerInfo(swigCPtr, this, ServerInfo.getCPtr(disownObject), disownObject); + } + + public static ContactNym ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.ContactNym_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new ContactNym(cPtr, false); + } + +} diff --git a/testwallet/Displayable.cs b/testwallet/Displayable.cs new file mode 100644 index 000000000..dbcdb6040 --- /dev/null +++ b/testwallet/Displayable.cs @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Displayable : Storable { + private HandleRef swigCPtr; + + internal Displayable(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.Displayable_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Displayable obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Displayable() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Displayable(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.Displayable_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Displayable_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static Displayable ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Displayable_ot_dynamic_cast(Storable.getCPtr(pObject)); + Displayable ret = (cPtr == IntPtr.Zero) ? null : new Displayable(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Displayable.java b/testwallet/Displayable.java new file mode 100644 index 000000000..f1d53158e --- /dev/null +++ b/testwallet/Displayable.java @@ -0,0 +1,51 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Displayable extends Storable { + private long swigCPtr; + + public Displayable(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.Displayable_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(Displayable obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Displayable(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } + + public void setGui_label(String value) { + otapiJNI.Displayable_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.Displayable_gui_label_get(swigCPtr, this); + } + + public static Displayable ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Displayable_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Displayable(cPtr, false); + } + +} diff --git a/testwallet/JNI_API_Windows/JNI_API_Windows.cpp b/testwallet/JNI_API_Windows/JNI_API_Windows.cpp new file mode 100755 index 000000000..0a3e2dea0 --- /dev/null +++ b/testwallet/JNI_API_Windows/JNI_API_Windows.cpp @@ -0,0 +1,28 @@ +// JNI_API_Windows.cpp : Defines the exported functions for the DLL application. +// + +#include "stdafx.h" +#include "JNI_API_Windows.h" + + +// This is an example of an exported variable +JNI_API_WINDOWS_API int nJNI_API_Windows=0; + +// This is an example of an exported function. +JNI_API_WINDOWS_API int fnJNI_API_Windows(void) +{ + return 42; +} + +// This is the constructor of a class that has been exported. +// see JNI_API_Windows.h for the class definition +CJNI_API_Windows::CJNI_API_Windows() +{ + return; +} + + +void OT_Sleep(int nMS) +{ + Sleep(nMS); +} diff --git a/testwallet/JNI_API_Windows/JNI_API_Windows.h b/testwallet/JNI_API_Windows/JNI_API_Windows.h new file mode 100755 index 000000000..f46b70af6 --- /dev/null +++ b/testwallet/JNI_API_Windows/JNI_API_Windows.h @@ -0,0 +1,22 @@ +// The following ifdef block is the standard way of creating macros which make exporting +// from a DLL simpler. All files within this DLL are compiled with the JNI_API_WINDOWS_EXPORTS +// symbol defined on the command line. This symbol should not be defined on any project +// that uses this DLL. This way any other project whose source files include this file see +// JNI_API_WINDOWS_API functions as being imported from a DLL, whereas this DLL sees symbols +// defined with this macro as being exported. +#ifdef JNI_API_WINDOWS_EXPORTS +#define JNI_API_WINDOWS_API __declspec(dllexport) +#else +#define JNI_API_WINDOWS_API __declspec(dllimport) +#endif + +// This class is exported from the JNI_API_Windows.dll +class JNI_API_WINDOWS_API CJNI_API_Windows { +public: + CJNI_API_Windows(void); + // TODO: add your methods here. +}; + +extern JNI_API_WINDOWS_API int nJNI_API_Windows; + +JNI_API_WINDOWS_API int fnJNI_API_Windows(void); diff --git a/testwallet/JNI_API_Windows/JNI_API_Windows.vcxproj b/testwallet/JNI_API_Windows/JNI_API_Windows.vcxproj new file mode 100644 index 000000000..8a0945076 --- /dev/null +++ b/testwallet/JNI_API_Windows/JNI_API_Windows.vcxproj @@ -0,0 +1,177 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + TCP Debug + Win32 + + + TCP Release + Win32 + + + + {75592C53-811B-4DFE-9454-7FB9E90C49EA} + Win32Proj + JNI_API_Windows + + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + true + C:\~\protobuf\src;C:\~\Java\include\win32;C:\~\Java\include;C:\Program Files\Java\jdk1.6.0\include\win32;C:\Program Files\Java\jdk1.6.0\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\zeromq\builds\msvc\libzmq\Release;C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\Debug;C:\~\Open-Transactions\testwallet\CPP_API_Windows\Debug;$(LibraryPath) + otapi + C:\~\Open-Transactions\testwallet\ + + + true + C:\~\protobuf\src;C:\~\Java\include\win32;C:\~\Java\include;C:\Program Files\Java\jdk1.6.0\include\win32;C:\Program Files\Java\jdk1.6.0\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\zeromq\builds\msvc\libzmq\Release;C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\TCP Debug;C:\~\Open-Transactions\testwallet\CPP_API_Windows\TCP Debug;$(LibraryPath) + otapi + C:\~\Open-Transactions\testwallet\ + + + false + C:\~\protobuf\src;C:\~\Java\include\win32;C:\~\Java\include;C:\Program Files\Java\jdk1.6.0\include\win32;C:\Program Files\Java\jdk1.6.0\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\zeromq\builds\msvc\libzmq\Release;C:\~\protobuf\vsprojects\Release;C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\Release;C:\~\Open-Transactions\testwallet\CPP_API_Windows\Release;$(LibraryPath) + otapi + + + false + C:\~\protobuf\src;C:\~\Java\include\win32;C:\~\Java\include;C:\Program Files\Java\jdk1.6.0\include\win32;C:\Program Files\Java\jdk1.6.0\include;C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\zeromq\builds\msvc\libzmq\Release;C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\TCP Release;C:\~\Open-Transactions\testwallet\CPP_API_Windows\TCP Release;$(LibraryPath) + otapi + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;JNI_API_WINDOWS_EXPORTS;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + libzmq.lib;winmm.lib;wininet.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;CPP_API_Windows.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;JNI_API_WINDOWS_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + libzmq.lib;winmm.lib;wininet.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;CPP_API_Windows.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;JNI_API_WINDOWS_EXPORTS;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + libzmq.lib;winmm.lib;wininet.lib;ws2_32.lib;libeay32MT.lib;ssleay32MT.lib;libprotobuf.lib;OTLib.lib;CPP_API_Windows.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;JNI_API_WINDOWS_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + libzmq.lib;winmm.lib;wininet.lib;ws2_32.lib;libeay32MT.lib;ssleay32MT.lib;OTLib.lib;CPP_API_Windows.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + true + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/testwallet/JNI_API_Windows/applink.c b/testwallet/JNI_API_Windows/applink.c new file mode 100755 index 000000000..7789bd930 --- /dev/null +++ b/testwallet/JNI_API_Windows/applink.c @@ -0,0 +1,94 @@ +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +#include +#include +#include + +static void *app_stdin(void) { return stdin; } +static void *app_stdout(void) { return stdout; } +static void *app_stderr(void) { return stderr; } +static int app_feof(FILE *fp) { return feof(fp); } +static int app_ferror(FILE *fp) { return ferror(fp); } +static void app_clearerr(FILE *fp) { clearerr(fp); } +static int app_fileno(FILE *fp) { return _fileno(fp); } +static int app_fsetmod(FILE *fp,char mod) +{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +#if defined(__BORLANDC__) +__stdcall /* __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. */ +#else +__cdecl +#endif +OPENSSL_Applink(void) +{ static int once=1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX}; + + if (once) + { OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/testwallet/JNI_API_Windows/dllmain.cpp b/testwallet/JNI_API_Windows/dllmain.cpp new file mode 100755 index 000000000..8a4edd310 --- /dev/null +++ b/testwallet/JNI_API_Windows/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/testwallet/JNI_API_Windows/stdafx.cpp b/testwallet/JNI_API_Windows/stdafx.cpp new file mode 100755 index 000000000..6c1e109dd --- /dev/null +++ b/testwallet/JNI_API_Windows/stdafx.cpp @@ -0,0 +1,6 @@ +// stdafx.cpp : source file that includes just the standard includes +// JNI_API_Windows.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + diff --git a/testwallet/JNI_API_Windows/stdafx.h b/testwallet/JNI_API_Windows/stdafx.h new file mode 100755 index 000000000..677e68a9f --- /dev/null +++ b/testwallet/JNI_API_Windows/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + + + +// TODO: reference additional headers your program requires here diff --git a/testwallet/JNI_API_Windows/targetver.h b/testwallet/JNI_API_Windows/targetver.h new file mode 100755 index 000000000..90e767bfc --- /dev/null +++ b/testwallet/JNI_API_Windows/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/testwallet/LoomServer.cs b/testwallet/LoomServer.cs new file mode 100644 index 000000000..7a047035b --- /dev/null +++ b/testwallet/LoomServer.cs @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class LoomServer : Server { + private HandleRef swigCPtr; + + internal LoomServer(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.LoomServer_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(LoomServer obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~LoomServer() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_LoomServer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.LoomServer_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.LoomServer_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.LoomServer_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_host { + set { + otapiPINVOKE.LoomServer_server_host_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_server_host_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_port { + set { + otapiPINVOKE.LoomServer_server_port_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_server_port_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string loom_username { + set { + otapiPINVOKE.LoomServer_loom_username_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_loom_username_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string namefield_id { + set { + otapiPINVOKE.LoomServer_namefield_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.LoomServer_namefield_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static LoomServer ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.LoomServer_ot_dynamic_cast(Storable.getCPtr(pObject)); + LoomServer ret = (cPtr == IntPtr.Zero) ? null : new LoomServer(cPtr, false); + return ret; + } + +} diff --git a/testwallet/LoomServer.java b/testwallet/LoomServer.java new file mode 100644 index 000000000..08f31b369 --- /dev/null +++ b/testwallet/LoomServer.java @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class LoomServer extends Server { + private long swigCPtr; + + public LoomServer(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.LoomServer_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(LoomServer obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_LoomServer(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private WalletData containerRefWalletData; + // ---------------- + protected void addReference(WalletData theContainer) { // This is Java code + containerRefWalletData = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.LoomServer_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.LoomServer_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.LoomServer_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.LoomServer_server_id_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.LoomServer_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.LoomServer_server_type_get(swigCPtr, this); + } + + public void setServer_host(String value) { + otapiJNI.LoomServer_server_host_set(swigCPtr, this, value); + } + + public String getServer_host() { + return otapiJNI.LoomServer_server_host_get(swigCPtr, this); + } + + public void setServer_port(String value) { + otapiJNI.LoomServer_server_port_set(swigCPtr, this, value); + } + + public String getServer_port() { + return otapiJNI.LoomServer_server_port_get(swigCPtr, this); + } + + public void setLoom_username(String value) { + otapiJNI.LoomServer_loom_username_set(swigCPtr, this, value); + } + + public String getLoom_username() { + return otapiJNI.LoomServer_loom_username_get(swigCPtr, this); + } + + public void setNamefield_id(String value) { + otapiJNI.LoomServer_namefield_id_set(swigCPtr, this, value); + } + + public String getNamefield_id() { + return otapiJNI.LoomServer_namefield_id_get(swigCPtr, this); + } + + public static LoomServer ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.LoomServer_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new LoomServer(cPtr, false); + } + +} diff --git a/testwallet/Makefile b/testwallet/Makefile new file mode 100644 index 000000000..4e421e07e --- /dev/null +++ b/testwallet/Makefile @@ -0,0 +1,343 @@ +# +# Open-Transactions: testwallet Makefile +# +# IMPORTANT: WHEN USING THIS MAKEFILE, YOU *MUST* USE THE OPTIONS. +# EXAMPLE: +# +# make TRANSPORT=ZMQ +# make TRANSPORT=ssltcp debug +# Etc... +# +# Transport is mandatory. +# +# Platform options are darwin, linux and freebsd (these are auto-detected now) +# +# Language options are c, csharp, java, ruby, python, perl5, php5, +# tcl, and lisp. +# + +PROGRAM = testwallet.exe +DEBUG_PROGRAM = testwallet.debug + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := ___OT_PLATFORM_UNKNOWN___ + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + +PLATFORM = $(OT_PLATFORM) + + +# --------------------------------------------------------------------- + + +OT_INCLUDEDIRS = \ + -I../OTLib/irrxml \ + -I../OTLib \ + -I./SSL-Example \ + -I../OTLib/simpleini \ + -I. + + +OT_LIBDIRS = \ + -L../OTLib + +API_CSOURCES = SSL-Example/SFSocket.c +API_CXXSOURCES = # empty +API_CFLAGS = # empty +API_LDFLAGS = # empty + + +C_COMPILER = cc + +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +API_LIBS = -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLibd +# +# FT: I tested this. The above version worked on Linux, and the below version did not. +# +#API_LIBS = -lssl -lcrypto -lOTLib +#API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd + + + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +API_CFLAGS = -m64 +API_LDFLAGS = -m64 +endif + +# --------------------------------------------------------------------- +# SSL Folders! + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c +endif + +# --------------------------------------------------------------------- + + +ifeq ($(DSP), 1) +PLATFORM_LIBDIRS = -L../openssl +PLATFORM_INCLUDEDIRS = -I../openssl/include +else +PLATFORM_LIBDIRS = #empty +PLATFORM_INCLUDEDIRS = #empty +endif + +# --------------------------------------------------------------------- + + +# +# Eventually more platform stuff can go below here, like 64-bit, etc. +# +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) + +endif +# End DARWIN ------------------------------------------------------------- + + + +ifeq ($(PLATFORM), linux) + +API_LDFLAGS += -ldl + +C_COMPILER = gcc + +endif +# End LINUX ------------------------------------------------------------- + + + + +# --- FreeBSD ---- + +ifeq ($(PLATFORM), freebsd) + +endif +# End FreeBSD ------------------------------------------------------------- + + + + + +# --------------------------------------------------------------------- + +# --- TRANSPORT + +# This is not a target, but a command-line option. +# +# So you have to do: make PLATFORM=linux TRANSPORT=ZMQ +# OR: make PLATFORM=darwin TRANSPORT=ZMQ debug +# OR: make PLATFORM=freebsd TRANSPORT=ZMQ +# Etc... +# + +#XMLRPCPP_INCLUDEDIR = -I../xmlrpcpp/src +#XMLRPCPP_LIBDIR = -L../xmlrpcpp/ + +ifeq ($(TRANSPORT), ZMQ) +API_CFLAGS += -DOT_ZMQ_MODE +API_CXXSOURCES += xmlrpcxx_client.cpp +else +API_CXXSOURCES += testclient.cpp +endif + + + + + +INCLUDEDIRS = $(PLATFORM_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) + +LIBDIRS = $(PLATFORM_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + + +CSOURCES = $(API_CSOURCES) + +CXXSOURCES = \ + OpenTransactions.cpp \ + OTServerConnection.cpp \ + OTClient.cpp \ + $(API_CXXSOURCES) + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +COBJECTS = $(CSOURCES:.c=.o) + +# The code will automatically accept the entire inbox, if compiled +# in TEST_CLIENT mode. But if it's compiled in API mode, then you +# have to manually go through the inbox items and allow your user +# the opportunity to accept or reject them. +# +CFLAGS = $(INCLUDEDIRS) $(API_CFLAGS) $(FT_FLAGS) -DTEST_CLIENT -c +DEBUG_FLAGS = -g +CXX = g++ +CC = $(C_COMPILER) + +LIBS = $(API_LIBS) +DEBUG_LIBS = $(API_DEBUG_LIBS) + + +# --- LDFLAGS +# +LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(DEBUG_LIBS) + + + + + +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +LINK_COMMAND = $(CXX) $(LDFLAGS) -o $(PROGRAM) $(CXXOBJECTS) $(COBJECTS) +DEBUG_LINK_COMMAND = $(CXX) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) $(CXXOBJECTS) $(COBJECTS) +endif +# End DARWIN ------------------------------------------------------------- + +ifeq ($(PLATFORM), linux) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End LINUX ------------------------------------------------------------- + +# --- FreeBSD ---- +ifeq ($(PLATFORM), freebsd) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End FreeBSD ------------------------------------------------------------- + + + + +# --------------------------------------------------------------------- + +# --- TARGETS + +# +# Default target: the first target is the default target. +# Just type "make PLATFORM=darwin" to build it. +# + +$(PROGRAM): $(CXXOBJECTS) $(COBJECTS) + $(LINK_COMMAND) + +all: $(PROGRAM) + +debug: CFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + $(DEBUG_LINK_COMMAND) + + +# --------------------------------------------------------------------- + + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +SFSocket.o: ./SSL-Example/SFSocket.c ./SSL-Example/SFSocket.h + $(CC) $(CFLAGS) -o ./SSL-Example/SFSocket.o ./SSL-Example/SFSocket.c + +OTServerConnection.o: OTServerConnection.cpp OTServerConnection.h + $(CXX) $(CFLAGS) -o OTServerConnection.o OTServerConnection.cpp +OTClient.o: OTClient.cpp OTClient.h + $(CXX) $(CFLAGS) -o OTClient.o OTClient.cpp +OpenTransactions.o: OpenTransactions.cpp OpenTransactions.h + $(CXX) $(CFLAGS) -o OpenTransactions.o OpenTransactions.cpp + +xmlrpcxx_client.o: xmlrpcxx_client.cpp + $(CXX) $(CFLAGS) -o xmlrpcxx_client.o xmlrpcxx_client.cpp + +testclient.o: testclient.cpp + $(CXX) $(CFLAGS) -o testclient.o testclient.cpp + +# +# Clean target: "make -f Makefile.API clean" to remove unwanted objects and executables. +# +RM=rm + +clean: + $(RM) -f ot.log $(COBJECTS) $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + + +# Run target: "make run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) + + diff --git a/testwallet/Makefile.API b/testwallet/Makefile.API new file mode 100644 index 000000000..ea5594095 --- /dev/null +++ b/testwallet/Makefile.API @@ -0,0 +1,773 @@ +# +# Open-Transactions: Makefile for dynamic libs (Python, Java, Ruby, etc) +# +# IMPORTANT: WHEN USING THIS MAKEFILE, YOU *MUST* USE THE OPTIONS. EXAMPLE: +# +# So you have to do: +# make -f Makefile.API PLATFORM=linux LANGUAGE=php5 TRANSPORT=ZMQ +# OR: make -f Makefile.API PLATFORM=darwin LANGUAGE=c TRANSPORT=ZMQ debug +# OR: make -f Makefile.API PLATFORM=freebsd LANGUAGE=ruby +# Etc... +# +# (Example only. Transport is optional, but you MUST choose a platform and language.) +# +# Platform options are darwin, linux and freebsd (untested) +# +# Language options are c, d, csharp, java, ruby, python, perl5, php5, tcl, and lisp. +# + +PROGRAM = libOTAPI.a +DEBUG_PROGRAM = libOTAPId.a + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := ___OT_PLATFORM_UNKNOWN___ + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + +PLATFORM = $(OT_PLATFORM) + + + +OT_INCLUDEDIRS = \ + -I../OTLib/irrxml \ + -I../OTLib \ + -I./SSL-Example \ + -I../OTLib/simpleini \ + -I. + + +# The LIBDIRS macro contains a list of library directories +# to pass to the linker so it can find necessary libraries. +# +OT_LIBDIRS = \ + -L../OTLib + + +API_CSOURCES = ./SSL-Example/SFSocket.c +API_CPPSOURCES = #empty +API_CFLAGS = #empty +API_LDFLAGS = #empty + + +C_COMPILER = cc + +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +API_LIBS = -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLibd +# +# FT: I tested this recently. The above version worked on Linux, and the below version did not. +# +#API_LIBS = -lssl -lcrypto -lOTLib +#API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd + + + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +API_CFLAGS = -m64 +API_LDFLAGS = -m64 +endif + +# --------------------------------------------------------------------- + +# SSL Folders! + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c +endif + + +# --------------------------------------------------------------------- + + +OT_EXTRA_INCLUDEDIRS = #empty +OT_EXTRA_LIBDIRS = #empty + + +ifeq ($(DSP), 1) +PLATFORM_INCLUDEDIRS = -I../openssl/include +PLATFORM_LIBDIRS = -L../openssl +else +PLATFORM_INCLUDEDIRS = #empty +PLATFORM_LIBDIRS = #empty +endif + +# --------------------------------------------------------------------- + + + + +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) + + +DYNAMIC_OTLIB_CONTENTS = # empty + +# C_COMPILER = gcc + + +# --- Common Lisp +LISP_PROGRAM = otapi.so +LISP_DEBUG_PROGRAM = otapid.so +LISP_LDFLAGS = -dynamiclib + +# --- C# (C-Sharp) +CSHARP_PROGRAM = libotapi.so +CSHARP_DEBUG_PROGRAM = libotapid.so +CSHARP_LDFLAGS = -dynamiclib + + +# --- D (D Language) +D_PROGRAM = libotapi.so +D_DEBUG_PROGRAM = libotapid.so +D_LDFLAGS = -dynamiclib -bundle + + +# --- JAVA +# -I/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Headers +JAVA_PROGRAM = libotapi.jnilib +JAVA_DEBUG_PROGRAM = libotapid.jnilib +JAVA_INCLUDEDIRS = -I$(shell javaconfig Headers) +JAVA_LDFLAGS = -framework JavaVM -bundle + +# --- PERL5 +# NOTE: the perl commands here (commented out), used at the command line, generated +# the actual CFLAGS and LDFLAGS that are used below in the uncommented section. +# (You may find them similarly useful on your machine.) +#PERL5_CFLAGS = -bundle $(shell perl -MExtUtils::Embed -e ccopts) +#PERL5_LDFLAGS = -bundle $(shell perl -MExtUtils::Embed -e ldopts) +#DEBUG_LDFLAGS += -bundle $(shell perl -MExtUtils::Embed -e ldopts) +# +PERL5_PROGRAM = otapi.bundle +PERL5_DEBUG_PROGRAM = otapid.bundle +PERL5_INCLUDEDIRS = # empty +PERL5_CFLAGS = -bundle -arch x86_64 -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -no-cpp-precomp -I/opt/local/include -I/System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE +PERL5_LDFLAGS = -bundle -arch x86_64 -L/opt/local/lib -L/System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE -lperl -ldl -lm -lutil -lc + + +# --- PHP5 +#/usr/libexec/apache2/libphp5.so +# +PHP5_PROGRAM = otapi.so +PHP5_DEBUG_PROGRAM = otapid.so +PHP5_INCLUDEDIRS = $(shell php-config --includes) +PHP5_LDFLAGS = -bundle_loader /usr/libexec/apache2/libphp5.so -flat_namespace -bundle + +# --- PYTHON +#CFLAGS += -fPIC $(shell python-config --cflags) +#LDFLAGS += -dynamiclib $(shell python-config --ldflags) +#DEBUG_LDFLAGS += -dynamiclib $(shell python-config --ldflags) +# +#INCLUDEDIRS += -I/usr/include/python2.6 +#LIBDIRS += -L/usr/lib/python2.6 +# +#CFLAGS += -fPIC +#LDFLAGS += -dynamiclib -lpython +#DEBUG_LDFLAGS += -dynamiclib -lpython +# +PYTHON_PROGRAM = _otapi.so +PYTHON_DEBUG_PROGRAM = _otapid.so +PYTHON_INCLUDEDIRS = -I/usr/include/python2.6 +PYTHON_LIBDIRS = -L/usr/lib/python2.6 +PYTHON_LDFLAGS = -dynamiclib -lpython + +# --- RUBY! +RUBY_PROGRAM = otapi.bundle +RUBY_DEBUG_PROGRAM = otapid.bundle +RUBY_INCLUDEDIRS = -I$(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["topdir"]') +RUBY_LDFLAGS = -dynamiclib $(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["LIBRUBYARG"]') + +# --- TCL +TCL_PROGRAM = otapi.so +TCL_DEBUG_PROGRAM = otapid.so +TCL_INCLUDEDIRS = # empty +TCL_LDFLAGS = -dynamiclib -framework Tcl + +endif +# End DARWIN ------------------------------------------------------------- + + + + +ifeq ($(PLATFORM), linux) + + +C_COMPILER = gcc + +DYNAMIC_OTLIB_CONTENTS = DYNAMIC_OTLIB=1 + +# --- Common Lisp +LISP_PROGRAM = otapi.so +LISP_DEBUG_PROGRAM = otapid.so +LISP_LDFLAGS = -shared + +# --- C# (C-Sharp) +CSHARP_PROGRAM = libotapi.so +CSHARP_DEBUG_PROGRAM = libotapid.so +CSHARP_LDFLAGS = -shared + +# --- D (D Language) +D_PROGRAM = libotapi.so +D_DEBUG_PROGRAM = libotapid.so +D_LDFLAGS = -shared + +# --- JAVA +JAVA_PROGRAM = libotapi.so +JAVA_DEBUG_PROGRAM = libotapid.so +JAVA_INCLUDEDIRS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux +JAVA_LDFLAGS = -shared + + +# --- PERL5 +#PERL5_CFLAGS -- Run this at the command line: perl -e 'use Config; print $Config{ccflags}' +#PERL5_LDFLAGS -- Run this at the command line: perl -e 'use Config; print $Config{ldflags}' +# +# When you run the command commands, they will produce output allowing you to set these +# as appropriate for your system: +# +#PERL5_CFLAGS = -shared $(shell perl -e 'use Config; print $Config{ccflags}') +#PERL5_LDFLAGS = -shared $(shell perl -e 'use Config; print $Config{ldflags}') +#PERL5_CFLAGS = -shared -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +#PERL5_LDFLAGS = -shared -L/usr/local/$(LINUX_LIBDIR) +# +PERL5_PROGRAM = otapi.so +PERL5_DEBUG_PROGRAM = otapid.so +PERL5_INCLUDEDIRS = -I/usr/$(LINUX_LIBDIR)/perl/5.10.0/CORE +PERL5_CFLAGS = -shared -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +PERL5_LDFLAGS = -shared -L/usr/local/$(LINUX_LIBDIR) + + +# --- PHP5 +#/usr/libexec/apache2/libphp5.so +#PHP5_INCLUDEDIRS = `php-config --includes` +# +PHP5_PROGRAM = otapi.so +PHP5_DEBUG_PROGRAM = otapid.so +PHP5_INCLUDEDIRS = `php-config --includes` +PHP5_LDFLAGS = -shared + + +# --- PYTHON +# +#PYTHON_INCLUDEDIRS = -I/usr/include/python2.5 +#PYTHON_LIBDIRS = -L/usr/$(LINUX_LIBDIR)/python2.5 +# +PYTHON_PROGRAM = _otapi.so +PYTHON_DEBUG_PROGRAM = _otapid.so +PYTHON_CLFAGS = $(shell python-config --cflags) +PYTHON_INCLUDEDIRS = -I/usr/include/python2.5 +PYTHON_LIBDIRS = -L/usr/$(LINUX_LIBDIR)/python2.5 +PYTHON_LDFLAGS = -shared $(shell python-config --ldflags) + + +# --- RUBY! +RUBY_PROGRAM = otapi.so +RUBY_DEBUG_PROGRAM = otapid.so +RUBY_INCLUDEDIRS = -I$(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["topdir"]') +RUBY_LDFLAGS = -shared $(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["LIBRUBYARG"]') + + +# --- TCL +# Maybe the include directory is wrong for your system? +# use this to find tcl.h: +# find / tcl.h | grep tcl.h +# Then make sure the directory below is correct for your system. +TCL_PROGRAM = otapi.so +TCL_DEBUG_PROGRAM = otapid.so +TCL_INCLUDEDIRS = -I/usr/include/tcl8.4 +TCL_LDFLAGS = -shared + +endif +# End LINUX ------------------------------------------------------------- + + + + + +# --- FreeBSD ---- + +ifeq ($(PLATFORM), freebsd) + +DYNAMIC_OTLIB_CONTENTS = # empty + +# --- Common Lisp +LISP_PROGRAM = otapi.so +LISP_DEBUG_PROGRAM = otapid.so +LISP_LDFLAGS = -shared + +# --- C# (C-Sharp) +CSHARP_PROGRAM = libotapi.so +CSHARP_DEBUG_PROGRAM = libotapid.so +CSHARP_LDFLAGS = -shared + +# --- D (D Language) +D_PROGRAM = libotapi.so +D_DEBUG_PROGRAM = libotapid.so +D_LDFLAGS = -shared + +# --- JAVA +JAVA_PROGRAM = libotapi.so +JAVA_DEBUG_PROGRAM = libotapid.so +JAVA_INCLUDEDIRS = # empty +JAVA_LDFLAGS = -shared + + +# --- PERL5 +#PERL5_CFLAGS -- Run this at the command line: perl -e 'use Config; print $Config{ccflags}' +#PERL5_LDFLAGS -- Run this at the command line: perl -e 'use Config; print $Config{ldflags}' +# +# When you run the command commands, they will produce output allowing you to set these +# as appropriate for your system: +# +#PERL5_CFLAGS = -shared $(shell perl -e 'use Config; print $Config{ccflags}') +#PERL5_LDFLAGS = -shared $(shell perl -e 'use Config; print $Config{ldflags}') +#PERL5_CFLAGS = -shared -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +#PERL5_LDFLAGS = -shared -L/usr/local/lib +# +PERL5_PROGRAM = otapi.bundle +PERL5_DEBUG_PROGRAM = otapid.bundle +PERL5_INCLUDEDIRS = -I/usr/lib/perl/5.10.0/CORE +PERL5_CFLAGS = -shared -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +PERL5_LDFLAGS = -shared -L/usr/local/lib + + +# --- PHP5 +#/usr/libexec/apache2/libphp5.so +#PHP5_INCLUDEDIRS = `php-config --includes` +# +PHP5_PROGRAM = otapi.so +PHP5_DEBUG_PROGRAM = otapid.so +PHP5_INCLUDEDIRS = `php-config --includes` +PHP5_LDFLAGS = -shared + + +# --- PYTHON +# +#PYTHON_INCLUDEDIRS = -I/usr/include/python2.5 +#PYTHON_LIBDIRS = -L/usr/lib/python2.5 +# +PYTHON_PROGRAM = _otapi.so +PYTHON_DEBUG_PROGRAM = _otapid.so +PYTHON_CLFAGS = $(shell python-config --cflags) +PYTHON_INCLUDEDIRS = -I/usr/include/python2.5 +PYTHON_LIBDIRS = -L/usr/lib/python2.5 +PYTHON_LDFLAGS = -shared $(shell python-config --ldflags) + + +# --- RUBY! +RUBY_PROGRAM = otapi.so +RUBY_DEBUG_PROGRAM = otapid.so +RUBY_INCLUDEDIRS = -I$(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["topdir"]') +RUBY_LDFLAGS = -shared $(shell ruby -e 'require "rbconfig"; puts RbConfig::CONFIG["LIBRUBYARG"]') + + +# --- TCL +# Maybe the include directory is wrong for your system? +# use this to find tcl.h: +# find / tcl.h | grep tcl.h +# Then make sure the directory below is correct for your system. +TCL_PROGRAM = otapi.so +TCL_DEBUG_PROGRAM = otapid.so +TCL_INCLUDEDIRS = -I/usr/include/tcl8.4 +TCL_LDFLAGS = -shared + +endif +# End FreeBSD ------------------------------------------------------------- + + + + + + +LINK_COMMAND = # empty +DEBUG_LINK_COMMAND = # empty + +BOOL_DYNAMIC_OTLIB = 0 + +# By default, the languages supported in the CPP_API are C and C++. (Two diff interfaces.) +# This Makefile exists to WRAP that for MORE languages... PHP, Perl, Java, Python, etc. +# + +# --- C and C++ +# +ifeq ($(LANGUAGE), c) +else +API_CFLAGS += -fPIC +endif + +# --- Common Lisp +ifeq ($(LANGUAGE), lisp) +PROGRAM = $(LISP_PROGRAM) +DEBUG_PROGRAM = $(LISP_DEBUG_PROGRAM) +API_CSOURCES += OTAPI_cffi.c +API_LDFLAGS += $(LISP_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- D (D Language) +ifeq ($(LANGUAGE), d) +PROGRAM = $(D_PROGRAM) +DEBUG_PROGRAM = $(D_DEBUG_PROGRAM) +API_CPPSOURCES += OTAPI_d.cpp +API_LDFLAGS += $(D_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- C# (C-Sharp) +ifeq ($(LANGUAGE), csharp) +PROGRAM = $(CSHARP_PROGRAM) +DEBUG_PROGRAM = $(CSHARP_DEBUG_PROGRAM) +API_CPPSOURCES += OTAPI_csharp.cpp +API_LDFLAGS += $(CSHARP_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- JAVA +ifeq ($(LANGUAGE), java) +PROGRAM = $(JAVA_PROGRAM) +DEBUG_PROGRAM = $(JAVA_DEBUG_PROGRAM) +API_CPPSOURCES += OTAPI_java.cpp +OT_EXTRA_INCLUDEDIRS += $(JAVA_INCLUDEDIRS) +API_LDFLAGS += $(JAVA_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- PERL +# +ifeq ($(LANGUAGE), perl5) +PROGRAM = $(PERL5_PROGRAM) +DEBUG_PROGRAM = $(PERL5_DEBUG_PROGRAM) +OT_EXTRA_INCLUDEDIRS += $(PERL5_INCLUDEDIRS) +API_CPPSOURCES += OTAPI_perl5.cpp +API_CFLAGS += $(PERL5_CFLAGS) +API_LDFLAGS += $(PERL5_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- PHP5 +ifeq ($(LANGUAGE), php5) +API_CPPSOURCES += OTAPI_php.cpp +OT_EXTRA_INCLUDEDIRS += $(PHP5_INCLUDEDIRS) +PROGRAM = $(PHP5_PROGRAM) +DEBUG_PROGRAM = $(PHP5_DEBUG_PROGRAM) +API_LDFLAGS += $(PHP5_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- PYTHON +ifeq ($(LANGUAGE), python) +PROGRAM = $(PYTHON_PROGRAM) +DEBUG_PROGRAM = $(PYTHON_DEBUG_PROGRAM) +OT_EXTRA_INCLUDEDIRS += $(PYTHON_INCLUDEDIRS) +OT_EXTRA_LIBDIRS += $(PYTHON_LIBDIRS) +API_CPPSOURCES += OTAPI_python.cpp +API_LDFLAGS += $(PYTHON_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- RUBY! +ifeq ($(LANGUAGE), ruby) +API_CPPSOURCES += OTAPI_ruby.cpp +OT_EXTRA_INCLUDEDIRS += $(RUBY_INCLUDEDIRS) +PROGRAM = $(RUBY_PROGRAM) +DEBUG_PROGRAM = $(RUBY_DEBUG_PROGRAM) +API_LDFLAGS += $(RUBY_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + +# --- TCL +ifeq ($(LANGUAGE), tcl) +API_CPPSOURCES += OTAPI_tcl.cpp +PROGRAM = $(TCL_PROGRAM) +DEBUG_PROGRAM = $(TCL_DEBUG_PROGRAM) +OT_EXTRA_INCLUDEDIRS += $(TCL_INCLUDEDIRS) +API_LDFLAGS += $(TCL_LDFLAGS) +BOOL_DYNAMIC_OTLIB = 1 +endif + + + + +# --------------------------------------------------------------------- + +# --- TRANSPORT + +# This is not a target, but a command-line option. +# +# So you have to do: make -f Makefile.API PLATFORM=linux LANGUAGE=php5 TRANSPORT=ZMQ +# OR: make -f Makefile.API PLATFORM=darwin LANGUAGE=c TRANSPORT=ZMQ debug +# OR: make -f Makefile.API PLATFORM=freebsd LANGUAGE=ruby TRANSPORT=ZMQ +# Etc... +# + +#XMLRPCPP_INCLUDEDIR = -I../xmlrpcpp/src +#XMLRPCPP_LIBDIR = -L../xmlrpcpp/ + +ifeq ($(TRANSPORT), ZMQ) +API_CFLAGS += -DOT_ZMQ_MODE +#OT_EXTRA_INCLUDEDIRS += $(XMLRPCPP_INCLUDEDIR) + +#API_LDFLAGS += -lXmlRpc +#OT_EXTRA_LIBDIRS += $(XMLRPCPP_LIBDIR) +endif + + + + + + + +# --------------------------------------------------------------------- +# +# The CSOURCES macro contains a list of source files. +# +# The COBJECTS macro converts the CSOURCES macro into a list +# of object files. +# +# The CFLAGS macro contains a list of options to be passed to +# the compiler. Adding "-g" to this line will cause the compiler +# to add debugging information to the executable. +# +# The CC macro defines the C compiler. +# +# The LDFLAGS macro contains all of the library and library +# directory information to be passed to the linker. +# + +INCLUDEDIRS = $(PLATFORM_INCLUDEDIRS) $(OT_EXTRA_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) + + +LIBDIRS = $(PLATFORM_LIBDIRS) $(OT_EXTRA_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + +CSOURCES = $(API_CSOURCES) + +CXXSOURCES = $(API_CPPSOURCES) \ + OpenTransactions.cpp \ + OTServerConnection.cpp \ + OTClient.cpp \ + OTAPI.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +COBJECTS = $(CSOURCES:.c=.o) +CFLAGS = $(INCLUDEDIRS) $(API_CFLAGS) $(FT_FLAGS) -c +DEBUG_FLAGS = -g +CXX = g++ +CC = $(C_COMPILER) + +LIBS = $(API_LIBS) +DEBUG_LIBS = $(API_DEBUG_LIBS) + + +# --- LDFLAGS +# +LDFLAGS = $(LIBDIRS) $(API_LDFLAGS) $(LIBS) +DEBUG_LDFLAGS = $(LIBDIRS) $(API_LDFLAGS) $(DEBUG_LIBS) + + + + + + +# +ifeq ($(LANGUAGE), c) +LINK_COMMAND = ar rc $(PROGRAM) $(CXXOBJECTS) $(COBJECTS) +DEBUG_LINK_COMMAND = ar rc $(DEBUG_PROGRAM) $(CXXOBJECTS) $(COBJECTS) +else +# --------------------------------------------------------------------- +# --- DARWIN +ifeq ($(PLATFORM), darwin) +LINK_COMMAND = $(CXX) $(LDFLAGS) -o $(PROGRAM) $(CXXOBJECTS) $(COBJECTS) +DEBUG_LINK_COMMAND = $(CXX) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) $(CXXOBJECTS) $(COBJECTS) +endif +# End DARWIN ------------------------------------------------------------- +# --- LINUX ----- +ifeq ($(PLATFORM), linux) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End LINUX ------------------------------------------------------------- +# --- FreeBSD ---- +ifeq ($(PLATFORM), freebsd) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End FreeBSD ------------------------------------------------------------- +endif + + + + + +# --------------------------------------------------------------------- + +# --- TARGETS + +# +# Default target: the first target is the default target. +# Just type "make -f Makefile.API_MAC_OSX" to build it. +# + +all: $(PROGRAM) + +# This was my attempt to automatically re-build the OTLib with linux's dynamic options turned on. +# Since this doesn't work, the user will have to rebuild OTLib by hand, with those options on, if +# he wishes to use the OTAPI. +# +ifeq ($(BOOL_DYNAMIC_OTLIB), 1) +#THROWAWAY = $(shell `cd ../OTLib && make clean && make PLATFORM=$(PLATFORM) $(DYNAMIC_OTLIB_CONTENTS)`) +else +THROWAWAY = # empty +endif + +$(PROGRAM): $(CXXOBJECTS) $(COBJECTS) + $(LINK_COMMAND) + +debug: CFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + $(DEBUG_LINK_COMMAND) + + +# --------------------------------------------------------------------- + + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +SFSocket.o: ./SSL-Example/SFSocket.c ./SSL-Example/SFSocket.h + $(CC) $(CFLAGS) -o ./SSL-Example/SFSocket.o ./SSL-Example/SFSocket.c + +OTServerConnection.o: OTServerConnection.cpp OTServerConnection.h + $(CXX) $(CFLAGS) -o OTServerConnection.o OTServerConnection.cpp +OTClient.o: OTClient.cpp OTClient.h + $(CXX) $(CFLAGS) -o OTClient.o OTClient.cpp +OpenTransactions.o: OpenTransactions.cpp OpenTransactions.h + $(CXX) $(CFLAGS) -o OpenTransactions.o OpenTransactions.cpp + +OTAPI.o: OTAPI.cpp OTAPI.h + $(CXX) $(CFLAGS) -o OTAPI.o OTAPI.cpp + + +# Common Lisp +OTAPI_cffi.o: OTAPI_cffi.c + cp OTAPI_cffi.h OTAPI_wrap.h + $(CC) $(CFLAGS) -o OTAPI_cffi.o OTAPI_cffi.c + +# C-Sharp +OTAPI_csharp.o: OTAPI_csharp.cpp + cp OTAPI_csharp.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_csharp.o OTAPI_csharp.cpp + +OTAPI_d.o: OTAPI_d.cpp + cp OTAPI_d.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_d.o OTAPI_d.cpp + +OTAPI_java.o: OTAPI_java.cpp + cp OTAPI_java.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_java.o OTAPI_java.cpp + +OTAPI_perl5.o: OTAPI_perl5.cpp + cp OTAPI_perl5.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_perl5.o OTAPI_perl5.cpp + +OTAPI_php.o: OTAPI_php.cpp + cp OTAPI_php.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_php.o OTAPI_php.cpp + +OTAPI_python.o: OTAPI_python.cpp + cp OTAPI_python.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_python.o OTAPI_python.cpp + +OTAPI_ruby.o: OTAPI_ruby.cpp + cp OTAPI_ruby.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_ruby.o OTAPI_ruby.cpp + +OTAPI_tcl.o: OTAPI_tcl.cpp + cp OTAPI_tcl.h OTAPI_wrap.h + $(CXX) $(CFLAGS) -o OTAPI_tcl.o OTAPI_tcl.cpp + +# +# Clean target: "make -f Makefile.API clean" to remove unwanted objects and executables. +# +RM=rm -f + +clean: + $(RM) ot.log otapi.so otapi.bundle _otapi.so _otapi.bundle otapi.dylib _otapi.dylib $(COBJECTS) $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + + diff --git a/testwallet/MarketData.cs b/testwallet/MarketData.cs new file mode 100644 index 000000000..a3029dcd7 --- /dev/null +++ b/testwallet/MarketData.cs @@ -0,0 +1,252 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class MarketData : Displayable { + private HandleRef swigCPtr; + + internal MarketData(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.MarketData_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(MarketData obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~MarketData() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_MarketData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.MarketData_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.MarketData_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string market_id { + set { + otapiPINVOKE.MarketData_market_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_market_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string asset_type_id { + set { + otapiPINVOKE.MarketData_asset_type_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_asset_type_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string currency_type_id { + set { + otapiPINVOKE.MarketData_currency_type_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_currency_type_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string scale { + set { + otapiPINVOKE.MarketData_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string total_assets { + set { + otapiPINVOKE.MarketData_total_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_total_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string number_bids { + set { + otapiPINVOKE.MarketData_number_bids_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_number_bids_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string number_asks { + set { + otapiPINVOKE.MarketData_number_asks_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_number_asks_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string last_sale_price { + set { + otapiPINVOKE.MarketData_last_sale_price_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_last_sale_price_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string current_bid { + set { + otapiPINVOKE.MarketData_current_bid_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_current_bid_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string current_ask { + set { + otapiPINVOKE.MarketData_current_ask_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_current_ask_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string volume_trades { + set { + otapiPINVOKE.MarketData_volume_trades_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_volume_trades_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string volume_assets { + set { + otapiPINVOKE.MarketData_volume_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_volume_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string volume_currency { + set { + otapiPINVOKE.MarketData_volume_currency_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_volume_currency_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string recent_highest_bid { + set { + otapiPINVOKE.MarketData_recent_highest_bid_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_recent_highest_bid_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string recent_lowest_ask { + set { + otapiPINVOKE.MarketData_recent_lowest_ask_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.MarketData_recent_lowest_ask_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static MarketData ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.MarketData_ot_dynamic_cast(Storable.getCPtr(pObject)); + MarketData ret = (cPtr == IntPtr.Zero) ? null : new MarketData(cPtr, false); + return ret; + } + +} diff --git a/testwallet/MarketData.java b/testwallet/MarketData.java new file mode 100644 index 000000000..69bfbfee3 --- /dev/null +++ b/testwallet/MarketData.java @@ -0,0 +1,188 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class MarketData extends Displayable { + private long swigCPtr; + + public MarketData(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.MarketData_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(MarketData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_MarketData(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private MarketList containerRefMarketList; + // ---------------- + protected void addReference(MarketList theContainer) { // This is Java code + containerRefMarketList = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.MarketData_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.MarketData_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.MarketData_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.MarketData_server_id_get(swigCPtr, this); + } + + public void setMarket_id(String value) { + otapiJNI.MarketData_market_id_set(swigCPtr, this, value); + } + + public String getMarket_id() { + return otapiJNI.MarketData_market_id_get(swigCPtr, this); + } + + public void setAsset_type_id(String value) { + otapiJNI.MarketData_asset_type_id_set(swigCPtr, this, value); + } + + public String getAsset_type_id() { + return otapiJNI.MarketData_asset_type_id_get(swigCPtr, this); + } + + public void setCurrency_type_id(String value) { + otapiJNI.MarketData_currency_type_id_set(swigCPtr, this, value); + } + + public String getCurrency_type_id() { + return otapiJNI.MarketData_currency_type_id_get(swigCPtr, this); + } + + public void setScale(String value) { + otapiJNI.MarketData_scale_set(swigCPtr, this, value); + } + + public String getScale() { + return otapiJNI.MarketData_scale_get(swigCPtr, this); + } + + public void setTotal_assets(String value) { + otapiJNI.MarketData_total_assets_set(swigCPtr, this, value); + } + + public String getTotal_assets() { + return otapiJNI.MarketData_total_assets_get(swigCPtr, this); + } + + public void setNumber_bids(String value) { + otapiJNI.MarketData_number_bids_set(swigCPtr, this, value); + } + + public String getNumber_bids() { + return otapiJNI.MarketData_number_bids_get(swigCPtr, this); + } + + public void setNumber_asks(String value) { + otapiJNI.MarketData_number_asks_set(swigCPtr, this, value); + } + + public String getNumber_asks() { + return otapiJNI.MarketData_number_asks_get(swigCPtr, this); + } + + public void setLast_sale_price(String value) { + otapiJNI.MarketData_last_sale_price_set(swigCPtr, this, value); + } + + public String getLast_sale_price() { + return otapiJNI.MarketData_last_sale_price_get(swigCPtr, this); + } + + public void setCurrent_bid(String value) { + otapiJNI.MarketData_current_bid_set(swigCPtr, this, value); + } + + public String getCurrent_bid() { + return otapiJNI.MarketData_current_bid_get(swigCPtr, this); + } + + public void setCurrent_ask(String value) { + otapiJNI.MarketData_current_ask_set(swigCPtr, this, value); + } + + public String getCurrent_ask() { + return otapiJNI.MarketData_current_ask_get(swigCPtr, this); + } + + public void setVolume_trades(String value) { + otapiJNI.MarketData_volume_trades_set(swigCPtr, this, value); + } + + public String getVolume_trades() { + return otapiJNI.MarketData_volume_trades_get(swigCPtr, this); + } + + public void setVolume_assets(String value) { + otapiJNI.MarketData_volume_assets_set(swigCPtr, this, value); + } + + public String getVolume_assets() { + return otapiJNI.MarketData_volume_assets_get(swigCPtr, this); + } + + public void setVolume_currency(String value) { + otapiJNI.MarketData_volume_currency_set(swigCPtr, this, value); + } + + public String getVolume_currency() { + return otapiJNI.MarketData_volume_currency_get(swigCPtr, this); + } + + public void setRecent_highest_bid(String value) { + otapiJNI.MarketData_recent_highest_bid_set(swigCPtr, this, value); + } + + public String getRecent_highest_bid() { + return otapiJNI.MarketData_recent_highest_bid_get(swigCPtr, this); + } + + public void setRecent_lowest_ask(String value) { + otapiJNI.MarketData_recent_lowest_ask_set(swigCPtr, this, value); + } + + public String getRecent_lowest_ask() { + return otapiJNI.MarketData_recent_lowest_ask_get(swigCPtr, this); + } + + public static MarketData ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.MarketData_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new MarketData(cPtr, false); + } + +} diff --git a/testwallet/MarketList.cs b/testwallet/MarketList.cs new file mode 100644 index 000000000..e2e312750 --- /dev/null +++ b/testwallet/MarketList.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class MarketList : Storable { + private HandleRef swigCPtr; + + internal MarketList(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.MarketList_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(MarketList obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~MarketList() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_MarketList(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetMarketDataCount() { + uint ret = otapiPINVOKE.MarketList_GetMarketDataCount(swigCPtr); + return ret; + } + + public MarketData GetMarketData(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.MarketList_GetMarketData(swigCPtr, nIndex); + MarketData ret = (cPtr == IntPtr.Zero) ? null : new MarketData(cPtr, false); + return ret; + } + + public bool RemoveMarketData(uint nIndexMarketData) { + bool ret = otapiPINVOKE.MarketList_RemoveMarketData(swigCPtr, nIndexMarketData); + return ret; + } + + public bool AddMarketData(MarketData disownObject) { + bool ret = otapiPINVOKE.MarketList_AddMarketData(swigCPtr, MarketData.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static MarketList ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.MarketList_ot_dynamic_cast(Storable.getCPtr(pObject)); + MarketList ret = (cPtr == IntPtr.Zero) ? null : new MarketList(cPtr, false); + return ret; + } + +} diff --git a/testwallet/MarketList.java b/testwallet/MarketList.java new file mode 100644 index 000000000..cab10b6cb --- /dev/null +++ b/testwallet/MarketList.java @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class MarketList extends Storable { + private long swigCPtr; + + public MarketList(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.MarketList_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(MarketList obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_MarketList(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefMarketData(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + MarketData refActualElement = GetMarketData(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof MarketData)) + continue; + + MarketData tempRef = (MarketData)(theObject); + + if ((MarketData.getCPtr(tempRef) == MarketData.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefMarketData(MarketData element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof MarketData)) + continue; + + MarketData tempRef = (MarketData)(theObject); + + if ((MarketData.getCPtr(tempRef) == MarketData.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + MarketData tempLocalRef = element; + elementList.add(tempLocalRef); + return MarketData.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetMarketDataCount() { return otapiJNI.MarketList_GetMarketDataCount(swigCPtr, this); } + + public MarketData GetMarketData(long nIndex) { + long cPtr = otapiJNI.MarketList_GetMarketData(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new MarketData(cPtr, false); + } + + public boolean RemoveMarketData(long nIndexMarketData) { + return otapiJNI.MarketList_RemoveMarketData(swigCPtr, this, removeRefMarketData(nIndexMarketData)); + } + + public boolean AddMarketData(MarketData disownObject) { + return otapiJNI.MarketList_AddMarketData(swigCPtr, this, MarketData.getCPtr(disownObject), disownObject); + } + + public static MarketList ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.MarketList_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new MarketList(cPtr, false); + } + +} diff --git a/testwallet/OTAPI.cpp b/testwallet/OTAPI.cpp new file mode 100644 index 000000000..cb3c3c7a8 --- /dev/null +++ b/testwallet/OTAPI.cpp @@ -0,0 +1,8624 @@ +/************************************************************************************ + + OTAPI.cpp -- Implementation for the C interface. (Written in C++) + C Programmers can include OTAPI.h and call these functions + as if they were calling straight C functions. OTAPI.h is also + wrapped by SWIG, making this same interface available in many + other languages (Java, Python, Ruby, Perl, Php, etc) + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include +#include +#include +#include + +#if defined (OT_ZMQ_MODE) +#include +#endif + +#include "OTStorage.h" + +#include "OTIdentifier.h" +#include "OTString.h" +#include "OTPseudonym.h" +#include "OTAssetContract.h" +#include "OTServerContract.h" +#include "OTCheque.h" +#include "OTPaymentPlan.h" +#include "OTMint.h" +#include "OTLedger.h" +#include "OTAccount.h" +#include "OTWallet.h" +#include "OTPurse.h" +#include "OTBasket.h" +#include "OTMessage.h" +#include "OTTransaction.h" + + +// A C++ class, high-level interface to OT. The class-based API. +#include "OpenTransactions.h" + +// This is for an extern "C" (though written in C++) wrapper for a global instance of the above. +// (In order to be able to call Open Transactions from C, as well as use SWIG and call it from +// php, perl, ruby, python, tcl, java, lisp, etc.) +//#include "OTAPI.h" +#include "OTAPI_funcdef.h" // Trying to compile as C++ now, due to the new Password Callback, which requires it. + +#include "OTLog.h" + + +// These functions are in C, so they can't return bool. But they can return BOOL! +// They appear as int in the header, for SWIG reasons. +// +#ifndef OT_BOOL +#define OT_BOOL int +#endif + +#ifndef OT_FALSE +const int OT_FALSE = 0; +#endif + +#ifndef OT_TRUE +const int OT_TRUE = 1; +#endif + + + + +// This global variable contains an OTWallet, an OTClient, etc. +// It's the C++ high-level interace to OT. +// Any client software will have an instance of this. +OT_API g_OT_API; +// Note: Must call OT_API::Init() followed by g_OT_API.Init() in the main function, before using OT. + + +static char g_tempBuf[MAX_STRING_LENGTH]; + + + + +// To use this extern "C" API, you must call this function first. +// (Therefore the same is true for all scripting languages that use this file... +// Ruby, Python, Perl, PHP, etc.) +OT_BOOL OT_API_Init(const char * szClientPath) +{ + OT_ASSERT_MSG(NULL != szClientPath, "Null path passed to OT_API_Init"); + + static bool bAlreadyInitialized = false; + + if (!bAlreadyInitialized) + { + bAlreadyInitialized = true; + + if (OT_API::InitOTAPI()) + { + OTString strClientPath(szClientPath); + bool bInit = g_OT_API.Init(strClientPath); // SSL gets initialized in here, before any keys are loaded. + + if (bInit) + return OT_TRUE; + } + } + + return OT_FALSE; +} + + + +OT_BOOL OT_API_LoadWallet(const char * szWalletFilename) +{ + OT_ASSERT_MSG(NULL != szWalletFilename, "Null filename passed to OT_API_LoadWallet"); + + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + // ------------------------ + //the g_OT_API now has: +// inline const char * GetStoragePath() { return ((NULL == m_pstrStoragePath) ? NULL : m_pstrStoragePath->Get()); } +// inline const char * GetWalletFilename() { return ((NULL == m_pstrWalletFilename) ? NULL : m_pstrWalletFilename->Get()); } +// inline bool SetStoragePath(const OTString & strPath) +// inline bool SetWalletFilename(const OTString & strFilename) + + const OTString strWalletFilename(szWalletFilename); + + bool bLoaded = g_OT_API.LoadWallet(strWalletFilename); + + if (bLoaded) + return OT_TRUE; + + return OT_FALSE; +} + + +OT_BOOL OT_API_SwitchWallet(const char * szDataFolderPath, const char * szWalletFilename) +{ + OT_ASSERT_MSG(NULL != szDataFolderPath, "Null szDataFolderPath passed to OT_API_SwitchWallet"); + OT_ASSERT_MSG(NULL != szWalletFilename, "Null szWalletFilename passed to OT_API_SwitchWallet"); + + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + // ------------------------------------------- + const char * szOldStoragePath = g_OT_API.GetStoragePath(); + + OTString strOldStoragePath; + + if (NULL != szOldStoragePath) + strOldStoragePath.Set(szOldStoragePath); + else + strOldStoragePath.Set("ERROR_OLD_PATH_WAS_EMPTY"); + + // ------------------------------------------- + + OTString strPATH_OUTPUT; + OTLog::TransformFilePath(szDataFolderPath, strPATH_OUTPUT); + + + // At some point, REMOVE this, since each instance of OT API should eventually store its OWN path. + OTLog::SetMainPath(strPATH_OUTPUT.Get()); + + // ------------------------------------------- + + // Keep this though. + g_OT_API.SetStoragePath(strPATH_OUTPUT); // Set to new path. + + if (OT_TRUE == OT_API_LoadWallet(szWalletFilename)) + return OT_TRUE; + else + { + OTLog::SetMainPath(strOldStoragePath.Get()); // remove this at some point, todo. This is the old way of doing it. + + g_OT_API.SetStoragePath(strOldStoragePath); // Set to old path again. + } + + return OT_FALSE; +} + + +// ---------------------------------------------------------------- + + +int OT_API_GetMemlogSize() +{ + return OTLog::GetMemlogSize(); +} + + +const char * OT_API_GetMemlogAtIndex(int nIndex) +{ + return OTLog::GetMemlogAtIndex(nIndex); +} + + +const char * OT_API_PeekMemlogFront() +{ + return OTLog::PeekMemlogFront(); +} + + +const char * OT_API_PeekMemlogBack() +{ + return OTLog::PeekMemlogBack(); +} + + +OT_BOOL OT_API_PopMemlogFront() +{ + return (OTLog::PopMemlogFront() ? OT_TRUE : OT_FALSE); +} + + +OT_BOOL OT_API_PopMemlogBack() +{ + return (OTLog::PopMemlogBack() ? OT_TRUE : OT_FALSE); +} + + + + + +// -------------------------------------------------- +// CREATE NYM -- Create new User +// +// Creates a new Nym and adds it to the wallet. +// (Including PUBLIC and PRIVATE KEYS.) +// +// Returns a new User ID (with files already created) +// or NULL upon failure. +// +// Once it exists, use OT_API_createUserAccount() to +// register your new Nym at any given Server. (Nearly all +// server requests require this...) +// +const char * OT_API_CreateNym(void) +{ + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = g_OT_API.CreateNym(); + + if (NULL == pNym) // Creation failed. + { + OTLog::Output(0, "Unable to create Nym.\n"); + + return NULL; + } + + pWallet->AddNym(*pNym); // Add our new nym to the wallet, who "owns" it hereafter. + + pWallet->SaveWallet(); // Since it just changed + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTString strOutput; + pNym->GetIdentifier(strOutput); // We're returning the new Nym ID. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// If you have a server contract that you'd like to add +// to your wallet, call this function. +// +OT_BOOL OT_API_AddServerContract(const char * szContract) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT(NULL != szContract); + OTString strContract(szContract); + + OTServerContract * pContract = new OTServerContract; + OT_ASSERT(NULL != pContract); + + // Check the server signature on the contract here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. + // if (pContract->LoadContract() && pContract->VerifyContract()) + if (strContract.Exists() && pContract->LoadContractFromString(strContract)) + { + OTIdentifier theContractID; + + pContract->CalculateContractID(theContractID); + + pContract->SetIdentifier(theContractID); + + // Next make sure the wallet has this contract on its list... + OTWallet * pWallet; + + if (pWallet = g_OT_API.GetWallet()) + { + pWallet->AddServerContract(*pContract); + pContract = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pContract) + { + delete pContract; + pContract = NULL; + + return OT_FALSE; + } + + return OT_TRUE; +} + + +// If you have an asset contract that you'd like to add +// to your wallet, call this function. +// +OT_BOOL OT_API_AddAssetContract(const char * szContract) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT(NULL != szContract); + OTString strContract(szContract); + + OTAssetContract * pContract = new OTAssetContract; + OT_ASSERT(NULL != pContract); + + // Check the server signature on the contract here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. + // if (pContract->LoadContract() && pContract->VerifyContract()) + if (strContract.Exists() && pContract->LoadContractFromString(strContract)) + { + OTIdentifier theContractID; + + pContract->CalculateContractID(theContractID); + + pContract->SetIdentifier(theContractID); + + // Next make sure the wallet has this contract on its list... + OTWallet * pWallet; + + if (pWallet = g_OT_API.GetWallet()) + { + pWallet->AddAssetContract(*pContract); + pContract = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pContract) + { + delete pContract; + pContract = NULL; + + return OT_FALSE; + } + + return OT_TRUE; +} + + + +// -------------------------------------------------- + + + + +int OT_API_GetNymCount(void) +{ + return g_OT_API.GetNymCount(); +} + +int OT_API_GetServerCount(void) +{ + return g_OT_API.GetServerCount(); +} + +int OT_API_GetAssetTypeCount(void) +{ + return g_OT_API.GetAssetTypeCount(); +} + +int OT_API_GetAccountCount(void) +{ + return g_OT_API.GetAccountCount(); +} + + + +// ---------------------------------------------------------------- + + +/// *** FUNCTIONS FOR REMOVING VARIOUS CONTRACTS AND NYMS FROM THE WALLET *** + +/// Can I remove this server contract from my wallet? +/// +/// You cannot remove the server contract from your wallet if there are accounts (or nyms) in there using it. +/// This function tells you whether you can remove the server contract or not. (Whether there are accounts or nyms using it...) +/// +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_CanRemoveServer(const char * SERVER_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in!\n"); + + OTIdentifier theID(SERVER_ID); + + // ------------------------------------------ + + const int nCount = OT_API_GetAccountCount(); + + // Loop through all the accounts. + for (int i = 0; i < nCount; i++) + { + const char * pAcctID = OT_API_GetAccountWallet_ID(i); + OTString strAcctID(pAcctID); + + const char * pID = OT_API_GetAccountWallet_ServerID(strAcctID.Get()); + OTIdentifier theCompareID(pID); + + if (theID == theCompareID) + { + OTLog::vOutput(0, "Unable to remove server contract %s from wallet: Account %s uses it.\n", + SERVER_ID, strAcctID.Get()); + return OT_FALSE; + } + } + + // ------------------------------------------ + + const int nNymCount = OT_API_GetNymCount(); + + // Loop through all the Nyms. (One might be registered on that server.) + // + for (int i = 0; i < nNymCount; i++) + { + const char * pNymID = OT_API_GetNym_ID(i); + OTString strNymID(pNymID); + + if (OT_TRUE == OT_API_IsNym_RegisteredAtServer(strNymID.Get(), SERVER_ID)) + { + OTLog::vOutput(0, "Unable to remove server contract %s from wallet: Nym %s is registered there.\n", + SERVER_ID, strNymID.Get()); + return OT_FALSE; + } + } + + return OT_TRUE; +} + +/// Remove this server contract from my wallet! +/// +/// Try to remove the server contract from the wallet. +/// This will not work if there are any accounts in the wallet for the same server ID. +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_RemoveServer(const char * SERVER_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + // Make sure there aren't any dependent accounts.. + if (OT_FALSE == OT_API_Wallet_CanRemoveServer(SERVER_ID)) + return OT_FALSE; + + // TODO: the above call proves that there are no accounts laying around + // for this server ID. (No need to worry about "orphaned accounts.") + // + // However, there may still be Nyms registered at the server! Therefore, + // we need to loop through the Nyms, and make sure none of them has been + // registered at this server ID. If it has, then we need to message the server + // to "deregister" the Nym, which is much cleaner. Otherwise server's only + // other alternative is to expire Nyms that have gone unused for some specific + // period of time, presumably those terms are described in the server contract. + // + OTWallet * pWallet = g_OT_API.GetWallet(); + + OT_ASSERT_MSG(NULL != pWallet, "No wallet found...\n"); + + OTIdentifier theID(SERVER_ID); + + if (pWallet->RemoveServerContract(theID)) + { + pWallet->SaveWallet(); + OTLog::vOutput(0, "Removed server contract from the wallet: %s\n", SERVER_ID); + return OT_TRUE; + } + + return OT_FALSE; +} + + + +/// Can I remove this asset contract from my wallet? +/// +/// You cannot remove the asset contract from your wallet if there are accounts in there using it. +/// This function tells you whether you can remove the asset contract or not. (Whether there are accounts...) +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_CanRemoveAssetType(const char * ASSET_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != ASSET_ID, "Null ASSET_ID passed in!\n"); + + OTIdentifier theID(ASSET_ID); + + // ------------------------------------------ + + const int nCount = OT_API_GetAccountCount(); + + // Loop through all the accounts. + for (int i = 0; i < nCount; i++) + { + const char * pAcctID = OT_API_GetAccountWallet_ID(i); + OTString strAcctID(pAcctID); + + const char * pID = OT_API_GetAccountWallet_AssetTypeID(strAcctID.Get()); + OTIdentifier theCompareID(pID); + + if (theID == theCompareID) + { + OTLog::vOutput(0, "Unable to remove asset contract %s from wallet: Account %s uses it.\n", + ASSET_ID, strAcctID.Get()); + return OT_FALSE; + } + } + + return OT_TRUE; +} + +/// Remove this asset contract from my wallet! +/// +/// Try to remove the asset contract from the wallet. +/// This will not work if there are any accounts in the wallet for the same asset type ID. +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_RemoveAssetType(const char * ASSET_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + // Make sure there aren't any dependent accounts.. + if (OT_FALSE == OT_API_Wallet_CanRemoveAssetType(ASSET_ID)) + return OT_FALSE; + + OTWallet * pWallet = g_OT_API.GetWallet(); + + OT_ASSERT_MSG(NULL != pWallet, "No wallet found...\n"); + + OTIdentifier theID(ASSET_ID); + + if (pWallet->RemoveAssetContract(theID)) + { + pWallet->SaveWallet(); + OTLog::vOutput(0, "Removed asset contract from the wallet: %s\n", ASSET_ID); + return OT_TRUE; + } + + return OT_FALSE; +} + + + + +/// Can I remove this Nym from my wallet? +/// +/// You cannot remove the Nym from your wallet if there are accounts in there using it. +/// This function tells you whether you can remove the Nym or not. (Whether there are accounts...) +/// It also checks to see if the Nym in question is registered at any servers. +/// +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_CanRemoveNym(const char * NYM_ID) +{ +// OTLog::Error("Debug 0\n"); + + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in!\n"); + + OTIdentifier theID(NYM_ID); +// OTLog::vError("Debug start: %s\n", NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theID); + + if (NULL == pNym) + { + OTLog::vError("Unable to find Nym while trying to remove it: %s\n", NYM_ID); + return OT_FALSE; + } + + // ------------------------------------------ + // Make sure the Nym doesn't have any accounts in the wallet. + // (Client must close those before calling this.) + // + const int nCount = OT_API_GetAccountCount(); + + // Loop through all the accounts. + for (int i = 0; i < nCount; i++) + { +// OTLog::vError("Debug loop: %d\n", i); + const char * pAcctID = OT_API_GetAccountWallet_ID(i); + OTString strAcctID(pAcctID); + + const char * pID = OT_API_GetAccountWallet_NymID(strAcctID.Get()); + + if (NULL == pID) + { + OTLog::Error("Bug in OT_API_Wallet_CanRemoveNym / OT_API_GetAccountWallet_NymID\n"); + return OT_FALSE; + } + +// OTLog::vError("Debug 1: %s\n", NYM_ID); + + OTIdentifier theCompareID(pID); + +// OTLog::vError("Debug end: %s\n", NYM_ID); + + // Looks like the Nym still has some accounts in this wallet. + if (theID == theCompareID) + { + OTLog::Output(0, "Nym cannot be removed because there are still accounts in the wallet for that Nym.\n"); + return OT_FALSE; + } + } + + // ------------------------------------------ + // Make sure the Nym isn't registered at any servers... + // (Client must unregister at those servers before calling this function..) + // + const int nServerCount = OT_API_GetServerCount(); + + for (int i = 0; i < nServerCount; i++) + { + const char * szServerID = OT_API_GetServer_ID(i); + + if (NULL != szServerID) + { + const OTString strServerID(szServerID); + + if (pNym->IsRegisteredAtServer(strServerID)) + { + OTLog::Output(0, "Nym cannot be removed because there are still servers in the wallet that the Nym is registered at.\n"); + return OT_FALSE; + } + } + } + + // ------------------------------------------ + + // TODO: Make sure Nym doesn't have any cash in any purses... + + return OT_TRUE; +} + +/// Remove this Nym from my wallet! +/// +/// Try to remove the Nym from the wallet. +/// This will fail if the Nym is registered at any servers, or has any accounts. +/// +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_RemoveNym(const char * NYM_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in!\n"); + + // ------------------------------------------ + // DONE: The below call proves already that there are no accounts laying around + // for this Nym. (No need to worry about "orphaned accounts.") + // + // DONE (finally): + // However, the Nym might still be registered at various servers, even without asset accounts. + // Therefore, we need to iterate through the server contracts, and if the Nym is registered at + // any of the servers, then "deregister" (before deleting the Nym entirely.) This is much + // cleaner for the server side, who otherwise has to expired unused nyms based on some rule + // presumably to be found in the server contract. + // ------------------------------------------ + if (OT_FALSE == OT_API_Wallet_CanRemoveNym(NYM_ID)) + return OT_FALSE; + + OTWallet * pWallet = g_OT_API.GetWallet(); + + OT_ASSERT_MSG(NULL != pWallet, "No wallet found...\n"); + + OTIdentifier theID(NYM_ID); + + if (pWallet->RemoveNym(theID)) + { + OTLog::vOutput(0, "OT_API_Wallet_RemoveNym: Success erasing Nym from wallet: %s\n", NYM_ID); + pWallet->SaveWallet(); + return OT_TRUE; + } + else + OTLog::vOutput(0, "OT_API_Wallet_RemoveNym: Failure erasing Nym from wallet: %s\n", NYM_ID); + + return OT_FALSE; +} + + + + +/// Can I remove this Account from my wallet? +/// +/// You cannot remove the Account from your wallet if there are transactions still open. +/// This function tells you whether you can remove the Account or not. (Whether there are transactions...) +/// Also, balance must be zero to do this. +/// +/// returns OT_BOOL +/// +OT_BOOL OT_API_Wallet_CanRemoveAccount(const char * ACCOUNT_ID) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "Null ACCOUNT_ID passed in!\n"); + + const OTIdentifier theAccountID(ACCOUNT_ID); + + OTAccount * pAccount = g_OT_API.GetAccount(theAccountID); + + if (NULL == pAccount) + { + OTLog::vOutput(0, "OT_API_Wallet_CanRemoveAccount: Unable to find account in wallet: %s.\n", + ACCOUNT_ID); + return OT_FALSE; + } + // Balance must be zero in order to close an account! + else if (pAccount->GetBalance() != 0) + { + OTLog::vOutput(0, "OT_API_Wallet_CanRemoveAccount: Account balance MUST be zero in order to close an asset account: %s.\n", + ACCOUNT_ID); + return OT_FALSE; + } + + // ----------------------------------------------------------------- + + OT_BOOL BOOL_RETURN_VALUE = OT_FALSE; + + const OTIdentifier & theServerID = pAccount->GetPurportedServerID(); + const OTIdentifier & theUserID = pAccount->GetUserID(); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTLedger * pInbox = g_OT_API.LoadInbox(theServerID, theUserID, theAccountID); + OTLedger * pOutbox = g_OT_API.LoadOutbox(theServerID, theUserID, theAccountID); + + // Make sure it gets cleaned up pInbox this goes out of scope. + OTCleanup theInboxAngel(pInbox); // I pass the pointer, in case it's NULL. + OTCleanup theOutboxAngel(pOutbox); // I pass the pointer, in case it's NULL. + + if (NULL == pInbox) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadInbox in OT_API_Wallet_CanRemoveAccount.\n " + "Account ID: %s\n", ACCOUNT_ID); + } + else if (NULL == pOutbox) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadOutbox in OT_API_Wallet_CanRemoveAccount.\n " + "Account ID: %s\n", ACCOUNT_ID); + } + else if ( (pInbox->GetTransactionCount() > 0) || (pOutbox->GetTransactionCount() > 0) ) + { + OTLog::Output(0, "OT_API_Wallet_CanRemoveAccount: You cannot remove an asset account if there are " + "inbox/outbox items still waiting to be processed.\n"); + } + else // SUCCESS! + BOOL_RETURN_VALUE = OT_TRUE; + + return BOOL_RETURN_VALUE; +} + + + +void OT_API_deleteAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "Null ACCOUNT_ID passed in."); + + if (OT_FALSE == OT_API_Wallet_CanRemoveAccount(ACCOUNT_ID)) + return; + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + g_OT_API.deleteAssetAccount(theServerID, theUserID, theAccountID); +} + + + + +/// OT_API_Wallet_ImportNym INCOMPLETE +/// +/// Parameters are the display name (wallet only) and the public key. +/// I'll probably also have the private key come in this way as well. +/// (Should be able to import public nyms as well as private.) +/// +/// Returns the NymID (once it is actually coded.) +/// +const char * OT_API_Wallet_ImportNym(const char * DISPLAY_NAME, const char * KEY_FILE_CONTENTS) +{ + OT_ASSERT_MSG(g_OT_API.IsInitialized(), "Not initialized; call OT_API::Init first."); + + OT_ASSERT_MSG(NULL != DISPLAY_NAME, "Null DISPLAY_NAME passed in."); + OT_ASSERT_MSG(NULL != KEY_FILE_CONTENTS, "Null KEY_FILE_CONTENTS passed in."); + + OTString strName(DISPLAY_NAME), strKeyfile(KEY_FILE_CONTENTS); + + + // Calculate the NymID for the PUBLIC_KEY + + // + + OTLog::Error("OT_API_Wallet_ImportNym is not functional yet. Sorry.\n"); + + + if (0) + { + OTString strNymID("OT_API_Wallet_ImportNym is not functional yet. Sorry.\n"); + + + + const char * pBuf = strNymID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + + +// ---------------------------------------------------------------- + +// based on Index (above 4 functions) this returns the Nym's ID +const char * OT_API_GetNym_ID(int nIndex) +{ + OT_ASSERT_MSG(nIndex >= 0, "Invalid index less than zero in OT_API_GetNym_ID"); + + OTIdentifier theNymID; + OTString strName; + + bool bGetNym = g_OT_API.GetNym(nIndex, theNymID, strName); + + if (bGetNym) + { + OTString strNymID(theNymID); + + const char * pBuf = strNymID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +// Returns Nym Name (based on NymID) +const char * OT_API_GetNym_Name(const char * NYM_ID) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_Name"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTString & strName = pNym->GetNymName(); + const char * pBuf = strName.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + +OT_BOOL OT_API_IsNym_RegisteredAtServer(const char * NYM_ID, const char * SERVER_ID) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in."); + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + + const OTIdentifier theNymID(NYM_ID), + theServerID(SERVER_ID); + + bool bSuccess = g_OT_API.IsNym_RegisteredAtServer(theNymID, theServerID); + + if (true == bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + +//-------------------------------------------------------- + + + +/// Returns Nym data (based on NymID) +// +const char * OT_API_GetNym_Stats(const char * NYM_ID) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_Statistics"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTString strOutput; + + pNym->DisplayStatistics(strOutput); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +int OT_API_GetNym_MailCount(const char * NYM_ID) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_MailCount"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + return pNym->GetMailCount(); + } + + return 0; +} + + +// returns the message, optionally with Subject: as first line. +const char * OT_API_GetNym_MailContentsByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_MailContentsByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetMailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload (in an OTEnvelope) + + OTEnvelope theEnvelope; + OTString strEnvelopeContents; + + // Decrypt the Envelope. + if (theEnvelope.SetAsciiArmoredData(pMessage->m_ascPayload) && + theEnvelope.Open(*pNym, strEnvelopeContents)) + { + const char * pBuf = strEnvelopeContents.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + } + } + + return NULL; +} + + + +/// returns the sender ID for a piece of mail. (NymID). +/// +const char * OT_API_GetNym_MailSenderIDByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_MailSenderIDByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetMailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // SERVER: pMessage->m_strServerID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload (in an OTEnvelope) + + const char * pBuf = pMessage->m_strNymID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + + } + } + + return NULL; +} + + + +/// returns the server ID that a piece of mail came from. +/// +const char * OT_API_GetNym_MailServerIDByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_MailServerIDByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetMailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // SERVER: pMessage->m_strServerID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload (in an OTEnvelope) + + const char * pBuf = pMessage->m_strServerID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + + } + } + + return NULL; +} + + + +// -------------------------------------------------------- + + +OT_BOOL OT_API_Nym_RemoveMailByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_Nym_RemoveMailByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + OTPseudonym * pSignerNym = pNym; + + if ((NULL != pNym) && + pNym->RemoveMailByIndex(nIndex)) + { + if (pNym->SaveSignedNymfile(*pSignerNym)) // <== save Nym to local storage, since a mail was erased. + return OT_TRUE; + else + OTLog::Error("Error saving Nym in OT_API_Nym_RemoveMailByIndex.\n"); + } + + return OT_FALSE; +} + + + +/// Returns OT_TRUE (1) if the Sender ID on this piece of Mail (by index) +/// loads a public key from my wallet, and if the signature on the message +/// verifies with that public key. +/// (Not only must the signature be good, but I must have added the nym to +/// my wallet sometime in the past, since this func returns false if it's not there.) +/// +/// A good wallet might be designed to automatically download any keys that +/// it doesn't already have, using OT_API_checkUser(). I'll probably need to +/// add something to OTClient where the @checkUser response auto-saves the new +/// key into the wallet. That way you can wait for a tenth of a second and then +/// just read the Nym (by ID) straight out of your own wallet. Nifty, eh? +/// +/// All the wallet has to do is fire off a "check user" whenever this call fails, +/// then come back when that succeeds and try this again. If STILL failure, then +/// you've got a signature problem. Otherwise it'll usually download the nym +/// and verify the signature all in an instant, without the user even noticing +/// what happened. +/// +OT_BOOL OT_API_Nym_VerifyMailByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_Nym_VerifyMailByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetMailByIndex(nIndex); + + if (NULL != pMessage) + { + // Grab the NymID of the sender. + const OTIdentifier theSenderNymID(pMessage->m_strNymID); + + // Grab a pointer to that Nym (if its public key is in my wallet.) + OTPseudonym * pSenderNym = g_OT_API.GetNym(theSenderNymID); + + // If it's there, use it to verify the signature on the message. + // return OT_TRUE if successful signature verification. + // + if (NULL != pSenderNym) + { + if (pMessage->VerifySignature(*pSenderNym)) + return OT_TRUE; + } + } + } + + return OT_FALSE; +} + + + +// -------------------------------------------------------------------------- +// +// OUTMAIL!! + +int OT_API_GetNym_OutmailCount(const char * NYM_ID) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_OutmailCount"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + return pNym->GetOutmailCount(); + } + + return 0; +} + + +// returns the message, optionally with Subject: as first line. +const char * OT_API_GetNym_OutmailContentsByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_OutmailContentsByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetOutmailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload (in an OTEnvelope) + + OTString strMailContents; + + // Decrypt the Envelope. + if (pMessage->m_ascPayload.Exists() && + pMessage->m_ascPayload.GetString(strMailContents)) + { + const char * pBuf = strMailContents.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + } + } + + return NULL; +} + + + +/// returns the recipient ID for a piece of mail. (NymID). +/// +const char * OT_API_GetNym_OutmailRecipientIDByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_OutmailRecipientIDByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetOutmailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // SERVER: pMessage->m_strServerID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload + + const char * pBuf = pMessage->m_strNymID2.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + + } + } + + return NULL; +} + + + +/// returns the server ID that a piece of mail came from. +/// +const char * OT_API_GetNym_OutmailServerIDByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_GetNym_OutmailServerIDByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetOutmailByIndex(nIndex); + + if (NULL != pMessage) + { + // SENDER: pMessage->m_strNymID + // SERVER: pMessage->m_strServerID + // RECIPIENT: pMessage->m_strNymID2 + // MESSAGE: pMessage->m_ascPayload + + const char * pBuf = pMessage->m_strServerID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + + } + } + + return NULL; +} + + + +// -------------------------------------------------------- + + +OT_BOOL OT_API_Nym_RemoveOutmailByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_Nym_RemoveOutmailByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + OTPseudonym * pSignerNym = pNym; + + if ((NULL != pNym) && + pNym->RemoveOutmailByIndex(nIndex)) + { + if (pNym->SaveSignedNymfile(*pSignerNym)) // <== save Nym to local storage, since a mail was erased. + return OT_TRUE; + else + OTLog::Error("Error saving Nym in OT_API_Nym_RemoveOutmailByIndex.\n"); + } + + return OT_FALSE; +} + + + +/// Returns OT_TRUE (1) if the Sender ID on this piece of Mail (by index) +/// loads a public key from my wallet, and if the signature on the message +/// verifies with that public key. +/// (Not only must the signature be good, but I must have added the nym to +/// my wallet sometime in the past, since this func returns false if it's not there.) +/// +/// A good wallet might be designed to automatically download any keys that +/// it doesn't already have, using OT_API_checkUser(). I'll probably need to +/// add something to OTClient where the @checkUser response auto-saves the new +/// key into the wallet. That way you can wait for a tenth of a second and then +/// just read the Nym (by ID) straight out of your own wallet. Nifty, eh? +/// +/// All the wallet has to do is fire off a "check user" whenever this call fails, +/// then come back when that succeeds and try this again. If STILL failure, then +/// you've got a signature problem. Otherwise it'll usually download the nym +/// and verify the signature all in an instant, without the user even noticing +/// what happened. +/// +OT_BOOL OT_API_Nym_VerifyOutmailByIndex(const char * NYM_ID, int nIndex) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed to OT_API_Nym_VerifyOutmailByIndex"); + + OTIdentifier theNymID(NYM_ID); + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + OTMessage * pMessage = pNym->GetOutmailByIndex(nIndex); + + if (NULL != pMessage) + { + // Grab the NymID of the sender. + const OTIdentifier theSenderNymID(pMessage->m_strNymID); + + // Grab a pointer to that Nym (if its public key is in my wallet.) + OTPseudonym * pSenderNym = g_OT_API.GetNym(theSenderNymID); + + // If it's there, use it to verify the signature on the message. + // return OT_TRUE if successful signature verification. + // + if (NULL != pSenderNym) + { + if (pMessage->VerifySignature(*pSenderNym)) + return OT_TRUE; + } + } + } + + return OT_FALSE; +} + + + + + +// ----------------------------------- +// SET NYM NAME +// +// You might have 40 of your friends' public nyms in +// your wallet. You might have labels on each of them. +// But whenever you change a label (and thus re-sign the +// file for that Nym when you save it), you only SIGN +// using one of your OWN nyms, for which you have a private +// key available for signing. +// +// When testing, there is only one nym, so you just pass it +// twice. But in real production, a user will have a default +// signing nym, the same way that he might have a default +// signing key in PGP, and that must be passed in whenever +// he changes the name on any of the other nyms in his wallet. +// (In order to properly sign and save the change.) +// +// Returns OT_TRUE (1) or OT_FALSE (0) +// +OT_BOOL OT_API_SetNym_Name(const char * NYM_ID, const char * SIGNER_NYM_ID, const char * NYM_NEW_NAME) +{ + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in."); + OT_ASSERT_MSG(NULL != SIGNER_NYM_ID, "Null SIGNER_NYM_ID passed in."); + OT_ASSERT_MSG(NULL != NYM_NEW_NAME, "Null NYM_NEW_NAME passed in."); + + const OTIdentifier theNymID(NYM_ID), + theSignerNymID(SIGNER_NYM_ID); + const OTString strNymName(NYM_NEW_NAME); + + bool bSuccess = g_OT_API.SetNym_Name(theNymID, theSignerNymID, strNymName); + + if (true == bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + +// Merely a client-side label +OT_BOOL OT_API_SetServer_Name(const char * SERVER_ID, + const char * STR_NEW_NAME) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != STR_NEW_NAME, "Null STR_NEW_NAME passed in."); + + const OTIdentifier theContractID(SERVER_ID); + const OTString strNewName(STR_NEW_NAME); + + bool bSuccess = g_OT_API.SetServer_Name(theContractID, strNewName); + + if (true == bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + + +// Merely a client-side label +OT_BOOL OT_API_SetAssetType_Name(const char * ASSET_ID, + const char * STR_NEW_NAME) +{ + OT_ASSERT_MSG(NULL != ASSET_ID, "Null ASSET_ID passed in."); + OT_ASSERT_MSG(NULL != STR_NEW_NAME, "Null STR_NEW_NAME passed in."); + + const OTIdentifier theContractID(ASSET_ID); + const OTString strNewName(STR_NEW_NAME); + + bool bSuccess = g_OT_API.SetAssetType_Name(theContractID, strNewName); + + if (true == bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + + + +//---------------------------------------------------------- +// GET NYM TRANSACTION NUM COUNT +// How many transaction numbers does the Nym have (for a given server?) +// +// This function returns the count of numbers available. If 0, then no +// transactions will work until you call OT_API_getTransactionNumber() +// to replenish your Nym's supply for that ServerID... +// +// Returns a count (0 through N numbers available), +// or -1 for error (no nym found.) +// +int OT_API_GetNym_TransactionNumCount(const char * SERVER_ID, const char * NYM_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in."); + + OTIdentifier theServerID(SERVER_ID); + OTIdentifier theNymID(NYM_ID); + + int nReturnValue = 0; + + OTPseudonym * pNym = g_OT_API.GetNym(theNymID); + + if (NULL != pNym) + { + nReturnValue = pNym->GetTransactionNumCount(theServerID); + } + else + { + nReturnValue = -1; + } + + return nReturnValue; +} + + + +// based on Index (above 4 functions) this returns the Server's ID +const char * OT_API_GetServer_ID(int nIndex) +{ + OT_ASSERT_MSG(nIndex >= 0, "Index out of bounds (it's in the negative)."); + + OTIdentifier theID; + OTString strName; + + bool bGetServer = g_OT_API.GetServer(nIndex, theID, strName); + + if (bGetServer) + { + OTString strID(theID); + + const char * pBuf = strID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + return NULL; +} + + +// Return's Server's name (based on server ID) +const char * OT_API_GetServer_Name(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTServerContract * pContract = g_OT_API.GetServer(theID); + + if (NULL != pContract) + { + OTString strName; + pContract->GetName(strName); + const char * pBuf = strName.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +// returns Asset Type ID (based on index from GetAssetTypeCount) +const char * OT_API_GetAssetType_ID(int nIndex) +{ + OT_ASSERT_MSG(nIndex >= 0, "Index out of bounds (it's in the negative)."); + + OTIdentifier theID; + OTString strName; + + bool bGetServer = g_OT_API.GetAssetType(nIndex, theID, strName); + + if (bGetServer) + { + OTString strID(theID); + + const char * pBuf = strID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + return NULL; +} + +// Returns asset type Name based on Asset Type ID +const char * OT_API_GetAssetType_Name(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTAssetContract * pContract = g_OT_API.GetAssetType(theID); + + if (NULL != pContract) + { + OTString strName; + pContract->GetName(strName); + const char * pBuf = strName.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +// ------------------------------------------------------------- + + +// returns a string containing the account ID, based on index. +const char * OT_API_GetAccountWallet_ID(int nIndex) +{ + OT_ASSERT_MSG(nIndex >= 0, "Index out of bounds (it's in the negative)."); + + OTIdentifier theID; + OTString strName; + + bool bGetServer = g_OT_API.GetAccount(nIndex, theID, strName); + + if (bGetServer) + { + OTString strID(theID); + + const char * pBuf = strID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + return NULL; +} + + +// returns the account name, based on account ID. +const char * OT_API_GetAccountWallet_Name(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + + if (NULL != pContract) + { + OTString strName; + pContract->GetName(strName); + const char * pBuf = strName.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + + +/// === Verify Account Receipt === +/// Returns OT_BOOL. Verifies any asset account (intermediary files) against its own last signed receipt. +/// Obviously this will fail for any new account that hasn't done any transactions yet, and thus has no receipts. +/// +OT_BOOL OT_API_VerifyAccountReceipt(const char * SERVER_ID, const char * NYM_ID, const char * ACCT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != NYM_ID, "Null NYM_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theNymID(NYM_ID), theAcctID(ACCT_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return OT_FALSE; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theNymID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theNymID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return OT_FALSE; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(theServerID); + + if (NULL == pServer) + { + OTLog::Output(0, "No Server Contract found with that Server ID.\n"); + return OT_FALSE; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + OTPseudonym * pServerNym = (OTPseudonym *)pServer->GetContractPublicNym(); + + if (NULL == pServerNym) + { + OTLog::Output(0, "No Contract Nym found in that Server Contract.\n"); + return OT_FALSE; + } + + // By this point, pServerNym is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + + const bool bVerified = OTTransaction::VerifyBalanceReceipt(*pServerNym, + *pNym, + theServerID, + theAcctID); + return bVerified ? OT_TRUE : OT_FALSE; +} + + + +// ------------------------------------------------------- +// SET ACCOUNT NAME (client side only. Server cares not about such labels.) +// +// Returns OT_TRUE (1) or OT_FALSE (0) +// +OT_BOOL OT_API_SetAccountWallet_Name(const char * ACCT_ID, const char * SIGNER_NYM_ID, const char * ACCT_NEW_NAME) +{ + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != SIGNER_NYM_ID, "Null SIGNER_NYM_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_NEW_NAME, "NULL ACCT_NEW_NAME passed in."); + + OTIdentifier theAcctID(ACCT_ID), + theSignerNymID(SIGNER_NYM_ID); + OTString strAcctNewName(ACCT_NEW_NAME); + + bool bSuccess = g_OT_API.SetAccount_Name(theAcctID, theSignerNymID, strAcctNewName); + + if (true == bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + + +// returns the account balance, based on account ID. +const char * OT_API_GetAccountWallet_Balance(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + + if (NULL != pContract) + { + long lBalance = pContract->GetBalance(); + + OTString strBalance; + + strBalance.Format("%ld", lBalance); + + const char * pBuf = strBalance.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + +// returns an account's "account type", (simple, issuer, etc.) +const char * OT_API_GetAccountWallet_Type(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + + if (NULL != pContract) + { + const char * pBuf = pContract->GetTypeString(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + +/// Returns an account's asset type ID. +/// (Which is a hash of the contract used to issue the asset type.) +const char * OT_API_GetAccountWallet_AssetTypeID(const char * THE_ID) +{ +// OTLog::vError("DEBUG START --OT_API_GetAccountWallet_AssetTypeID-- ID is: %s\n", THE_ID); + + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + +// OTLog::vError("DEBUG 2: ID: %s \n", THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + +// OTLog::Error("DEBUG 3 \n"); + + if (NULL != pContract) + { +// OTLog::Error("DEBUG 4 \n"); + + OTIdentifier theAssetID(pContract->GetAssetTypeID()); + +// OTLog::Error("DEBUG 5 \n"); + + OTString strAssetTypeID(theAssetID); + +// OTLog::vError("DEBUG 6: strAssetTypeID: %s \n", strAssetTypeID.Get()); + + const char * pBuf = strAssetTypeID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + +// OTLog::vError("DEBUG OT_API_GetAccountWallet_AssetTypeID %s \n ", g_tempBuf); + + return g_tempBuf; + } + + return NULL; +} + + + +/// Returns an account's Server ID. +/// (Which is a hash of the server contract.) +const char * OT_API_GetAccountWallet_ServerID(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + OTIdentifier theID(THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + + if (NULL != pContract) + { + OTIdentifier theServerID(pContract->GetPurportedServerID()); + OTString strServerID(theServerID); + + const char * pBuf = strServerID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + + +/// Returns an account's Nym ID. +/// (Which is a hash of the Nym's public key for the owner of this account.) +const char * OT_API_GetAccountWallet_NymID(const char * THE_ID) +{ + OT_ASSERT_MSG(NULL != THE_ID, "Null THE_ID passed in."); + + const OTIdentifier theID(THE_ID); + + OTAccount * pContract = g_OT_API.GetAccount(theID); + + if (NULL != pContract) + { + OTIdentifier theUserID(pContract->GetUserID()); + OTString strUserID(theUserID); + + const char * pBuf = strUserID.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + +// -------------------------------------------------- +// Verify and Retrieve XML Contents. +// +// Pass in a contract and a user ID, and this function will: +// -- Load the contract up and verify it. +// -- Verify the user's signature on it. +// -- Remove the PGP-style bookends (the signatures, etc) +// and return the XML contents of the contract in string form. +// +const char * OT_API_VerifyAndRetrieveXMLContents(const char * THE_CONTRACT, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != THE_CONTRACT, "NULL THE_CONTRACT passed to OT_API_VerifyAndRetrieveXMLContents."); + OT_ASSERT_MSG(NULL != USER_ID, "NULL USER_ID passed to OT_API_VerifyAndRetrieveXMLContents."); + + const OTIdentifier theUserID(USER_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPublicNym(theUserID); + + if (NULL == pNym) // LoadPublicNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTString strContract(THE_CONTRACT); + + if (!strContract.Exists()) + { + OTLog::Output(0, "Empty contract passed to OT_API_VerifyAndRetrieveXMLContents\n"); + return NULL; + } + + // ----------------------------------------------------- + + OTContract * pContract = OTContract::InstantiateContract(strContract); + OTCleanup theAngel(pContract); + + if (NULL == pContract) + { + OTLog::Output(0, "Unable to instantiate contract passed to OT_API_VerifyAndRetrieveXMLContents\n"); + return NULL; + } + + // ----------------------------------------------------- + + if (false == pContract->VerifyContract()) + { + OTLog::Output(0, "Unable to verify contract passed to OT_API_VerifyAndRetrieveXMLContents\n"); + return NULL; + } + + // ----------------------------------------------------- + + if (false == pContract->VerifySignature(*pNym)) + { + OTLog::Output(0, "Unable to verify signature on contract using Nym passed in to OT_API_VerifyAndRetrieveXMLContents\n"); + return NULL; + } + + // ----------------------------------------------------- + + OTString strOutput; + + pContract->SaveContents(strOutput); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + + + +/* +// ---------------------------------------------------------------------- + + WRITE A CHEQUE --- (Returns the cheque in string form.) + + ==> OT_API_WriteCheque() internally constructs an OTCheque and issues it, like so: + + OTCheque theCheque( SERVER_ID, ASSET_TYPE_ID ); + + theCheque.IssueCheque( AMOUNT // The amount of the cheque, in string form, which OTAPI + // will convert to a long integer. Negative amounts + // allowed, since that is how OT implements invoices. + // (An invoice is just a cheque with a negative amount.) + + lTransactionNumber, // The API will supply this automatically, as long as + // there are some transaction numbers in the wallet. (Call + // OT_API_getTransactionNumber() if your wallet needs more.) + + VALID_FROM, VALID_TO, // Valid date range (in seconds since Jan 1970...) + + ACCOUNT_ID, USER_ID, // User ID and Acct ID for SENDER. + + CHEQUE_MEMO, // The memo for the cheque. + + RECIPIENT_USER_ID); // Recipient User ID is optional. (You can use an + // empty string here, to write a blank cheque.) + */ +const char * OT_API_WriteCheque(const char * SERVER_ID, + const char * CHEQUE_AMOUNT, + const char * VALID_FROM, + const char * VALID_TO, + const char * SENDER_ACCT_ID, + const char * SENDER_USER_ID, + const char * CHEQUE_MEMO, + const char * RECIPIENT_USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != CHEQUE_AMOUNT, "Null CHEQUE_AMOUNT passed in."); + OT_ASSERT_MSG(NULL != VALID_FROM, "Null VALID_FROM passed in."); + OT_ASSERT_MSG(NULL != VALID_TO, "Null VALID_TO passed in."); + OT_ASSERT_MSG(NULL != SENDER_ACCT_ID, "Null SENDER_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != SENDER_USER_ID, "Null SENDER_USER_ID passed in."); + + const long lAmount = atol(CHEQUE_AMOUNT); + + const time_t time_From = (time_t)atoi(VALID_FROM), time_To = (time_t)atoi(VALID_TO); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theSenderAcctID(SENDER_ACCT_ID); + const OTIdentifier theSenderUserID(SENDER_USER_ID); + + OTIdentifier theRecipientUserID; + + bool bHasRecipient = ((NULL != RECIPIENT_USER_ID) && (strlen(RECIPIENT_USER_ID) > 2)); + + if (bHasRecipient) + theRecipientUserID.SetString(RECIPIENT_USER_ID); + + // ---------------------------------------------------- + + OTString strMemo; + + if (NULL != CHEQUE_MEMO) + strMemo.Set(CHEQUE_MEMO); + + OTCheque * pCheque = g_OT_API.WriteCheque(theServerID, + lAmount, + time_From, time_To, + theSenderAcctID, + theSenderUserID, + strMemo, + bHasRecipient ? &(theRecipientUserID) : NULL); + + OTCleanup theChequeAngel(pCheque); // Handles cleanup. (If necessary.) + + if (NULL == pCheque) + { + OTLog::Error("OT_API::WriteCheque failed in OT_API_WriteCheque.\n"); + return NULL; + } + + // At this point, I know pCheque is good (and will be cleaned up automatically.) + + OTString strCheque(*pCheque); // Extract the cheque to string form. + + const char * pBuf = strCheque.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ----------------------------------------------------------------- +// PROPOSE PAYMENT PLAN +// +// (Return as STRING) +// +// PARAMETER NOTES: +// -- Payment Plan Delay, and Payment Plan Period, both default to 30 days (if you pass 0.) +// +// -- Payment Plan Length, and Payment Plan Max Payments, both default to 0, which means +// no maximum length and no maximum number of payments. +// +// ----------------------------------------------------------------- +// FYI, the payment plan creation process (finally) is: +// +// 1) Payment plan is written, and signed, by the recipient. (This function: OT_API_ProposePaymentPlan) +// 2) He sends it to the sender, who signs it and submits it. (OT_API_ConfirmPaymentPlan and OT_API_depositPaymentPlan) +// 3) The server loads the recipient nym to verify the transaction +// number. The sender also had to burn a transaction number (to +// submit it) so now, both have verified trns#s in this way. +// +const char * OT_API_ProposePaymentPlan(const char * SERVER_ID, + // ---------------------------------------- + const char * VALID_FROM, // Default (0 or NULL) == NOW + const char * VALID_TO, // Default (0 or NULL) == no expiry / cancel anytime + // ---------------------------------------- + const char * SENDER_ACCT_ID, // Mandatory parameters. + const char * SENDER_USER_ID, // Both sender and recipient must sign before submitting. + // ---------------------------------------- + const char * PLAN_CONSIDERATION, // Like a memo. + // ---------------------------------------- + const char * RECIPIENT_ACCT_ID, // NOT optional. + const char * RECIPIENT_USER_ID, // Both sender and recipient must sign before submitting. + // ------------------------------- + const char * INITIAL_PAYMENT_AMOUNT, // zero or NULL == no initial payment. + const char * INITIAL_PAYMENT_DELAY, // seconds from creation date. Default is zero or NULL. + // ---------------------------------------- . + const char * PAYMENT_PLAN_AMOUNT, // zero or NULL == no regular payments. + const char * PAYMENT_PLAN_DELAY, // No. of seconds from creation date. Default is zero or NULL. + const char * PAYMENT_PLAN_PERIOD, // No. of seconds between payments. Default is zero or NULL. + // --------------------------------------- + const char * PAYMENT_PLAN_LENGTH, // In seconds. Defaults to 0 or NULL (no maximum length.) + const char * PAYMENT_PLAN_MAX_PAYMENTS // Integer. Defaults to 0 or NULL (no maximum payments.) + ) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != SENDER_ACCT_ID, "Null SENDER_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != SENDER_USER_ID, "Null SENDER_USER_ID passed in."); + OT_ASSERT_MSG(NULL != RECIPIENT_ACCT_ID, "Null RECIPIENT_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != RECIPIENT_USER_ID, "Null RECIPIENT_USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theSenderAcctID(SENDER_ACCT_ID); + const OTIdentifier theSenderUserID(SENDER_USER_ID); + const OTIdentifier theRecipientAcctID(RECIPIENT_ACCT_ID); + const OTIdentifier theRecipientUserID(RECIPIENT_USER_ID); + + // -------------------------------------- + + time_t tValidFrom = 0; + + if ((NULL != VALID_FROM) && (atoi(VALID_FROM) > 0)) + { + tValidFrom = atoi(VALID_FROM); + } + + // -------------------------------------- + + time_t tValidTo = 0; + + if ((NULL != VALID_TO) && (atoi(VALID_TO) > 0)) + { + tValidTo = atoi(VALID_TO); + } + + // -------------------------------------- + + OTString strConsideration("(Consideration for the agreement between the parties is meant to be recorded here.)"); + + if (NULL != PLAN_CONSIDERATION) + strConsideration.Set(PLAN_CONSIDERATION); + + // -------------------------------------- + + long lInitialPaymentAmount = 0; + + if ((NULL != INITIAL_PAYMENT_AMOUNT) && (atol(INITIAL_PAYMENT_AMOUNT) > 0)) + { + lInitialPaymentAmount = atol(INITIAL_PAYMENT_AMOUNT); + } + + // -------------------------------------- + + time_t tInitialPaymentDelay = 0; + + if ((NULL != INITIAL_PAYMENT_DELAY) && (atoi(INITIAL_PAYMENT_DELAY) > 0)) + { + tInitialPaymentDelay = atoi(INITIAL_PAYMENT_DELAY); + } + + // -------------------------------------- + + long lPaymentPlanAmount = 0; + + if ((NULL != PAYMENT_PLAN_AMOUNT) && (atol(PAYMENT_PLAN_AMOUNT) > 0)) + { + lPaymentPlanAmount = atol(PAYMENT_PLAN_AMOUNT); + } + + // -------------------------------------- + + time_t tPaymentPlanDelay = 0; + + if ((NULL != PAYMENT_PLAN_DELAY) && (atoi(PAYMENT_PLAN_DELAY) > 0)) + { + tPaymentPlanDelay = atoi(PAYMENT_PLAN_DELAY); + } + + // -------------------------------------- + + time_t tPaymentPlanPeriod = 0; + + if ((NULL != PAYMENT_PLAN_PERIOD) && (atoi(PAYMENT_PLAN_PERIOD) > 0)) + { + tPaymentPlanPeriod = atoi(PAYMENT_PLAN_PERIOD); + } + + // -------------------------------------- + + time_t tPaymentPlanLength = 0; + + if ((NULL != PAYMENT_PLAN_LENGTH) && (atoi(PAYMENT_PLAN_LENGTH) > 0)) + { + tPaymentPlanLength = atoi(PAYMENT_PLAN_LENGTH); + } + + // -------------------------------------- + + int nPaymentPlanMaxPayments = 0; + + if ((NULL != PAYMENT_PLAN_MAX_PAYMENTS) && (atoi(PAYMENT_PLAN_MAX_PAYMENTS) > 0)) + { + nPaymentPlanMaxPayments = atoi(PAYMENT_PLAN_MAX_PAYMENTS); + } + + // -------------------------------------- + + + OTPaymentPlan * pPlan = g_OT_API.ProposePaymentPlan(theServerID, + // ---------------------------------------- + tValidFrom, // Default (0) == NOW + tValidTo, // Default (0) == no expiry / cancel anytime + // ---------------------------------------- + theSenderAcctID, + theSenderUserID, + // ---------------------------------------- + strConsideration, // Like a memo. + // ---------------------------------------- + theRecipientAcctID, + theRecipientUserID, + // ---------------------------------------- + lInitialPaymentAmount, + tInitialPaymentDelay, + // ---------------------------------------- + lPaymentPlanAmount, + tPaymentPlanDelay, + tPaymentPlanPeriod, + // ---------------------------------------- + tPaymentPlanLength, + nPaymentPlanMaxPayments); + + OTCleanup theAngel(pPlan); // Handles cleanup. (If necessary.) + + if (NULL == pPlan) + { + OTLog::Error("OT_API::ProposePaymentPlan failed in OT_API_ProposePaymentPlan.\n"); + return NULL; + } + + // At this point, I know pPlan is good (and will be cleaned up automatically.) + + OTString strOutput(*pPlan); // Extract the payment plan to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// Called by CUSTOMER. +// "PAYMENT_PLAN" is the output of the above function (ProposePaymentPlan) +// Customer should call OT_API_depositPaymentPlan after this. +// +const char * OT_API_ConfirmPaymentPlan(const char * SERVER_ID, + const char * SENDER_USER_ID, + const char * SENDER_ACCT_ID, + const char * RECIPIENT_USER_ID, + const char * PAYMENT_PLAN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != SENDER_USER_ID, "Null SENDER_USER_ID passed in."); + OT_ASSERT_MSG(NULL != SENDER_ACCT_ID, "Null SENDER_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != RECIPIENT_USER_ID, "Null RECIPIENT_USER_ID passed in."); + OT_ASSERT_MSG(NULL != PAYMENT_PLAN, "Null PAYMENT_PLAN passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theSenderUserID(SENDER_USER_ID); + const OTIdentifier theSenderAcctID(SENDER_ACCT_ID); + const OTIdentifier theRecipientUserID(RECIPIENT_USER_ID); + + OTPaymentPlan thePlan; + const OTString strPlan(PAYMENT_PLAN); + + if (!strPlan.Exists() || (false == thePlan.LoadContractFromString(strPlan))) + { + OTLog::Output(0, "OT_API_ConfirmPaymentPlan: Failure loading payment plan from string.\n"); + return NULL; + } + // -------------------------------------- + + bool bConfirmed = g_OT_API.ConfirmPaymentPlan(theServerID, + theSenderUserID, + theSenderAcctID, + theRecipientUserID, + thePlan); + if (false == bConfirmed) + { + OTLog::Output(0, "OT_API::ConfirmPaymentPlan failed in OT_API_ConfirmPaymentPlan.\n"); + return NULL; + } + + OTString strOutput(thePlan); // Extract the payment plan to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ----------------------------------------------------------------- +// LOAD PUBLIC KEY (of other users, where no private key is available) +// This is the "address book" versus the private Nym. +// If nothing found in the address book, it still tries to load +// a Private Nym (just to get the pubkey from it.) +// -- from local storage +// +// (return as STRING) +// +// Users will most likely store public keys of OTHER users, and they will need +// to load those from time to time, especially to verify signatures, etc. +// +const char * OT_API_LoadPubkey(const char * USER_ID) // returns NULL, or a public key. +{ + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTString strPubkey; // For the output + + // --------------------------------------------------------- + + OTIdentifier NYM_ID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTPseudonym * pNym = g_OT_API.LoadPublicNym(NYM_ID); + + if (NULL == pNym) // If he's not in the "address book" then let's see if this is a private Nym. + { + pNym = g_OT_API.LoadPrivateNym(NYM_ID); + } + + // --------------------------------------------------------- + + if (NULL == pNym) + { + pNym = new OTPseudonym(NYM_ID); + + OT_ASSERT_MSG(NULL != pNym, "Error allocating memory in the OT API."); + + // First load the public key + if (false == pNym->LoadPublicKey()) + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure loading Nym public key in OT_API_LoadPubkey: %s\n", + strNymID.Get()); + delete pNym; + return NULL; + } + else if (false == pNym->VerifyPseudonym()) + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure verifying Nym public key in OT_API_LoadPubkey: %s\n", + strNymID.Get()); + delete pNym; + return NULL; + } + } + + // --------------------------------------------------------- + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theNymAngel(pNym); // I pass the pointer, in case it's NULL. + + if (NULL == pNym) + { + OTString strNymID(NYM_ID); + OTLog::vOutput(0, "Failure in OT_API_LoadPubkey: %s\n", + strNymID.Get()); + } + else if (false == pNym->GetPublicKey().GetPublicKey(strPubkey)) + { + OTString strNymID(NYM_ID); + OTLog::vOutput(0, "Failure retrieving pubkey from Nym in OT_API_LoadPubkey: %s\n", + strNymID.Get()); + } + else // success + { + const char * pBuf = strPubkey.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + + + + +// ----------------------------------------------------------------- +// LOAD USER PUBLIC KEY -- from local storage +// +// (return as STRING) +// +const char * OT_API_LoadUserPubkey(const char * USER_ID) // returns NULL, or a public key. +{ + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTString strPubkey; // For the output + + OTIdentifier NYM_ID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTPseudonym * pNym = g_OT_API.LoadPrivateNym(NYM_ID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theNymAngel(pNym); // I pass the pointer, in case it's NULL. + + if (NULL == pNym) + { + OTString strNymID(NYM_ID); + OTLog::vOutput(0, "Failure calling OT_API::LoadPrivateNym in OT_API_LoadUserPubkey: %s\n", + strNymID.Get()); + } + else if (false == pNym->GetPublicKey().GetPublicKey(strPubkey)) + { + OTString strNymID(NYM_ID); + OTLog::vOutput(0, "Failure retrieving pubkey from Nym in OT_API_LoadUserPubkey: %s\n", + strNymID.Get()); + } + else // success + { + const char * pBuf = strPubkey.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +// ------------------------------------------------------------------------ +// +// Verify that USER_ID (including its Private Key) is an +// available and verified user in local storage. +// +// Loads the user's private key, verifies, then returns OT_TRUE or OT_FALSE. +// +OT_BOOL OT_API_VerifyUserPrivateKey(const char * USER_ID) // returns OT_BOOL +{ + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + // Get the string into usable form. + OTIdentifier NYM_ID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTPseudonym * pNym = g_OT_API.LoadPrivateNym(NYM_ID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theNymAngel(pNym); // I pass the pointer, in case it's NULL. + + if (NULL == pNym) + { + OTString strNymID(NYM_ID); + OTLog::vOutput(0, "Failure calling OT_API::LoadPrivateNym in OT_API_VerifyUserPrivateKey:\n%s\n", + strNymID.Get()); + } + else + { + return OT_TRUE; + } + + return OT_FALSE; +} + + + +// -------------------------------------------------------------- +// LOAD PURSE / MINT / ASSET CONTRACT -- (from local storage) +// +// Based on Asset Type ID: load a purse, a public mint, or an asset contract +// and return it as a string -- or return NULL if it wasn't found. +// +const char * OT_API_LoadPurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID) // returns NULL, or a purse. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theAssetID(ASSET_TYPE_ID); + const OTIdentifier theUserID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTPurse * pPurse = g_OT_API.LoadPurse(theServerID, theAssetID, theUserID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup thePurseAngel(pPurse); // I pass the pointer, in case it's NULL. + + if (NULL == pPurse) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadPurse in OT_API_LoadPurse.\n " + "Server: %s\n Asset Type: %s\n", SERVER_ID, ASSET_TYPE_ID); + } + else // success + { + OTString strOutput(*pPurse); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +// -------------------------------------------------- +// +// Is Mint Still Good ? OT_TRUE (1) == Yes, this mint is still good. +// OT_FALSE (0) == No: expired or other error. +// +OT_BOOL OT_API_Mint_IsStillGood(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "NULL ASSET_TYPE_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAssetID(ASSET_TYPE_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return OT_FALSE; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return OT_FALSE; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTMint * pMint = g_OT_API.LoadMint(theServerID, theAssetID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theMintAngel(pMint); // I pass the pointer, in case it's NULL. + + if (NULL == pMint) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadMint in OT_API_Mint_IsStillGood().\n " + "Server: %s\n Asset Type: %s\n", SERVER_ID, ASSET_TYPE_ID); + } + else // success + { + bool bExpired = pMint->Expired(); + + if (!bExpired) + return OT_TRUE; + } + + // ----------------------------------------------------- + + return OT_FALSE; +} + + + +const char * OT_API_LoadMint(const char * SERVER_ID, + const char * ASSET_TYPE_ID) // returns NULL, or a mint +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theAssetID(ASSET_TYPE_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTMint * pMint = g_OT_API.LoadMint(theServerID, theAssetID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theMintAngel(pMint); // I pass the pointer, in case it's NULL. + + if (NULL == pMint) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadMint in OT_API_LoadMint.\n " + "Server: %s\n Asset Type: %s\n", SERVER_ID, ASSET_TYPE_ID); + } + else // success + { + OTString strOutput(*pMint); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +const char * OT_API_LoadAssetContract(const char * ASSET_TYPE_ID) // returns NULL, or an asset contract +{ + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + + const OTIdentifier theAssetID(ASSET_TYPE_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = g_OT_API.LoadAssetContract(theAssetID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pContract); // I pass the pointer, in case it's NULL. + + if (NULL == pContract) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadAssetContract in OT_API_LoadAssetContract.\n " + "Asset Type: %s\n", ASSET_TYPE_ID); + } + else // success + { + OTString strOutput(*pContract); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +const char * OT_API_LoadServerContract(const char * SERVER_ID) // returns NULL, or an asset contract +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTServerContract * pContract = g_OT_API.LoadServerContract(theServerID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pContract); // I pass the pointer, in case it's NULL. + + if (NULL == pContract) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadServerContract in OT_API_LoadServerContract.\n " + "Server ID: %s\n", SERVER_ID); + } + else // success + { + OTString strOutput(*pContract); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + +// -------------------------------------------------------------- +// LOAD ACCOUNT / INBOX / OUTBOX -- (from local storage) +// +// Loads an acct, or inbox or outbox, based on account ID, (from local storage) +// and returns it as string (or returns NULL if it couldn't load it.) +// +const char * OT_API_LoadAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID) // Returns NULL, or an account. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theUserID(USER_ID); + const OTIdentifier theAccountID(ACCOUNT_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTAccount * pAccount = g_OT_API.LoadAssetAccount(theServerID, theUserID, theAccountID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pAccount); // I pass the pointer, in case it's NULL. + + if (NULL == pAccount) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadAssetAccount in OT_API_LoadAssetAccount.\n " + "Account ID: %s\n", ACCOUNT_ID); + } + else // success + { + OTString strOutput(*pAccount); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +const char * OT_API_LoadNymbox(const char * SERVER_ID, + const char * USER_ID) // Returns NULL, or an inbox. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theUserID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTLedger * pLedger = g_OT_API.LoadNymbox(theServerID, theUserID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pLedger); // I pass the pointer, in case it's NULL. + + if (NULL == pLedger) + { + OTLog::Output(0, "Failure calling OT_API::LoadNymbox in OT_API_LoadNymbox.\n"); + } + else // success + { + OTString strOutput(*pLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +const char * OT_API_LoadInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID) // Returns NULL, or an inbox. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theUserID(USER_ID); + const OTIdentifier theAccountID(ACCOUNT_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTLedger * pLedger = g_OT_API.LoadInbox(theServerID, theUserID, theAccountID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pLedger); // I pass the pointer, in case it's NULL. + + if (NULL == pLedger) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadInbox in OT_API_LoadInbox.\n " + "Account ID: %s\n", ACCOUNT_ID); + } + else // success + { + OTString strOutput(*pLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +const char * OT_API_LoadOutbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theUserID(USER_ID); + const OTIdentifier theAccountID(ACCOUNT_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTLedger * pLedger = g_OT_API.LoadOutbox(theServerID, theUserID, theAccountID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup theAngel(pLedger); // I pass the pointer, in case it's NULL. + + if (NULL == pLedger) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadOutbox in OT_API_LoadOutbox.\n " + "Account ID: %s\n", ACCOUNT_ID); + } + else // success + { + OTString strOutput(*pLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + + + +// -------------------------------------------------------------- + +/** + SO HOW WOULD YOU **USE** THIS? To process your inbox... + + -- First you call OT_API_getInbox to grab the latest inbox from the server. + (You will also want to call OT_API_getOutbox as well as + OT_API_getAccount, since you need to have the latest versions of + those files, or your balance agreement will be calculated wrong, + causing your transaction to fail.) + + -- Then you call OT_API_LoadInbox to load it from local storage. + + During this time, your user has the opportunity to peruse the + inbox, and to decide which transactions therein he wishes to + accept or reject. If you want to display the inbox items on + the screen, use these functions to loop through them: + OT_API_Ledger_GetCount + OT_API_Ledger_GetTransactionByIndex + OT_API_Ledger_GetTransactionIDByIndex + + You will probably ask me for more introspection on the transactions themselves. + (Just ask -- No problem.) Here's what you have right now: + OT_API_Transaction_GetType + + -- Then call OT_API_Ledger_CreateResponse in order to create a + 'response' ledger for that inbox, which will be sent to the server. + + -- Then call OT_API_Ledger_GetCount (pass it the inbox) to find out how many + transactions are inside of it. Use that count to LOOP through them... + + -- Use OT_API_Ledger_GetTransactionByIndex to grab each transaction as + you iterate through the inbox. + + -- Call OT_API_Transaction_CreateResponse to create a response for each + transaction, accepting or rejecting it, and adding it to the response + ledger. + + -- Penultimately, call OT_API_Ledger_FinalizeResponse() which will create + a Balance Agreement for the ledger. + + -- Finally, call OT_API_processInbox to send that response ledger to the + server and process the various items. + */ + + +// Returns number of transactions within, or -1 for error. +int OT_API_Ledger_GetCount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_GetCount. Acct ID:\n%s\n", + strAcctID.Get()); + return -1; + } + + return theLedger.GetTransactionCount(); + + return -1; +} + + +// ----------------------------------------------------------------------- +// Creates a new 'response' ledger, set up with the right Server ID, etc, so you +// can add the 'response' items to it, one by one. (Pass in the original ledger +// that you are responding to, as it uses the data from it to set up the response.) +// +const char * OT_API_Ledger_CreateResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * ORIGINAL_LEDGER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != ORIGINAL_LEDGER, "Null ORIGINAL_LEDGER passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + // Let's load up the ledger (probably in inbox) that was passed in... + OTString strOriginalLedger(ORIGINAL_LEDGER); + + OTLedger theOriginalLedger(theUserID, theAccountID, theServerID); + + if (false == theOriginalLedger.LoadContractFromString(strOriginalLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + if (false == theOriginalLedger.VerifyAccount(*pNym)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error verifying original ledger in OT_API_Ledger_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + // By this point, the ledger is loaded properly from the string, + // Let's create the response to it. + OTLedger * pResponseLedger = OTLedger::GenerateLedger(theUserID, theAccountID, + theServerID, OTLedger::message);// bCreateFile=false + OTCleanup theResponseAngel(pResponseLedger); // Angel will handle cleanup. + + if (NULL == pResponseLedger) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error generating response ledger in OT_API_Ledger_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + pResponseLedger->SignContract(*pNym); + pResponseLedger->SaveContract(); + + OTString strOutput(*pResponseLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// ------------------------------------------------------------------------- +// Lookup a transaction or its ID (from within a ledger) based on index or +// transaction number. +// +// The transaction number is returned as a string, because I return ALL long +// ints as a string (in the API.) In C, you can just call atol to convert it back. +// This makes it easier for the guys who use scripting languages. (This file is +// primarily for them. If you are lower-level, you should use OpenTransactions.h/.cpp +// and then use this one as a model for how to do it. Or use this one if you insist +// on straight C, since all these functions are extern "C".) +// +const char * OT_API_Ledger_GetTransactionByIndex(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + int nIndex) // returns transaction by index (from ledger) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + OT_ASSERT_MSG(nIndex >= 0, "Index out of bounds (it's in the negative)."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_GetTransactionByIndex. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // At this point, I know theLedger loaded successfully. + + if (nIndex >= theLedger.GetTransactionCount()) + { + OTLog::vError("OT_API_Ledger_GetTransactionByIndex out of bounds: %d\n", nIndex); + return NULL; // out of bounds. I'm saving from an OT_ASSERT_MSG() happening here. (Maybe I shouldn't.) + } + + OTTransaction * pTransaction = theLedger.GetTransactionByIndex(nIndex); +// OTCleanup theAngel(pTransaction); // THE LEDGER CLEANS THIS ALREADY. + + if (NULL == pTransaction) + { + OTLog::vError("OT_API_Ledger_GetTransactionByIndex good index but uncovered NULL pointer: %d\n", + nIndex); + return NULL; // Weird. + } + + // At this point, I actually have the transaction pointer, so let's return it in string form... + + OTString strOutput(*pTransaction); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// Returns transaction by ID (transaction numbers are long ints, and thus +// they are passed as strings in this OT high-level API.) +const char * OT_API_Ledger_GetTransactionByID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + const char * TRANSACTION_NUMBER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + OT_ASSERT_MSG(NULL != TRANSACTION_NUMBER, "NULL TRANSACTION_NUMBER passed in."); + + long lTransactionNumber = atol(TRANSACTION_NUMBER); + OT_ASSERT_MSG(lTransactionNumber >= 0, "Bad transaction number passed in (negative value)."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_GetTransactionByID. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // At this point, I know theLedger loaded successfully. + + OTTransaction * pTransaction = theLedger.GetTransaction(lTransactionNumber); + // No need to cleanup this transaction, the ledger owns it already. + + if (NULL == pTransaction) + { + OTLog::vOutput(0, "OT_API_Ledger_GetTransactionByID: No transactions found " + "in ledger with that number: %ld.\n", lTransactionNumber); + return NULL; // Maybe he was just looking; this isn't necessarily an error. + } + + // At this point, I actually have the transaction pointer, so let's return it in string form... + + OTString strOutput(*pTransaction); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// Returns a transaction number, or -1 for error. +const char * OT_API_Ledger_GetTransactionIDByIndex(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + int nIndex) // returns transaction number by index. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + OT_ASSERT_MSG(nIndex >= 0, "Index out of bounds (it's in the negative)."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + + // ----------------------------------------------------- + + OTString strOutput("-1"); // For the output + + long lTransactionNumber = 0; + OTTransaction * pTransaction = NULL; + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_GetTransactionIDByIndex. Acct ID:\n%s\n", + strAcctID.Get()); + } + + // At this point, I know theLedger loaded successfully. + + else if (nIndex >= theLedger.GetTransactionCount()) + { + OTLog::vError("OT_API_Ledger_GetTransactionIDByIndex out of bounds: %d\n", nIndex); + // out of bounds. I'm saving from an OT_ASSERT_MSG() happening here. (Maybe I shouldn't.) + } + + else if (NULL == (pTransaction = theLedger.GetTransactionByIndex(nIndex))) + { + OTLog::vError("OT_API_Ledger_GetTransactionIDByIndex good index but uncovered NULL pointer: %d\n", + nIndex); + } // NO NEED TO CLEANUP the transaction, since it is already "owned" by theLedger. + + // At this point, I actually have the transaction pointer, so let's get the ID... + + else if (0 > (lTransactionNumber = pTransaction->GetTransactionNum())) + { + OTLog::vError("OT_API_Ledger_GetTransactionIDByIndex negative transaction num: %ld\n", + lTransactionNumber); + // Bad value. + } + else // success + { + strOutput.Format("%ld", lTransactionNumber); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// -------------------------------------------------------------- +// Add a transaction to a ledger. +// (Returns the updated ledger.) +// +const char * OT_API_Ledger_AddTransaction(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_AddTransaction. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + else if (false == theLedger.VerifyAccount(*pNym)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error verifying ledger in OT_API_Ledger_AddTransaction. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // At this point, I know theLedger loaded and verified successfully. + // ----------------------------------------------------- + + OTTransaction * pTransaction = new OTTransaction(theUserID, theAccountID, theServerID); + + OT_ASSERT_MSG(NULL != pTransaction, "Error allocating memory in the OTAPI."); + + if (false == pTransaction->LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Ledger_AddTransaction. Acct ID:\n%s\n", + strAcctID.Get()); + delete pTransaction; pTransaction = NULL; + return NULL; + } + else if (false == pTransaction->VerifyAccount(*pNym)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error verifying transaction in OT_API_Ledger_AddTransaction. Acct ID:\n%s\n", + strAcctID.Get()); + delete pTransaction; pTransaction = NULL; + return NULL; + } + + // ----------------------------------------------------- + + // At this point, I know pTransaction loaded and verified successfully. + // So let's add it to the ledger, save, and return updated ledger in string form. + + theLedger.AddTransaction(*pTransaction); // Ledger now "owns" it and will handle cleanup. + + theLedger.ReleaseSignatures(); + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + OTString strOutput(theLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// -------------------------------------------------------------- +/// Create a 'response' transaction, that will be used to indicate my +/// acceptance or rejection of another transaction. Usually an entire +/// ledger full of these is sent to the server as I process the various +/// transactions in my inbox. +/// +/// The original transaction is passed in, and I generate a response transaction based on it. +/// Also, the response ledger is passed in, so I load it, add the response transaction, save +/// it back to string, and return the string. +/// +/// This way, users can call this function multiple times, adding transactions until done. +/// +const char * OT_API_Transaction_CreateResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, // 'Response' ledger be sent to the server... + const char * THE_TRANSACTION, // Responding to...? + OT_BOOL BOOL_DO_I_ACCEPT) // 0 or 1 (OT_TRUE or OT_FALSE.) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), + theUserID(USER_ID), theAcctID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER); + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (NULL == pServer) + { + OTLog::Output(0, "No Server Contract found with that Server ID.\n"); + return NULL; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + const OTPseudonym * pServerNym = pServer->GetContractPublicNym(); + + if (NULL == pServerNym) + { + OTLog::Output(0, "No Contract Nym found in that Server Contract.\n"); + return NULL; + } + + // By this point, pServerNym is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAcctID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error loading ledger from string in OT_API_Transaction_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + else if (false == theLedger.VerifyAccount(*pNym)) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error verifying ledger in OT_API_Transaction_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // At this point, I know theLedger loaded and verified successfully. + // (This is the 'response' ledger that the user previously generated, + // and now he is loading it up with responses that this function will + // generate on his behalf.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAcctID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + // This transaction is presumably from the server, since we are in this + // function in order to generate a response back to the server. So therefore + // I want to verify that the server has actually signed the thing, before + // I go off responding to it like a damned fool. + // + else if (false == theTransaction.VerifyAccount(*((OTPseudonym *)pServerNym))) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error verifying transaction in OT_API_Transaction_CreateResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + if ( + (OTTransaction::pending != theTransaction.GetType()) + && (OTTransaction::chequeReceipt != theTransaction.GetType()) + && (OTTransaction::transferReceipt != theTransaction.GetType()) + && (OTTransaction::marketReceipt != theTransaction.GetType()) + && (OTTransaction::paymentReceipt != theTransaction.GetType()) + && (OTTransaction::finalReceipt != theTransaction.GetType()) + && (OTTransaction::basketReceipt != theTransaction.GetType()) + ) + { + OTLog::vError("OT_API_Transaction_CreateResponse: wrong transaction type: %s.\n", + theTransaction.GetTypeString()); + return NULL; + } + + // ----------------------------------------------------- + + // At this point, I know theTransaction loaded and verified successfully. + // So let's generate a response item based on it, and add it to a processInbox + // transaction to be added to that ledger (if one's not already there...) + + // First, check to see if there is a processInbox transaction already on + // the ledger... + OTTransaction * pTransaction = theLedger.GetTransaction(OTTransaction::processInbox); + + // If it's not already there, create it and add it. + if (NULL == pTransaction) + { + OTString strServerID(theServerID); + long lTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lTransactionNumber); + + if (false == bGotTransNum) + { + OTString strNymID(theUserID); + OTLog::vOutput(0, "User is all out of transaction numbers in OT_API_Transaction_CreateResponse:\n%s\n", + strNymID.Get()); + return NULL; + } + + pTransaction = OTTransaction::GenerateTransaction(theUserID, theAcctID, theServerID, + OTTransaction::processInbox, + lTransactionNumber); + if (NULL == pTransaction) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error generating processInbox transaction in \n" + "OT_API_Transaction_CreateResponse for AcctID:\n%s\n", strAcctID.Get()); + + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, true); // bSave=true. Have to add this back since we failed to use it. + + return NULL; + } + + theLedger.AddTransaction(*pTransaction); // Ledger now "owns" it and will handle cleanup. + } + + // At this point I know pTransaction is a processInbox transaction, ready to go, + // and that theLedger will handle any cleanup issues related to it. + + // ----------------------------------------------------- + + // Next let's create a new item that responds to theTransaction, and add that + // item to pTransaction. Then we'll return the updated ledger. + + OTItem::itemType theAcceptItemType = OTItem::error_state; + OTItem::itemType theRejectItemType = OTItem::error_state; + + switch (theTransaction.GetType()) + { + case OTTransaction::pending: + theAcceptItemType = OTItem::acceptPending; + theRejectItemType = OTItem::rejectPending; + break; + + + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + theAcceptItemType = OTItem::acceptCronReceipt; + theRejectItemType = OTItem::disputeCronReceipt; + break; + + case OTTransaction::chequeReceipt: + case OTTransaction::transferReceipt: + theAcceptItemType = OTItem::acceptItemReceipt; + theRejectItemType = OTItem::disputeItemReceipt; + break; + + case OTTransaction::finalReceipt: + theAcceptItemType = OTItem::acceptFinalReceipt; + theRejectItemType = OTItem::disputeFinalReceipt; + break; + + case OTTransaction::basketReceipt: + theAcceptItemType = OTItem::acceptBasketReceipt; + theRejectItemType = OTItem::disputeBasketReceipt; + break; + + default: + theAcceptItemType = OTItem::error_state; + theRejectItemType = OTItem::error_state; + OTLog::vError("Unexpected transaction type in \n" + "OT_API_Transaction_CreateResponse: %s\n", theTransaction.GetTypeString()); + return NULL; + } + + long lReferenceTransactionNum = 0; + + switch (theTransaction.GetType()) + { + case OTTransaction::marketReceipt: + case OTTransaction::paymentReceipt: + case OTTransaction::finalReceipt: + case OTTransaction::basketReceipt: + lReferenceTransactionNum = theTransaction.GetTransactionNum(); + break; + + case OTTransaction::pending: + case OTTransaction::chequeReceipt: + case OTTransaction::transferReceipt: + { + // ----------------------------------------------------- + // Here's some code in case you need to load up the item. + OTString strReference; + theTransaction.GetReferenceString(strReference); + + if (!strReference.Exists()) + { + OTLog::Error("OT_API_Transaction_CreateResponse: No reference string found on transaction.\n"); + return NULL; + } + // ----------------------------------------------------- + OTItem * pOriginalItem = OTItem::CreateItemFromString(strReference, theServerID, theTransaction.GetReferenceToNum()); + OTCleanup theAngel(pOriginalItem); + + if (NULL == pOriginalItem) + { + OTLog::Error("OT_API_Transaction_CreateResponse: Failed loading transaction item from string.\n"); + return NULL; + } + // pItem will be automatically cleaned up when it goes out of scope. + // ----------------------------------------------------- + + if ( + (OTItem::request != pOriginalItem->GetStatus()) + || + ( + (OTItem::acceptPending != pOriginalItem->GetType()) && // I'm accepting a transfer receipt. + (OTItem::transfer != pOriginalItem->GetType()) && // I'm accepting a transfer that was sent to me. + (OTItem::depositCheque != pOriginalItem->GetType()) // I'm accepting a notice that someone cashed a cheque I wrote. + ) + ) + { + OTLog::Error("OT_API_Transaction_CreateResponse: Wrong item type or " + "status attached as reference on transaction.\n"); + return NULL; + } + + lReferenceTransactionNum = pOriginalItem->GetTransactionNum(); // <============ + } + // ----------------------------------------------------- + break; + + default: + OTLog::vError("Unexpected transaction type in \n" + "OT_API_Transaction_CreateResponse: %s\n", theTransaction.GetTypeString()); + return NULL; + } + + + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pTransaction, + (OT_TRUE == BOOL_DO_I_ACCEPT) ? + theAcceptItemType : theRejectItemType); // set above. + + + // Set up the "accept" transaction item to be sent to the server + // (this item references and accepts another item by its transaction number-- + // one that is already there in my inbox) + pAcceptItem->SetReferenceToNum(lReferenceTransactionNum); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + pAcceptItem->SetAmount(theTransaction.GetReceiptAmount()); // Server validates this, so make sure it's right. + + // the transaction will handle cleaning up the transaction item. + pTransaction->AddItem(*pAcceptItem); + + // I don't attach the original item here because I already reference it by transaction num, + // and because the server already has it and sent it to me. SO I just need to give the server + // enough info to look it up again. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + + pTransaction->ReleaseSignatures(); + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + theLedger.ReleaseSignatures(); + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + OTString strOutput(theLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// ------------------------------------------------------------------------- +/// (Response Ledger) LEDGER FINALIZE RESPONSE +/// +/// AFTER you have set up all the transaction responses, call THIS function +/// to finalize them by adding a BALANCE AGREEMENT. +/// +/// MAKE SURE you have the latest copy of the account file, inbox file, and +/// outbox file, since we will need those in here to create the balance statement +/// properly. +/// +/// (Client software may wish to check those things, when downloaded, against +/// the local copies and the local signed receipts. In this way, clients can +/// protect themselves against malicious servers.) +/// +const char * OT_API_Ledger_FinalizeResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER) // 'Response' ledger be sent to the server... +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_LEDGER, "NULL THE_LEDGER passed in."); + + const OTIdentifier theServerID(SERVER_ID), + theUserID(USER_ID), + theAcctID(ACCOUNT_ID); + + OTString strLedger(THE_LEDGER), strServerID(theServerID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (NULL == pServer) + { + OTLog::Output(0, "No Server Contract found with that Server ID.\n"); + return NULL; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + const OTPseudonym * pServerNym = pServer->GetContractPublicNym(); + + if (NULL == pServerNym) + { + OTLog::Output(0, "No Contract Nym found in that Server Contract.\n"); + return NULL; + } + + // By this point, pServerNym is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger theLedger(theUserID, theAcctID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error loading ledger from string in OT_API_Ledger_FinalizeResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + else if (false == theLedger.VerifyAccount(*pNym)) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error verifying ledger in OT_API_Ledger_FinalizeResponse. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // At this point, I know theLedger loaded and verified successfully. + // (This is the 'response' ledger that the user previously generated, + // and now he is loading it up with responses that this function will + // generate on his behalf.) + // ----------------------------------------------------- + + // First, check to see if there is a processInbox transaction already on + // the ledger... + OTTransaction * pTransaction = theLedger.GetTransaction(OTTransaction::processInbox); + + // If it's not already there, create it and add it. + if (NULL == pTransaction) + { + OTString strAcctID(theAcctID); + OTLog::vError("Error finding processInbox transaction in \n" + "OT_API_Ledger_FinalizeResponse for AcctID:\n%s\n", strAcctID.Get()); + return NULL; + } + + // At this point I know pTransaction is a processInbox transaction, ready to go, + // and that theLedger will handle any cleanup issues related to it. + + // ----------------------------------------------------- + + // If balance statement is already there, return. + if (NULL != pTransaction->GetItem(OTItem::balanceStatement)) + { + OTLog::Error("OT_API_Ledger_FinalizeResponse: this response has already been finalized.\n"); + return NULL; + } + + // ------------------------------------------------------------- + + // Get the account. + + OTAccount * pAccount = g_OT_API.GetAccount(theAcctID); + + if (NULL == pAccount) + { + OTLog::Output(0, "Unable to load Account.\n"); + return NULL; + } + + // ------------------------------------------------------------- + + // Load the inbox and outbox. + + OTLedger theInbox(theUserID, theAcctID, theServerID); + OTLedger theOutbox(theUserID, theAcctID, theServerID); + + if (!theInbox.LoadInbox()) + { + OTLog::Output(0, "Unable to load Inbox.\n"); + return NULL; + } + + if (!theOutbox.LoadOutbox()) + { + OTLog::Output(0, "Unable to load Outbox.\n"); + return NULL; + } + + // ------------------------------------------------------------- + + // Setup balance agreement item here! + // Adapting code from OTServer... with comments: + // + // This transaction accepts various incoming pending transfers. + // So when it's all done, my balance will be higher. + // AND pending inbox items will be removed from my inbox. + // + // I would like to not even process the whole giant loop below, + // if I can verify here now that the balance agreement is wrong. + // + // Thus I will actually loop through the acceptPending items in pTransaction, and then for each one, I'll + // lookup the ACTUAL transaction in the inbox, and get its ACTUAL value. (And total them all up.) + // + // The total of those, (WITHOUT the user having to tell me what it will be, since I'm looking them all up), + // should equal the difference in the account balance! Meaning the current balance plus that total will be + // the expected NEW balance, according to this balance agreement -- if it wants to be approved, that is. + // + // + + bool bSuccessFindingAllTransactions = true; + long lTotalBeingAccepted = 0; + + std::list theListOfInboxReceiptsBeingRemoved; + + OTPseudonym theTempNym; + + for (listOfItems::iterator ii = pTransaction->GetItemList().begin(); ii != pTransaction->GetItemList().end(); ++ii) + { + OTItem * pItem = *ii; + + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + if ((pItem->GetType() == OTItem::acceptPending) || + (pItem->GetType() == OTItem::acceptItemReceipt)) + { + OTTransaction * pServerTransaction = theInbox.GetPendingTransaction(pItem->GetReferenceToNum()); + + OTLog::vOutput(0, "Checking client-side inbox for expected pending or receipt transaction: %ld... ", + pItem->GetReferenceToNum()); // temp remove + + if (NULL == pServerTransaction) + { + bSuccessFindingAllTransactions = false; + OTLog::Output(0, "NOT found! (Do you have the latest inbox?)\n"); // temp remove + break; + } + else + { + bSuccessFindingAllTransactions = true; + + // IF I'm accepting a pending transfer, then add the amount to my counter of total amount being accepted. + // + // ELSE if I'm accepting an item receipt (which will remove my responsibility for that item) then add it + // to the temp Nym (which is a list of transaction numbers that will be removed from my responsibility if + // all is successful.) Also remove all the Temp Nym numbers from pNym, so we can verify the Balance + // Statement AS IF they were already removed. Add them + // + if (pItem->GetType() == OTItem::acceptPending) // acceptPending + lTotalBeingAccepted += pServerTransaction->GetReceiptAmount(); // <============================ + + else if (pItem->GetType() == OTItem::acceptItemReceipt) // acceptItemReceipt + { + // What number do I remove here? the user is accepting a transfer receipt, which + // is in reference to the recipient's acceptPending. THAT item is in reference to + // my original transfer (or contains a cheque with my original number.) (THAT's the # I need.) + // + OTString strOriginalItem; + pServerTransaction->GetReferenceString(strOriginalItem); + + OTItem * pOriginalItem = OTItem::CreateItemFromString(strOriginalItem, SERVER_ID, + pServerTransaction->GetReferenceToNum()); + OTCleanup theOrigItemGuardian(pOriginalItem); // So I don't have to clean it up later. No memory leaks. + + if (NULL != pOriginalItem) + { + // If pOriginalItem is acceptPending, that means the client is accepting the transfer receipt from the server, (from his inbox), + // which has the recipient's acceptance inside of the client's transfer as the original item. This means the transfer that + // the client originally sent is now finally closed! + // + // If it's a depositCheque, that means the client is accepting the cheque receipt from the server, + // (from his inbox) + // which has the recipient's deposit inside of it as the original item. This means that the cheque that + // the client originally wrote is now finally closed! + // + // In both cases, the "original item" itself is not from the client, but from the recipient! Therefore, + // the number on that item is useless for removing numbers from the client's list of issued numbers. + // Rather, I need to load that original cheque, or pending transfer, from WITHIN the original item, + // in order to get THAT number, to remove it from the client's issued list. (Whether for real, or for + // setting up dummy data in order to verify the balance agreement.) *sigh* + // + // ---------------------------- + if (OTItem::depositCheque == pOriginalItem->GetType()) // client is accepting a cheque receipt, which has a depositCheque (from the recipient) as the original item within. + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pOriginalItem->GetAttachment(strCheque); + + OTCheque theCheque; // allocated on the stack :-) + + if (false == ((strCheque.GetLength() > 2) && + theCheque.LoadContractFromString(strCheque))) + { + OTLog::vError("ERROR loading cheque from string in OT_API_Ledger_FinalizeResponse:\n%s\n", + strCheque.Get()); + } + else // Since the client wrote the cheque, and he is now accepting the cheque receipt, he can be cleared for that transaction number... + { + if (pNym->VerifyIssuedNum(strServerID, theCheque.GetTransactionNum())) + theTempNym.AddIssuedNum(strServerID, theCheque.GetTransactionNum()); + else + OTLog::vError("OT_API_Ledger_FinalizeResponse: cheque receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe need to download a fresh copy of it.)\n", + theCheque.GetTransactionNum()); + } + } + // ---------------------------- + // client is accepting a transfer receipt, which has an acceptPending from the recipient + // as the original item within. + // + else if (OTItem::acceptPending == pOriginalItem->GetType()) // (which is in reference to the client's outoing original transfer.) + { + if (pNym->VerifyIssuedNum(strServerID, pOriginalItem->GetReferenceToNum())) + theTempNym.AddIssuedNum(strServerID, pOriginalItem->GetReferenceToNum()); + else + OTLog::vError("OT_API_Ledger_FinalizeResponse: transferReceipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe need to download a fresh copy of it.)\n", + pOriginalItem->GetReferenceToNum()); + } + // ---------------------------- + else // wrong type. + { + OTString strOriginalItemType; + pOriginalItem->GetTypeString(strOriginalItemType); + OTLog::vError("OT_API_Ledger_FinalizeResponse: Original item has wrong type, while accepting item receipt:\n%s\n", + strOriginalItemType.Get()); + } + } + else + { + OTLog::vError("OT_API_Ledger_FinalizeResponse: Unable to load original item from string while accepting item receipt:\n%s\n", + strOriginalItem.Get()); + } + } // acceptItemReceipt + + + // I'll also go ahead and remove each transaction from theInbox, and pass said inbox into the VerifyBalanceAgreement call... + // (So it can simulate as if the inbox was already changed, and the total is already calculated, and if it succeeds, + // then we can allow the giant loop below to do it all for real.) + // (I'm not saving this copy of the inbox anyway--there's another one below.) + // + //theInbox.RemovePendingTransaction(pItem->GetReferenceToNum()); + // Let's remove it this way instead: + // + //theInbox.RemoveTransaction(pServerTransaction->GetTransactionNum()); // <================ + // Now this is done AFTER this loop... + // + theListOfInboxReceiptsBeingRemoved.push_back(pServerTransaction->GetTransactionNum()); + + } // pServerTransaction != NULL + } // if pItem type is accept pending or item receipt. + + // --------------------------------------------------------------- + + else if ((pItem->GetType() == OTItem::acceptCronReceipt) || + (pItem->GetType() == OTItem::acceptFinalReceipt) || + (pItem->GetType() == OTItem::acceptBasketReceipt) + ) + { + OTTransaction * pServerTransaction = theInbox.GetTransaction(pItem->GetReferenceToNum()); + + OTLog::vOutput(2, "Checking client-side inbox for expected cron or final or basket receipt: %ld... ", + pItem->GetReferenceToNum()); // temp remove + + if (NULL == pServerTransaction) + { + bSuccessFindingAllTransactions = false; + OTLog::Output(2, "NOT found! (Do you have the latest inbox?)\n"); // temp remove + break; + } + else + { + bSuccessFindingAllTransactions = true; + + switch (pItem->GetType()) + { + // ************************************************************ + + case OTItem::acceptCronReceipt: + // pServerTransaction is a marketReceipt or paymentReceipt + // + + // When accepting a cron receipt from the inbox, you don't have to clear the issued transaction number. + // In this case, the original trans# is cleared when the finalReceipt is generated, + // and the closing trans# is cleared when the finalReceipt is cleared. + + // So NO issued numbers being removed or added in this case. + // (But we still remove the receipt from our copy of the inbox, below, + // so that the balance agreement will reflect as if it had already been + // successfully removed. (Because balance agreement is meant to show the new + // state of things, in the event of success--a signed record of those things.) + break; + + // ************************************************************ + + case OTItem::acceptFinalReceipt: + // pServerTransaction is a finalReceipt + + + // IN THIS CASE: If we're accepting a finalReceipt, that means all the OTHER receipts related to it + // (sharing the same "in reference to") must ALSO be cleared from the inbox along with it! That's the + // whole point of the finalReceipt -- to make sure all related receipts are cleared, when IT is. + // + // The server WILL verify this also (I tested it)... That's why we check here, to save the trouble + // of being rejected by the server. + // + // So let's see if the number of related receipts on this process inbox (pTransaction) matches + // the number of related receipts in the actual inbox (theInbox), as found by the finalReceipt's + // (pServerTransaction) "in reference to" value, which should be the same as on the related receipts. + + // (Below) pTransaction is the processInbox transaction. Each item on it is in ref to a DIFFERENT receipt, + // even though, if they are marketReceipts, all of THOSE receipts are in ref to the original transaction#. + { +// int nRefCount = 0; + std::set setOfRefNumbers; // we'll store them here, to disallow duplicates, to make sure they are all unique IDs + + // + // I need to loop through all items on pTransaction (my processInbox request) + // For each, look it up on the inbox. (Each item may be "in reference to" + // one original transaction or another.) FIND THE ONES that are in reference to + // the same # as pServerTransaction is. + // + for (listOfItems::iterator iiii = pTransaction->GetItemList().begin(); + iiii != pTransaction->GetItemList().end(); ++iiii) + { + OTItem * pItemPointer = *iiii; + OT_ASSERT_MSG(NULL != pItemPointer, "Pointer should not have been NULL."); + + // pItemPointer->GetReferenceToNum() is the server's transaction number for the receipt + // that it dropped into my inbox. pTransPointer is the receipt itself (hopefully.) + OTTransaction * pTransPointer = theInbox.GetTransaction(pItemPointer->GetReferenceToNum()); + + // Careful on the logic here... + // ONCE EACH INBOX RECEIPT IS DEFINITELY NOT-NULL, and + // if *IT* is "in reference to" pServerTransaction->GetReferenceToNum(), + // Then increment the count for the transaction. COMPARE *THAT* to theInbox.GetCount and we're golden!! + // Perhaps the finalReceipt is in reference to #10, and there are 6 others that are ALSO in reference to #10. + // That's a total of 7 receipts in the inbox that are in reference to #10, so my request had better have the + // same count :-) + // + if ((NULL != pTransPointer) && + (pTransPointer->GetReferenceToNum() == pServerTransaction->GetReferenceToNum())) + { +// nRefCount++; + // std::set doesn't allow duplicates. + setOfRefNumbers.insert(pItemPointer->GetReferenceToNum()); + } + } + + // --------------------------------------------- + // + if (setOfRefNumbers.size() + != // IS NOT EQUAL TO... + + theInbox.GetTransactionCountInRefTo(pServerTransaction->GetReferenceToNum())) + /* todo: Notice I'm not making sure the count is entirely composed of ACCEPTED receipts. (vs DISPUTED...) + I probably should add code to GetItemCountInRefTo() so it only counts ACCEPTED receipts.*/ + { + OTLog::vOutput(0, + "OT_API_Ledger_FinalizeResponse: When accepting a finalReceipt, you MUST accept all " + "related receipts (ones that share the same IN REFERENCE TO transaction number as the finalReceipt %ld)\n" + "Transaction item count (in ref to): %d Inbox transaction count (in ref to): %d.\n", + pServerTransaction->GetReferenceToNum(), + setOfRefNumbers.size(), + theInbox.GetTransactionCountInRefTo(pServerTransaction->GetReferenceToNum())); + + bSuccessFindingAllTransactions = false; + break; + } + // Else NO BREAK; + //break; FALLING THROUGH TO BELOW, to do the pNym/theTempNym stuff in the BASKET section... + + // pServerTransaction->GetReferenceToNum() is the OPENING number and should already be closed. + // + // IN fact, since the "in reference to" is supposedly already closed, then let's just + // MAKE SURE of that, since otherwise it'll screw up my future balance agreements. (The + // instant a finalReceipt appears, the "in ref to" is already gone on the server's side.) + // + if (OTTransaction::finalReceipt == pServerTransaction->GetType()) + { + if (pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pServerTransaction->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pServerTransaction->GetReferenceToNum()); + } + else + OTLog::Error("Expected pServerTransaction to be a final receipt (while finalizing for process inbox.)\n"); + // + // pNym won't actually save unless it actually removes that #. If the #'s already NOT THERE, + // then the removal will fail, and thus it won't bother saving here. + } + + // ... (FALL THROUGH) ... + + case OTItem::acceptBasketReceipt: + // pServerTransaction is a basketReceipt (or finalReceipt, since falling through from above.) + // + // Remove the proper issued number, based on the CLOSING TRANSACTION NUMBER + // of the finalReceipt/basketReceipt I'm accepting... + // + + if (pNym->VerifyIssuedNum(strServerID, pServerTransaction->GetClosingNum())) + theTempNym.AddIssuedNum(strServerID, pServerTransaction->GetClosingNum()); + else + OTLog::vError("OT_API_Ledger_FinalizeResponse: final or basket Receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe need to download a fresh copy of it.)\n", + pServerTransaction->GetClosingNum()); + break; + + // ************************************************************ + + default: + { + OTString strTempType; + pItem->GetTypeString(strTempType); + OTLog::vError("OT_API_Ledger_FinalizeResponse: Unexpected item type: %s\n", strTempType.Get()); + break; + } + } + + // I'll also go ahead and remove each transaction from theInbox, and pass said inbox into the VerifyBalanceAgreement call... + // (So it can simulate as if the inbox was already changed, and the total is already calculated, and if it succeeds, + // then we can allow the giant loop below to do it all for real.) + // (I'm not saving this copy of the inbox anyway--there's another one below.) + // + //theInbox.RemoveTransaction(pItem->GetReferenceToNum()); + // Let's remove it this way instead: + // +// theInbox.RemoveTransaction(pServerTransaction->GetTransactionNum()); // <================ + // + // Actually, let's remove it this way: + theListOfInboxReceiptsBeingRemoved.push_back(pServerTransaction->GetTransactionNum()); + + } // else if pServerTransaction NOT NULL. + } // If acceptCronReceipt/acceptFinalReceipt/acceptBasketReceipt + } + + // ------------------------------------------ + + if (false == bSuccessFindingAllTransactions) // failure. + { + OTLog::Output(0, "OT_API_Ledger_FinalizeResponse: transactions in processInbox message do not match actual inbox.\n"); + + return NULL; // RETURN. + } + // --------------------------------------------------------------------- + + // SUCCESS finding all transactions + + while (!theListOfInboxReceiptsBeingRemoved.empty()) + { + long lTemp = theListOfInboxReceiptsBeingRemoved.front(); + theListOfInboxReceiptsBeingRemoved.pop_front(); + + if (false == theInbox.RemoveTransaction(lTemp)) // <================ + OTLog::vError("OT_API_Ledger_FinalizeResponse: Failed removing receipt from temporary Inbox: %ld \n", lTemp); + } + + // ***************************************************************** + + // SET UP NYM FOR BALANCE AGREEMENT. + + // By this point, theTempNym contains a list of all the transaction numbers that are issued to me, + // but that will NOT be issued to me anymore once this processInbox is processed. + // Therefore I need to REMOVE those items from my issued list (at least temporarily) in order to + // calculate the balance agreement properly. So I used theTempNym as a temp variable to store those + // numbers, so I can remove them from my Nym and them add them again after generating the statement. + // + for (int i = 0; i < theTempNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theTempNym.GetIssuedNum(theServerID, i); + pNym->RemoveIssuedNum(strServerID, lTemp); + } + + // ----------------------------------------- + + // BALANCE AGREEMENT + // + // The item is signed and saved within this call as well. No need to do that again. + // + OTItem * pBalanceItem = theInbox.GenerateBalanceStatement(lTotalBeingAccepted, *pTransaction, *pNym, *pAccount, theOutbox); + + // ----------------------------------------- + + // Here I am adding these numbers back again, since I removed them to generate the balance agreement. + // (They won't be removed for real until I receive the server's acknowledgment that those numbers + // really were removed. theTempNym then I have to keep them and use them for my balance agreements.) + // + for (int i = 0; i < theTempNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theTempNym.GetIssuedNum(theServerID, i); + pNym->AddIssuedNum(strServerID, lTemp); + } + + // ***************************************************************** + + if (NULL == pBalanceItem) + { + OTLog::vOutput(0, "OT_API_Ledger_FinalizeResponse: ERROR generating balance statement.\n"); + + return NULL; + } + + // the transaction will handle cleaning up the transaction item. + pTransaction->AddItem(*pBalanceItem); + + // ----------------------------------------- + + // sign the item + // This already happens in the GenerateBalanceStatement() call above. + // I would actually have to RELEASE the signatures if I wanted to sign again! + // (Unless I WANT two signatures...) + // +// pBalanceItem->SignContract(*pNym); +// pBalanceItem->SaveContract(); + + pTransaction->ReleaseSignatures(); + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + theLedger.ReleaseSignatures(); + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + OTString strOutput(theLedger); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + + +// -------------------------------------------------------------------- +// Retrieve Voucher from Transaction +// +// If you withdrew into a voucher instead of cash, this function allows +// you to retrieve the actual voucher cheque from the reply transaction. +// (A voucher is a cheque drawn on an internal server account instead +// of a user's asset account, so the voucher cannot ever bounce due to +// insufficient funds. We are accustomed to this functionality already +// in our daily lives, via "money orders" and "cashier's cheques".) +// +// How would you use this in full? +// +// First, call OT_API_withdrawVoucher() in order to send the request +// to the server. (You may optionally call OT_API_FlushMessageBuffer() +// before doing this.) +// +// Then, call OT_API_PopMessageBuffer() to retrieve any server reply. +// +// If there is a message from the server in reply, then call +// OT_API_Message_GetCommand to verify that it's a reply to the message +// that you sent, and call OT_API_Message_GetSuccess to verify whether +// the message was a success. +// +// If it was a success, next call OT_API_Message_GetLedger to retrieve +// the actual "reply ledger" from the server. +// +// Penultimately, call OT_API_Ledger_GetTransactionByID() and then, +// finally, call OT_API_Transaction_GetVoucher() (below) in order to +// retrieve the voucher cheque itself from the transaction. +// +const char * OT_API_Transaction_GetVoucher(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + OTString strOutput; + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetVoucher. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + if (OTTransaction::atWithdrawal != theTransaction.GetType()) + { + OTLog::Error("Error: tried to retrieve voucher from wrong transaction (not atWithdrawal).\n"); + return NULL; + } + + // ----------------------------------------------------- + + // loop through the ALL items that make up this transaction and check to see if a response to withdrawal. + OTItem * pItem = NULL; + + // if pointer not null, and it's a withdrawal, and it's an acknowledgement (not a rejection or error) + for (listOfItems::iterator ii = theTransaction.GetItemList().begin(); ii != theTransaction.GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT_MSG(NULL != pItem, "Null pItem in transaction list."); + + if ((OTItem::atWithdrawVoucher == pItem->GetType()) && + (OTItem::acknowledgement == pItem->GetStatus())) + { + OTString strVoucher; + pItem->GetAttachment(strVoucher); + + OTCheque theVoucher; + if (theVoucher.LoadContractFromString(strVoucher)) // Todo additional verification here on the cheque. + { + theVoucher.SaveContract(strOutput); + break; + } + } + + } + + // ----------------------------------------------------- + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found a voucher -- let's return it! + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + + + + + +const char * OT_API_Transaction_GetSenderUserID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetSenderUserID. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTIdentifier theOutput; + + bool bSuccess = theTransaction.GetSenderUserIDForDisplay(theOutput); + + // ----------------------------------------------------- + + if (bSuccess) + { + OTString strOutput(theOutput); + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found it -- let's return the user ID + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + else + return NULL; +} + + + + + + +const char * OT_API_Transaction_GetRecipientUserID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + OTLog::Output(0, "Unable to load nym, sorry.\n"); + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetRecipientUserID. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTIdentifier theOutput; + + bool bSuccess = theTransaction.GetRecipientUserIDForDisplay(theOutput); + + // ----------------------------------------------------- + + // Normally, there IS NO recipient user ID for a transfer (only a recipient acct ID.) + // But here, as a special trick, I'll see if the account is in my address book. + // THIS MEANS THE ADDRESS BOOK needs to store nyms (for other people, their public nym) + // as well as a list of acct IDs that I have associated with each Nym. That way, I can + // later look up the Nym ID based on the acct ID, and then look up my display label for + // that Nym. + // +// if (!bSuccess && (theTransaction.GetType() == OTTransaction::pending)) +// { +// // AS SOON AS ADDRESS BOOK FEATURE IS ADDED, THEN THIS CAN BE COMPLETED HERE. +// } + + // ----------------------------------------------------- + + if (bSuccess) + { + OTString strOutput(theOutput); + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found it -- let's return the user ID + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + else + return NULL; +} + + + + + + +const char * OT_API_Transaction_GetSenderAcctID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetSenderAcctID. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTIdentifier theOutput; + + bool bSuccess = theTransaction.GetSenderAcctIDForDisplay(theOutput); + + // ----------------------------------------------------- + + if (bSuccess) + { + OTString strOutput(theOutput); + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found it -- let's return the user ID + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + else + return NULL; +} + + + + + + +const char * OT_API_Transaction_GetRecipientAcctID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetRecipientAcctID. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTIdentifier theOutput; + + bool bSuccess = theTransaction.GetRecipientAcctIDForDisplay(theOutput); + + // ----------------------------------------------------- + + if (bSuccess) + { + OTString strOutput(theOutput); + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found it -- let's return the user ID + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + else + return NULL; +} + + + + + + + + +// ------------------------------------------------------------- + + +// -------------------------------------------------- +// +// PENDING TRANSFER (various functions) +// +// When someone has sent you a PENDING TRANSFER (a form of transaction +// that will be sitting in your inbox waiting for you to accept/reject it) +// then, as you are reading the inbox, you can use these functions in +// order to get data from the pending transfer. +// + + + +const char * OT_API_Pending_GetNote(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Pending_GetNote. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + if (OTTransaction::pending != theTransaction.GetType()) + { + OTLog::vError("OT_API_Pending_GetNote: wrong transaction type: %s. (Expected \"pending\".)\n", + theTransaction.GetTypeString()); + return NULL; + } + + // ----------------------------------------------------- + + OTString strReference; + theTransaction.GetReferenceString(strReference); + + if (!strReference.Exists()) + { + OTLog::Error("OT_API_Pending_GetNote: No reference string found on transaction.\n"); + return NULL; + } + + // ----------------------------------------------------- + + OTItem * pItem = OTItem::CreateItemFromString(strReference, theServerID, theTransaction.GetReferenceToNum()); + OTCleanup theAngel(pItem); + + if (NULL == pItem) + { + OTLog::Error("OT_API_Pending_GetNote: Failed loading transaction item from string.\n"); + return NULL; + } + + // pItem will be automatically cleaned up when it goes out of scope. + // ----------------------------------------------------- + + + if ((OTItem::transfer != pItem->GetType()) || + (OTItem::request != pItem->GetStatus())) + { + OTLog::Error("OT_API_Pending_GetNote: Wrong item type or status attached as reference on transaction.\n"); + return NULL; + } + + + // ----------------------------------------------------- + + OTString strOutput; + + pItem->GetNote(strOutput); + + // ----------------------------------------------------- + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found a note -- let's return it! + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +const char * OT_API_Transaction_GetAmount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetAmount. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTString strOutput; + const long lAmount = theTransaction.GetReceiptAmount(); + + strOutput.Format("%ld", lAmount); + + // ----------------------------------------------------- + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found the transaction and got the amount, let's return it. + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// There is a notice in my inbox, from the server, informing me of +// a pending transfer. +// Oh? And this notice is in reference to what transaction ID? +// This function will return the ID of the original transaction +// that the sender used to send me the transfer in the first place. +// Since his actual request is attached to the pending transaction, +// I can use this function to look up the number. +// +/// Returns cheque #, or market offer #, or payment plan #, or pending transfer # +/// (Meant to be used on inbox items.) +/// +const char * OT_API_Transaction_GetDisplayReferenceToNum(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetReferenceToNum. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + const long lDisplayNum = theTransaction.GetReferenceNumForDisplay(); + OTString strOutput; + + if (lDisplayNum != 0) + strOutput.Format("%ld", lDisplayNum); + + // ----------------------------------------------------- + + // Didn't find one. + if (!strOutput.Exists()) + return NULL; + + // We found the "in reference to" transaction number .. + // let's return it... + // + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + + + + +// -------------------------------------------------- +// +// Get Transaction Type (internally uses GetTransactionTypeString().) +// +const char * OT_API_Transaction_GetType(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetType. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + + const char * pBuf = theTransaction.GetTypeString(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +/// -------------------------------------------------- +/// +/// Get Transaction Date Signed (internally uses OTTransaction::GetDateSigned().) +/// +const char * OT_API_Transaction_GetDateSigned(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading transaction from string in OT_API_Transaction_GetDateSigned. Acct ID:\n%s\n", + strAcctID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + OTString strOutput; + const long lDateSigned = theTransaction.GetDateSigned(); + + strOutput.Format("%ld", lDateSigned); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// -------------------------------------------------- +// +// Get Transaction Success OT_TRUE (1) == acknowledgment +// OT_FALSE (0) == rejection +// +OT_BOOL OT_API_Transaction_GetSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return OT_FALSE; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return OT_FALSE; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("OT_API_Transaction_GetSuccess: Error loading transaction from string. Acct ID:\n%s\n", + strAcctID.Get()); + return OT_FALSE; + } + + // ----------------------------------------------------- + + bool bSuccess = theTransaction.GetSuccess(); + + if (bSuccess) + return OT_TRUE; + + return OT_FALSE; +} + + + +// -------------------------------------------------- +// +// Get Balance Agreement Success +// (from a TRANSACTION.) +// OT_TRUE (1) == acknowledgment +// OT_FALSE (0) == rejection +// +OT_BOOL OT_API_Transaction_GetBalanceAgreementSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TRANSACTION, "NULL THE_TRANSACTION passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strTransaction(THE_TRANSACTION); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return OT_FALSE; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return OT_FALSE; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTTransaction theTransaction(theUserID, theAccountID, theServerID); + + if (false == theTransaction.LoadContractFromString(strTransaction)) + { + OTString strAcctID(theAccountID); + OTLog::vError("OT_API_Transaction_GetBalanceAgreementSuccess: Error loading transaction from string. Acct ID:\n%s\n", + strAcctID.Get()); + return OT_FALSE; + } + + // ---------------------------------------------------- + + // At this point, I actually have the transaction pointer, so let's return its success status + OTItem * pReplyItem = theTransaction.GetItem(OTItem::atBalanceStatement); + + if (NULL == pReplyItem) + pReplyItem = theTransaction.GetItem(OTItem::atTransactionStatement); + + if (NULL == pReplyItem) + { + OTLog::vError("OT_API_Transaction_GetBalanceAgreementSuccess good transaction but uncovered NULL item pointer.\n"); + return OT_FALSE; // Weird. + } + + if (pReplyItem->GetStatus() == OTItem::acknowledgement) + { + return OT_TRUE; + } + + return OT_FALSE; +} + + + + +// ----------------------------------------------------------- +/// GET BALANCE AGREEMENT SUCCESS (From a MESSAGE.) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. (Sorry.) +/// +OT_BOOL OT_API_Message_GetBalanceAgreementSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetBalanceAgreementSuccess: Unable to load message.\n"); + return OT_FALSE; + } + + // It's not a transaction request or response, so the Payload wouldn't + // contain a ledger. (Don't want to pass back whatever it DOES contain + // in that case, now do I?) + // + if ( + (false == theMessage.m_strCommand.Compare("@notarizeTransactions")) && + (false == theMessage.m_strCommand.Compare("@processNymbox")) && + (false == theMessage.m_strCommand.Compare("@processInbox")) + ) + { + OTLog::vOutput(0, "OT_API_Message_GetBalanceAgreementSuccess: Wrong message type: %s\n", theMessage.m_strCommand.Get()); + return OT_FALSE; + } + + // The ledger is stored in the Payload, we'll grab it into the String. + OTString strLedger(theMessage.m_ascPayload); + + if (!strLedger.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetBalanceAgreementSuccess: No ledger found on message.\n"); + return OT_FALSE; + } + + // ------------------------------------ + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("OT_API_Message_GetBalanceAgreementSuccess: Error loading ledger from string. Acct ID:\n%s\n", + strAcctID.Get()); + return OT_FALSE; + } + + // At this point, I know theLedger loaded successfully. + + if (theLedger.GetTransactionCount() <= 0) + { + OTLog::vError("OT_API_Message_GetBalanceAgreementSuccess bad count in message ledger: %d\n", theLedger.GetTransactionCount()); + return OT_FALSE; // out of bounds. I'm saving from an OT_ASSERT_MSG() happening here. (Maybe I shouldn't.) + } + + OTTransaction * pReplyTransaction = theLedger.GetTransactionByIndex(0); // Right now this is a defacto standard. (only 1 transaction per message ledger, excepting process inbox. <== why? That's one as well I thought. And has multiple items attached.) + // OTCleanup theAngel(pTransaction); // THE LEDGER CLEANS THIS ALREADY. + + if (NULL == pReplyTransaction) + { + OTLog::vError("OT_API_Message_GetBalanceAgreementSuccess good index but uncovered NULL pointer: %d\n", + 0); + return OT_FALSE; // Weird. + } + + // At this point, I actually have the transaction pointer, so let's return its success status + OTItem * pReplyItem = pReplyTransaction->GetItem(OTItem::atBalanceStatement); + + if (NULL == pReplyItem) + pReplyItem = pReplyTransaction->GetItem(OTItem::atTransactionStatement); + + if (NULL == pReplyItem) + { + OTLog::vError("OT_API_Message_GetBalanceAgreementSuccess good index but uncovered NULL item pointer: %d\n", + 0); + return OT_FALSE; // Weird. + } + + if (pReplyItem->GetStatus() == OTItem::acknowledgement) + { + return OT_TRUE; + } + + return OT_FALSE; +} + + + + + + + + + +/* + +const char * OT_API_LoadPurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID) // returns NULL, or a purse. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID); + const OTIdentifier theAssetID(ASSET_TYPE_ID); + const OTIdentifier theUserID(USER_ID); + + // There is an OT_ASSERT in here for memory failure, + // but it still might return NULL if various verification fails. + OTPurse * pPurse = g_OT_API.LoadPurse(theServerID, theAssetID, theUserID); + + // Make sure it gets cleaned up when this goes out of scope. + OTCleanup thePurseAngel(pPurse); // I pass the pointer, in case it's NULL. + + if (NULL == pPurse) + { + OTLog::vOutput(0, "Failure calling OT_API::LoadPurse in OT_API_LoadPurse.\n " + "Server: %s\n Asset Type: %s\n", SERVER_ID, ASSET_TYPE_ID); + } + else // success + { + OTString strOutput(*pPurse); // For the output + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; + } + + return NULL; +} + +*/ + +// -------------------------------------------------- + + +// PURSE FUNCTIONS + + +// -------------------------------------------------------------------- +// Get Purse Total Value (internally uses GetTotalValue().) +// +// Returns the purported sum of all the tokens within. +// +const char * OT_API_Purse_GetTotalValue(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_PURSE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTString strPurse(THE_PURSE); + + // ----------------------------------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID); + + if (false == thePurse.LoadContractFromString(strPurse)) + { + OTString strAssetTypeID(theAssetTypeID); + OTLog::vError("Error loading purse from string in OT_API_Purse_GetTotalValue. Asset Type ID:\n%s\n", + strAssetTypeID.Get()); + return NULL; + } + + // ----------------------------------------------------- + + long lTotalValue = 0; + + if (thePurse.GetTotalValue() > 0) + lTotalValue = thePurse.GetTotalValue(); + + OTString strOutput; + strOutput.Format("%ld", lTotalValue); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +/* + const char * OT_API_LoadPurse( const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID); // returns NULL, or a purse. + */ + +/// This should, if USER_ID is NULL, create a Nym to encrypt the tokens to, and just attach +/// it (the dummy nym) as a parameter on the purse, along with its ID. +/// Otherwise use the User ID that's there. +/// +const char * OT_API_CreatePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID) // returns NULL, or a purse. UserID optional. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); +// OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); // optional + + if (NULL != USER_ID) + OTLog::vError("DEBUG OT_API_CreatePurse: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); + else + OTLog::vError("DEBUG OT_API_CreatePurse with NULL USER_ID: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + OTIdentifier theUserID; + + if (NULL != USER_ID) + theUserID.SetString(USER_ID); + else + { + OTLog::Error("OT_API_CreatePurse ERROR: This is where we need to create a dummy Nym for the purse. Todo."); + // This is where we need to create a dummy Nym for the purse. Todo. + } + + // ----------------------------------------------------- + +// OTLog::Error("DEBUG OT_API_CreatePurse 1 \n "); + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + +// OTLog::Error("DEBUG OT_API_CreatePurse 2 \n "); + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); // TODO we won't do this if using a dummy Nym. + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } +// OTLog::Error("DEBUG OT_API_CreatePurse 3 \n "); + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID, theUserID); + + thePurse.SignContract(*pNym); // todo when the dummy nym is done, HE will sign this. Pointer will have one or the other. + thePurse.SaveContract(); + + // ------------- +// OTLog::Error("DEBUG OT_API_CreatePurse 4 \n "); + + OTString strOutput(thePurse); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + +// OTLog::vError("DEBUG OT_API_CreatePurse %s \n ", g_tempBuf); + + return g_tempBuf; +} + + +/// Warning! This will overwrite whatever purse is there. +/// The proper way to use this function is, LOAD the purse, +/// then IMPORT whatever other purse you want into it, then +/// SAVE it again. +OT_BOOL OT_API_SavePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE) // returns OT_BOOL +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + OTLog::vError("DEBUG OT_API_SavePurse: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), theUserID(USER_ID); + + const OTString strPurse(THE_PURSE); + + // ------------------------------------------------------------- + + OT_BOOL bSuccess = OT_FALSE; + + OTPurse thePurse(theServerID, theAssetTypeID, theUserID); + + if (strPurse.Exists() && thePurse.LoadContractFromString(strPurse)) + { + if (g_OT_API.SavePurse(theServerID, theAssetTypeID, theUserID, thePurse)) + { + bSuccess = OT_TRUE; + } + else + { + OTLog::vOutput(0, "OT_API_SavePurse: Failure saving purse:\n%s\n", strPurse.Get()); + } + } + else + { + OTLog::vOutput(0, "OT_API_SavePurse: Failure loading purse from string:\n%s\n", strPurse.Get()); + } + + return bSuccess; +} + + +// --- + +/// Returns a count of the tokens inside this purse. (Coins.) +/// or -1 in case of error. +/// +int OT_API_Purse_Count(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_PURSE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + const OTString strPurse(THE_PURSE); + + // ------------------------------------------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID); + + if (strPurse.Exists() && thePurse.LoadContractFromString(strPurse)) + { + return thePurse.Count(); + } + + return (-1); +} + + + +/// Returns the TOKEN on top of the stock (LEAVING it on top of the stack, +/// but giving you a string copy of it.) +/// returns NULL if failure. +/// +const char * OT_API_Purse_Peek(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE) +{ + OTString strOutput; // for later. + + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), theUserID(USER_ID); + + const OTString strPurse(THE_PURSE); + + // ------------------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID, theUserID); + + if (strPurse.Exists() && thePurse.LoadContractFromString(strPurse)) + { + if (!thePurse.IsEmpty()) + { + OTToken * pToken = thePurse.Pop(*pNym); + OTCleanup theTokenAngel(pToken); + + if (NULL != pToken) + { + pToken->SaveContract(strOutput); + } + else + { + OTLog::Output(0, "OT_API_Purse_Peek: Failed popping a token from a stack that wasn't supposed to be empty...\n"); + return NULL; + } + } + else + { + OTLog::Output(0, "OT_API_Purse_Peek: Failed attempt to peek; purse is empty.\n"); + return NULL; + } + } + else + { + OTLog::vOutput(0, "OT_API_Purse_Peek: Failure loading purse from string:\n%s\n", strPurse.Get()); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// Removes the token from the top of the stock and DESTROYS IT, +/// and RETURNS THE UPDATED PURSE (with the token now missing from it.) +/// WARNING: Do not call this function unless you have PEEK()d FIRST!! +/// Otherwise you will lose the token and get left "holding the bag". +/// returns NULL if failure. +const char * OT_API_Purse_Pop(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE) +{ + OTString strOutput; // for later. + + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + OTLog::vError("DEBUG OT_API_Purse_Pop: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), theUserID(USER_ID); + + const OTString strPurse(THE_PURSE); + + // ------------------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID, theUserID); + + if (strPurse.Exists() && thePurse.LoadContractFromString(strPurse)) + { + if (!thePurse.IsEmpty()) + { + OTToken * pToken = thePurse.Pop(*pNym); + OTCleanup theTokenAngel(pToken); + + if (NULL != pToken) + { + thePurse.ReleaseSignatures(); + thePurse.SignContract(*pNym); + thePurse.SaveContract(); + thePurse.SaveContract(strOutput); + } + else + { + OTLog::Output(0, "OT_API_Purse_Pop: Failed popping a token from a stack that wasn't supposed to be empty...\n"); + return NULL; + } + } + else + { + OTLog::Output(0, "OT_API_Purse_Pop: Failed attempt to peek; purse is empty.\n"); + return NULL; + } + } + else + { + OTLog::vOutput(0, "OT_API_Purse_Pop: Failure loading purse from string:\n%s\n", strPurse.Get()); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// Pushes a token onto the stack (of the purse.) +/// Returns the updated purse (now including the token.) +/// Returns NULL if failure. +const char * OT_API_Purse_Push(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE, + const char * THE_TOKEN) +{ + OTString strOutput; // for later. + + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + OTLog::vError("DEBUG OT_API_Purse_Push: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); + + OTLog::vError("Purse Push SERVER_ID: %s \n", SERVER_ID); + OTLog::vError("Purse Push ASSET_TYPE_ID: %s \n", ASSET_TYPE_ID); + OTLog::vError("Purse Push USER_ID: %s \n", USER_ID); + OTLog::vError("Purse Push THE_PURSE: %s \n", THE_PURSE); + OTLog::vError("Purse Push THE_TOKEN: %s \n", THE_TOKEN); + + + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), theUserID(USER_ID); + + const OTString strPurse(THE_PURSE), strToken(THE_TOKEN); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + if (!strPurse.Exists()) + { + OTLog::Output(0, "OT_API_Purse_Push: Purse does not exist.\n"); + return NULL; + } + else if (!strToken.Exists()) + { + OTLog::Output(0, "OT_API_Purse_Push: Token does not exist.\n"); + return NULL; + } + + // --------------------------- + + OTPurse thePurse(theServerID, theAssetTypeID, theUserID); + OTToken theToken(theServerID, theAssetTypeID); + + if (thePurse.LoadContractFromString(strPurse) && + theToken.LoadContractFromString(strToken)) + { + if (thePurse.Push(*pNym, theToken)) // purse makes its own copy of token. + { + thePurse.ReleaseSignatures(); + thePurse.SignContract(*pNym); + thePurse.SaveContract(); + thePurse.SaveContract(strOutput); + } + else + { + OTLog::Output(0, "OT_API_Purse_Push: Failed pushing a token to a purse...\n"); + return NULL; + } + } + else + { + OTLog::vOutput(0, "OT_API_Purse_Push: Failure loading purse or token from string:\n%s\n%s\n", + strPurse.Get(), strToken.Get()); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + OTLog::vError("Purse Push: %s \n", g_tempBuf); + + return g_tempBuf; +} + + + + +// ------------------ + + +/// Returns OT_BOOL +/// Should handle duplicates. Should load, merge, and save. +OT_BOOL OT_API_Wallet_ImportPurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, // you pass in the purse you're trying to import + const char * THE_PURSE) // It should either have your User ID on it, or the key should be inside so you can import. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + OTLog::vError("DEBUG OT_API_Wallet_ImportPurse: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); + +// OTLog::vError("Debug start\nServerID: %s\nAsset ID: %s\n User ID: %s\nNew Purse:\n%s\n", +// SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), theUserID(USER_ID); + + const OTString strNewPurse(THE_PURSE); + +// OTLog::Error("Debug end\n"); + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return OT_FALSE; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(theUserID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = g_OT_API.LoadPrivateNym(theUserID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return OT_FALSE; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPurse * pOldPurse = g_OT_API.LoadPurse(theServerID, theAssetTypeID, theUserID); + OTCleanup thePurseAngel(pOldPurse); + + if (NULL == pOldPurse) // apparently there's not already a purse of this type, let's create it. + { + pOldPurse = new OTPurse(theServerID, theAssetTypeID, theUserID); + + OT_ASSERT(NULL != pOldPurse); + + thePurseAngel.SetCleanupTarget(*pOldPurse); + } + + // By this point, the old purse has either been loaded, or created. + // -------------------------------------------------------------- + + OTPurse theNewPurse(theServerID, theAssetTypeID); // This purse might have a dummy nym inside it, so I can't assume it's for my User ID. + + if (strNewPurse.Exists() && theNewPurse.LoadContractFromString(strNewPurse)) + { + if (pOldPurse->Merge(*pNym, theNewPurse)) + { + pOldPurse->ReleaseSignatures(); + pOldPurse->SignContract(*pNym); + pOldPurse->SaveContract(); + + bool bSaved = g_OT_API.SavePurse(theServerID, theAssetTypeID, theUserID, *pOldPurse); + + return bSaved ? OT_TRUE : OT_FALSE; + } + else + { + OTLog::vOutput(0, "Failure merging purse:\n%s\n", strNewPurse.Get()); + } + } + else + { + OTLog::vOutput(0, "Failure loading purse from string:\n%s\n", strNewPurse.Get()); + } + + return OT_FALSE; +} + + + +/// Messages the server. If failure, make sure you didn't lose that purse!! +/// If success, the new tokens will be returned shortly and saved into the appropriate purse. +/// Note that an asset account isn't necessary to do this... just a nym operating cash-only. +/// The same as exchanging a 20-dollar bill at the teller window for a replacement bill. +/// +void OT_API_exchangePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + // todo: exchange message. + OTLog::vError("TODO (NOT CODED) OT_API_exchangePurse: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n USER_ID: %s\n ", SERVER_ID, ASSET_TYPE_ID, USER_ID); +} + + + + +// -------------- + + +/// Returns an encrypted form of the actual blinded token ID. +/// (There's no need to decrypt the ID until redeeming the token, when +/// you re-encrypt it to the server's public key, or until spending it, +/// when you re-encrypt it to the recipient's public key, or exporting +/// it, when you create a dummy recipient and attach it to the purse.) +/// +const char * OT_API_Token_GetID(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput("0"), strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const OTASCIIArmor & ascSpendable = theToken.GetSpendable(); // encrypted version of Token ID, used as an "ID" on client side. + + strOutput.Format("%s", ascSpendable.Get()); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// The actual cash value of the token. Returns a long int as a string. +/// +const char * OT_API_Token_GetDenomination(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput("0"), strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const long l_Val = theToken.GetDenomination(); + + strOutput.Format("%ld", l_Val); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +/// OT_API_Token_GetSeries +/// Returns -1 for error. +/// Otherwise returns the series number of this token. (Int.) +/// +int OT_API_Token_GetSeries(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput, strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + return theToken.GetSeries(); + + return -1; +} + + + + +/// the date is seconds since Jan 1970, but returned as a string. +/// +const char * OT_API_Token_GetValidFrom(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput, strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const time_t t_Date = theToken.GetValidFrom(); + const long l_Date = t_Date; + + strOutput.Format("%ld", l_Date); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +/// the date is seconds since Jan 1970, but returned as a string. +/// +const char * OT_API_Token_GetValidTo(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID); + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput, strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const time_t t_Date = theToken.GetValidTo(); + const long l_Date = t_Date; + + strOutput.Format("%ld", l_Date); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// The actual Token ID inside of each token is encrypted to a Nym at all times. +// You can use a dummy Nym (which Purses will soon do automatically for password cash) +// This is a storage mechanism only. +// If you really wish a purse to be public, you would export it to a dummy Nym, +// with the private key included inside the purse, and with the password added as +// a data member or comment within the text. +// +// In this case, the GUI needs to be able to export cash from one Nym to another, +// so a function has been provided for doing so to the actual Token IDs (not just the purse. +// Understand that even when you decrypt a token out of a purse, the token ID itself is still +// encrypted within that token. That is what this function is for. +// +/// returns: the updated token itself in string form. +// +const char * OT_API_Token_ChangeOwner(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN, + const char * OLD_OWNER_NYM_ID, + const char * NEW_OWNER_NYM_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + OT_ASSERT_MSG(NULL != OLD_OWNER_NYM_ID, "Null OLD_OWNER_NYM_ID passed in."); + OT_ASSERT_MSG(NULL != NEW_OWNER_NYM_ID, "Null NEW_OWNER_NYM_ID passed in."); + + OTLog::vError("Debugging OT_API_Token_ChangeOwner: SERVER_ID: %s\n ASSET_TYPE_ID: %s\n OLD_OWNER_NYM_ID: %s\n NEW_OWNER_NYM_ID: %s\n ", + SERVER_ID, ASSET_TYPE_ID, OLD_OWNER_NYM_ID, NEW_OWNER_NYM_ID); + + const OTIdentifier theServerID(SERVER_ID), theAssetTypeID(ASSET_TYPE_ID), + oldOwnerID(OLD_OWNER_NYM_ID), newOwnerID(NEW_OWNER_NYM_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pOldNym = pWallet->GetNymByID(oldOwnerID); + + if (NULL == pOldNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pOldNym = g_OT_API.LoadPrivateNym(oldOwnerID); + + if (NULL == pOldNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; // I don't bother loading a public nym here since I need to decrypt tokens. (Need private.) + } + + pWallet->AddNym(*pOldNym); + } + + // By this point, pOldNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPseudonym * pNewNym = pWallet->GetNymByID(newOwnerID); + + if (NULL == pNewNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no Nym already loaded with that ID. Loading...\n"); + + pNewNym = g_OT_API.LoadPrivateNym(newOwnerID); + + if (NULL == pNewNym) // LoadPrivateNym has plenty of error logging already. + { + pNewNym = g_OT_API.LoadPublicNym(newOwnerID); + + if (NULL == pNewNym) // LoadPublicNym has plenty of error logging already. + { + // I try to load the private Nym first in case that's what it really is -- + // might as well have it that way correctly in the wallet. + // Failing that, I try to load the public nym. If I'm exporting some + // cash to someone, I at LEAST need his public key. (And after that, can't re-import...) + // Failing that, we have to return NULL. Sorry, we tried. + return NULL; + } + } + + pWallet->AddNym(*pNewNym); + } + + // By this point, pNewNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTToken theToken(theServerID, theAssetTypeID); + + OTString strOutput, strToken(THE_TOKEN); + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + if (false == theToken.ReassignOwnership(*pOldNym, *pNewNym)) + { + OTLog::Error("Error re-assigning ownership of token in OT_API_Token_ChangeOwner\n"); + } + else + { + OTLog::Output(3, "Success re-assigning ownership of token in OT_API_Token_ChangeOwner.\n"); + + theToken.ReleaseSignatures(); + theToken.SignContract(*pNewNym); + theToken.SaveContract(); + + theToken.SaveContract(strOutput); + } + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// --------- + +const char * OT_API_Token_GetAssetID(const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + OTToken theToken; + OTString strToken(THE_TOKEN), strOutput; + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const OTIdentifier & theID = theToken.GetAssetID(); + theID.GetString(strOutput); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +const char * OT_API_Token_GetServerID(const char * THE_TOKEN) +{ + OT_ASSERT_MSG(NULL != THE_TOKEN, "Null THE_TOKEN passed in."); + + OTToken theToken; + OTString strToken(THE_TOKEN), strOutput; + + if (strToken.Exists() && theToken.LoadContractFromString(strToken)) + { + const OTIdentifier & theID = theToken.GetServerID(); + theID.GetString(strOutput); + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + + +// -------------------------------------------------------------- +// IS BASKET CURRENCY ? +// +// Tells you whether or not a given asset type is actually a basket currency. +// +// returns OT_BOOL (OT_TRUE or OT_FALSE aka 1 or 0.) +// +OT_BOOL OT_API_IsBasketCurrency(const char * ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + + OTLog::vOutput(0, "BASKET ID: %s \n", ASSET_TYPE_ID); + + const OTIdentifier theAssetTypeID(ASSET_TYPE_ID); + + if (g_OT_API.IsBasketCurrency(theAssetTypeID)) + return OT_TRUE; + else + return OT_FALSE; +} + + + +// -------------------------------------------------------------------- +// Get Basket Count (of backing asset types.) +// +// Returns the number of asset types that make up this basket. +// (Or zero.) +// +int OT_API_Basket_GetMemberCount(const char * ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + + OTLog::vOutput(0, "BASKET ID: %s \n", ASSET_TYPE_ID); + + const OTIdentifier theAssetTypeID(ASSET_TYPE_ID); + + return g_OT_API.GetBasketMemberCount(theAssetTypeID); +} + + + +// -------------------------------------------------------------------- +// Get Asset Type of a basket's member currency, by index. +// +// (Returns a string containing Asset Type ID, or NULL). +// +const char * OT_API_Basket_GetMemberType(const char * BASKET_ASSET_TYPE_ID, + const int nIndex) +{ + OT_ASSERT_MSG(NULL != BASKET_ASSET_TYPE_ID, "Null BASKET_ASSET_TYPE_ID passed in."); + + OTLog::vOutput(0, "BASKET ID: %s \n", BASKET_ASSET_TYPE_ID); + + const OTIdentifier theAssetTypeID(BASKET_ASSET_TYPE_ID); + + OTIdentifier theOutputMemberType; + + + bool bGotType = g_OT_API.GetBasketMemberType(theAssetTypeID, + nIndex, + theOutputMemberType); + if (false == bGotType) + return NULL; + + + OTString strOutput(theOutputMemberType); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ---------------------------------------------------- +// GET BASKET MINIMUM TRANSFER AMOUNT +// +// Returns a long (as string) containing the minimum transfer +// amount for the entire basket. +// +// FOR EXAMPLE: +// If the basket is defined as 10 Rands == 2 Silver, 5 Gold, 8 Euro, +// then the minimum transfer amount for the basket is 10. This function +// would return a string containing "10", in that example. +// +const char * OT_API_Basket_GetMinimumTransferAmount(const char * BASKET_ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(NULL != BASKET_ASSET_TYPE_ID, "Null BASKET_ASSET_TYPE_ID passed in."); + + OTLog::vOutput(0, "BASKET ID: %s \n", BASKET_ASSET_TYPE_ID); + + const OTIdentifier theAssetTypeID(BASKET_ASSET_TYPE_ID); + + long lMinTransAmount = g_OT_API.GetBasketMinimumTransferAmount(theAssetTypeID); + + if (0 == lMinTransAmount) + return NULL; + + + OTString strOutput; + strOutput.Format("%ld", lMinTransAmount); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// ---------------------------------------------------- +// GET BASKET MEMBER's MINIMUM TRANSFER AMOUNT +// +// Returns a long (as string) containing the minimum transfer +// amount for one of the member currencies in the basket. +// +// FOR EXAMPLE: +// If the basket is defined as 10 Rands == 2 Silver, 5 Gold, 8 Euro, +// then the minimum transfer amount for the member currency at index +// 0 is 2, the minimum transfer amount for the member currency at +// index 1 is 5, and the minimum transfer amount for the member +// currency at index 2 is 8. +// +const char * OT_API_Basket_GetMemberMinimumTransferAmount(const char * BASKET_ASSET_TYPE_ID, + const int nIndex) +{ + OT_ASSERT_MSG(NULL != BASKET_ASSET_TYPE_ID, "Null BASKET_ASSET_TYPE_ID passed in."); + + OTLog::vOutput(0, "BASKET ID: %s \n", BASKET_ASSET_TYPE_ID); + + + const OTIdentifier theAssetTypeID(BASKET_ASSET_TYPE_ID); + + long lMinTransAmount = g_OT_API.GetBasketMemberMinimumTransferAmount(theAssetTypeID, nIndex); + + if (0 == lMinTransAmount) + { + OTLog::Error("OT_API_Basket_GetMemberMinimumTransferAmount: returned 0. Strange... what basket is this?\n"); + return NULL; + } + + OTString strOutput; + strOutput.Format("%ld", lMinTransAmount); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// ---------------------------------------------------- + + + + + + + + + + + +// -------------------------------------------------- + +// MESSAGES BEING SENT TO THE SERVER: + + + + +void OT_API_checkServerID(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.checkServerID(theServerID, theUserID); +} + + +void OT_API_createUserAccount(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.createUserAccount(theServerID, theUserID); +} + +void OT_API_deleteUserAccount(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.deleteUserAccount(theServerID, theUserID); +} + + +void OT_API_checkUser(const char * SERVER_ID, + const char * USER_ID, + const char * USER_ID_CHECK) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID_CHECK, "Null USER_ID_CHECK passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theOtherUserID(USER_ID_CHECK); + + g_OT_API.checkUser(theServerID, theUserID, theOtherUserID); +} + + +void OT_API_sendUserMessage(const char * SERVER_ID, + const char * USER_ID, + const char * USER_ID_RECIPIENT, + const char * RECIPIENT_PUBKEY, + const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID_RECIPIENT, "Null USER_ID_RECIPIENT passed in."); + OT_ASSERT_MSG(NULL != RECIPIENT_PUBKEY, "Null RECIPIENT_PUBKEY passed in."); + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theOtherUserID(USER_ID_RECIPIENT); + OTASCIIArmor ascRecipPubkey(RECIPIENT_PUBKEY); + OTString strMessage(THE_MESSAGE); + + g_OT_API.sendUserMessage(theServerID, theUserID, theOtherUserID, ascRecipPubkey, strMessage); +} + + +void OT_API_getRequest(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.getRequest(theServerID, theUserID); +} + + + +void OT_API_issueAssetType(const char * SERVER_ID, + const char * USER_ID, + const char * THE_CONTRACT) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_CONTRACT, "NULL THE_CONTRACT passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + OTString strContract(THE_CONTRACT); + + g_OT_API.issueAssetType(theServerID, theUserID, strContract); +} + + +void OT_API_getContract(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_ID, "Null ASSET_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAssetID(ASSET_ID); + + g_OT_API.getContract(theServerID, theUserID, theAssetID); +} + + +void OT_API_getMint(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_ID, "Null ASSET_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAssetID(ASSET_ID); + + g_OT_API.getMint(theServerID, theUserID, theAssetID); +} + + +void OT_API_createAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_ID, "Null ASSET_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAssetID(ASSET_ID); + + g_OT_API.createAssetAccount(theServerID, theUserID, theAssetID); +} + + + +// Sends a message to the server to retrieve latest copy of an asset acct. +void OT_API_getAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + + g_OT_API.getAccount(theServerID, theUserID, theAcctID); +} + + + + +// ---------------------------------------------------- +// GENERATE BASKET CREATION REQUEST +// +// (returns the basket in string form.) +// +// Call OT_API_AddBasketCreationItem multiple times to add +// the various currencies to the basket, and then call +// OT_API_issueBasket to send the request to the server. +// +const char * OT_API_GenerateBasketCreation(const char * USER_ID, + const char * MINIMUM_TRANSFER) +{ + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != MINIMUM_TRANSFER, "Null MINIMUM_TRANSFER passed in."); + + const OTIdentifier theUserID(USER_ID); + + // ---------------------------------------------- + + long lMinimumTransfer = 10; // Just a default value. + + if ((NULL != MINIMUM_TRANSFER) && (atol(MINIMUM_TRANSFER) > 0)) + lMinimumTransfer = atol(MINIMUM_TRANSFER); + + // ---------------------------------------------- + + OTBasket * pBasket = g_OT_API.GenerateBasketCreation(theUserID, lMinimumTransfer); // Must be above zero. If <= 0, defaults to 10. + + OTCleanup theAngel(pBasket); + + if (NULL == pBasket) + return NULL; + + // At this point, I know pBasket is good (and will be cleaned up automatically.) + // ---------------------------------------------- + + + OTString strOutput(*pBasket); +// pBasket->SaveContract(strOutput); // Extract the basket to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ---------------------------------------------------- +// ADD BASKET CREATION ITEM +// +// (returns the updated basket in string form.) +// +// Call OT_API_GenerateBasketCreation first (above), then +// call this function multiple times to add the various +// currencies to the basket, and then call OT_API_issueBasket +// to send the request to the server. +// +const char * OT_API_AddBasketCreationItem(const char * USER_ID, // for signature. + const char * THE_BASKET, // created in above call. + const char * ASSET_TYPE_ID, // Adding an asset type to the new basket. + const char * MINIMUM_TRANSFER) +{ + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_BASKET, "Null THE_BASKET passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != MINIMUM_TRANSFER, "Null MINIMUM_TRANSFER passed in."); + + OTString strBasket(THE_BASKET); + + // ---------------------------------------------------- + + const OTIdentifier theUserID(USER_ID), theAssetTypeID(ASSET_TYPE_ID); + + // ---------------------------------------------- + + long lMinimumTransfer = 10; // Just a default value. + + if ((NULL != MINIMUM_TRANSFER) && (atol(MINIMUM_TRANSFER) > 0)) + lMinimumTransfer = atol(MINIMUM_TRANSFER); + + // ---------------------------------------------- + + OTBasket theBasket; + + bool bAdded = false; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (theBasket.LoadContractFromString(strBasket)) + { + bAdded = g_OT_API.AddBasketCreationItem(theUserID, // for signature. + theBasket, // created in above call. + theAssetTypeID, // Adding an asset type to the new basket. + lMinimumTransfer); // The amount of the asset type that is in the basket (per). + } + + if (false == bAdded) + return NULL; + + + OTString strOutput(theBasket); // Extract the updated basket to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// -------------------------------------------------------------------------- +// ISSUE BASKET CURRENCY +// +// Issue a new asset type based on a BASKET of other asset types! +// You cannot call this function until you first set up the BASKET_INFO object. +// I will provide functions for setting up that object, so that you can then +// call this function to actually message the server with your request. +// +// ANYONE can issue a new basket type, but they will have no control over the +// issuer account. Normally when issuing a currency, you therefore control the +// issuer account. But with baskets, that is managed internally by the server. +// This means anyone can define a basket, and all may use it -- but no one +// controls it except the server. +// +void OT_API_issueBasket(const char * SERVER_ID, + const char * USER_ID, + const char * THE_BASKET) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_BASKET, "Null THE_BASKET passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + OTString strBasketInfo(THE_BASKET); + + g_OT_API.issueBasket(theServerID, theUserID, strBasketInfo); +} + + + + + + + +// ---------------------------------------------------- +// GENERATE BASKET EXCHANGE REQUEST +// +// (Returns the new basket exchange request in string form.) +// +// Call this function first. Then call OT_API_AddBasketExchangeItem +// multiple times, and then finally call OT_API_exchangeBasket to +// send the request to the server. +// +const char * OT_API_GenerateBasketExchange(const char * SERVER_ID, + const char * USER_ID, + const char * BASKET_ASSET_TYPE_ID, + const char * BASKET_ASSET_ACCT_ID, + // ------------------------------------- + const int TRANSFER_MULTIPLE) // 1 2 3 + // 5=2,3,4 OR 10=4,6,8 OR 15=6,9,12 +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != BASKET_ASSET_TYPE_ID, "Null BASKET_ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != BASKET_ASSET_ACCT_ID, "Null BASKET_ASSET_ACCT_ID passed in."); + + const OTIdentifier theUserID(USER_ID), theServerID(SERVER_ID), + theBasketAssetTypeID(BASKET_ASSET_TYPE_ID), + theBasketAssetAcctID(BASKET_ASSET_ACCT_ID); + + // ---------------------------------------------- + + int nTransferMultiple = 1; // Just a default value. + + if (TRANSFER_MULTIPLE > 0) + nTransferMultiple = TRANSFER_MULTIPLE; + + // ---------------------------------------------- + + OTBasket * pBasket = g_OT_API.GenerateBasketExchange(theServerID, + theUserID, + theBasketAssetTypeID, + theBasketAssetAcctID, + nTransferMultiple); // 1 2 3 + // 5=2,3,4 OR 10=4,6,8 OR 15=6,9,12 + OTCleanup theAngel(pBasket); + + if (NULL == pBasket) + return NULL; + + // At this point, I know pBasket is good (and will be cleaned up automatically.) + // ---------------------------------------------- + + + OTString strOutput(*pBasket); // Extract the basket to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + +// ---------------------------------------------------- +// ADD BASKET EXCHANGE ITEM +// +// Returns the updated basket exchange request in string form. +// (Or NULL.) +// +// Call the above function first. Then call this one multiple +// times, and then finally call OT_API_exchangeBasket to send +// the request to the server. +// +const char * OT_API_AddBasketExchangeItem(const char * SERVER_ID, + const char * USER_ID, + const char * THE_BASKET, + const char * ASSET_TYPE_ID, + const char * ASSET_ACCT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_BASKET, "Null THE_BASKET passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_ACCT_ID, "Null ASSET_ACCT_ID passed in."); + + OTString strBasket(THE_BASKET); + + // ---------------------------------------------------- + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), + theAssetTypeID(ASSET_TYPE_ID), + theAssetAcctID(ASSET_ACCT_ID); + + // ---------------------------------------------- + + OTBasket theBasket; + + bool bAdded = false; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (theBasket.LoadContractFromString(strBasket)) + { + bAdded = g_OT_API.AddBasketExchangeItem(theServerID, + theUserID, + theBasket, + theAssetTypeID, + theAssetAcctID); + } + + if (false == bAdded) + return NULL; + + OTString strOutput(theBasket); // Extract the updated basket to string form. + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// -------------------------------------------------------------------------- +// EXCHANGE BASKET +// +// Send a request to the server asking to exchange in or out of a basket +// currency. +// +// For example, maybe you have 3 gold, 2 silver, and 5 dollars, and those are +// the ingredients of the "Rand" basket currency. This message allows you to +// ask the server to convert from your gold, silver, and dollar accounts into +// your Rand account. (Or convert from your Rand account back into your gold, +// silver, and dollar accounts.) +// +// Other than this conversion process, (with the reserves stored internally by +// the server) basket accounts are identical to normal asset accounts -- they +// are merely another asset type ID, and you can use them the same as you would +// use any other asset type (open accounts, write cheques, withdraw cash, trade +// on markets, etc.) +// +void OT_API_exchangeBasket(const char * SERVER_ID, + const char * USER_ID, + const char * BASKET_ASSET_ID, + const char * THE_BASKET, + const OT_BOOL BOOL_EXCHANGE_IN_OR_OUT) // exchanging in == OT_TRUE (1), out == OT_FALSE (0). +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != BASKET_ASSET_ID, "Null BASKET_ASSET_ID passed in."); + OT_ASSERT_MSG(NULL != THE_BASKET, "Null THE_BASKET passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theBasketAssetID(BASKET_ASSET_ID); + + OTString strBasketInfo(THE_BASKET); + + // exchanging in == true, out == false. + const bool bExchangeInOrOut = ((OT_TRUE == BOOL_EXCHANGE_IN_OR_OUT) ? true : false); + + g_OT_API.exchangeBasket(theServerID, theUserID, theBasketAssetID, strBasketInfo, bExchangeInOrOut); +} + +// ---------------------------------------------------- + + + + + + + + + + +void OT_API_getTransactionNumber(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + + g_OT_API.getTransactionNumber(theServerID, theUserID); +} + + +void OT_API_notarizeWithdrawal(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * AMOUNT) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != AMOUNT, "Null AMOUNT passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + + OTString strAmount(AMOUNT); + + g_OT_API.notarizeWithdrawal(theServerID, theUserID, theAcctID, strAmount); +} + + +void OT_API_notarizeDeposit(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * THE_PURSE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PURSE, "Null THE_PURSE passed in."); + + // REMOVE TEMP DEBUG +// OTLog::vError("DEBUG: SERVER_ID: %s \n USER_ID: %s \n ACCT_ID: %s \n THE_PURSE: %s\n", +// SERVER_ID, USER_ID, ACCT_ID, THE_PURSE); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + OTString strPurse(THE_PURSE); + + g_OT_API.notarizeDeposit(theServerID, theUserID, theAcctID, strPurse); +} + + +void OT_API_notarizeTransfer(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_FROM, + const char * ACCT_TO, + const char * AMOUNT, + const char * NOTE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_FROM, "Null ACCT_FROM passed in."); + OT_ASSERT_MSG(NULL != ACCT_TO, "Null ACCT_TO passed in."); + OT_ASSERT_MSG(NULL != AMOUNT, "Null AMOUNT passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + OTIdentifier theFromAcct(ACCT_FROM), theToAcct(ACCT_TO); + + OTString strAmount(AMOUNT), strNote; + + if (NULL != NOTE) + strNote.Set(NOTE); + + g_OT_API.notarizeTransfer(theServerID, theUserID, theFromAcct, theToAcct, strAmount, strNote); +} + + +void OT_API_getInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + + g_OT_API.getInbox(theServerID, theUserID, theAcctID); +} + + +void OT_API_getNymbox(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.getNymbox(theServerID, theUserID); +} + + +void OT_API_getOutbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + + g_OT_API.getOutbox(theServerID, theUserID, theAcctID); +} + + +void OT_API_processInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * ACCT_LEDGER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_LEDGER, "NULL ACCT_LEDGER passed in."); + + OTLog::vOutput(0, + "SERVER_ID: %s \n" + "USER_ID: %s \n" + "ACCT_ID: %s \n" + "ACCT_LEDGER: %s \n", + SERVER_ID, USER_ID, ACCT_ID, ACCT_LEDGER); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + OTString strLedger(ACCT_LEDGER); + + OTString temp1(SERVER_ID), temp2(USER_ID), temp3(ACCT_ID), temp4(ACCT_LEDGER); + OTLog::vOutput(0, + "SERVER_ID: %s \n" + "USER_ID: %s \n" + "ACCT_ID: %s \n" + "ACCT_LEDGER: %s \n", + temp1.Get(), temp2.Get(), temp3.Get(), temp4.Get()); + + + + g_OT_API.processInbox(theServerID, theUserID, theAcctID, strLedger); +} + + +void OT_API_processNymbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_LEDGER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_LEDGER, "NULL ACCT_LEDGER passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + OTString strLedger(ACCT_LEDGER); + + g_OT_API.processNymbox(theServerID, theUserID, strLedger); +} + + +void OT_API_withdrawVoucher(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * RECIPIENT_USER_ID, + const char * CHEQUE_MEMO, + const char * AMOUNT) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != RECIPIENT_USER_ID, "Null RECIPIENT_USER_ID passed in."); + OT_ASSERT_MSG(NULL != CHEQUE_MEMO, "Null CHEQUE_MEMO passed in."); + OT_ASSERT_MSG(NULL != AMOUNT, "Null AMOUNT passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), + theAcctID(ACCT_ID), theRecipientUserID(RECIPIENT_USER_ID); + + OTString strMemo(CHEQUE_MEMO), strAmount(AMOUNT); + + g_OT_API.withdrawVoucher(theServerID, theUserID, theAcctID, theRecipientUserID, strMemo, strAmount); +} + + + +void OT_API_depositCheque(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * THE_CHEQUE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCT_ID, "Null ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_CHEQUE, "Null THE_CHEQUE passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAcctID(ACCT_ID); + OTString strCheque(THE_CHEQUE); + + g_OT_API.depositCheque(theServerID, theUserID, theAcctID, strCheque); +} + + + + +// -------------------------------------------------- +// DEPOSIT PAYMENT PLAN +// +// See OT_API_WritePaymentPlan as well. +// +void OT_API_depositPaymentPlan(const char * SERVER_ID, + const char * USER_ID, + const char * THE_PAYMENT_PLAN) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != THE_PAYMENT_PLAN, "Null THE_PAYMENT_PLAN passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + const OTString strPlan(THE_PAYMENT_PLAN); + + g_OT_API.depositPaymentPlan(theServerID, theUserID, strPlan); +} + + + +// DONE: Remove Market ID. +// DONE: Change inner call from cancelNymMarketOffer to cancelCronItem +// DONE: Make a copy of this function called cancelPaymentPlan. +// +void OT_API_cancelMarketOffer(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ACCT_ID, + const char * TRANSACTION_NUMBER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID ASSET_ACCT_ID in."); + OT_ASSERT_MSG(NULL != ASSET_ACCT_ID, "Null MARKET_ID passed in."); + OT_ASSERT_MSG(NULL != TRANSACTION_NUMBER, "NULL TRANSACTION_NUMBER passed in."); + + const long lTransactionNumber = atol(TRANSACTION_NUMBER); + OT_ASSERT_MSG(lTransactionNumber >= 0, "Bad transaction number passed in (negative value)."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAssetAcctID(ASSET_ACCT_ID); + + g_OT_API.cancelCronItem(theServerID, theUserID, theAssetAcctID, lTransactionNumber); +} + +/// OT_API_cancelPaymentPlan +/// Cancel a payment plan by transaction number. +/// +void OT_API_cancelPaymentPlan(const char * SERVER_ID, + const char * USER_ID, + const char * FROM_ACCT_ID, + const char * TRANSACTION_NUMBER) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != FROM_ACCT_ID, "Null FROM_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != TRANSACTION_NUMBER, "NULL TRANSACTION_NUMBER passed in."); + + const long lTransactionNumber = atol(TRANSACTION_NUMBER); + OT_ASSERT_MSG(lTransactionNumber >= 0, "Bad transaction number passed in (negative value)."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theFromAcctID(FROM_ACCT_ID); + + g_OT_API.cancelCronItem(theServerID, theUserID, theFromAcctID, lTransactionNumber); +} + + +// -------------------------------------------------- +// ISSUE MARKET OFFER +// +void OT_API_issueMarketOffer(const char * SERVER_ID, + const char * USER_ID, + // ------------------------------------------- + const char * ASSET_TYPE_ID, // Perhaps this is the + const char * ASSET_ACCT_ID, // wheat market. + // ------------------------------------------- + const char * CURRENCY_TYPE_ID, // Perhaps I'm buying the + const char * CURRENCY_ACCT_ID, // wheat with rubles. + // ------------------------------------------- + const char * MARKET_SCALE, // Defaults to minimum of 1. Market granularity. + const char * MINIMUM_INCREMENT, // This will be multiplied by the Scale. Min 1. + const char * TOTAL_ASSETS_ON_OFFER, // Total assets available for sale or purchase. Will be multiplied by minimum increment. + const char * PRICE_LIMIT, // Per Minimum Increment... + OT_BOOL bBuyingOrSelling) // SELLING == OT_TRUE, BUYING == OT_FALSE. +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_TYPE_ID, "Null ASSET_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != ASSET_ACCT_ID, "Null ASSET_ACCT_ID passed in."); + OT_ASSERT_MSG(NULL != CURRENCY_TYPE_ID, "Null CURRENCY_TYPE_ID passed in."); + OT_ASSERT_MSG(NULL != CURRENCY_ACCT_ID, "Null CURRENCY_ACCT_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), + theAssetTypeID(ASSET_TYPE_ID), theAssetAcctID(ASSET_ACCT_ID), + theCurrencyTypeID(CURRENCY_TYPE_ID), theCurrencyAcctID(CURRENCY_ACCT_ID); + + long lMarketScale = 1, lMinIncrement = 1, lTotalAssetsOnOffer = 1, lPriceLimit = 1; + + + if ((NULL != MARKET_SCALE) && (atol(MARKET_SCALE) > 0)) + lMarketScale = atol(MARKET_SCALE); + + if ((NULL != MINIMUM_INCREMENT) && (atol(MINIMUM_INCREMENT) > 0)) + lMinIncrement = atol(MINIMUM_INCREMENT); + + if ((NULL != TOTAL_ASSETS_ON_OFFER) && (atol(TOTAL_ASSETS_ON_OFFER) > 0)) + lTotalAssetsOnOffer = atol(TOTAL_ASSETS_ON_OFFER); + + if ((NULL != PRICE_LIMIT) && (atol(PRICE_LIMIT) > 0)) + lPriceLimit = atol(PRICE_LIMIT); + + // ------------------------------------------- + + g_OT_API.issueMarketOffer(theServerID, theUserID, + // ------------------------------------------- + theAssetTypeID, theAssetAcctID, theCurrencyTypeID, theCurrencyAcctID, + // ------------------------------------------- + lMarketScale, lMinIncrement, lTotalAssetsOnOffer, lPriceLimit, + (bBuyingOrSelling == OT_FALSE) ? false : true); +} + + + + +void OT_API_getMarketList(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.getMarketList(theServerID, theUserID); +} + +void OT_API_getMarketOffers(const char * SERVER_ID, + const char * USER_ID, + const char * MARKET_ID, + const char * MAX_DEPTH) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != MARKET_ID, "Null MARKET_ID passed in."); +// OT_ASSERT_MSG(NULL != MAX_DEPTH, "Null MAX_DEPTH passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theMarketID(MARKET_ID); + + const long lDepth = (NULL != MAX_DEPTH) ? atol(MAX_DEPTH) : 0; + OT_ASSERT_MSG(lDepth >= 0, "Bad depth passed in (negative value)."); + + g_OT_API.getMarketOffers(theServerID, theUserID, theMarketID, lDepth); +} + +void OT_API_getMarketRecentTrades(const char * SERVER_ID, + const char * USER_ID, + const char * MARKET_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != MARKET_ID, "Null MARKET_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theMarketID(MARKET_ID); + + g_OT_API.getMarketRecentTrades(theServerID, theUserID, theMarketID); +} + +void OT_API_getNym_MarketOffers(const char * SERVER_ID, + const char * USER_ID) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + g_OT_API.getNym_MarketOffers(theServerID, theUserID); +} + + + +// ----------------------------------------------------------- +// POP MESSAGE BUFFER +// +// If there are any replies from the server, they are stored in +// the message buffer. This function will return those messages +// (and remove them from the list) one-by-one, newest first. +// +// Returns the message as a string. +// +const char * OT_API_PopMessageBuffer(void) +{ + OTMessage * pMsg = g_OT_API.PopMessageBuffer(); + + OTCleanup theAngel(pMsg); // Just making sure it gets cleaned up. + + if (NULL == pMsg) // The buffer was empty. + { + OTLog::Error("OT_API_PopMessageBuffer: Buffer is empty, sorry.\n"); + return NULL; + } + + OTString strOutput(*pMsg); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// Just flat-out empties the thing. +void OT_API_FlushMessageBuffer(void) +{ + g_OT_API.FlushMessageBuffer(); +} + + + +// ----------------------------------------------------------- +// GET MESSAGE COMMAND TYPE +// +// This way you can discover what kind of command it was. +// All server replies are pre-pended with the @ sign. For example, if +// you send a "getAccount" message, the server reply is "@getAccount", +// and if you send "getMint" the reply is "@getMint", and so on. +// +const char * OT_API_Message_GetCommand(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + return NULL; + + OTString strOutput(theMessage.m_strCommand); + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// ----------------------------------------------------------- +// GET MESSAGE LEDGER +// +// If you just received a server response to a transaction, and +// you want to actually iterate through the transactions in the +// response ledger for that transaction, this function will retrieve +// that ledger for you. +// +const char * OT_API_Message_GetLedger(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetLedger: Unable to load message.\n"); + return NULL; + } + + // It's not a transaction request or response, so the Payload wouldn't + // contain a ledger. (Don't want to pass back whatever it DOES contain + // in that case, now do I?) + // + if ((false == theMessage.m_strCommand.Compare("notarizeTransactions")) && + (false == theMessage.m_strCommand.Compare("@notarizeTransactions"))) + { + OTLog::vOutput(0, "OT_API_Message_GetLedger: Wrong message type: %s\n", theMessage.m_strCommand.Get()); + return NULL; + } + + // The ledger is stored in the Payload, we'll grab it into the String. + OTString strOutput(theMessage.m_ascPayload); + + if (!strOutput.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetLedger: No ledger found on message.\n"); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + +// ----------------------------------------------------------- +// GET NEW ASSET TYPE ID +// +// If you just issued a new asset type, you'll want to read the +// server reply and get the new asset type ID out of it. +// Otherwise how will you ever open accounts in that new type? +// +const char * OT_API_Message_GetNewAssetTypeID(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetNewAssetTypeID: Unable to load message.\n"); + return NULL; + } + + // It's not a transaction request or response, so the Payload wouldn't + // contain a ledger. (Don't want to pass back whatever it DOES contain + // in that case, now do I?) + // + if (false == theMessage.m_strCommand.Compare("@issueAssetType")) + { + OTLog::vOutput(0, "OT_API_Message_GetNewAssetTypeID: Wrong message type: %s\n", + theMessage.m_strCommand.Get()); + return NULL; + } + + OTString strOutput(theMessage.m_strAssetID); + + if (!strOutput.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetNewAssetTypeID: No new asset type ID found on message.\n"); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + +// ----------------------------------------------------------- +// GET NEW ISSUER ACCOUNT ID +// +// If you just issued a new asset type, you'll want to read the +// server reply and get the new issuer acct ID out of it. +// Otherwise how will you ever issue anything with it? +// +const char * OT_API_Message_GetNewIssuerAcctID(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetNewIssuerAcctID: Unable to load message.\n"); + return NULL; + } + + // It's not an issue asset type response, so the m_strAcctID wouldn't + // contain an issuer account ID. (Don't want to pass back whatever it DOES contain + // in that case, now do I?) + // + if (false == theMessage.m_strCommand.Compare("@issueAssetType")) + { + OTLog::vOutput(0, "OT_API_Message_GetNewIssuerAcctID: Wrong message type: %s\n", + theMessage.m_strCommand.Get()); + return NULL; + } + + OTString strOutput(theMessage.m_strAcctID); + + if (!strOutput.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetNewIssuerAcctID: No issuer account ID found on message.\n"); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ----------------------------------------------------------- +// GET NEW ACCOUNT ID +// +// If you just created a new asset account, you'll want to read the +// server reply and get the new acct ID out of it. +// Otherwise how will you ever use it? +// This function allows you to get the new account ID out of the +// server reply message. +// +const char * OT_API_Message_GetNewAcctID(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetNewAcctID: Unable to load message.\n"); + return NULL; + } + + // It's not a response to createAccount, so the m_strAcctID wouldn't + // contain a new account ID anyway, right? (Don't want to pass back whatever + // it DOES contain in that case, now do I?) + // + if (false == theMessage.m_strCommand.Compare("@createAccount")) + { + OTLog::vOutput(0, "OT_API_Message_GetNewAcctID: Wrong message type: %s\n", + theMessage.m_strCommand.Get()); + return NULL; + } + + OTString strOutput(theMessage.m_strAcctID); + + if (!strOutput.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetNewAcctID: No asset account ID found on message.\n"); + return NULL; + } + + const char * pBuf = strOutput.Get(); + +#ifdef _WIN32 + strcpy_s(g_tempBuf, MAX_STRING_LENGTH, pBuf); +#else + strlcpy(g_tempBuf, pBuf, MAX_STRING_LENGTH); +#endif + + return g_tempBuf; +} + + + + +// ----------------------------------------------------------- +/// GET MESSAGE SUCCESS (True or False) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. +/// +OT_BOOL OT_API_Message_GetSuccess(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists()) + { + OTLog::Error("Error: THE_MESSAGE doesn't exist.\n"); + return OT_FALSE; + } + + if (!theMessage.LoadContractFromString(strMessage)) + { + OTLog::Error("OT_API_Message_GetSuccess: Failed loading message from string.\n"); + return OT_FALSE; + } + + if (true == theMessage.m_bSuccess) + return OT_TRUE; + else + { + OTLog::vError("** MESSAGE FAILURE: \n\n%s\n\n", THE_MESSAGE); + return OT_FALSE; + } +} + + + +// ----------------------------------------------------------- +/// GET MESSAGE "DEPTH" (USED FOR MARKET-SPECIFIC MESSAGES.) +/// +/// Returns the count of relevant items, so you know whether to bother reading the payload. +/// Returns -1 if error. +/// +/// The "depth" variable stores the count of items being returned. +/// For example, if I call getMarketList, and 10 markets are returned, +/// then depth will be set to 10. OR, if I call getNym_MarketOffers, and +/// the Nym has 16 offers on the various markets, then the depth will be 16. +/// +/// This value is important when processing server replies to market inquiries. +/// If the depth is 0, then you are done. End. BUT! if it contains a number, such as 10, +/// then that means you will want to next READ those 10 markets (or offers, or trades, etc) +/// out of the server reply's payload. +/// +/// Whereas if success is TRUE, but depth is 0, that means while the message processed +/// successfully, the list was simply empty (and thus it would be a waste of time trying +/// to unpack the non-existent, empty list of data items from the payload of your successful +/// reply.) +/// +int OT_API_Message_GetDepth(const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + return (-1); + + int nDepth = theMessage.m_lDepth; + + return nDepth; +} + + + +// ----------------------------------------------------------- +/// GET MESSAGE TRANSACTION SUCCESS (True or False) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. +/// +OT_BOOL OT_API_Message_GetTransactionSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_MESSAGE) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != ACCOUNT_ID, "NULL ACCOUNT_ID passed in."); + OT_ASSERT_MSG(NULL != THE_MESSAGE, "Null THE_MESSAGE passed in."); + + const OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID), theAccountID(ACCOUNT_ID); + + OTString strMessage(THE_MESSAGE); + + OTMessage theMessage; + + if (!strMessage.Exists() || !theMessage.LoadContractFromString(strMessage)) + { + OTLog::Output(0, "OT_API_Message_GetTransactionSuccess: Unable to load message.\n"); + return OT_FALSE; + } + + // It's not a transaction request or response, so the Payload wouldn't + // contain a ledger. (Don't want to pass back whatever it DOES contain + // in that case, now do I?) + // + if ( + (false == theMessage.m_strCommand.Compare("@notarizeTransactions")) && + (false == theMessage.m_strCommand.Compare("@processInbox")) + ) + { + OTLog::vOutput(0, "OT_API_Message_GetTransactionSuccess: Wrong message type: %s\n", theMessage.m_strCommand.Get()); + return OT_FALSE; + } + + // The ledger is stored in the Payload, we'll grab it into the String. + OTString strLedger(theMessage.m_ascPayload); + + if (!strLedger.Exists()) + { + OTLog::Output(0, "OT_API_Message_GetTransactionSuccess: No ledger found on message.\n"); + return OT_FALSE; + } + + // ------------------------------------ + + OTLedger theLedger(theUserID, theAccountID, theServerID); + + if (false == theLedger.LoadContractFromString(strLedger)) + { + OTString strAcctID(theAccountID); + OTLog::vError("Error loading ledger from string in OT_API_Message_GetTransactionSuccess. Acct ID:\n%s\n", + strAcctID.Get()); + return OT_FALSE; + } + + // At this point, I know theLedger loaded successfully. + + if (theLedger.GetTransactionCount() <= 0) + { + OTLog::vError("OT_API_Message_GetTransactionSuccess bad count in message ledger: %d\n", theLedger.GetTransactionCount()); + return OT_FALSE; // out of bounds. I'm saving from an OT_ASSERT_MSG() happening here. (Maybe I shouldn't.) + } + + OTTransaction * pTransaction = theLedger.GetTransactionByIndex(0); // Right now this is a defacto standard. (only 1 transaction per message ledger, excepting process inbox.) + // OTCleanup theAngel(pTransaction); // THE LEDGER CLEANS THIS ALREADY. + + if (NULL == pTransaction) + { + OTLog::vError("OT_API_Message_GetTransactionSuccess good index but uncovered NULL pointer: %d\n", + 0); + return OT_FALSE; // Weird. + } + + // At this point, I actually have the transaction pointer, so let's return its success status + + if (pTransaction->GetSuccess()) + return OT_TRUE; + + return OT_FALSE; +} + + + + + +// ----------------------------------------------------------- +// NOT necessary in XmlRpc->HTTP mode (the preferred way.) +// Only TCP/SSL mode maintains a connection to the server, and was for testing. +OT_BOOL OT_API_ConnectServer(const char * SERVER_ID, + const char * USER_ID, + const char * szCA_FILE, + const char * szKEY_FILE, + const char * szKEY_PASSWORD) +{ + OT_ASSERT_MSG(NULL != SERVER_ID, "Null SERVER_ID passed in."); + OT_ASSERT_MSG(NULL != USER_ID, "Null USER_ID passed in."); + OT_ASSERT_MSG(NULL != szCA_FILE, "Null szCA_FILE passed in."); + OT_ASSERT_MSG(NULL != szKEY_FILE, "Null szKEY_FILE passed in."); + OT_ASSERT_MSG(NULL != szKEY_PASSWORD, "Null szKEY_PASSWORD passed in."); + + OTIdentifier theServerID(SERVER_ID), theUserID(USER_ID); + + OTString strCA(szCA_FILE), strKeyFile(szKEY_FILE), strKeyPassword(szKEY_PASSWORD); + + bool bConnected = g_OT_API.ConnectServer(theServerID, theUserID, strCA, strKeyFile, strKeyPassword); + + if (bConnected) + return OT_TRUE; + + return OT_FALSE; +} + + +// Not necessary in HTTP mode. +// (Request/Response; no need to check sockets periodically in that mode.) +// If you use TCP/SSL mode, you have to call this in order to check for +// server replies and process them. +OT_BOOL OT_API_ProcessSockets(void) +{ + bool bProcess = g_OT_API.ProcessSockets(); + + if (bProcess) + return OT_TRUE; + + return OT_FALSE; +} + + + + + + + + + + + + + + + + + + diff --git a/testwallet/OTAPI.h b/testwallet/OTAPI.h new file mode 100644 index 000000000..c780bc7bb --- /dev/null +++ b/testwallet/OTAPI.h @@ -0,0 +1,186 @@ +/************************************************************************************ + * + * OTAPI.h -- The include file if you want to call the library from C. + * (Also used to create stubs for many other languages via SWIG.) + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + + +// Include this file if you want to use the C API. +// +// The OTAPI_funcdef.h file contains the actual function definitions, +// and is used by SWIG to generate bindings to many other scripting languages. + + +#ifndef __OT_API_H__ +#define __OT_API_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#include "OTAPI_funcdef.h" + + +#ifdef __cplusplus +} +#endif + + + +#endif // __OT_API_H__ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testwallet/OTAPI.i b/testwallet/OTAPI.i new file mode 100644 index 000000000..4b6b3997e --- /dev/null +++ b/testwallet/OTAPI.i @@ -0,0 +1,1769 @@ +%module(directors="1") otapi +%{ +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" +%} + + +%include "std_string.i"; +%include "typemaps.i" + +// --------------------------------------------------------------- +#ifdef SWIGJAVA + +%include "java/enumtypeunsafe.swg"; + +%typemap("javapackage") OTCallback, OTCallback *, OTCallback & "com.wrapper.core.jni"; +%typemap("javapackage") OTCaller, OTCaller *, OTCaller & "com.wrapper.core.jni"; + +%typemap("javapackage") Storage, Storage *, Storage & "com.wrapper.core.jni"; +%typemap("javapackage") Storable, Storable *, Storable & "com.wrapper.core.jni"; + +%typemap("javapackage") Blob, Blob *, Blob & "com.wrapper.core.jni"; +%typemap("javapackage") StringMap, StringMap *, StringMap & "com.wrapper.core.jni"; +%typemap("javapackage") BitcoinAcct, BitcoinAcct *, BitcoinAcct & "com.wrapper.core.jni"; +%typemap("javapackage") BitcoinServer, BitcoinServer *, BitcoinServer & "com.wrapper.core.jni"; +%typemap("javapackage") RippleServer, RippleServer *, RippleServer & "com.wrapper.core.jni"; +%typemap("javapackage") LoomServer, LoomServer *, LoomServer & "com.wrapper.core.jni"; +%typemap("javapackage") ServerInfo, ServerInfo *, ServerInfo & "com.wrapper.core.jni"; +%typemap("javapackage") ContactNym, ContactNym *, ContactNym & "com.wrapper.core.jni"; +%typemap("javapackage") ContactAcct, ContactAcct *, ContactAcct & "com.wrapper.core.jni"; +%typemap("javapackage") Contact, Contact *, Contact & "com.wrapper.core.jni"; +%typemap("javapackage") AddressBook, AddressBook *, AddressBook & "com.wrapper.core.jni"; +%typemap("javapackage") WalletData, WalletData *, WalletData & "com.wrapper.core.jni"; + +%typemap("javapackage") MarketData, MarketData *, MarketData & "com.wrapper.core.jni"; +%typemap("javapackage") MarketList, MarketList *, MarketList & "com.wrapper.core.jni"; +%typemap("javapackage") OfferDataMarket, OfferDataMarket *, OfferDataMarket & "com.wrapper.core.jni"; +%typemap("javapackage") BidData, BidData *, BidData & "com.wrapper.core.jni"; +%typemap("javapackage") AskData, AskData *, AskData & "com.wrapper.core.jni"; +%typemap("javapackage") OfferListMarket, OfferListMarket *, OfferListMarket & "com.wrapper.core.jni"; +%typemap("javapackage") TradeDataMarket, TradeDataMarket *, TradeDataMarket & "com.wrapper.core.jni"; +%typemap("javapackage") TradeListMarket, TradeListMarket *, TradeListMarket & "com.wrapper.core.jni"; +%typemap("javapackage") OfferDataNym, OfferDataNym *, OfferDataNym & "com.wrapper.core.jni"; +%typemap("javapackage") OfferListNym, OfferListNym *, OfferListNym & "com.wrapper.core.jni"; +%typemap("javapackage") TradeDataNym, TradeDataNym *, TradeDataNym & "com.wrapper.core.jni"; +%typemap("javapackage") TradeListNym, TradeListNym *, TradeListNym & "com.wrapper.core.jni"; + +%typemap("javapackage") InitDefaultStorage "com.wrapper.core.jni"; +%typemap("javapackage") GetDefaultStorage "com.wrapper.core.jni"; +%typemap("javapackage") CreateStorageContext "com.wrapper.core.jni"; +%typemap("javapackage") CreateObject "com.wrapper.core.jni"; +%typemap("javapackage") Exists "com.wrapper.core.jni"; +%typemap("javapackage") StoreString "com.wrapper.core.jni"; +%typemap("javapackage") QueryString "com.wrapper.core.jni"; +%typemap("javapackage") StorePlainString "com.wrapper.core.jni"; +%typemap("javapackage") QueryPlainString "com.wrapper.core.jni"; +%typemap("javapackage") StoreObject "com.wrapper.core.jni"; +%typemap("javapackage") QueryObject "com.wrapper.core.jni"; +%typemap("javapackage") EraseValueByKey "com.wrapper.core.jni"; + +%typemap("javapackage") PackType "com.wrapper.core.jni"; +%typemap("javapackage") StorageType "com.wrapper.core.jni"; +%typemap("javapackage") StoredObjectType "com.wrapper.core.jni"; + + +// I found this GEM in the Berekeley DB code! +// +%define JAVA_TYPEMAP(_ctype, _jtype, _jnitype) +%typemap(jstype) _ctype #_jtype +%typemap(jtype) _ctype #_jtype +%typemap(jni) _ctype #_jnitype +%typemap(out) _ctype %{ $result = (_jnitype)$1; %} +%typemap(javain) _ctype "$javainput" +%typemap(javaout) _ctype { return $jnicall; } +%enddef + +// Uses the above macro. +// +JAVA_TYPEMAP(size_t, long, jlong) + +#endif +// --------------------------------------------------------------- + +/* + SAMPLE CODE: + + %typemap(jni) time_t "jlong" + %typemap(jtype) time_t "long" + %typemap(jstype) time_t "long" + + %typemap(out) time_t %{ $result = (jlong)$1; %} + %typemap(in) time_t "(time_t)$input" + + */ + +%feature("director") OTCallback; + + +//%typemap(javain) std::string & SBUF "$javainput" + + + +// The Callback definitions here, must appear BELOW the above SWIG directives that apply to them. +// The actual HEADER these definitions come from (OTStorage.h) must be included ABOVE THAT so that +// the SWIG directives will know what the hell we are talking about. Then those directives are actually +// applied here. +// Even below this section, you will see MORE SWIG directives, and then the definitions below those +// that THEY apply to. +// + +class OTCallback +{ +public: + OTCallback() {} + virtual ~OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); +}; + + +class OTCaller +{ +protected: + std::string m_strPW; + OTCallback *_callback; + +public: + OTCaller() : _callback(NULL) { } + ~OTCaller(); + + const char * GetPassword(); + + void delCallback(); + void setCallback(OTCallback *cb); + bool isCallbackSet(); + + void callOne(); + void callTwo(); +}; + +bool OT_API_Set_PasswordCallback(OTCaller & theCaller); + + + +//%apply int *INPUT {int *x, int *y}; +//%apply SWIGTYPE *INPUT {int *x, int *y}; + +%ignore clone; + +%ignore Storable::Create(StoredObjectType eType, PackType thePackType); + +%ignore PackedBuffer; + +%ignore OTPacker; + +%ignore PackerSubclass; + +%ignore Storage::Create(StorageType eStorageType, PackType ePackType); + +%ignore stat; + +%ignore std::istream; + +%ignore std::ostream; + +%ignore msgpack::sbuffer; + +%ignore std::map; + +%ignore stlplus::simple_ptr_clone; + +// ------------------------------------------- + +// So there aren't memory leaks from passing the objects back and forth. + +//%apply SWIGTYPE & DISOWN { SWIGTYPE & disownObject }; + +// // +//%apply SWIGTYPE * DISOWN {wxCaret* caret}; + +//DEFAULT REFERENCE HANDLING +//%typemap(in) SWIGTYPE & { ... default reference handling ...}; + +//%typemap(in) SWIGTYPE & DISOWN { SWIGTYPE & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { BitcoinAcct & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { BitcoinServer & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { RippleServer & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { LoomServer & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { ServerInfo & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { ContactNym & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { ContactAcct & disownObject }; +// +//%typemap(in) SWIGTYPE *DISOWN { Contact & disownObject }; + + + + // NOTE: these are supposed to be here, so that the Java garbage collector + // can clean up any memory it's finished with (from OT.) + // + // SWIG people: PLEASE update your documentation a bit. I've had to figure out + // this crap through trial-and-error. I thought SWIG was supposed to make things easier? + // If newobject is support, then delobject should be supported to. Especially for JAVA, + // of all languages!! Also, if I have the custom code handlers for Java, Python, etc then + // why have SWIG at all? + +%newobject CreateObject(StoredObjectType eType); + +%newobject QueryObject(StoredObjectType theObjectType, std::string strFolder, std::string oneStr="", std::string twoStr="", std::string threeStr=""); + +%newobject Storage::QueryObject(StoredObjectType theObjectType, std::string strFolder, std::string oneStr="", std::string twoStr="", std::string threeStr=""); + +%newobject Storage::CreateObject(StoredObjectType eType); + +%newobject CreateStorageContext(StorageType eStoreType, PackType ePackType=OTDB_DEFAULT_PACKER); + +// ---------------------------------------------------- + +// Use this inside the class definition itself, farther down below. +// (Wherever you want to have a list of elements inside a container.) +// +%define OT_SWIG_DECLARE_GET_ADD_REMOVE(name) + protected: + std::deque< stlplus::simple_ptr_clone > list_##name##s; +public: + size_t Get##name##Count(); + name * Get##name(size_t nIndex); + bool Remove##name(size_t nIndex##name); + bool Add##name(name & disownObject) +%enddef + +// Use this inside the class definition itself, farther down below. +// +%define DEFINE_OT_SWIG_DYNAMIC_CAST(CLASS_NAME_A) + CLASS_NAME_A * clone () const { return NULL; std::cerr << "********* THIS SHOULD NEVER HAPPEN!!!!! *****************" << std::endl;} + static CLASS_NAME_A * ot_dynamic_cast( Storable *pObject) { return dynamic_cast(pObject); } +// static const CLASS_NAME_A* ot_dynamic_cast(const Storable *pObject) { return dynamic_cast(pObject); } +%enddef + + + +// Put this: inside the %typemap (javacode) for the class that you want to have equals(). +// +/* +%define OT_SUPPORT_EQUALS +#ifdef SWIGJAVA +public boolean equals(Object obj) { + boolean equal = false; + if (obj instanceof $javaclassname) + equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr); // Look at this cast! I am using polymorphism, I can't cast like this.... + return equal; +} +public int hashCode() { + return (int)getPointer(); +} +#endif +%enddef +*/ + +// ------------------------------------------------------------------------------- + +// Put a list of these ABOVE the class definitions below. +// ALL objects, containers AND elements, are OT Storable objects. +// +// These two blocks enable the object to dynamic cast back +// to its true type, after factory construction. +// +// TODO: Fix this since "this" doesn't work at static level. +// (Anyway, doesn't it already have a pointer to its container?) +%define OT_BEFORE_STORABLE_TYPE(STORABLE_TYPE_A) +//%typemap(javaout) STORABLE_TYPE_A * ot_dynamic_cast { +// long cPtr = $jnicall; +// $javaclassname ret = null; +// if (cPtr != 0) { +// ret = new $javaclassname(cPtr, $owner); +// ret.addReference(this); +// } +// return ret; +//} +%enddef + +/*%exception STORABLE_TYPE::dynamic_cast(Storable * pObject) { // Java code + $action + if (!$result) { + jclass excep = jenv->FindClass("java/lang/ClassCastException"); + if (excep) { + jenv->ThrowNew(excep, "dynamic_cast exception"); + } + } +} +*/ + + +/* +%typemap(out) Storable * OT_SWIG_DYNAMIC_CAST { + STORABLE_TYPE *downcast = dynamic_cast($1); + *(STORABLE_TYPE **)&$result = downcast; +} + +%typemap(javaout) Storable * OT_DYNAMIC_CAST { + return new STORABLE_TYPE($jnicall, $owner); +} +*/ +// Todo: add mapping to Java destruct process, so that when the proxy +// goes out of scope, it is smart enough to remove itself from the reference list. +// Why is it being added in the first place? Because it is pointing to a certain +// object -- therefore according to Java it should have a reference to that object. +// Otherwise it will end up pointing to bad memory, when that object gets cleaned +// up by the garbage collector (who THOUGHT no one was referencing it.) +// + + + +// ------------------------------------------------------------------------------- + +// This code is now added in the classes themselves, since it's presumed useful. + +%define OT_AFTER_STORABLE_TYPE(STORABLE_TYPE_B) // C++ CODE +//%extend OTDB::STORABLE_TYPE_B { +// static STORABLE_TYPE_B * dynamic_cast(Storable * pObject) { // C++ CODE +// return dynamic_cast(pObject); +// } +//} +%enddef + + + + +// ------------------------------------------------------------------------------- + +// Put this: inside the %typemap(javacode) for the CONTAINER_TYPE (near the top of it.) +// +// Any container stores a list of references to its elements, +// where a reference is added each time you use the "Add" method, so +// that none of its elements are erased out from under it by the Java Garbage Collector. +// +%define OT_CONTAINER_TYPE_MEMBERS + private List elementList = new ArrayList(); +%enddef + +// ---------------------------- + + +// If a class is meant to be used as an element inside a container, then use this +// macro to create the necessary typemap for that class's GET method. +// +// Put it: With the rest of the TYPEMAP for the class in question. (Above the class +// definition itself, and above the container typemaps.) +// +// Swig uses it: Any container that defines a get method for that class based on +// the signature below: THE_ELEMENT_TYPE * Get##THE_ELEMENT_TYPE +// +%define OT_IS_ELEMENT_TYPE(THE_ELEMENT_TYPE_A) +// When the CONTAINER_TYPE's "Get" function is called, this will add a Java +// reference to prevent premature garbage collection and resulting use +// of dangling C++ pointer. Intended for methods that return pointers or +// references to a member variable. +%typemap(javaout,noblock=1) THE_ELEMENT_TYPE_A * Get##THE_ELEMENT_TYPE_A { + long cPtr = $jnicall; + $javaclassname ret = null; + if (cPtr != 0) { + ret = new $javaclassname(cPtr, $owner); + ret.addReference(this); + } + return ret; +} +// ---- +// Swig uses this in every CONTAINER_TYPE's "Add" function, which all +// have a parameter profile matching this typemap. +// +%typemap(javain,noblock=1) THE_ELEMENT_TYPE_A & disownObject { getCPtrAddRef##THE_ELEMENT_TYPE_A($javainput) } + +// This is used by CONTAINER_TYPE's "Remove" function. Do not change the +// parameter name nIndex##name or this typemap will stop working... +%typemap(javain,noblock=1) size_t nIndex##THE_ELEMENT_TYPE_A { removeRef##THE_ELEMENT_TYPE_A($javainput) } + +%enddef +// ---------------------------------------------------------------------------------- + + + + +// The STORABLE_TYPE (BitcoinAcct, say) keeps a reference to its CONTAINER_TYPE (WalletData). +// +// Put it: inside the %typemap(javacode) for the ELEMENT_TYPE, for EACH possible container type. +// +%define OT_CAN_BE_CONTAINED_BY(CONTAINER_TYPE_A) + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private CONTAINER_TYPE_A containerRef##CONTAINER_TYPE_A; + // ---------------- + protected void addReference(CONTAINER_TYPE_A theContainer) { // This is Java code + containerRef##CONTAINER_TYPE_A = theContainer; + } + // ---------------- +%enddef + +// ------------------------------------------------------------------------------- + +// You might wonder, why did I use THE_ELEMENT_TYPE_A and then THE_ELEMENT_TYPE_B, +// etc? Because I didn't want to risk one define somehow overlapping another and +// substituting the wrong name because they both happened to use the same token +// for substitution. Therefore I made sure they all had different token naming. +// (FYI.) + + +// The CONTAINER_TYPE (WalletData) uses this for *EACH* Get/Add/Remove item within. +// So this macro appears multiple times, if there are multiple deques. (Like a contact +// has nyms AND accounts inside of it.) +// +// Put it: inside the %typemap(javacode) for the CONTAINER_TYPE, for EACH ELEMENT_TYPE. +// +// Ensure that the GC doesn't collect any THE_ELEMENT_TYPE set from Java +// as the underlying C++ class stores a shallow copy + +// Altered the SWIG example so that we store a list of these references, instead +// of only the latest one. (None of them should go out of scope until this object does.) + +%define OT_ADD_ELEMENT(THE_ELEMENT_TYPE_B) // THIS BLOCK CONTAINS JAVA CODE. +private long removeRef##THE_ELEMENT_TYPE_B(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + THE_ELEMENT_TYPE_B refActualElement = Get##THE_ELEMENT_TYPE_B(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof THE_ELEMENT_TYPE_B)) + continue; + + THE_ELEMENT_TYPE_B tempRef = (THE_ELEMENT_TYPE_B)(theObject); + + if ((THE_ELEMENT_TYPE_B.getCPtr(tempRef) == THE_ELEMENT_TYPE_B.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRef##THE_ELEMENT_TYPE_B(THE_ELEMENT_TYPE_B element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof THE_ELEMENT_TYPE_B)) + continue; + + THE_ELEMENT_TYPE_B tempRef = (THE_ELEMENT_TYPE_B)(theObject); + + if ((THE_ELEMENT_TYPE_B.getCPtr(tempRef) == THE_ELEMENT_TYPE_B.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + THE_ELEMENT_TYPE_B tempLocalRef = element; + elementList.add(tempLocalRef); + return THE_ELEMENT_TYPE_B.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +%enddef +// hope I can just change the function name to customize it to type. + +// ---------------------------------------- + + + + + +#ifdef SWIGJAVA +// +// ------------------------------------------------------------ + +OT_BEFORE_STORABLE_TYPE(OTDB::OTDBString) +OT_IS_ELEMENT_TYPE(OTDBString) + +%typemap(javacode,noblock=1) OTDB::OTDBString { + // ------------------------ +} + +// ******************************* + + +OT_BEFORE_STORABLE_TYPE(OTDB::Blob) +OT_IS_ELEMENT_TYPE(Blob) + +%typemap(javacode,noblock=1) OTDB::Blob { + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::StringMap) +OT_IS_ELEMENT_TYPE(StringMap) + +%typemap(javacode,noblock=1) OTDB::StringMap { + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::BitcoinAcct) +OT_IS_ELEMENT_TYPE(BitcoinAcct) + +%typemap(javacode,noblock=1) OTDB::BitcoinAcct { + OT_CAN_BE_CONTAINED_BY(WalletData) + // ------------------------ +} + +// ******************************* + + +OT_BEFORE_STORABLE_TYPE(OTDB::ServerInfo) +OT_IS_ELEMENT_TYPE(ServerInfo) + +%typemap(javacode,noblock=1) OTDB::ServerInfo { + OT_CAN_BE_CONTAINED_BY(ContactNym) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::BitcoinServer) +OT_IS_ELEMENT_TYPE(BitcoinServer) + +%typemap(javacode,noblock=1) OTDB::BitcoinServer { + OT_CAN_BE_CONTAINED_BY(WalletData) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::RippleServer) +OT_IS_ELEMENT_TYPE(RippleServer) + +%typemap(javacode,noblock=1) OTDB::RippleServer { + OT_CAN_BE_CONTAINED_BY(WalletData) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::LoomServer) +OT_IS_ELEMENT_TYPE(LoomServer) + +%typemap(javacode,noblock=1) OTDB::LoomServer { + OT_CAN_BE_CONTAINED_BY(WalletData) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::ContactNym) +OT_IS_ELEMENT_TYPE(ContactNym) + +%typemap(javacode,noblock=1) OTDB::ContactNym { + OT_CAN_BE_CONTAINED_BY(Contact) + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(ServerInfo) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::ContactAcct) +OT_IS_ELEMENT_TYPE(ContactAcct) + +%typemap(javacode,noblock=1) OTDB::ContactAcct { + OT_CAN_BE_CONTAINED_BY(Contact) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::WalletData) +OT_IS_ELEMENT_TYPE(WalletData) + +%typemap(javacode,noblock=1) OTDB::WalletData { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(BitcoinServer) + OT_ADD_ELEMENT(BitcoinAcct) + OT_ADD_ELEMENT(RippleServer) + OT_ADD_ELEMENT(LoomServer) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::Contact) +OT_IS_ELEMENT_TYPE(Contact) + +%typemap(javacode,noblock=1) OTDB::Contact { + OT_CAN_BE_CONTAINED_BY(AddressBook) + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(ContactNym) + OT_ADD_ELEMENT(ContactAcct) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::AddressBook) +OT_IS_ELEMENT_TYPE(AddressBook) + +%typemap(javacode,noblock=1) OTDB::AddressBook { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(Contact) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::MarketData) +OT_IS_ELEMENT_TYPE(MarketData) + +%typemap(javacode,noblock=1) OTDB::MarketData { + OT_CAN_BE_CONTAINED_BY(MarketList) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::MarketList) +OT_IS_ELEMENT_TYPE(MarketList) + +%typemap(javacode,noblock=1) OTDB::MarketList { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(MarketData) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::BidData) +OT_IS_ELEMENT_TYPE(BidData) + +%typemap(javacode,noblock=1) OTDB::BidData { + OT_CAN_BE_CONTAINED_BY(OfferListMarket) + // ------------------------ +} + +// ******************************* + + +OT_BEFORE_STORABLE_TYPE(OTDB::AskData) +OT_IS_ELEMENT_TYPE(AskData) + +%typemap(javacode,noblock=1) OTDB::AskData { + OT_CAN_BE_CONTAINED_BY(OfferListMarket) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::OfferListMarket) +OT_IS_ELEMENT_TYPE(OfferListMarket) + +%typemap(javacode,noblock=1) OTDB::OfferListMarket { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(BidData) + OT_ADD_ELEMENT(AskData) +} + + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::TradeDataMarket) +OT_IS_ELEMENT_TYPE(TradeDataMarket) + +%typemap(javacode,noblock=1) OTDB::TradeDataMarket { + OT_CAN_BE_CONTAINED_BY(TradeListMarket) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::TradeListMarket) +OT_IS_ELEMENT_TYPE(TradeListMarket) + +%typemap(javacode,noblock=1) OTDB::TradeListMarket { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(TradeDataMarket) +} + + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::OfferDataNym) +OT_IS_ELEMENT_TYPE(OfferDataNym) + +%typemap(javacode,noblock=1) OTDB::OfferDataNym { + OT_CAN_BE_CONTAINED_BY(OfferListNym) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::OfferListNym) +OT_IS_ELEMENT_TYPE(OfferListNym) + +%typemap(javacode,noblock=1) OTDB::OfferListNym { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(OfferDataNym) +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::TradeDataNym) +OT_IS_ELEMENT_TYPE(TradeDataNym) + +%typemap(javacode,noblock=1) OTDB::TradeDataNym { + OT_CAN_BE_CONTAINED_BY(TradeListNym) + // ------------------------ +} + +// ******************************* + +OT_BEFORE_STORABLE_TYPE(OTDB::TradeListNym) +OT_IS_ELEMENT_TYPE(TradeListNym) + +%typemap(javacode,noblock=1) OTDB::TradeListNym { + // ------------------------ + OT_CONTAINER_TYPE_MEMBERS + OT_ADD_ELEMENT(TradeDataNym) +} + + + +// ------------------------------------------------------------ +#endif + + + + + + +// ------------------------------------------------ + + +/* Parse the header file to generate wrappers */ +%include "OTAPI_funcdef.h" + + + +namespace OTDB { + + + + enum PackType // PACKING TYPE + { + PACK_MESSAGE_PACK = 0, // Using MessagePack as packer. + PACK_PROTOCOL_BUFFERS, // Using Google Protocol Buffers as packer. + PACK_TYPE_ERROR // (Should never be.) + }; + + enum StorageType // STORAGE TYPE + { + STORE_FILESYSTEM = 0, // Filesystem +// STORE_COUCH_DB, // Couch DB (not yet supported) + STORE_TYPE_SUBCLASS // (Subclass provided by API client via SWIG.) + }; + + enum StoredObjectType + { + STORED_OBJ_STRING=0, // Just a string. + STORED_OBJ_BLOB, // Used for storing binary data. Bytes of arbitrary length. + STORED_OBJ_STRING_MAP, // A StringMap is a list of Key/Value pairs, useful for storing nearly anything. + STORED_OBJ_WALLET_DATA, // The GUI wallet's stored data + STORED_OBJ_BITCOIN_ACCT, // The GUI wallet's stored data about a Bitcoin acct + STORED_OBJ_BITCOIN_SERVER, // The GUI wallet's stored data about a Bitcoin RPC port. + STORED_OBJ_RIPPLE_SERVER, // The GUI wallet's stored data about a Ripple server. + STORED_OBJ_LOOM_SERVER, // The GUI wallet's stored data about a Loom server. + STORED_OBJ_SERVER_INFO, // A Nym has a list of these. + STORED_OBJ_CONTACT_NYM, // This is a Nym record inside a contact of your address book. + STORED_OBJ_CONTACT_ACCT, // This is an account record inside a contact of your address book. + STORED_OBJ_CONTACT, // Your address book has a list of these. + STORED_OBJ_ADDRESS_BOOK, // Your address book. + STORED_OBJ_MARKET_DATA, // The description data for any given Market ID. + STORED_OBJ_MARKET_LIST, // A list of MarketDatas. + STORED_OBJ_BID_DATA, // Offer details (doesn't contain private details) + STORED_OBJ_ASK_DATA, // Offer details (doesn't contain private details) + STORED_OBJ_OFFER_LIST_MARKET, // A list of offer details, for a specific market. + STORED_OBJ_TRADE_DATA_MARKET, // Trade details (doesn't contain private data) + STORED_OBJ_TRADE_LIST_MARKET, // A list of trade details, for a specific market. + STORED_OBJ_OFFER_DATA_NYM, // Private offer details for a particular Nym and Offer. + STORED_OBJ_OFFER_LIST_NYM, // A list of private offer details for a particular Nym. + STORED_OBJ_TRADE_DATA_NYM, // Private trade details for a particular Nym and Trade. + STORED_OBJ_TRADE_LIST_NYM, // A list of private trade details for a particular Nym and Offer. + STORED_OBJ_ERROR // (Should never be.) + }; + + // ---------------------------------------------------- + + // Since Storable is the common base for the "pure data" hierarchy, + // IStorable serves as the common base for the Packing infrastructure. + // There are subclasses for the various packers (IStorableMsgpack, IStorablePB, etc) + // Although external users of this will only see, for example, a "WalletData" object, + // They are actually using, behind the scenes, a WalletDataPB object, which subclasses + // WalletData, AND implements IStorablePB. + // The API user doesn't care about all this -- it happens behind the scenes automatically + // based on whatever storage/packer system is chosen. He just knows that he wants to + // Store or Query a WalletData, and no more. + + class IStorable; // This forward declaration is all we see of this implementation detail + // ------------------------------- + + class Storable // <===== Storable is the actual interface that coders using the OT API will care about. + { + friend class Storage; // for instantiation of storable objects by their storage context. + + protected: + Storable() { m_Type = "Storable"; } + + std::string m_Type; + public: + virtual ~Storable() {} + + // %ignore spam(unsigned short); API users don't need this function, it's for internal purposes. + static Storable * Create(StoredObjectType eType, PackType thePackType); + + DEFINE_OT_SWIG_DYNAMIC_CAST(Storable) + }; + + // ------------------------------------------------------- + + class Storage + { + private: + OTPacker * m_pPacker; + + protected: + Storage() : m_pPacker(NULL) {} + + Storage(const Storage & rhs) : m_pPacker(NULL) { } // We don't want to copy the pointer. Let it create its own. + + // This is called once, in the factory. + void SetPacker(OTPacker & thePacker) { OT_ASSERT(NULL == m_pPacker); m_pPacker = &thePacker; } + + // ******************************************************** + // OVERRIDABLES + // + // If you wish to MAKE YOUR OWN subclass of Storage (to provide your own storage system) + // then just subclass OTDB::Storage, and override the below methods. For an example of how + // it's done, see StorageFS (filesystem), which is included in OTStorage.cpp and .h + // + // NOTE: This should be possible even in other languages! I'm using SWIG directors, meaning + // that you can make a Java subclass of OTDB::Storage, or a Python subclass, etc. This isn't + // possible with the other classes in OTStorage (yet), which must be subclassed in C++. But + // for this class, it is. + // + virtual bool onStorePackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onQueryPackedBuffer(PackedBuffer & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onStorePlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onQueryPlainString(std::string & theBuffer, std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + virtual bool onEraseValueByKey(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr="")=0; + + + // ------------------------------------- + + public: + // Use GetPacker() to access the Packer, throughout duration of this Storage object. + // If it doesn't exist yet, this function will create it on the first call. (The + // parameter allows you the choose what type will be created, other than default.) + // This way, whenever using an OT Storage, you KNOW the packer is always the right + // one, and that you don't have to fiddle with it at all. You can also therefore use + // it for creating instances of various Storables and PackedBuffers, and knowing + // that the right types will be instantiated, with the buffer being the appropriate + // subclass for the packer. + // + OTPacker * GetPacker(PackType ePackType=OTDB_DEFAULT_PACKER); + + virtual bool Init(std::string oneStr="", std::string twoStr="", std::string threeStr="", + std::string fourStr="", std::string fiveStr="", std::string sixStr="")=0; + + // ----------------------------------------- + // See if the file is there. + virtual bool Exists(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr="")=0; + + // ******************************************************** + + virtual ~Storage() { if (NULL != m_pPacker) delete m_pPacker; m_pPacker = NULL; } + + // ----------------------------------------- + // Store/Retrieve a string. + + bool StoreString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + bool StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryPlainString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Store/Retrieve an object. (Storable.) + + bool StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // Use %newobject Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Erase any value based on its location. + + bool EraseValueByKey(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // -------------------------- + // Note: + // Make sure to use: %newobject Factory::createObj(); IN OTAPI.i file! + // + // That way, Java garbage cleanup will handle object after this. + // (Instead of leaking because it thinks C++ will clean it up.) + // + // Factory for Storable objects. %newobject Factory::createObj(); + Storable * CreateObject(StoredObjectType eType); + + // -------------------------- + + // Factory for Storage itself. %ignore this in OTAPI.i (It's accessed through + // a namespace-level function.) + // + static Storage * Create(StorageType eStorageType, PackType ePackType); // FACTORY + + StorageType GetType() const; + }; + + + // ******************************************************************** + // + // OTDB Namespace PUBLIC INTERFACE + // + // + + bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, + std::string oneStr="", std::string twoStr="", std::string threeStr="", + std::string fourStr="", std::string fiveStr="", std::string sixStr=""); + + // Default Storage instance: + Storage * GetDefaultStorage(); + + // %newobject Factory::createObj(); + Storage * CreateStorageContext(StorageType eStoreType, PackType ePackType=OTDB_DEFAULT_PACKER); + + Storable * CreateObject(StoredObjectType eType); + + // bool bSuccess = StoreString(strInbox, "inbox", "lkjsdf908w345ljkvd"); + // bool bSuccess = StoreString(strMint, "mints", SERVER_ID, ASSET_ID); + // bool bSuccess = StoreString(strPurse, "purse", SERVER_ID, USER_ID, ASSET_ID); + + // BELOW FUNCTIONS will use the DEFAULT Storage context for the OTDB Namespace + // (If you don't want to specifically create and manage a context, then you just + // use the default context, which the rest of the OT library will also use.) + // + // -------- + // Let's see if the file is there... + // + bool Exists(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // -------- + // Store/Retrieve a string. (Packing it first.) + // + bool StoreString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // --------------------------------- + // Store/Retrieve a plain string (no packing--the plain string goes directly to storage.) + // Many existing OT datafiles are this way, so this function is used a lot in the OT lib. + // + bool StorePlainString(std::string strContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + std::string QueryPlainString(std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // -------- + // Store/Retrieve an object. (Storable.) + // + bool StoreObject(Storable & theContents, std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // Use %newobject Storage::Query(); + Storable * QueryObject(StoredObjectType theObjectType, + std::string strFolder, std::string oneStr="", + std::string twoStr="", std::string threeStr=""); + + // ----------------------------------------- + // Erase any value based on its location. + + bool EraseValueByKey(std::string strFolder, + std::string oneStr="", std::string twoStr="", std::string threeStr=""); + + // ------------------------------------------------ + + + + + + class OTDBString : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + OTDBString() : Storable() { m_Type = "OTDBString"; } + OTDBString(const std::string& rhs) : Storable(), m_string(rhs) { m_Type = "OTDBString"; } + + public: + virtual ~OTDBString() { } + + std::string m_string; + + DEFINE_OT_SWIG_DYNAMIC_CAST(OTDBString) + }; + + // ------------------------------------------------ + + class Blob : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through the factory. + protected: + Blob() : Storable() { m_Type = "Blob"; } + + public: + virtual ~Blob() { } + + std::vector m_memBuffer; // Where the actual binary data is stored, before packing. + + DEFINE_OT_SWIG_DYNAMIC_CAST(Blob) + }; + + // ------------------------------------------------ + + class StringMap : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + StringMap() : Storable() { m_Type = "StringMap"; } + + public: + virtual ~StringMap() { } + + std::map the_map; // all strings, key/value pairs. + + void SetValue(const std::string& strKey, const std::string& strValue) + { the_map[strKey] = strValue; } + + std::string GetValue(const std::string& strKey) + { std::string ret_val(""); std::map::iterator ii = the_map.find(strKey); + if (ii != the_map.end()) ret_val = (*ii).second; return ret_val; } + + DEFINE_OT_SWIG_DYNAMIC_CAST(StringMap) + }; + + + // ------------------------------------------------ + + class Displayable : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Displayable() : Storable() { m_Type = "Displayable"; } + + public: + virtual ~Displayable() { } + + std::string gui_label; // The label that appears in the GUI + + DEFINE_OT_SWIG_DYNAMIC_CAST(Displayable) + }; + + // ************************************************* + + class MarketData : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + MarketData() : Displayable(), + scale("0"), total_assets("0"), number_bids("0"), last_sale_price("0"), + current_bid("0"), current_ask("0"), + volume_trades("0"), volume_assets("0"), volume_currency("0"), + recent_highest_bid("0"), recent_lowest_ask("0") + { m_Type = "MarketData"; } + + public: + virtual ~MarketData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_id; + std::string market_id; + + std::string asset_type_id; + std::string currency_type_id; + + std::string scale; // the Market scale. (A trade in any particular asset is measured in X units of SCALE.) + // IOW, if the scale is 5000 on the gold market, that means "3 units" is 15000 gold + + std::string total_assets; // total amount of assets available on market for purchase. + + std::string number_bids; // number of bids that are currently on the market. + std::string number_asks; // number of asks that are currently on the market. + + std::string last_sale_price; // The price at which the most recent trade occurred on this market. + std::string current_bid; // The highest bid currently on the market. + std::string current_ask; // The lowest ask price currently available on the market. + + std::string volume_trades; // 24-hour period, number of trades. + + std::string volume_assets; // 24-hour volume, amount of assets traded. + std::string volume_currency; // 24-hour volume, amount of currency paid for assets traded. + + std::string recent_highest_bid; // in a 24hour period, the highest bid to hit the market. + std::string recent_lowest_ask; // in a 24hour period, the lowest ask to hit the market. + + DEFINE_OT_SWIG_DYNAMIC_CAST(MarketData) + }; + + // ------------------------------------------------------ + + class MarketList : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + MarketList() : Storable() { m_Type = "MarketList"; } + + public: + virtual ~MarketList() {} + + OT_SWIG_DECLARE_GET_ADD_REMOVE(MarketData); + + DEFINE_OT_SWIG_DYNAMIC_CAST(MarketList) + }; + + + // ****************************************************** + + class OfferDataMarket : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferDataMarket() : Displayable(), + transaction_id("0"), price_per_scale("1"), available_assets("0"), minimum_increment("1") + { m_Type = "OfferDataMarket"; } + + public: + virtual ~OfferDataMarket() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; + std::string price_per_scale; + + // uint64_t total_assets; + // uint64_t finished_so_far; + std::string available_assets; + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + std::string minimum_increment; + + DEFINE_OT_SWIG_DYNAMIC_CAST(OfferDataMarket) + }; + + // ------------------------------------------------------ + + class BidData : public OfferDataMarket + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BidData() : OfferDataMarket() + { m_Type = "BidData"; } + + public: + virtual ~BidData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using OfferDataMarket::transaction_id; + using OfferDataMarket::price_per_scale; + using OfferDataMarket::available_assets; + using OfferDataMarket::minimum_increment; + + DEFINE_OT_SWIG_DYNAMIC_CAST(BidData) + }; + + // ------------------------------------------------------ + + class AskData : public OfferDataMarket + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + AskData() : OfferDataMarket() + { m_Type = "AskData"; } + + public: + virtual ~AskData() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using OfferDataMarket::transaction_id; + using OfferDataMarket::price_per_scale; + using OfferDataMarket::available_assets; + using OfferDataMarket::minimum_increment; + + DEFINE_OT_SWIG_DYNAMIC_CAST(AskData) + }; + + // ------------------------------------------------------ + + class OfferListMarket : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferListMarket() : Storable() { m_Type = "OfferListMarket"; } + + public: + virtual ~OfferListMarket() {} + + OT_SWIG_DECLARE_GET_ADD_REMOVE(BidData); + OT_SWIG_DECLARE_GET_ADD_REMOVE(AskData); + + DEFINE_OT_SWIG_DYNAMIC_CAST(OfferListMarket) + }; + + // ****************************************************** + + class TradeDataMarket : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeDataMarket() : Displayable(), + transaction_id("0"), date("0"), + price("0"), amount_sold("0") + { m_Type = "TradeDataMarket"; } + + public: + virtual ~TradeDataMarket() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; // (transaction number for this trade.) + std::string date; // (The date of this trade's execution) + std::string price; // (The price this trade executed at.) + std::string amount_sold; // (Amount of asset sold for that price.) + + DEFINE_OT_SWIG_DYNAMIC_CAST(TradeDataMarket) + }; + + // ------------------------------------------------------ + + class TradeListMarket : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeListMarket() : Storable() { m_Type = "TradeListMarket"; } + + public: + virtual ~TradeListMarket() {} + + OT_SWIG_DECLARE_GET_ADD_REMOVE(TradeDataMarket); + + DEFINE_OT_SWIG_DYNAMIC_CAST(TradeListMarket) + }; + + // ****************************************************** + + class OfferDataNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferDataNym() : Displayable(), + valid_from("0"), valid_to("0"), + selling(false), scale("1"), price_per_scale("1"), + transaction_id("0"), + total_assets("1"), finished_so_far("0"), + minimum_increment("1"), stop_price("0") + { m_Type = "OfferDataNym"; } + + public: + virtual ~OfferDataNym() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string valid_from; + std::string valid_to; + + std::string server_id; + std::string asset_type_id; // the asset type on offer. + std::string asset_acct_id; // the account where the asset is. + std::string currency_type_id; // the currency being used to purchase the asset. + std::string currency_acct_id; // the account where currency is. + + bool selling; // true for ask, false for bid. + + std::string scale; // 1oz market? 100oz market? 10,000oz market? This determines size and granularity. + std::string price_per_scale; + + std::string transaction_id; + + std::string total_assets; + std::string finished_so_far; + + + // Each sale or purchase against (total_assets - finished_so_far) must be in minimum increments. + // Minimum Increment must be evenly divisible by scale. + // (This effectively becomes a "FILL OR KILL" order if set to the same value as total_assets. Also, MUST be 1 + // or greater. CANNOT be zero. Enforce this at class level. You cannot sell something in minimum increments of 0.) + + std::string minimum_increment; + + std::string stop_sign; // If this is a stop order, this will contain '<' or '>'. + std::string stop_price; // The price at which the stop order activates (less than X or greater than X, based on sign.) + + DEFINE_OT_SWIG_DYNAMIC_CAST(OfferDataNym) + }; + + // ------------------------------------------------------ + + class OfferListNym : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + OfferListNym() : Storable() { m_Type = "OfferListNym"; } + + public: + virtual ~OfferListNym() {} + + OT_SWIG_DECLARE_GET_ADD_REMOVE(OfferDataNym); + + DEFINE_OT_SWIG_DYNAMIC_CAST(OfferListNym) + }; + + // ****************************************************** + + class TradeDataNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeDataNym() : Displayable(), + transaction_id("0"), + completed_count("0"), date("0"), + price("0"), amount_sold("0") + { m_Type = "TradeDataNym"; } + + public: + virtual ~TradeDataNym() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string transaction_id; // (transaction number for this trade.) + + std::string completed_count; // (How many trades have processed for the associated offer? We keep count for each trade.) + std::string date; // (The date of this trade's execution) + std::string price; // (The price this trade executed at.) + std::string amount_sold; // (Amount of asset sold for that price.) + + DEFINE_OT_SWIG_DYNAMIC_CAST(TradeDataNym) + }; + + // ------------------------------------------------------ + + class TradeListNym : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + TradeListNym() : Storable() { m_Type = "TradeListNym"; } + + public: + virtual ~TradeListNym() {} + + OT_SWIG_DECLARE_GET_ADD_REMOVE(TradeDataNym); + + DEFINE_OT_SWIG_DYNAMIC_CAST(TradeListNym) + }; + + // ************************************************* + + // ACCOUNT (GUI local storage about my own accounts, in my wallet.) + + class Acct : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Acct() : Displayable() { m_Type = "Acct"; } + + public: + virtual ~Acct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string acct_id; + std::string server_id; + + DEFINE_OT_SWIG_DYNAMIC_CAST(Acct) + }; + + // ---------------------------- + + class BitcoinAcct : public Acct + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BitcoinAcct() : Acct() { m_Type = "BitcoinAcct"; } + + public: + virtual ~BitcoinAcct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using Acct::acct_id; + using Acct::server_id; + + std::string bitcoin_acct_name; + + DEFINE_OT_SWIG_DYNAMIC_CAST(BitcoinAcct) + }; + + // ************************************************** + + // SERVER (GUI local storage about servers.) + + class ServerInfo : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ServerInfo() : Displayable() { m_Type = "ServerInfo"; } + + public: + virtual ~ServerInfo() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_id; + std::string server_type; + + DEFINE_OT_SWIG_DYNAMIC_CAST(ServerInfo) + }; + + // ---------------------------- + + class Server : public ServerInfo + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Server() : ServerInfo() { m_Type = "Server"; } + + public: + virtual ~Server() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + std::string server_host; + std::string server_port; + + DEFINE_OT_SWIG_DYNAMIC_CAST(Server) + }; + + // ---------------------------- + + class BitcoinServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + BitcoinServer() : Server() { m_Type = "BitcoinServer"; } + + public: + virtual ~BitcoinServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string bitcoin_username; + std::string bitcoin_password; + + DEFINE_OT_SWIG_DYNAMIC_CAST(BitcoinServer) + }; + + // ---------------------------- + + class RippleServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + RippleServer() : Server() { m_Type = "RippleServer"; } + + public: + virtual ~RippleServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string ripple_username; + std::string ripple_password; + + std::string namefield_id; + std::string passfield_id; + + DEFINE_OT_SWIG_DYNAMIC_CAST(RippleServer) + }; + + // ---------------------------- + + class LoomServer : public Server + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + LoomServer() : Server() { m_Type = "LoomServer"; } + + public: + virtual ~LoomServer() { } + + using Displayable::gui_label; // The label that appears in the GUI + + using ServerInfo::server_id; // in base class + using ServerInfo::server_type; // in base class + + using Server::server_host; // in base class + using Server::server_port; // in base class + + std::string loom_username; + + std::string namefield_id; + + DEFINE_OT_SWIG_DYNAMIC_CAST(LoomServer) + }; + + // ---------------------------- + + class ContactNym : public Displayable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ContactNym() : Displayable() { m_Type = "ContactNym"; } + + public: + virtual ~ContactNym(); + + using Displayable::gui_label; // The label that appears in the GUI + + std::string nym_type; + std::string nym_id; + std::string public_key; + std::string memo; + + OT_SWIG_DECLARE_GET_ADD_REMOVE(ServerInfo); + + DEFINE_OT_SWIG_DYNAMIC_CAST(ContactNym) + }; + + + // ------------------------------------------------ + + class WalletData : public Storable + { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + WalletData() : Storable() { m_Type = "WalletData"; } + + public: + virtual ~WalletData() { } + + // List of Bitcoin servers + // List of Bitcoin accounts + // Loom, etc. + + OT_SWIG_DECLARE_GET_ADD_REMOVE(BitcoinServer); + OT_SWIG_DECLARE_GET_ADD_REMOVE(BitcoinAcct); + OT_SWIG_DECLARE_GET_ADD_REMOVE(RippleServer); + OT_SWIG_DECLARE_GET_ADD_REMOVE(LoomServer); + + DEFINE_OT_SWIG_DYNAMIC_CAST(WalletData) + }; + + // ---------------------------- + + class ContactAcct : public Displayable { + + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + ContactAcct() : Displayable() { m_Type = "ContactAcct"; } + + public: + virtual ~ContactAcct() { } + + using Displayable::gui_label; // The label that appears in the GUI + + std::string server_type; + std::string server_id; + std::string asset_type_id; + std::string acct_id; + std::string nym_id; + std::string memo; + std::string public_key; + + DEFINE_OT_SWIG_DYNAMIC_CAST(ContactAcct) + }; + + // ---------------------------- + + + class Contact : public Displayable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + Contact() : Displayable() { m_Type = "Contact"; } + + public: + virtual ~Contact(); + + using Displayable::gui_label; // The label that appears in the GUI + + std::string contact_id; + std::string email; + std::string memo; + std::string public_key; + + OT_SWIG_DECLARE_GET_ADD_REMOVE(ContactNym); + OT_SWIG_DECLARE_GET_ADD_REMOVE(ContactAcct); + + DEFINE_OT_SWIG_DYNAMIC_CAST(Contact) + }; + + // ---------------------------- + + class AddressBook : public Storable { + // You never actually get an instance of this, only its subclasses. + // Therefore, I don't allow you to access the constructor except through factory. + protected: + AddressBook() : Storable() { m_Type = "AddressBook"; } + + public: + virtual ~AddressBook(); + + OT_SWIG_DECLARE_GET_ADD_REMOVE(Contact); + + DEFINE_OT_SWIG_DYNAMIC_CAST(AddressBook) + }; + + // ---------------------------- + +} // namespace OTDB + + + + + +%feature("director") OTDB::Storage; + + + + +%inline %{ + using namespace OTDB; + %} + + + +// These have to go AFTER the class definitions. +// +/* UNUSED + +OT_AFTER_STORABLE_TYPE(OTDBString) +OT_AFTER_STORABLE_TYPE(Blob) +OT_AFTER_STORABLE_TYPE(StringMap) +OT_AFTER_STORABLE_TYPE(BitcoinAcct) + +OT_AFTER_STORABLE_TYPE(ServerInfo) + +OT_AFTER_STORABLE_TYPE(BitcoinServer) +OT_AFTER_STORABLE_TYPE(RippleServer) +OT_AFTER_STORABLE_TYPE(LoomServer) +OT_AFTER_STORABLE_TYPE(ContactNym) +OT_AFTER_STORABLE_TYPE(ContactAcct) +OT_AFTER_STORABLE_TYPE(WalletData) + +OT_AFTER_STORABLE_TYPE(Contact) + +OT_AFTER_STORABLE_TYPE(AddressBook) +*/ + + + + + diff --git a/testwallet/OTAPI_csharp.cpp b/testwallet/OTAPI_csharp.cpp new file mode 100644 index 000000000..4c38754cd --- /dev/null +++ b/testwallet/OTAPI_csharp.cpp @@ -0,0 +1,10106 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGCSHARP +#define SWIG_DIRECTORS + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + + +#include +#include +#include + + +/* Support for throwing C# exceptions from C/C++. There are two types: + * Exceptions that take a message and ArgumentExceptions that take a message and a parameter name. */ +typedef enum { + SWIG_CSharpApplicationException, + SWIG_CSharpArithmeticException, + SWIG_CSharpDivideByZeroException, + SWIG_CSharpIndexOutOfRangeException, + SWIG_CSharpInvalidCastException, + SWIG_CSharpInvalidOperationException, + SWIG_CSharpIOException, + SWIG_CSharpNullReferenceException, + SWIG_CSharpOutOfMemoryException, + SWIG_CSharpOverflowException, + SWIG_CSharpSystemException +} SWIG_CSharpExceptionCodes; + +typedef enum { + SWIG_CSharpArgumentException, + SWIG_CSharpArgumentNullException, + SWIG_CSharpArgumentOutOfRangeException +} SWIG_CSharpExceptionArgumentCodes; + +typedef void (SWIGSTDCALL* SWIG_CSharpExceptionCallback_t)(const char *); +typedef void (SWIGSTDCALL* SWIG_CSharpExceptionArgumentCallback_t)(const char *, const char *); + +typedef struct { + SWIG_CSharpExceptionCodes code; + SWIG_CSharpExceptionCallback_t callback; +} SWIG_CSharpException_t; + +typedef struct { + SWIG_CSharpExceptionArgumentCodes code; + SWIG_CSharpExceptionArgumentCallback_t callback; +} SWIG_CSharpExceptionArgument_t; + +static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { + { SWIG_CSharpApplicationException, NULL }, + { SWIG_CSharpArithmeticException, NULL }, + { SWIG_CSharpDivideByZeroException, NULL }, + { SWIG_CSharpIndexOutOfRangeException, NULL }, + { SWIG_CSharpInvalidCastException, NULL }, + { SWIG_CSharpInvalidOperationException, NULL }, + { SWIG_CSharpIOException, NULL }, + { SWIG_CSharpNullReferenceException, NULL }, + { SWIG_CSharpOutOfMemoryException, NULL }, + { SWIG_CSharpOverflowException, NULL }, + { SWIG_CSharpSystemException, NULL } +}; + +static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { + { SWIG_CSharpArgumentException, NULL }, + { SWIG_CSharpArgumentNullException, NULL }, + { SWIG_CSharpArgumentOutOfRangeException, NULL } +}; + +static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { + SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; + if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { + callback = SWIG_csharp_exceptions[code].callback; + } + callback(msg); +} + +static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code, const char *msg, const char *param_name) { + SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; + if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { + callback = SWIG_csharp_exceptions_argument[code].callback; + } + callback(msg, param_name); +} + + +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionCallbacks_otapi( + SWIG_CSharpExceptionCallback_t applicationCallback, + SWIG_CSharpExceptionCallback_t arithmeticCallback, + SWIG_CSharpExceptionCallback_t divideByZeroCallback, + SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, + SWIG_CSharpExceptionCallback_t invalidCastCallback, + SWIG_CSharpExceptionCallback_t invalidOperationCallback, + SWIG_CSharpExceptionCallback_t ioCallback, + SWIG_CSharpExceptionCallback_t nullReferenceCallback, + SWIG_CSharpExceptionCallback_t outOfMemoryCallback, + SWIG_CSharpExceptionCallback_t overflowCallback, + SWIG_CSharpExceptionCallback_t systemCallback) { + SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; + SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; + SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; + SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; + SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; + SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; + SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; + SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; + SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; + SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; + SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; +} + +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionArgumentCallbacks_otapi( + SWIG_CSharpExceptionArgumentCallback_t argumentCallback, + SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, + SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; + SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; +} + + +/* Callback for returning strings to C# without leaking memory */ +typedef char * (SWIGSTDCALL* SWIG_CSharpStringHelperCallback)(const char *); +static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL; + + +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_otapi(SWIG_CSharpStringHelperCallback callback) { + SWIG_csharp_string_callback = callback; +} + + +/* Contract support */ + +#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, msg, ""); return nullreturn; } else + +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes so that C# proxy + * methods can be called from C++. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus + +#if defined(DEBUG_DIRECTOR_OWNED) +#include +#endif +#include + +namespace Swig { + /* Director base class - not currently used in C# directors */ + class Director { + }; + + /* Base class for director exceptions */ + class DirectorException { + protected: + std::string swig_msg; + + public: + DirectorException(const char* msg) : swig_msg(msg) { + } + DirectorException(const std::string &msg) : swig_msg(msg) { + } + const std::string& what() const { + return swig_msg; + } + virtual ~DirectorException() { + } + }; + + /* Pure virtual method exception */ + class DirectorPureVirtualException : public Swig::DirectorException { + public: + DirectorPureVirtualException(const char* msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { + } + }; +} + +#endif /* __cplusplus */ + + + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + + using namespace OTDB; + + + +/* --------------------------------------------------- + * C++ director class methods + * --------------------------------------------------- */ + +#include "OTAPI_wrap.h" + +SwigDirector_OTCallback::SwigDirector_OTCallback() : OTCallback(), Swig::Director() { + swig_init_callbacks(); +} + +SwigDirector_OTCallback::~SwigDirector_OTCallback() { + +} + + +std::string SwigDirector_OTCallback::runOne() { + std::string c_result ; + char * jresult = 0 ; + + if (!swig_callbackrunOne) { + return OTCallback::runOne(); + } else { + jresult = (char *) swig_callbackrunOne(); + if (!jresult) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return c_result; + } + c_result.assign(jresult); + } + return c_result; +} + +std::string SwigDirector_OTCallback::runTwo() { + std::string c_result ; + char * jresult = 0 ; + + if (!swig_callbackrunTwo) { + return OTCallback::runTwo(); + } else { + jresult = (char *) swig_callbackrunTwo(); + if (!jresult) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return c_result; + } + c_result.assign(jresult); + } + return c_result; +} + +void SwigDirector_OTCallback::swig_connect_director(SWIG_Callback0_t callbackrunOne, SWIG_Callback1_t callbackrunTwo) { + swig_callbackrunOne = callbackrunOne; + swig_callbackrunTwo = callbackrunTwo; +} + +void SwigDirector_OTCallback::swig_init_callbacks() { + swig_callbackrunOne = 0; + swig_callbackrunTwo = 0; +} + + +#ifdef __cplusplus +extern "C" { +#endif + +SWIGEXPORT void * SWIGSTDCALL CSharp_new_OTCallback() { + void * jresult ; + OTCallback *result = 0 ; + + result = (OTCallback *)new SwigDirector_OTCallback(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OTCallback(void * jarg1) { + OTCallback *arg1 = (OTCallback *) 0 ; + + arg1 = (OTCallback *)jarg1; + delete arg1; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTCallback_runOne(void * jarg1) { + char * jresult ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + arg1 = (OTCallback *)jarg1; + result = (arg1)->runOne(); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTCallback_runOneSwigExplicitOTCallback(void * jarg1) { + char * jresult ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + arg1 = (OTCallback *)jarg1; + result = (arg1)->OTCallback::runOne(); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTCallback_runTwo(void * jarg1) { + char * jresult ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + arg1 = (OTCallback *)jarg1; + result = (arg1)->runTwo(); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTCallback_runTwoSwigExplicitOTCallback(void * jarg1) { + char * jresult ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + arg1 = (OTCallback *)jarg1; + result = (arg1)->OTCallback::runTwo(); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTCallback_director_connect(void *objarg, SwigDirector_OTCallback::SWIG_Callback0_t callback0, SwigDirector_OTCallback::SWIG_Callback1_t callback1) { + OTCallback *obj = (OTCallback *)objarg; + SwigDirector_OTCallback *director = dynamic_cast(obj); + if (director) { + director->swig_connect_director(callback0, callback1); + } +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_new_OTCaller() { + void * jresult ; + OTCaller *result = 0 ; + + result = (OTCaller *)new OTCaller(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OTCaller(void * jarg1) { + OTCaller *arg1 = (OTCaller *) 0 ; + + arg1 = (OTCaller *)jarg1; + delete arg1; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTCaller_GetPassword(void * jarg1) { + char * jresult ; + OTCaller *arg1 = (OTCaller *) 0 ; + char *result = 0 ; + + arg1 = (OTCaller *)jarg1; + result = (char *)(arg1)->GetPassword(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTCaller_delCallback(void * jarg1) { + OTCaller *arg1 = (OTCaller *) 0 ; + + arg1 = (OTCaller *)jarg1; + (arg1)->delCallback(); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTCaller_setCallback(void * jarg1, void * jarg2) { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + + arg1 = (OTCaller *)jarg1; + arg2 = (OTCallback *)jarg2; + (arg1)->setCallback(arg2); +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OTCaller_isCallbackSet(void * jarg1) { + unsigned int jresult ; + OTCaller *arg1 = (OTCaller *) 0 ; + bool result; + + arg1 = (OTCaller *)jarg1; + result = (bool)(arg1)->isCallbackSet(); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTCaller_callOne(void * jarg1) { + OTCaller *arg1 = (OTCaller *) 0 ; + + arg1 = (OTCaller *)jarg1; + (arg1)->callOne(); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTCaller_callTwo(void * jarg1) { + OTCaller *arg1 = (OTCaller *) 0 ; + + arg1 = (OTCaller *)jarg1; + (arg1)->callTwo(); +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OT_API_Set_PasswordCallback(void * jarg1) { + unsigned int jresult ; + OTCaller *arg1 = 0 ; + bool result; + + arg1 = (OTCaller *)jarg1; + if (!arg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTCaller & type is null", 0); + return 0; + } + result = (bool)OT_API_Set_PasswordCallback(*arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Init(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Init((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_LoadWallet(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_LoadWallet((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SwitchWallet(char * jarg1, char * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetMemlogSize() { + int jresult ; + int result; + + result = (int)OT_API_GetMemlogSize(); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetMemlogAtIndex(int jarg1) { + char * jresult ; + int arg1 ; + char *result = 0 ; + + arg1 = (int)jarg1; + result = (char *)OT_API_GetMemlogAtIndex(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_PeekMemlogFront() { + char * jresult ; + char *result = 0 ; + + result = (char *)OT_API_PeekMemlogFront(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_PeekMemlogBack() { + char * jresult ; + char *result = 0 ; + + result = (char *)OT_API_PeekMemlogBack(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_PopMemlogFront() { + int jresult ; + int result; + + result = (int)OT_API_PopMemlogFront(); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_PopMemlogBack() { + int jresult ; + int result; + + result = (int)OT_API_PopMemlogBack(); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_CreateNym() { + char * jresult ; + char *result = 0 ; + + result = (char *)OT_API_CreateNym(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_AddServerContract(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_AddServerContract((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_AddAssetContract(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_AddAssetContract((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetServerCount() { + int jresult ; + int result; + + result = (int)OT_API_GetServerCount(); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetAssetTypeCount() { + int jresult ; + int result; + + result = (int)OT_API_GetAssetTypeCount(); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetAccountCount() { + int jresult ; + int result; + + result = (int)OT_API_GetAccountCount(); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetNymCount() { + int jresult ; + int result; + + result = (int)OT_API_GetNymCount(); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetServer_ID(int jarg1) { + char * jresult ; + int arg1 ; + char *result = 0 ; + + arg1 = (int)jarg1; + result = (char *)OT_API_GetServer_ID(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetServer_Name(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetServer_Name((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAssetType_ID(int jarg1) { + char * jresult ; + int arg1 ; + char *result = 0 ; + + arg1 = (int)jarg1; + result = (char *)OT_API_GetAssetType_ID(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAssetType_Name(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_ID(int jarg1) { + char * jresult ; + int arg1 ; + char *result = 0 ; + + arg1 = (int)jarg1; + result = (char *)OT_API_GetAccountWallet_ID(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_Name(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_Balance(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_Type(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_AssetTypeID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_ServerID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetAccountWallet_NymID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_VerifyAccountReceipt(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetNym_TransactionNumCount(char * jarg1, char * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_ID(int jarg1) { + char * jresult ; + int arg1 ; + char *result = 0 ; + + arg1 = (int)jarg1; + result = (char *)OT_API_GetNym_ID(arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_Name(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetNym_Name((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_Stats(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_IsNym_RegisteredAtServer(char * jarg1, char * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetNym_MailCount(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_MailContentsByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_MailSenderIDByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_MailServerIDByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Nym_RemoveMailByIndex(char * jarg1, int jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Nym_VerifyMailByIndex(char * jarg1, int jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_GetNym_OutmailCount(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_OutmailContentsByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_OutmailRecipientIDByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GetNym_OutmailServerIDByIndex(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Nym_RemoveOutmailByIndex(char * jarg1, int jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Nym_VerifyOutmailByIndex(char * jarg1, int jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_CanRemoveServer(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_RemoveServer(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_CanRemoveAssetType(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_RemoveAssetType(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_CanRemoveNym(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_RemoveNym(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_CanRemoveAccount(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Wallet_ImportNym(char * jarg1, char * jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SetNym_Name(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SetAccountWallet_Name(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SetAssetType_Name(char * jarg1, char * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SetServer_Name(char * jarg1, char * jarg2) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_VerifyAndRetrieveXMLContents(char * jarg1, char * jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_WriteCheque(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7, char * jarg8) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (char *)jarg6; + arg7 = (char *)jarg7; + arg8 = (char *)jarg8; + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_ProposePaymentPlan(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7, char * jarg8, char * jarg9, char * jarg10, char * jarg11, char * jarg12, char * jarg13, char * jarg14, char * jarg15) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (char *)jarg6; + arg7 = (char *)jarg7; + arg8 = (char *)jarg8; + arg9 = (char *)jarg9; + arg10 = (char *)jarg10; + arg11 = (char *)jarg11; + arg12 = (char *)jarg12; + arg13 = (char *)jarg13; + arg14 = (char *)jarg14; + arg15 = (char *)jarg15; + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_ConfirmPaymentPlan(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadUserPubkey(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadPubkey(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_LoadPubkey((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_VerifyUserPrivateKey(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadPurse(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadMint(char * jarg1, char * jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadAssetContract(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadServerContract(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_LoadServerContract((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Mint_IsStillGood(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_IsBasketCurrency(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Basket_GetMemberCount(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Basket_GetMemberType(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Basket_GetMinimumTransferAmount(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Basket_GetMemberMinimumTransferAmount(char * jarg1, int jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (int)jarg2; + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadAssetAccount(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadInbox(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadOutbox(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Ledger_GetCount(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_CreateResponse(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_GetTransactionByIndex(char * jarg1, char * jarg2, char * jarg3, char * jarg4, int jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (int)jarg5; + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_GetTransactionByID(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_GetTransactionIDByIndex(char * jarg1, char * jarg2, char * jarg3, char * jarg4, int jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (int)jarg5; + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_AddTransaction(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_CreateResponse(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, int jarg6) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (int)jarg6; + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Ledger_FinalizeResponse(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetType(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetVoucher(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Transaction_GetSuccess(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Transaction_GetBalanceAgreementSuccess(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetDateSigned(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetAmount(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Pending_GetNote(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetSenderUserID(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetSenderAcctID(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetRecipientUserID(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetRecipientAcctID(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Transaction_GetDisplayReferenceToNum(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_CreatePurse(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_SavePurse(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Purse_GetTotalValue(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Purse_Count(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Purse_Peek(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Purse_Pop(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Purse_Push(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Wallet_ImportPurse(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_exchangePurse(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_ChangeOwner(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetID(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetDenomination(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Token_GetSeries(char * jarg1, char * jarg2, char * jarg3) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetValidFrom(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetValidTo(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetAssetID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Token_GetServerID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_checkServerID(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_checkServerID((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_createUserAccount(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_deleteUserAccount(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_deleteAssetAccount(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_checkUser(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_sendUserMessage(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getRequest(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_getRequest((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getTransactionNumber(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_issueAssetType(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getContract(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getMint(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_createAssetAccount(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getAccount(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GenerateBasketCreation(char * jarg1, char * jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_AddBasketCreationItem(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_issueBasket(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_GenerateBasketExchange(char * jarg1, char * jarg2, char * jarg3, char * jarg4, int jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (int)jarg5; + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_AddBasketExchangeItem(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_exchangeBasket(char * jarg1, char * jarg2, char * jarg3, char * jarg4, int jarg5) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (int)jarg5; + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_notarizeWithdrawal(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_notarizeDeposit(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_notarizeTransfer(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (char *)jarg6; + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getInbox(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getOutbox(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getNymbox(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_getNymbox((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_LoadNymbox(char * jarg1, char * jarg2) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_processInbox(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_processNymbox(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_withdrawVoucher(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (char *)jarg6; + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_depositCheque(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_depositPaymentPlan(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_issueMarketOffer(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7, char * jarg8, char * jarg9, char * jarg10, int jarg11) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + arg6 = (char *)jarg6; + arg7 = (char *)jarg7; + arg8 = (char *)jarg8; + arg9 = (char *)jarg9; + arg10 = (char *)jarg10; + arg11 = (int)jarg11; + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getMarketList(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_getMarketList((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getMarketOffers(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getMarketRecentTrades(char * jarg1, char * jarg2, char * jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_getNym_MarketOffers(char * jarg1, char * jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_cancelMarketOffer(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_cancelPaymentPlan(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_PopMessageBuffer() { + char * jresult ; + char *result = 0 ; + + result = (char *)OT_API_PopMessageBuffer(); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OT_API_FlushMessageBuffer() { + OT_API_FlushMessageBuffer(); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Message_GetCommand(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Message_GetSuccess(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Message_GetDepth(char * jarg1) { + int jresult ; + char *arg1 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + result = (int)OT_API_Message_GetDepth((char const *)arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Message_GetTransactionSuccess(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_Message_GetBalanceAgreementSuccess(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Message_GetLedger(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Message_GetNewAssetTypeID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Message_GetNewIssuerAcctID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OT_API_Message_GetNewAcctID(char * jarg1) { + char * jresult ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + arg1 = (char *)jarg1; + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_ConnectServer(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + int jresult ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int result; + + arg1 = (char *)jarg1; + arg2 = (char *)jarg2; + arg3 = (char *)jarg3; + arg4 = (char *)jarg4; + arg5 = (char *)jarg5; + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_OT_API_ProcessSockets() { + int jresult ; + int result; + + result = (int)OT_API_ProcessSockets(); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Storable(void * jarg1) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + + arg1 = (OTDB::Storable *)jarg1; + delete arg1; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storable_Create(int jarg1, int jarg2) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storable_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_GetPacker__SWIG_0(void * jarg1, int jarg2) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + OTPacker *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTPacker *)(arg1)->GetPacker(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_GetPacker__SWIG_1(void * jarg1) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTPacker *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + result = (OTPacker *)(arg1)->GetPacker(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + if (!jarg7) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg7)->assign(jarg7); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_2(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_3(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->Init(arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_4(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->Init(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_5(void * jarg1, char * jarg2) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)(arg1)->Init(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Init__SWIG_6(void * jarg1) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + result = (bool)(arg1)->Init(); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Exists__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Exists__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Exists__SWIG_2(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->Exists(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_Exists__SWIG_3(void * jarg1, char * jarg2) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)(arg1)->Exists(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Storage(void * jarg1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + + arg1 = (OTDB::Storage *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreString__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreString__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreString__SWIG_2(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreString__SWIG_3(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->StoreString(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryString__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryString__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (arg1)->QueryString(arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryString__SWIG_2(void * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (arg1)->QueryString(arg2,arg3); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryString__SWIG_3(void * jarg1, char * jarg2) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (arg1)->QueryString(arg2); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StorePlainString__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StorePlainString__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StorePlainString__SWIG_2(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StorePlainString__SWIG_3(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->StorePlainString(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryPlainString__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryPlainString__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryPlainString__SWIG_2(void * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (arg1)->QueryPlainString(arg2,arg3); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Storage_QueryPlainString__SWIG_3(void * jarg1, char * jarg2) { + char * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (arg1)->QueryPlainString(arg2); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreObject__SWIG_0(void * jarg1, void * jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::Storable *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreObject__SWIG_1(void * jarg1, void * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::Storable *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreObject__SWIG_2(void * jarg1, void * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::Storable *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_StoreObject__SWIG_3(void * jarg1, void * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::Storable *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->StoreObject(*arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_QueryObject__SWIG_0(void * jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_QueryObject__SWIG_1(void * jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_QueryObject__SWIG_2(void * jarg1, int jarg2, char * jarg3, char * jarg4) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_QueryObject__SWIG_3(void * jarg1, int jarg2, char * jarg3) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_EraseValueByKey__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_EraseValueByKey__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_EraseValueByKey__SWIG_2(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Storage_EraseValueByKey__SWIG_3(void * jarg1, char * jarg2) { + unsigned int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + arg1 = (OTDB::Storage *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)(arg1)->EraseValueByKey(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_CreateObject(void * jarg1, int jarg2) { + void * jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::Storage *)jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Storage_Create(int jarg1, int jarg2) { + void * jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storage *result = 0 ; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_Storage_GetType(void * jarg1) { + int jresult ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StorageType result; + + arg1 = (OTDB::Storage *)jarg1; + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_0(int jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7, char * jarg8) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + if (!jarg7) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg7)->assign(jarg7); + if (!jarg8) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg8)->assign(jarg8); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_1(int jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6, char * jarg7) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + if (!jarg7) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg7)->assign(jarg7); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_2(int jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5, char * jarg6) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + if (!jarg6) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg6)->assign(jarg6); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_3(int jarg1, int jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_4(int jarg1, int jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_5(int jarg1, int jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_InitDefaultStorage__SWIG_6(int jarg1, int jarg2) { + unsigned int jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + bool result; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_GetDefaultStorage() { + void * jresult ; + OTDB::Storage *result = 0 ; + + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_CreateStorageContext__SWIG_0(int jarg1, int jarg2) { + void * jresult ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storage *result = 0 ; + + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_CreateStorageContext__SWIG_1(int jarg1) { + void * jresult ; + OTDB::StorageType arg1 ; + OTDB::Storage *result = 0 ; + + arg1 = (OTDB::StorageType)jarg1; + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_CreateObject(int jarg1) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Exists__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Exists__SWIG_1(char * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::Exists(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Exists__SWIG_2(char * jarg1, char * jarg2) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)OTDB::Exists(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Exists__SWIG_3(char * jarg1) { + unsigned int jresult ; + std::string arg1 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + result = (bool)OTDB::Exists(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreString__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreString__SWIG_1(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreString__SWIG_2(char * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreString__SWIG_3(char * jarg1, char * jarg2) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)OTDB::StoreString(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryString__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryString__SWIG_1(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = OTDB::QueryString(arg1,arg2,arg3); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryString__SWIG_2(char * jarg1, char * jarg2) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = OTDB::QueryString(arg1,arg2); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryString__SWIG_3(char * jarg1) { + char * jresult ; + std::string arg1 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + result = OTDB::QueryString(arg1); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StorePlainString__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StorePlainString__SWIG_1(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StorePlainString__SWIG_2(char * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StorePlainString__SWIG_3(char * jarg1, char * jarg2) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)OTDB::StorePlainString(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryPlainString__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryPlainString__SWIG_1(char * jarg1, char * jarg2, char * jarg3) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = OTDB::QueryPlainString(arg1,arg2,arg3); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryPlainString__SWIG_2(char * jarg1, char * jarg2) { + char * jresult ; + std::string arg1 ; + std::string arg2 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = OTDB::QueryPlainString(arg1,arg2); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_QueryPlainString__SWIG_3(char * jarg1) { + char * jresult ; + std::string arg1 ; + std::string result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + result = OTDB::QueryPlainString(arg1); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreObject__SWIG_0(void * jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + unsigned int jresult ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + arg1 = (OTDB::Storable *)jarg1; + if (!arg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreObject__SWIG_1(void * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + arg1 = (OTDB::Storable *)jarg1; + if (!arg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreObject__SWIG_2(void * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + arg1 = (OTDB::Storable *)jarg1; + if (!arg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_StoreObject__SWIG_3(void * jarg1, char * jarg2) { + unsigned int jresult ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + bool result; + + arg1 = (OTDB::Storable *)jarg1; + if (!arg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Storable & type is null", 0); + return 0; + } + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)OTDB::StoreObject(*arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_QueryObject__SWIG_0(int jarg1, char * jarg2, char * jarg3, char * jarg4, char * jarg5) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + if (!jarg5) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg5)->assign(jarg5); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_QueryObject__SWIG_1(int jarg1, char * jarg2, char * jarg3, char * jarg4) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_QueryObject__SWIG_2(int jarg1, char * jarg2, char * jarg3) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_QueryObject__SWIG_3(int jarg1, char * jarg2) { + void * jresult ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + OTDB::Storable *result = 0 ; + + arg1 = (OTDB::StoredObjectType)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_EraseValueByKey__SWIG_0(char * jarg1, char * jarg2, char * jarg3, char * jarg4) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + if (!jarg4) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg4)->assign(jarg4); + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_EraseValueByKey__SWIG_1(char * jarg1, char * jarg2, char * jarg3) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg3)->assign(jarg3); + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_EraseValueByKey__SWIG_2(char * jarg1, char * jarg2) { + unsigned int jresult ; + std::string arg1 ; + std::string arg2 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg2)->assign(jarg2); + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_EraseValueByKey__SWIG_3(char * jarg1) { + unsigned int jresult ; + std::string arg1 ; + bool result; + + if (!jarg1) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + (&arg1)->assign(jarg1); + result = (bool)OTDB::EraseValueByKey(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OTDBString(void * jarg1) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + + arg1 = (OTDB::OTDBString *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OTDBString_m_string_set(void * jarg1, char * jarg2) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OTDBString *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->m_string = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OTDBString_m_string_get(void * jarg1) { + char * jresult ; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OTDBString *)jarg1; + result = (std::string *) & ((arg1)->m_string); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OTDBString_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OTDBString *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Blob(void * jarg1) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + + arg1 = (OTDB::Blob *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Blob_m_memBuffer_set(void * jarg1, void * jarg2) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + std::vector< unsigned char > *argp2 ; + + arg1 = (OTDB::Blob *)jarg1; + argp2 = (std::vector< unsigned char > *)jarg2; + if (!argp2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null std::vector< unsigned char >", 0); + return ; + } + arg2 = *argp2; + if (arg1) (arg1)->m_memBuffer = arg2; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Blob_m_memBuffer_get(void * jarg1) { + void * jresult ; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > result; + + arg1 = (OTDB::Blob *)jarg1; + result = ((arg1)->m_memBuffer); + jresult = new std::vector< unsigned char >((const std::vector< unsigned char > &)result); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Blob_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Blob *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_StringMap(void * jarg1) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + + arg1 = (OTDB::StringMap *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_StringMap_the_map_set(void * jarg1, void * jarg2) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + + arg1 = (OTDB::StringMap *)jarg1; + arg2 = (std::map< std::string,std::string > *)jarg2; + if (arg1) (arg1)->the_map = *arg2; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_StringMap_the_map_get(void * jarg1) { + void * jresult ; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *result = 0 ; + + arg1 = (OTDB::StringMap *)jarg1; + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_StringMap_SetValue(void * jarg1, char * jarg2, char * jarg3) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + + arg1 = (OTDB::StringMap *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (!jarg3) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg3_str(jarg3); + arg3 = &arg3_str; + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_StringMap_GetValue(void * jarg1, char * jarg2) { + char * jresult ; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string result; + + arg1 = (OTDB::StringMap *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return 0; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + result = (arg1)->GetValue((std::string const &)*arg2); + jresult = SWIG_csharp_string_callback((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_StringMap_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::StringMap *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Displayable(void * jarg1) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + + arg1 = (OTDB::Displayable *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Displayable_gui_label_set(void * jarg1, char * jarg2) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Displayable *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Displayable_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Displayable *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Displayable_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Displayable *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_MarketData(void * jarg1) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_gui_label_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_server_id_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_server_id_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_market_id_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->market_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_market_id_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->market_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_asset_type_id_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_asset_type_id_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_currency_type_id_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->currency_type_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_currency_type_id_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->currency_type_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_scale_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_scale_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_total_assets_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->total_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_total_assets_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->total_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_number_bids_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->number_bids = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_number_bids_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->number_bids); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_number_asks_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->number_asks = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_number_asks_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->number_asks); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_last_sale_price_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->last_sale_price = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_last_sale_price_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->last_sale_price); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_current_bid_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->current_bid = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_current_bid_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->current_bid); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_current_ask_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->current_ask = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_current_ask_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->current_ask); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_volume_trades_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->volume_trades = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_volume_trades_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->volume_trades); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_volume_assets_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->volume_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_volume_assets_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->volume_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_volume_currency_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->volume_currency = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_volume_currency_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->volume_currency); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_recent_highest_bid_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->recent_highest_bid = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_recent_highest_bid_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->recent_highest_bid); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_MarketData_recent_lowest_ask_set(void * jarg1, char * jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->recent_lowest_ask = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_MarketData_recent_lowest_ask_get(void * jarg1) { + char * jresult ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::MarketData *)jarg1; + result = (std::string *) & ((arg1)->recent_lowest_ask); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_MarketData_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::MarketData *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_MarketList(void * jarg1) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + + arg1 = (OTDB::MarketList *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_MarketList_GetMarketDataCount(void * jarg1) { + unsigned long jresult ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t result; + + arg1 = (OTDB::MarketList *)jarg1; + result = (arg1)->GetMarketDataCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_MarketList_GetMarketData(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + OTDB::MarketData *result = 0 ; + + arg1 = (OTDB::MarketList *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MarketList_RemoveMarketData(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::MarketList *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveMarketData(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MarketList_AddMarketData(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + bool result; + + arg1 = (OTDB::MarketList *)jarg1; + arg2 = (OTDB::MarketData *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::MarketData & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddMarketData(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_MarketList_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::MarketList *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OfferDataMarket(void * jarg1) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataMarket_gui_label_set(void * jarg1, char * jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataMarket_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataMarket_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataMarket_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataMarket_price_per_scale_set(void * jarg1, char * jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataMarket_price_per_scale_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataMarket_available_assets_set(void * jarg1, char * jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataMarket_available_assets_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataMarket_minimum_increment_set(void * jarg1, char * jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataMarket_minimum_increment_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataMarket *)jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferDataMarket_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferDataMarket *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_BidData(void * jarg1) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + + arg1 = (OTDB::BidData *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BidData_gui_label_set(void * jarg1, char * jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BidData_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BidData_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BidData_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BidData_price_per_scale_set(void * jarg1, char * jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BidData_price_per_scale_get(void * jarg1) { + char * jresult ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BidData_available_assets_set(void * jarg1, char * jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BidData_available_assets_get(void * jarg1) { + char * jresult ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BidData_minimum_increment_set(void * jarg1, char * jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BidData_minimum_increment_get(void * jarg1) { + char * jresult ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BidData *)jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_BidData_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BidData *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_AskData(void * jarg1) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + + arg1 = (OTDB::AskData *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_AskData_gui_label_set(void * jarg1, char * jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_AskData_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_AskData_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_AskData_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_AskData_price_per_scale_set(void * jarg1, char * jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_AskData_price_per_scale_get(void * jarg1) { + char * jresult ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_AskData_available_assets_set(void * jarg1, char * jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_AskData_available_assets_get(void * jarg1) { + char * jresult ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_AskData_minimum_increment_set(void * jarg1, char * jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_AskData_minimum_increment_get(void * jarg1) { + char * jresult ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::AskData *)jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_AskData_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::AskData *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OfferListMarket(void * jarg1) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + + arg1 = (OTDB::OfferListMarket *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_OfferListMarket_GetBidDataCount(void * jarg1) { + unsigned long jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + result = (arg1)->GetBidDataCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferListMarket_GetBidData(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + OTDB::BidData *result = 0 ; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListMarket_RemoveBidData(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBidData(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListMarket_AddBidData(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + bool result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (OTDB::BidData *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::BidData & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddBidData(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_OfferListMarket_GetAskDataCount(void * jarg1) { + unsigned long jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + result = (arg1)->GetAskDataCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferListMarket_GetAskData(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + OTDB::AskData *result = 0 ; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListMarket_RemoveAskData(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveAskData(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListMarket_AddAskData(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + bool result; + + arg1 = (OTDB::OfferListMarket *)jarg1; + arg2 = (OTDB::AskData *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::AskData & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddAskData(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferListMarket_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferListMarket *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_TradeDataMarket(void * jarg1) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataMarket_gui_label_set(void * jarg1, char * jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataMarket_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataMarket_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataMarket_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataMarket_date_set(void * jarg1, char * jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->date = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataMarket_date_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + result = (std::string *) & ((arg1)->date); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataMarket_price_set(void * jarg1, char * jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataMarket_price_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + result = (std::string *) & ((arg1)->price); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataMarket_amount_sold_set(void * jarg1, char * jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->amount_sold = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataMarket_amount_sold_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataMarket *)jarg1; + result = (std::string *) & ((arg1)->amount_sold); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeDataMarket_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeDataMarket *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_TradeListMarket(void * jarg1) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + + arg1 = (OTDB::TradeListMarket *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_TradeListMarket_GetTradeDataMarketCount(void * jarg1) { + unsigned long jresult ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t result; + + arg1 = (OTDB::TradeListMarket *)jarg1; + result = (arg1)->GetTradeDataMarketCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeListMarket_GetTradeDataMarket(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + OTDB::TradeDataMarket *result = 0 ; + + arg1 = (OTDB::TradeListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_TradeListMarket_RemoveTradeDataMarket(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::TradeListMarket *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_TradeListMarket_AddTradeDataMarket(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + bool result; + + arg1 = (OTDB::TradeListMarket *)jarg1; + arg2 = (OTDB::TradeDataMarket *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::TradeDataMarket & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeListMarket_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeListMarket *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OfferDataNym(void * jarg1) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_gui_label_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_valid_from_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->valid_from = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_valid_from_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->valid_from); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_valid_to_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->valid_to = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_valid_to_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->valid_to); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_server_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_server_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_asset_type_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_asset_type_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_asset_acct_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->asset_acct_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_asset_acct_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->asset_acct_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_currency_type_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->currency_type_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_currency_type_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->currency_type_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_currency_acct_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->currency_acct_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_currency_acct_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->currency_acct_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_selling_set(void * jarg1, unsigned int jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + arg2 = jarg2 ? true : false; + if (arg1) (arg1)->selling = arg2; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferDataNym_selling_get(void * jarg1) { + unsigned int jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool result; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (bool) ((arg1)->selling); + jresult = result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_scale_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_scale_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_price_per_scale_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_price_per_scale_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_total_assets_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->total_assets = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_total_assets_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->total_assets); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_finished_so_far_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->finished_so_far = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_finished_so_far_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->finished_so_far); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_minimum_increment_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_minimum_increment_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_stop_sign_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->stop_sign = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_stop_sign_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->stop_sign); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_OfferDataNym_stop_price_set(void * jarg1, char * jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->stop_price = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_OfferDataNym_stop_price_get(void * jarg1) { + char * jresult ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::OfferDataNym *)jarg1; + result = (std::string *) & ((arg1)->stop_price); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferDataNym_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferDataNym *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_OfferListNym(void * jarg1) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + + arg1 = (OTDB::OfferListNym *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_OfferListNym_GetOfferDataNymCount(void * jarg1) { + unsigned long jresult ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t result; + + arg1 = (OTDB::OfferListNym *)jarg1; + result = (arg1)->GetOfferDataNymCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferListNym_GetOfferDataNym(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + OTDB::OfferDataNym *result = 0 ; + + arg1 = (OTDB::OfferListNym *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListNym_RemoveOfferDataNym(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::OfferListNym *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_OfferListNym_AddOfferDataNym(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + bool result; + + arg1 = (OTDB::OfferListNym *)jarg1; + arg2 = (OTDB::OfferDataNym *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::OfferDataNym & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddOfferDataNym(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_OfferListNym_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferListNym *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_TradeDataNym(void * jarg1) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_gui_label_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_transaction_id_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_transaction_id_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_completed_count_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->completed_count = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_completed_count_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->completed_count); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_date_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->date = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_date_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->date); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_price_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->price = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_price_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->price); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_TradeDataNym_amount_sold_set(void * jarg1, char * jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->amount_sold = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_TradeDataNym_amount_sold_get(void * jarg1) { + char * jresult ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::TradeDataNym *)jarg1; + result = (std::string *) & ((arg1)->amount_sold); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeDataNym_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeDataNym *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_TradeListNym(void * jarg1) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + + arg1 = (OTDB::TradeListNym *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_TradeListNym_GetTradeDataNymCount(void * jarg1) { + unsigned long jresult ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t result; + + arg1 = (OTDB::TradeListNym *)jarg1; + result = (arg1)->GetTradeDataNymCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeListNym_GetTradeDataNym(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + OTDB::TradeDataNym *result = 0 ; + + arg1 = (OTDB::TradeListNym *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_TradeListNym_RemoveTradeDataNym(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::TradeListNym *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_TradeListNym_AddTradeDataNym(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + bool result; + + arg1 = (OTDB::TradeListNym *)jarg1; + arg2 = (OTDB::TradeDataNym *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::TradeDataNym & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddTradeDataNym(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_TradeListNym_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeListNym *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Acct(void * jarg1) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + + arg1 = (OTDB::Acct *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Acct_gui_label_set(void * jarg1, char * jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Acct_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Acct_acct_id_set(void * jarg1, char * jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Acct_acct_id_get(void * jarg1) { + char * jresult ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Acct_server_id_set(void * jarg1, char * jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Acct_server_id_get(void * jarg1) { + char * jresult ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Acct *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Acct_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Acct *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_BitcoinAcct(void * jarg1) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinAcct_gui_label_set(void * jarg1, char * jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinAcct_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinAcct_acct_id_set(void * jarg1, char * jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinAcct_acct_id_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinAcct_server_id_set(void * jarg1, char * jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinAcct_server_id_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinAcct_bitcoin_acct_name_set(void * jarg1, char * jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->bitcoin_acct_name = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinAcct_bitcoin_acct_name_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinAcct *)jarg1; + result = (std::string *) & ((arg1)->bitcoin_acct_name); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_BitcoinAcct_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BitcoinAcct *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_ServerInfo(void * jarg1) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ServerInfo_gui_label_set(void * jarg1, char * jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ServerInfo_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ServerInfo_server_id_set(void * jarg1, char * jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ServerInfo_server_id_get(void * jarg1) { + char * jresult ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ServerInfo_server_type_set(void * jarg1, char * jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ServerInfo_server_type_get(void * jarg1) { + char * jresult ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ServerInfo *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_ServerInfo_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ServerInfo *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Server(void * jarg1) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + + arg1 = (OTDB::Server *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Server_gui_label_set(void * jarg1, char * jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Server *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Server_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Server *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Server_server_id_set(void * jarg1, char * jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Server *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Server_server_id_get(void * jarg1) { + char * jresult ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Server *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Server_server_type_set(void * jarg1, char * jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Server *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Server_server_type_get(void * jarg1) { + char * jresult ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Server *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Server_server_host_set(void * jarg1, char * jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Server *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Server_server_host_get(void * jarg1) { + char * jresult ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Server *)jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Server_server_port_set(void * jarg1, char * jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Server *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Server_server_port_get(void * jarg1) { + char * jresult ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Server *)jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Server_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Server *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_BitcoinServer(void * jarg1) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_gui_label_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_server_id_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_server_id_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_server_type_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_server_type_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_server_host_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_server_host_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_server_port_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_server_port_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_bitcoin_username_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->bitcoin_username = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_bitcoin_username_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->bitcoin_username); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_BitcoinServer_bitcoin_password_set(void * jarg1, char * jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->bitcoin_password = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_BitcoinServer_bitcoin_password_get(void * jarg1) { + char * jresult ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::BitcoinServer *)jarg1; + result = (std::string *) & ((arg1)->bitcoin_password); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_BitcoinServer_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BitcoinServer *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_RippleServer(void * jarg1) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_gui_label_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_server_id_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_server_id_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_server_type_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_server_type_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_server_host_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_server_host_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_server_port_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_server_port_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_ripple_username_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->ripple_username = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_ripple_username_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->ripple_username); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_ripple_password_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->ripple_password = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_ripple_password_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->ripple_password); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_namefield_id_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->namefield_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_namefield_id_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->namefield_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_RippleServer_passfield_id_set(void * jarg1, char * jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->passfield_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_RippleServer_passfield_id_get(void * jarg1) { + char * jresult ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::RippleServer *)jarg1; + result = (std::string *) & ((arg1)->passfield_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_RippleServer_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::RippleServer *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_LoomServer(void * jarg1) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_gui_label_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_server_id_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_server_id_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_server_type_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_server_type_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_server_host_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_server_host_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_server_port_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_server_port_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_loom_username_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->loom_username = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_loom_username_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->loom_username); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_LoomServer_namefield_id_set(void * jarg1, char * jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->namefield_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_LoomServer_namefield_id_get(void * jarg1) { + char * jresult ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::LoomServer *)jarg1; + result = (std::string *) & ((arg1)->namefield_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_LoomServer_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::LoomServer *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_ContactNym(void * jarg1) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactNym_gui_label_set(void * jarg1, char * jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactNym_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactNym_nym_type_set(void * jarg1, char * jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->nym_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactNym_nym_type_get(void * jarg1) { + char * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (std::string *) & ((arg1)->nym_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactNym_nym_id_set(void * jarg1, char * jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->nym_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactNym_nym_id_get(void * jarg1) { + char * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (std::string *) & ((arg1)->nym_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactNym_public_key_set(void * jarg1, char * jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactNym_public_key_get(void * jarg1) { + char * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactNym_memo_set(void * jarg1, char * jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactNym_memo_get(void * jarg1) { + char * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_ContactNym_GetServerInfoCount(void * jarg1) { + unsigned long jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t result; + + arg1 = (OTDB::ContactNym *)jarg1; + result = (arg1)->GetServerInfoCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_ContactNym_GetServerInfo(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + OTDB::ServerInfo *result = 0 ; + + arg1 = (OTDB::ContactNym *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_ContactNym_RemoveServerInfo(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::ContactNym *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveServerInfo(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_ContactNym_AddServerInfo(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + bool result; + + arg1 = (OTDB::ContactNym *)jarg1; + arg2 = (OTDB::ServerInfo *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::ServerInfo & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddServerInfo(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_ContactNym_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ContactNym *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_WalletData(void * jarg1) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + + arg1 = (OTDB::WalletData *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_WalletData_GetBitcoinServerCount(void * jarg1) { + unsigned long jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + arg1 = (OTDB::WalletData *)jarg1; + result = (arg1)->GetBitcoinServerCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_WalletData_GetBitcoinServer(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::BitcoinServer *result = 0 ; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_RemoveBitcoinServer(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_AddBitcoinServer(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (OTDB::BitcoinServer *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::BitcoinServer & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddBitcoinServer(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_WalletData_GetBitcoinAcctCount(void * jarg1) { + unsigned long jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + arg1 = (OTDB::WalletData *)jarg1; + result = (arg1)->GetBitcoinAcctCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_WalletData_GetBitcoinAcct(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::BitcoinAcct *result = 0 ; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_RemoveBitcoinAcct(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_AddBitcoinAcct(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (OTDB::BitcoinAcct *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::BitcoinAcct & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_WalletData_GetRippleServerCount(void * jarg1) { + unsigned long jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + arg1 = (OTDB::WalletData *)jarg1; + result = (arg1)->GetRippleServerCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_WalletData_GetRippleServer(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::RippleServer *result = 0 ; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_RemoveRippleServer(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveRippleServer(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_AddRippleServer(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (OTDB::RippleServer *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::RippleServer & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddRippleServer(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_WalletData_GetLoomServerCount(void * jarg1) { + unsigned long jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + arg1 = (OTDB::WalletData *)jarg1; + result = (arg1)->GetLoomServerCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_WalletData_GetLoomServer(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::LoomServer *result = 0 ; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_RemoveLoomServer(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveLoomServer(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_WalletData_AddLoomServer(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + bool result; + + arg1 = (OTDB::WalletData *)jarg1; + arg2 = (OTDB::LoomServer *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::LoomServer & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddLoomServer(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_WalletData_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::WalletData *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_ContactAcct(void * jarg1) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_gui_label_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_server_type_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_server_type_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_server_id_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_server_id_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_asset_type_id_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_asset_type_id_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_acct_id_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_acct_id_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_nym_id_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->nym_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_nym_id_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->nym_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_memo_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_memo_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_ContactAcct_public_key_set(void * jarg1, char * jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_ContactAcct_public_key_get(void * jarg1) { + char * jresult ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::ContactAcct *)jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_ContactAcct_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ContactAcct *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_Contact(void * jarg1) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + + arg1 = (OTDB::Contact *)jarg1; + delete arg1; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Contact_gui_label_set(void * jarg1, char * jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Contact_gui_label_get(void * jarg1) { + char * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Contact_contact_id_set(void * jarg1, char * jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->contact_id = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Contact_contact_id_get(void * jarg1) { + char * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + result = (std::string *) & ((arg1)->contact_id); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Contact_email_set(void * jarg1, char * jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->email = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Contact_email_get(void * jarg1) { + char * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + result = (std::string *) & ((arg1)->email); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Contact_memo_set(void * jarg1, char * jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Contact_memo_get(void * jarg1) { + char * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_Contact_public_key_set(void * jarg1, char * jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + if (!jarg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); + return ; + } + std::string arg2_str(jarg2); + arg2 = &arg2_str; + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_Contact_public_key_get(void * jarg1) { + char * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = SWIG_csharp_string_callback(result->c_str()); + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_Contact_GetContactNymCount(void * jarg1) { + unsigned long jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t result; + + arg1 = (OTDB::Contact *)jarg1; + result = (arg1)->GetContactNymCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Contact_GetContactNym(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + OTDB::ContactNym *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Contact_RemoveContactNym(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContactNym(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Contact_AddContactNym(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + bool result; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (OTDB::ContactNym *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::ContactNym & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddContactNym(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_Contact_GetContactAcctCount(void * jarg1) { + unsigned long jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t result; + + arg1 = (OTDB::Contact *)jarg1; + result = (arg1)->GetContactAcctCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Contact_GetContactAcct(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + OTDB::ContactAcct *result = 0 ; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Contact_RemoveContactAcct(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContactAcct(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Contact_AddContactAcct(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + bool result; + + arg1 = (OTDB::Contact *)jarg1; + arg2 = (OTDB::ContactAcct *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::ContactAcct & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddContactAcct(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_Contact_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Contact *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_delete_AddressBook(void * jarg1) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + + arg1 = (OTDB::AddressBook *)jarg1; + delete arg1; +} + + +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_AddressBook_GetContactCount(void * jarg1) { + unsigned long jresult ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t result; + + arg1 = (OTDB::AddressBook *)jarg1; + result = (arg1)->GetContactCount(); + jresult = (unsigned long)result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_AddressBook_GetContact(void * jarg1, unsigned long jarg2) { + void * jresult ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + OTDB::Contact *result = 0 ; + + arg1 = (OTDB::AddressBook *)jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_AddressBook_RemoveContact(void * jarg1, unsigned long jarg2) { + unsigned int jresult ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + bool result; + + arg1 = (OTDB::AddressBook *)jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContact(arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_AddressBook_AddContact(void * jarg1, void * jarg2) { + unsigned int jresult ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + bool result; + + arg1 = (OTDB::AddressBook *)jarg1; + arg2 = (OTDB::Contact *)jarg2; + if (!arg2) { + SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "OTDB::Contact & type is null", 0); + return 0; + } + result = (bool)(arg1)->AddContact(*arg2); + jresult = result; + return jresult; +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_AddressBook_ot_dynamic_cast(void * jarg1) { + void * jresult ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::AddressBook *result = 0 ; + + arg1 = (OTDB::Storable *)jarg1; + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + jresult = (void *)result; + return jresult; +} + + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_OTDBString_SWIGUpcast(OTDB::OTDBString *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_Blob_SWIGUpcast(OTDB::Blob *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_StringMap_SWIGUpcast(OTDB::StringMap *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_Displayable_SWIGUpcast(OTDB::Displayable *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_MarketData_SWIGUpcast(OTDB::MarketData *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_MarketList_SWIGUpcast(OTDB::MarketList *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_OfferDataMarket_SWIGUpcast(OTDB::OfferDataMarket *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::OfferDataMarket * SWIGSTDCALL CSharp_BidData_SWIGUpcast(OTDB::BidData *jarg1) { + return (OTDB::OfferDataMarket *)jarg1; +} + +SWIGEXPORT OTDB::OfferDataMarket * SWIGSTDCALL CSharp_AskData_SWIGUpcast(OTDB::AskData *jarg1) { + return (OTDB::OfferDataMarket *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_OfferListMarket_SWIGUpcast(OTDB::OfferListMarket *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_TradeDataMarket_SWIGUpcast(OTDB::TradeDataMarket *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_TradeListMarket_SWIGUpcast(OTDB::TradeListMarket *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_OfferDataNym_SWIGUpcast(OTDB::OfferDataNym *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_OfferListNym_SWIGUpcast(OTDB::OfferListNym *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_TradeDataNym_SWIGUpcast(OTDB::TradeDataNym *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_TradeListNym_SWIGUpcast(OTDB::TradeListNym *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_Acct_SWIGUpcast(OTDB::Acct *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Acct * SWIGSTDCALL CSharp_BitcoinAcct_SWIGUpcast(OTDB::BitcoinAcct *jarg1) { + return (OTDB::Acct *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_ServerInfo_SWIGUpcast(OTDB::ServerInfo *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::ServerInfo * SWIGSTDCALL CSharp_Server_SWIGUpcast(OTDB::Server *jarg1) { + return (OTDB::ServerInfo *)jarg1; +} + +SWIGEXPORT OTDB::Server * SWIGSTDCALL CSharp_BitcoinServer_SWIGUpcast(OTDB::BitcoinServer *jarg1) { + return (OTDB::Server *)jarg1; +} + +SWIGEXPORT OTDB::Server * SWIGSTDCALL CSharp_RippleServer_SWIGUpcast(OTDB::RippleServer *jarg1) { + return (OTDB::Server *)jarg1; +} + +SWIGEXPORT OTDB::Server * SWIGSTDCALL CSharp_LoomServer_SWIGUpcast(OTDB::LoomServer *jarg1) { + return (OTDB::Server *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_ContactNym_SWIGUpcast(OTDB::ContactNym *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_WalletData_SWIGUpcast(OTDB::WalletData *jarg1) { + return (OTDB::Storable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_ContactAcct_SWIGUpcast(OTDB::ContactAcct *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Displayable * SWIGSTDCALL CSharp_Contact_SWIGUpcast(OTDB::Contact *jarg1) { + return (OTDB::Displayable *)jarg1; +} + +SWIGEXPORT OTDB::Storable * SWIGSTDCALL CSharp_AddressBook_SWIGUpcast(OTDB::AddressBook *jarg1) { + return (OTDB::Storable *)jarg1; +} + +#ifdef __cplusplus +} +#endif + diff --git a/testwallet/OTAPI_csharp.h b/testwallet/OTAPI_csharp.h new file mode 100644 index 000000000..9aa1f9400 --- /dev/null +++ b/testwallet/OTAPI_csharp.h @@ -0,0 +1,33 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_otapi_WRAP_H_ +#define SWIG_otapi_WRAP_H_ + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + SwigDirector_OTCallback(); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); + + typedef char * (SWIGSTDCALL* SWIG_Callback0_t)(); + typedef char * (SWIGSTDCALL* SWIG_Callback1_t)(); + void swig_connect_director(SWIG_Callback0_t callbackrunOne, SWIG_Callback1_t callbackrunTwo); + +private: + SWIG_Callback0_t swig_callbackrunOne; + SWIG_Callback1_t swig_callbackrunTwo; + void swig_init_callbacks(); +}; + + +#endif diff --git a/testwallet/OTAPI_d.h b/testwallet/OTAPI_d.h new file mode 100644 index 000000000..e69de29bb diff --git a/testwallet/OTAPI_funcdef.h b/testwallet/OTAPI_funcdef.h new file mode 100644 index 000000000..5d1c74c8b --- /dev/null +++ b/testwallet/OTAPI_funcdef.h @@ -0,0 +1,2060 @@ +/************************************************************************************ + * + * OTAPI_funcdef.h -- Any function defs added to the OTAPI interface go here. + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +// DO NOT INCLUDE THIS FILE, anywhere! +// +// (It's used internally.) +// Instead, if you want to use the functions defined here, #include "OTAPI.h" instead. +// +// (That file will include this one, but in the appropriate way.) + + + + + +// -------------------------------------------------------------------- +/** + INITIALIZE the OTAPI + + Call this first, to initialize the library. It needs to know the path + to the data_folder, which on the client side is inside the testwallet folder. + + Something like this: + + OT_BOOL bInit = OT_API_Init("/absolute-path-goes-here/.ot/client_data"); + + */ +int OT_API_Init(const char * szClientPath); // actually returns BOOL + + + + + +// -------------------------------------------------------------------- +/** + LOAD WALLET + + Next you'll want to load your wallet up. It needs to be in the data_folder. + Just pass in the filename. Like this: + + OT_API_LoadWallet("wallet.xml"); + + */ +int OT_API_LoadWallet(const char * szWalletFilename); // actually returns BOOL + + + + +// -------------------------------------------------------------------- +/** + SWITCH WALLET + + Experimental. + If you want to switch to a completely different wallet, at a completely + different path, then call this function. + + OT_API_SwitchWallet("/absolute-path-goes-here/.ot/client_data", + "wallet.xml"); + + */ +int OT_API_SwitchWallet(const char * szDataFolderPath, const char * szWalletFilename); // actually returns OT_BOOL + + +// ---------------------------------------------------- +// The below functions are for retrieving log data programatically. + +int OT_API_GetMemlogSize(); + +const char * OT_API_GetMemlogAtIndex(int nIndex); + +const char * OT_API_PeekMemlogFront(); +const char * OT_API_PeekMemlogBack(); + +int OT_API_PopMemlogFront(); // actually returns OT_BOOL +int OT_API_PopMemlogBack(); // actually returns OT_BOOL + + + +// -------------------------------------------------- +/// CREATE NYM -- Create new User +/// +/// Creates a new Nym and adds it to the wallet. +/// (Including PUBLIC and PRIVATE KEYS.) +/// +/// Returns a new User ID (with files already created) +/// or NULL upon failure. +/// +/// Once it exists, use OT_API_createUserAccount() to +/// register your new Nym at any given Server. (Nearly all +/// server requests require this...) +/// +const char * OT_API_CreateNym(void); + + + +// -------------------------------------------------- +/// ADD SERVER CONTRACT +/// If you have a server contract that you'd like to add +/// to your wallet, call this function. +/// +int OT_API_AddServerContract(const char * szContract); // returns OT_TRUE (1) or OT_FALSE(0) + + + + +// -------------------------------------------------- +/// ADD ASSET CONTRACT +/// If you have an asset contract that you'd like to add +/// to your wallet, call this function. +/// +int OT_API_AddAssetContract(const char * szContract); // returns OT_TRUE (1) or OT_FALSE(0) + + + +// -------------------------------------------------- + +/// NOTE: THE BELOW FUNCTIONS *DO NOT* SEND ANY MESSAGE TO THE SERVER, +/// BUT RATHER, THEY ONLY QUERY FOR DATA FROM LOCAL STORAGE. +/// +/// Often a server response will cause a change to the data in local storage. +/// These functions allow you to re-load that data so your GUI can reflect +/// the updates to those files. +/// +int OT_API_GetServerCount(void); +int OT_API_GetAssetTypeCount(void); +int OT_API_GetAccountCount(void); +int OT_API_GetNymCount(void); + + + +const char * OT_API_GetServer_ID(int nIndex); // based on Index (above 4 functions) this returns the Server's ID +const char * OT_API_GetServer_Name(const char * SERVER_ID); // Return's Server's name (based on server ID) + + + + +const char * OT_API_GetAssetType_ID(int nIndex); // returns Asset Type ID (based on index from GetAssetTypeCount) +const char * OT_API_GetAssetType_Name(const char * ASSET_TYPE_ID); // Returns asset type name based on Asset Type ID + + + +/// You already have accounts in your wallet (without any server communications) +/// and these functions allow you to query the data members of those accounts. +/// Thus, "AccountWallet" denotes that you are examining copies of your accounts that +/// are sitting in your wallet. Originally the purpose was to eliminate confusion with +/// a different set of similarly-named functions. +const char * OT_API_GetAccountWallet_ID(int nIndex); // returns a string containing the account ID, based on index. +const char * OT_API_GetAccountWallet_Name(const char * ACCOUNT_ID); // returns the account name, based on account ID. +const char * OT_API_GetAccountWallet_Balance(const char * ACCOUNT_ID); // returns the account balance, based on account ID. +const char * OT_API_GetAccountWallet_Type(const char * ACCOUNT_ID); // returns the account type (simple, issuer, etc) +const char * OT_API_GetAccountWallet_AssetTypeID(const char * ACCOUNT_ID); // returns asset type ID of the account +const char * OT_API_GetAccountWallet_ServerID(const char * ACCOUNT_ID); // returns Server ID of the account +const char * OT_API_GetAccountWallet_NymID(const char * ACCOUNT_ID); // returns Nym ID of the account + +/// Returns OT_BOOL. Verifies any asset account (intermediary files) against its own last signed receipt. +/// Obviously this will fail for any new account that hasn't done any transactions yet, and thus has no receipts. +int OT_API_VerifyAccountReceipt(const char * SERVER_ID, const char * NYM_ID, const char * ACCT_ID); + + +//---------------------------------------------------------- +/// GET NYM TRANSACTION NUM COUNT +/// How many transaction numbers does the Nym have (for a given server?) +/// +/// This function returns the count of numbers available. If 0, then no +/// transactions will work until you call OT_API_getTransactionNumber() +/// to replenish your Nym's supply for that ServerID... +/// +/// Returns a count (0 through N numbers available), +/// or -1 for error (no nym found.) +/// +int OT_API_GetNym_TransactionNumCount(const char * SERVER_ID, const char * NYM_ID); + +const char * OT_API_GetNym_ID(int nIndex); /// based on Index (above 4 functions) this returns the Nym's ID +const char * OT_API_GetNym_Name(const char * NYM_ID); /// Returns Nym Name (based on NymID) +const char * OT_API_GetNym_Stats(const char * NYM_ID); /// Returns Nym Statistics (based on NymID) + +int OT_API_IsNym_RegisteredAtServer(const char * NYM_ID, const char * SERVER_ID); // actually returns OT_BOOL + + +/// Each Nym has mail messages, they can come from different servers. +/// This allows you to peruse the mail for a given Nym, and erase messages. +/// +/*** + + So how would you actually USE this to browse a Nym's mail? + + -- Call OT_API_GetNym_MailCount() to find out how many mail items there are. + + -- Then LOOP through them, and use OT_API_GetNym_MailSenderIDByIndex and + OT_API_GetNym_MailServerIDByIndex to populate the list. + + -- If you want to add a subject display, you'll have to call OT_API_GetNym_MailContentsByIndex() + and check for a first line beginning in Subject: (there may not be one.) + + -- OT_API_GetNym_MailContentsByIndex returns the body of the mail regardless. + + -- Use OT_API_Nym_VerifyMailByIndex() to verify the signature on the mail, + + -- and use OT_API_Nym_RemoveMailByIndex() to erase mail (when you want to.) + + */ + +int OT_API_GetNym_MailCount(const char * NYM_ID); + +const char * OT_API_GetNym_MailContentsByIndex(const char * NYM_ID, int nIndex); /// returns the message itself (Subject: optionally as first line) + +const char * OT_API_GetNym_MailSenderIDByIndex(const char * NYM_ID, int nIndex); /// returns the NymID of the sender. +const char * OT_API_GetNym_MailServerIDByIndex(const char * NYM_ID, int nIndex); /// returns the ServerID where the message came from. + +int OT_API_Nym_RemoveMailByIndex(const char * NYM_ID, int nIndex); /// actually returns OT_BOOL, (1 or 0.) +int OT_API_Nym_VerifyMailByIndex(const char * NYM_ID, int nIndex); /// actually returns OT_BOOL. OT_TRUE if signature verifies. (Sender Nym MUST be in my wallet for this to work.) + +// --------------------------------------------------------- + +int OT_API_GetNym_OutmailCount(const char * NYM_ID); + +const char * OT_API_GetNym_OutmailContentsByIndex(const char * NYM_ID, int nIndex); /// returns the message itself (Subject: optionally as first line) + +const char * OT_API_GetNym_OutmailRecipientIDByIndex(const char * NYM_ID, int nIndex); /// returns the NymID of the recipient. +const char * OT_API_GetNym_OutmailServerIDByIndex(const char * NYM_ID, int nIndex); /// returns the ServerID where the message came from. + +int OT_API_Nym_RemoveOutmailByIndex(const char * NYM_ID, int nIndex); /// actually returns OT_BOOL, (1 or 0.) +int OT_API_Nym_VerifyOutmailByIndex(const char * NYM_ID, int nIndex); /// actually returns OT_BOOL. OT_TRUE if signature verifies. (Sender Nym MUST be in my wallet for this to work.) + +// --------------------------------------------------------- + +/// *** FUNCTIONS FOR REMOVING VARIOUS CONTRACTS AND NYMS FROM THE WALLET *** + +/// Can I remove this server contract from my wallet? +/// +/// You cannot remove the server contract from your wallet if there are accounts in there using it. +/// This function tells you whether you can remove the server contract or not. (Whether there are accounts...) +/// returns OT_BOOL +/// +int OT_API_Wallet_CanRemoveServer(const char * SERVER_ID); + +/// Remove this server contract from my wallet! +/// +/// Try to remove the server contract from the wallet. +/// This will not work if there are any accounts in the wallet for the same server ID. +/// returns OT_BOOL +/// +int OT_API_Wallet_RemoveServer(const char * SERVER_ID); + + + +/// Can I remove this asset contract from my wallet? +/// +/// You cannot remove the asset contract from your wallet if there are accounts in there using it. +/// This function tells you whether you can remove the asset contract or not. (Whether there are accounts...) +/// returns OT_BOOL +/// +int OT_API_Wallet_CanRemoveAssetType(const char * ASSET_ID); + + +/// Remove this asset contract from my wallet! +/// +/// Try to remove the asset contract from the wallet. +/// This will not work if there are any accounts in the wallet for the same asset type ID. +/// returns OT_BOOL +/// +int OT_API_Wallet_RemoveAssetType(const char * ASSET_ID); + + + +/// Can I remove this Nym from my wallet? +/// +/// You cannot remove the Nym from your wallet if there are accounts in there using it. +/// This function tells you whether you can remove the Nym or not. (Whether there are accounts...) +/// returns OT_BOOL +/// +int OT_API_Wallet_CanRemoveNym(const char * NYM_ID); + + +/// Remove this Nym from my wallet! +/// +/// Try to remove the Nym from the wallet. +/// This will not work if there are any nyms in the wallet for the same server ID. +/// returns OT_BOOL +/// +int OT_API_Wallet_RemoveNym(const char * NYM_ID); + + + +/// Can I remove this Account from my wallet? +/// +/// You cannot remove the Account from your wallet if there are transactions still open. +/// This function tells you whether you can remove the Account or not. (Whether there are transactions...) +/// returns OT_BOOL +/// +int OT_API_Wallet_CanRemoveAccount(const char * ACCOUNT_ID); + + +// See OT_API_deleteAssetAccount(), a server message, for deleting asset accounts. +// (You can't just delete them out of the wallet without first deleting them off of the server.) +// + + + + +const char * OT_API_Wallet_ImportNym(const char * DISPLAY_NAME, const char * KEY_FILE_CONTENTS); + + + + + +// ----------------------------------- +/// SET NYM NAME +/// +/// You might have 40 of your friends' public nyms in +/// your wallet. You might have labels on each of them. +/// But whenever you change a label (and thus re-sign the +/// file for that Nym when you save it), you only SIGN +/// using one of your OWN nyms, for which you have a private +/// key available for signing. +/// +/// Signer Nym? +/// When testing, there is only one nym, so you just pass it +/// twice. But in real production, a user will have a default +/// signing nym, the same way that he might have a default +/// signing key in PGP, and that must be passed in whenever +/// he changes the name on any of the other nyms in his wallet. +/// (In order to properly sign and save the change.) +/// +/// Returns OT_TRUE (1) or OT_FALSE (0) +/// +int OT_API_SetNym_Name(const char * NYM_ID, + const char * SIGNER_NYM_ID, + const char * NYM_NEW_NAME); // actually returns OT_BOOL. + +/// Returns OT_TRUE (1) or OT_FALSE (0) +/// The asset account's name is merely a client-side label. +int OT_API_SetAccountWallet_Name(const char * ACCT_ID, + const char * SIGNER_NYM_ID, + const char * ACCT_NEW_NAME); +/// actually returns OT_BOOL. +int OT_API_SetAssetType_Name(const char * ASSET_ID, + const char * STR_NEW_NAME); +/// actually returns OT_BOOL. +int OT_API_SetServer_Name(const char * SERVER_ID, + const char * STR_NEW_NAME); + + +/// (Above) IMPORTANT: USE the above functions for setting the CLIENT-SIDE +/// display labels that you use in your UI for the Nyms/Servers/AssetTypes/Accounts. +/// These labels are stored SEPARATELY from their own files, in the wallet file. +/// +/// If you just added the contract, it will SET the label for you based on the contract type. +/// like if it's an asset contract, it uses the currency name field from the asset contract. +/// If it's a server contract it uses the entity short name. After that, it's +/// configurable for the user, and stays on client side, and persists via wallet. +/// +/// EVEN WHEN OT has to re-download one of those files, it will make sure to save +/// the display label properly in the wallet. +/// +/// THIS MEANS *you*, as a client developer: +/// 1) CAN DEPEND on these labels to have the right value. +/// 2) Can expect them to start out with good default values. +/// 3) Can configure them from there. +/// 4) SHOULD DISPLAY THEM as appropriate in your application. +/// 5) Of course, use the ID behind the scenes for making all your +/// OT calls... just use the name for display purposes. +/// + + + +// -------------------------------------------------- +/// Verify and Retrieve XML Contents. +/// +/// Pass in a contract and a user ID, and this function will: +/// -- Load the contract up and verify it. (Most classes in OT +/// are derived in some way from OTContract.) +/// -- Verify the user's signature on it. +/// -- Remove the PGP-style bookends (the signatures, etc) +/// and return the XML contents of the contract in string form. <== +/// +const char * OT_API_VerifyAndRetrieveXMLContents(const char * THE_CONTRACT, + const char * USER_ID); + + + + +// ---------------------------------------------------------------------- +/** + + WRITE A CHEQUE --- (Returns the cheque in string form.) + + ==> OT_API_WriteCheque() internally constructs an OTCheque + and issues it, like so: + + OTCheque theCheque( SERVER_ID, ASSET_TYPE_ID ); + + theCheque.IssueCheque( AMOUNT // The amount of the cheque, in string form, which OTAPI + // will convert to a long integer. Negative amounts + // allowed, since that is how OT implements invoices. + // (An invoice is just a cheque with a negative amount.) + + lTransactionNumber, // The API will supply this automatically, as long as + // there are some transaction numbers in the wallet. (Call + // OT_API_getTransactionNumber() if your wallet needs more.) + + VALID_FROM, VALID_TO, // Valid date range (in seconds since Jan 1970...) + + ACCOUNT_ID, USER_ID, // User ID and Acct ID for SENDER. + + CHEQUE_MEMO, // The memo for the cheque. (Can be empty or be NULL.) + + RECIPIENT_USER_ID); // Recipient User ID is optional. (You can use an + // empty string here, to write a blank cheque, or pass NULL.) + */ +const char * OT_API_WriteCheque(const char * SERVER_ID, + const char * CHEQUE_AMOUNT, + const char * VALID_FROM, + const char * VALID_TO, + const char * SENDER_ACCT_ID, + const char * SENDER_USER_ID, + const char * CHEQUE_MEMO, + const char * RECIPIENT_USER_ID); + + + + +// ---------------------------------------------------------------------- + +/** + + PROPOSE PAYMENT PLAN --- Returns the payment plan in string form. + + (Called by Merchant.) + + PARAMETER NOTES: + -- Payment Plan Delay, and Payment Plan Period, both default to 30 days (if you pass 0.) + + -- Payment Plan Length, and Payment Plan Max Payments, both default to 0, which means + no maximum length and no maximum number of payments. + + ----------------------------------------------------------------- + FYI, the payment plan creation process (finally) is: + + 1) Payment plan is written, and signed, by the recipient. (This function: OT_API_ProposePaymentPlan) + 2) He sends it to the sender, who signs it and submits it. (OT_API_ConfirmPaymentPlan and OT_API_depositPaymentPlan) + 3) The server loads the recipient nym to verify the transaction + number. The sender also had to burn a transaction number (to + submit it) so now, both have verified trns#s in this way. + + ---------------------------------------------------------------------------------------- + + FYI, here are all the OT library calls that are performed by this single API call: + +OTPaymentPlan * pPlan = new OTPaymentPlan(pAccount->GetRealServerID(), + pAccount->GetAssetTypeID(), + pAccount->GetRealAccountID(), pAccount->GetUserID(), + RECIPIENT_ACCT_ID, RECIPIENT_USER_ID); + + ---------------------------------------------------------------------------------------- + From OTAgreement: (This must be called first, before the other two methods below can be called.) + + bool OTAgreement::SetProposal( const OTPseudonym & MERCHANT_NYM, const OTString & strConsideration, + const time_t & VALID_FROM=0, const time_t & VALID_TO=0); + + ---------------------------------------------------------------------------------------- + (Optional initial payment): +bool OTPaymentPlan::SetInitialPayment(const long & lAmount, time_t tTimeUntilInitialPayment=0); // default: now. + ---------------------------------------------------------------------------------------- + + These two (above and below) can be called independent of each other. You can + have an initial payment, AND/OR a payment plan. + + ---------------------------------------------------------------------------------------- + (Optional regular payments): +bool OTPaymentPlan::SetPaymentPlan(const long & lPaymentAmount, + time_t tTimeUntilPlanStart=LENGTH_OF_MONTH_IN_SECONDS, // Default: 1st payment in 30 days + time_t tBetweenPayments=LENGTH_OF_MONTH_IN_SECONDS, // Default: 30 days. + time_t tPlanLength=0, int nMaxPayments=0); + ---------------------------------------------------------------------------------------- +*/ +const char * OT_API_ProposePaymentPlan(const char * SERVER_ID, + // ---------------------------------------- + const char * VALID_FROM, // Default (0 or NULL) == NOW + const char * VALID_TO, // Default (0 or NULL) == no expiry / cancel anytime + // ---------------------------------------- + const char * SENDER_ACCT_ID, // Mandatory parameters. + const char * SENDER_USER_ID, // Both sender and recipient must sign before submitting. + // ---------------------------------------- + const char * PLAN_CONSIDERATION, // Like a memo. + // ---------------------------------------- + const char * RECIPIENT_ACCT_ID, // NOT optional. + const char * RECIPIENT_USER_ID, // Both sender and recipient must sign before submitting. + // ------------------------------- + const char * INITIAL_PAYMENT_AMOUNT, // zero or NULL == no initial payment. + const char * INITIAL_PAYMENT_DELAY, // seconds from creation date. Default is zero or NULL. + // ---------------------------------------- . + const char * PAYMENT_PLAN_AMOUNT, // zero or NULL == no regular payments. + const char * PAYMENT_PLAN_DELAY, // No. of seconds from creation date. Default is zero or NULL. + const char * PAYMENT_PLAN_PERIOD, // No. of seconds between payments. Default is zero or NULL. + // --------------------------------------- + const char * PAYMENT_PLAN_LENGTH, // In seconds. Defaults to 0 or NULL (no maximum length.) + const char * PAYMENT_PLAN_MAX_PAYMENTS // Integer. Defaults to 0 or NULL (no maximum payments.) + ); + +// Called by Customer. Pass in the plan obtained in the above call. +// +const char * OT_API_ConfirmPaymentPlan(const char * SERVER_ID, + const char * SENDER_USER_ID, + const char * SENDER_ACCT_ID, + const char * RECIPIENT_USER_ID, + const char * PAYMENT_PLAN); + + +// ----------------------------------------------------------------- +/// LOAD USER PUBLIC KEY -- from local storage +/// +/// (returns as STRING) +/// +/// MEANT TO BE USED in cases where a private key is also available. +/// +const char * OT_API_LoadUserPubkey(const char * USER_ID); // returns NULL, or a public key. + + + +// ----------------------------------------------------------------- +/// LOAD PUBLIC KEY -- from local storage +/// +/// (returns as STRING) +/// +/// MEANT TO BE USED in cases where a private key is NOT available. +/// +const char * OT_API_LoadPubkey(const char * USER_ID); // returns NULL, or a public key. + + + + + + +// ------------------------------------------------------------------------ +/// +/// Verify that USER_ID (including its Private Key) is an +/// available and verified user in local storage. +/// +/// Loads the user's private key, verifies, then returns OT_TRUE or OT_FALSE. +/// +int OT_API_VerifyUserPrivateKey(const char * USER_ID); // returns OT_BOOL + + + + + + + + +// -------------------------------------------------------------- +/// LOAD PURSE or MINT or ASSET CONTRACT or SERVER CONTRACT -- (from local storage) +/// +/// Based on Asset Type ID: load a purse, a public mint, or an asset/server contract +/// and return it as a string -- or return NULL if it wasn't found. +/// +const char * OT_API_LoadPurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID); // returns NULL, or a purse. + +const char * OT_API_LoadMint(const char * SERVER_ID, + const char * ASSET_TYPE_ID); // returns NULL, or a mint + +const char * OT_API_LoadAssetContract(const char * ASSET_TYPE_ID); // returns NULL, or an asset contract. + +const char * OT_API_LoadServerContract(const char * SERVER_ID); // returns NULL, or a server contract. + + + + + +/// Returns OT_TRUE if the mint is still usable. +/// Returns OT_FALSE if expired or other error. +// +int OT_API_Mint_IsStillGood(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_TYPE_ID); + + + + +// -------------------------------------------------------------- +/// IS BASKET CURRENCY ? +/// +/// Tells you whether or not a given asset type is actually a basket currency. +/// +int OT_API_IsBasketCurrency(const char * ASSET_TYPE_ID); // returns OT_BOOL (OT_TRUE or OT_FALSE aka 1 or 0.) + + +// -------------------------------------------------------------------- +/// Get Basket Count (of backing asset types.) +/// +/// Returns the number of asset types that make up this basket. +/// (Or zero.) +/// +int OT_API_Basket_GetMemberCount(const char * BASKET_ASSET_TYPE_ID); + + +// -------------------------------------------------------------------- +/// Get Asset Type of a basket's member currency, by index. +/// +/// (Returns a string containing Asset Type ID, or NULL). +/// +const char * OT_API_Basket_GetMemberType(const char * BASKET_ASSET_TYPE_ID, + const int nIndex); + +// ---------------------------------------------------- +/// GET BASKET MINIMUM TRANSFER AMOUNT +/// +/// Returns a long (as string) containing the minimum transfer +/// amount for the entire basket. +/// +/// FOR EXAMPLE: +/// If the basket is defined as 10 Rands == 2 Silver, 5 Gold, 8 Euro, +/// then the minimum transfer amount for the basket is 10. This function +/// would return a string containing "10", in that example. +/// +const char * OT_API_Basket_GetMinimumTransferAmount(const char * BASKET_ASSET_TYPE_ID); + + + +// ---------------------------------------------------- +/// GET BASKET MEMBER's MINIMUM TRANSFER AMOUNT +/// +/// Returns a long (as string) containing the minimum transfer +/// amount for one of the member currencies in the basket. +/// +/// FOR EXAMPLE: +/// If the basket is defined as 10 Rands == 2 Silver, 5 Gold, 8 Euro, +/// then the minimum transfer amount for the member currency at index +/// 0 is 2, the minimum transfer amount for the member currency at +/// index 1 is 5, and the minimum transfer amount for the member +/// currency at index 2 is 8. +/// +const char * OT_API_Basket_GetMemberMinimumTransferAmount(const char * BASKET_ASSET_TYPE_ID, + const int nIndex); + + + + + + + + + + + + + +// -------------------------------------------------------------- +/// LOAD ACCOUNT / INBOX / OUTBOX -- (from local storage) +/// +/// Loads an acct, or inbox or outbox, based on account ID, (from local storage) +/// and returns it as string (or returns NULL if it couldn't load it.) +/// +const char * OT_API_LoadAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID); // Returns NULL, or an account. +const char * OT_API_LoadInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID); // Returns NULL, or an inbox. +const char * OT_API_LoadOutbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID); // returns NULL, or an outbox. + + + + + +// -------------------------------------------------------------- +// Find out how many pending transactions (and receipts) are in this inbox. +int OT_API_Ledger_GetCount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER); // Returns number of transactions within. + + + +// ----------------------------------------------------------------------- +/// Creates a new 'response' ledger, set up with the right Server ID, etc, so you can +/// add the 'response' transactions to it, one by one. (Pass in the original ledger +/// that you are responding to, as it uses the data from it to set up the response.) +/// +const char * OT_API_Ledger_CreateResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * ORIGINAL_LEDGER); + + +// ------------------------------------------------------------------------- +/// Lookup a transaction or its ID (from within a ledger) based on index or +/// transaction number. +// +const char * OT_API_Ledger_GetTransactionByIndex(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + int nIndex); // returns transaction by index. + +const char * OT_API_Ledger_GetTransactionByID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + const char * TRANSACTION_NUMBER); // returns transaction by ID. + +const char * OT_API_Ledger_GetTransactionIDByIndex(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + int nIndex); // returns transaction number by index. + +// -------------------------------------------------------------- +/// Add a transaction to a ledger. +/// +const char * OT_API_Ledger_AddTransaction(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER, + const char * THE_TRANSACTION); + + +// -------------------------------------------------------------- +/// Create a 'response' transaction, that will be used to indicate my +/// acceptance or rejection of another transaction. Usually an entire +/// ledger full of these is sent to the server as I process the various +/// transactions in my inbox. +/// +const char * OT_API_Transaction_CreateResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * RESPONSE_LEDGER, // To be sent to the server... + const char * ORIGINAL_TRANSACTION, // Responding to...? + int BOOL_DO_I_ACCEPT); // 1 or 0 (OT_TRUE or OT_FALSE.) + + + + +/// ------------------------------------------------------------------------- +/// (Response Ledger) LEDGER FINALIZE RESPONSE +/// +/// AFTER you have set up all the transaction responses, call THIS function +/// to finalize them by adding a BALANCE AGREEMENT. +/// +/// MAKE SURE you have the latest copy of the account file, inbox file, and +/// outbox file, since we will need those in here to create the balance statement +/// properly. +/// +/// (Client software may wish to check those things, when downloaded, against +/// the local copies and the local signed receipts. In this way, clients can +/// protect themselves against malicious servers.) +/// +const char * OT_API_Ledger_FinalizeResponse(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_LEDGER); // 'Response' ledger be sent to the server... + + + +// -------------------------------------------------------------------- +/// Get Transaction Type (internally uses GetTransactionTypeString().) +// +const char * OT_API_Transaction_GetType(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + + +// -------------------------------------------------------------------- +/// Retrieve Voucher from Transaction +/// +/// If you withdrew into a voucher instead of cash, this function allows +/// you to retrieve the actual voucher cheque from the reply transaction. +/// (A voucher is a cheque drawn on an internal server account instead +/// of a user's asset account, so the voucher cannot ever bounce due to +/// insufficient funds. We are accustomed to this functionality already +/// in our daily lives, via "money orders" and "cashier's cheques".) +/// +/// How would you use this in full? +/// +/// First, call OT_API_withdrawVoucher() in order to send the request +/// to the server. (You may optionally call OT_API_FlushMessageBuffer() +/// before doing this.) +/// +/// Then, call OT_API_PopMessageBuffer() to retrieve any server reply. +/// +/// If there is a message from the server in reply, then call +/// OT_API_Message_GetCommand to verify that it's a reply to the message +/// that you sent, and call OT_API_Message_GetSuccess to verify whether +/// the message was a success. +/// +/// If it was a success, next call OT_API_Message_GetLedger to retrieve +/// the actual "reply ledger" from the server. +/// +/// Penultimately, call OT_API_Ledger_GetTransactionByID() and then, +/// finally, call OT_API_Transaction_GetVoucher() (below) in order to +/// retrieve the voucher cheque itself from the transaction. +/// +const char * OT_API_Transaction_GetVoucher(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + + +// -------------------------------------------------- +/// +/// Get Transaction Success OT_TRUE (1) == acknowledgment +/// OT_FALSE (0) == rejection +/// Returns OT_BOOL. +/// +int OT_API_Transaction_GetSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + +/// Gets the balance agreement success (from a transaction.) +/// returns OT_BOOL. +// +int OT_API_Transaction_GetBalanceAgreementSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + +/// -------------------------------------------------- +/// +/// Get Transaction Date Signed (internally uses OTTransaction::GetDateSigned().) +/// +const char * OT_API_Transaction_GetDateSigned(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + +const char * OT_API_Transaction_GetAmount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + +// -------------------------------------------------- +/// +/// PENDING TRANSFER (various functions) +/// +/// When someone has sent you a PENDING TRANSFER (a form of transaction +/// that will be sitting in your inbox waiting for you to accept/reject it) +/// then, as you are reading the inbox, you can use these functions in +/// order to get data from each pending transfer. That way your user can +/// then decide whether to accept or reject it (see the ledger functions.) +/// + +const char * OT_API_Pending_GetNote(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + +// ---------- + +const char * OT_API_Transaction_GetSenderUserID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + +const char * OT_API_Transaction_GetSenderAcctID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + +const char * OT_API_Transaction_GetRecipientUserID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + +const char * OT_API_Transaction_GetRecipientAcctID(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + +/// The pending notice in the inbox has a transaction number that +/// was issued to the server (so it could put the notice in your inbox.) +/// But it's IN REFERENCE TO a transfer that was initiated by another +/// user. THIS function will retrieve THAT transaction number, because +/// this function queries a pending transaction to see what transaction +/// it is "in reference to." +/// +const char * OT_API_Transaction_GetDisplayReferenceToNum(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_TRANSACTION); + + + +// --------------------------------------------------------- + + + +/* + const char * OT_API_LoadPurse( const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID); // returns NULL, or a purse. + */ + +/// This should, if USER_ID is NULL, create a Nym to encrypt the tokens to, and just attach +/// it (the dummy nym) as a parameter on the purse, along with its ID. +/// Otherwise use the User ID that's there. +/// +const char * OT_API_CreatePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID); // returns NULL, or a purse. UserID optional. + +/// Warning! This will overwrite whatever purse is there. +/// The proper way to use this function is, LOAD the purse, +/// then IMPORT whatever other purse you want into it, then +/// SAVE it again. +int OT_API_SavePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE); // returns OT_BOOL + +// -------------------------------------------------------------------- +/// Get Purse Total Value (internally uses GetTotalValue().) +/// +/// Returns the purported sum of all the tokens within. +/// +const char * OT_API_Purse_GetTotalValue(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_PURSE); + +// --- + +int OT_API_Purse_Count(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_PURSE); + +/// Returns the TOKEN on top of the stock (LEAVING it on top of the stack, +/// but giving you a string copy of it.) +/// returns NULL if failure. +/// +const char * OT_API_Purse_Peek(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE); + +/// Removes the token from the top of the stock and DESTROYS IT, +/// and RETURNS THE UPDATED PURSE (with the token now missing from it.) +/// WARNING: Do not call this function unless you have PEEK()d FIRST!! +/// Otherwise you will lose the token and get left "holding the bag". +/// returns NULL if failure. +const char * OT_API_Purse_Pop(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE); + +/// Pushes a token onto the stack (of the purse.) +/// Returns the updated purse (now including the token.) +/// Returns NULL if failure. +const char * OT_API_Purse_Push(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE, + const char * THE_TOKEN); + + +// ------------------ + + +/// Returns OT_BOOL +/// Should handle duplicates. Should load, merge, and save. +int OT_API_Wallet_ImportPurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, // you pass in the purse you're trying to import + const char * THE_PURSE); // It should either have your User ID on it, or the key should be inside so you can import. + +/// Messages the server. If failure, make sure you didn't lose that purse!! +/// If success, the new tokens will be returned shortly and saved into the appropriate purse. +/// Note that an asset account isn't necessary to do this... just a nym operating cash-only. +/// The same as exchanging a 20-dollar bill at the teller window for a replacement bill. +/// +void OT_API_exchangePurse(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * USER_ID, + const char * THE_PURSE); + +// -------------- + +/// Tokens are stored in an encrypted state for security reasons. +/// This function is used for exporting those tokens to another Nym, +/// such as a Dummy nym, or another user's Nym. +/// +const char * OT_API_Token_ChangeOwner(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN, + const char * OLD_OWNER_NYM_ID, + const char * NEW_OWNER_NYM_ID); + +/// Returns an encrypted form of the actual blinded token ID. +/// (There's no need to decrypt the ID until redeeming the token, when +/// you re-encrypt it to the server's public key, or until spending it, +/// when you re-encrypt it to the recipient's public key, or exporting +/// it, when you create a dummy recipient and attach it to the purse.) +/// +const char * OT_API_Token_GetID(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN); + +/// The actual cash value of the token. Returns a long int as a string. +/// +const char * OT_API_Token_GetDenomination(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN); + +int OT_API_Token_GetSeries(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN); + + +/// the date is seconds since Jan 1970, but returned as a string. +/// +const char * OT_API_Token_GetValidFrom(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN); + +/// the date is seconds since Jan 1970, but returned as a string. +/// +const char * OT_API_Token_GetValidTo(const char * SERVER_ID, + const char * ASSET_TYPE_ID, + const char * THE_TOKEN); + + +// --------- + +const char * OT_API_Token_GetAssetID(const char * THE_TOKEN); + +const char * OT_API_Token_GetServerID(const char * THE_TOKEN); + + + +// -------------------------------------------------------------------- + + + + +// *** MESSAGES BEING SENT TO THE SERVER -- BELOW!!! *** + + + + +/** + CHECK SERVER ID -- (This is used for "pinging" the server...) + + Notice, if you ever want to send a message, you have to include the + Server ID and the User ID. + + The OTAPI will use the Server ID to look-up the server contract. (FYI, + the Server ID is a hash of the server contract itself, so it is impos- + sible to change the contract, without also changing the ID.) + + Then it will connect to the server based on the connection information + in that contract, send the message, get the reply, and disconnect. + (That's in HTTP mode -- in TCP mode it maintains the connection.) + + It will also encrypt the message to the public key found inside that + contract, so only the person who signed the contract will be able to + read the message. + + Open Transactions will also use the User ID to lookup the public key + for that user. (The UserID, aka NymID, is a hash of the public key + itself.) + + This message is basically just a ping -- it verifies that the server + is really there, and that it can really open the messages that are + encrypted to the key in the server contract. It's the first thing + your wallet software should do. Think of it like a way to PING the + server. + + */ +void OT_API_checkServerID(const char * SERVER_ID, const char * USER_ID); + + +// -------------------------------------------------------------------- +/** + CREATE USER's ACCOUNT (On a specific server.) + + Note: There are USER accounts and ASSET accounts... + + A User account is simply a public key. Whenever you send a message + to the server, you would normally have to send a public key with the + message, so that the server can encrypt the reply back to you. + + Due to this, the server will cache the public key so you only have + to send the ID (which is a hash of the key.) The server uses this ID + to look up the public key and encrypt the response back to you. + + -- Any user can create as many public keys as they wish. So User + accounts are pseudonymous. + + -- Cash token exchanges are possible without a User account (using + an HTTPS proxy operated by the server operator) so users are NOT + forced to create accounts, if they prefer to deal only in cash. + However, it's worth noting that even if they do, the cash itself + IS STILL UNTRACEABLE, due to the Chaumian blinding. + + -- A user may use the same public key at multiple servers, and he + creates his own keys inside the wallet. So this function is less + about "creating" the user account, and more about simply register- + ing a public key on a specific server. + + -- (Wallet software is capable, in OT, of distributing assets across + multiple servers seamlessly, which means it's a requirement that + the user generate his own keys and register them on whichever + servers that he sees fit to trust. + + Since the server contract and public key are both presumed to have + been created by this point, you simply pass in their IDs and the + library will do the rest of the work. + */ +void OT_API_createUserAccount(const char * SERVER_ID, + const char * USER_ID); + +/// This allows you to delete a Nym from any server it is +/// registered at. NOTE: This will FAIL if the Nym has any +/// transactions open at the server ("used but not closed"), +/// as well as if there are any accounts or cron items still +/// open at that server, or any receipts in the Nymbox. +/// +void OT_API_deleteUserAccount(const char * SERVER_ID, + const char * USER_ID); + +/// This allows you to delete an asset account from a server, +/// provided that the balance is 0 and the inbox and outbox are +/// both empty. +/// +void OT_API_deleteAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID); + +// -------------------------------------------------------------------- +/** + CHECK USER --- (Grab his public key based on his User ID.) + + ServerID -- Must be included with every message. + USER_ID -- You must include your own userID so the server can reply. + USER_CHECK_ID -- This is a SECOND user's ID. + + In this message, you are requesting the server to send you the + public key for another user, denoted by his ID in USER_ID_CHECK. + + The server's response will contain the public key of the other + user, so you can encrypt messages or cash to him. Your wallet can + verify that the key is the right one, by hashing it and comparing + the result to the other user's ID. Since the User ID is a hash of + the key, they should always match. + + */ +void OT_API_checkUser(const char * SERVER_ID, + const char * USER_ID, + const char * USER_ID_CHECK); + +// -------------------------------------------------------------------- +/** + SEND USER MESSAGE --- (Send a message to another user, encrypted to his pubkey.) + + ServerID -- Must be included with every message. + USER_ID -- You must include your own userID so the server can reply. + USER_ID_RECIPIENT -- This is a recipient user ID. + RECIPIENT_PUBKEY -- Recipient's public key in base64-encoded form. + THE_MESSAGE -- plaintext message you want to send. A cheque? Some cash? A note? Etc. + + In this message, you are requesting the server to send a message to + another user, encrypted to his public key and dropped in his nymbox. + + */ +void OT_API_sendUserMessage(const char * SERVER_ID, + const char * USER_ID, + const char * USER_ID_RECIPIENT, + const char * RECIPIENT_PUBKEY, + const char * THE_MESSAGE); + +// -------------------------------------------------------------------- +/** + GET REQUEST NUMBER + + Nearly every message to the server needs to have the current "Request + Number" attached to it. This is a number that, for each user, starts at + 0, and increments with each command. Usually, the number simply + increments on both sides, and there is no need to communicate it. + + BUT SOMETIMES the request number GOES OUT OF SYNC... When this happen, + none of your commands will work anymore! + + To fix it, just call this function. + + After you call it, it will automatically synchronize your wallet with + the request number on the server side, and your commands will start + working again. + + Without understanding this simple concept, NONE of your messages will + go through! This mechanism prevents an attack from intercepting a message + and sending it multiple times. + */ +void OT_API_getRequest(const char * SERVER_ID, + const char * USER_ID); + +/** + GET TRANSACTION NUMBER + + Every TRANSACTION must be accompanied by a TRANSACTION NUMBER + and you can only use a transaction number that was given to you + previously by the server. If you run out of transaction numbers, then + just call the below API function to get a new one (call it a few times + so your wallet has a few in reserve.) + + The server usually sends you new transaction numbers whenever you + successfully do commands, but if you run out, you just call that function. + + Without understanding this, none of your transactions would ever go + through! This mechanism is what makes it possible to prove balances + and transactions, without having to store any account history! + */ +void OT_API_getTransactionNumber(const char * SERVER_ID, + const char * USER_ID); + + + +// -------------------------------------------------------------------- +/// ISSUE ASSET TYPE -- Ask the server to issue a new asset type. +/// +/// THE_CONTRACT is actually a string containing the asset contract itself. +/// (And the server will not issue the new asset type unless the key in the +/// contract matches YOUR UserID. Only the contract signer may issue it.) +/// +void OT_API_issueAssetType(const char * SERVER_ID, + const char * USER_ID, + const char * THE_CONTRACT); + + + +// -------------------------------------------------------------------- +/// GET CONTRACT -- Get server's copy of any asset contract, by asset type ID. +/// +void OT_API_getContract(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID); + + + + +// -------------------------------------------------------------------------- +/// Get server's copy of public Mint file (which contains the public minting +/// keys for each asset type. Withdrawal requests will not work for any given +/// asset type until you have downloaded the mint for that asset type.) +/// +void OT_API_getMint(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID); + + + + + +// --------------------------------------------------------------------------- +/// CREATE ASSET ACCOUNT -- of any asset type, (just pass in the Asset Type ID.) +/// +void OT_API_createAssetAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ID); + + + + +// -------------------------------------------------------------------------- +/// GET ACCOUNT -- Send a message to the server asking it to send you the latest +/// copy of any of your asset accounts (incl. the current balance.) +/// +void OT_API_getAccount(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID); + + +// -------------------------------------------------- + + + + + + + + + +// ---------------------------------------------------- +/// GENERATE BASKET CREATION REQUEST +/// +/// (returns the basket in string form.) +/// +/// Call OT_API_AddBasketCreationItem multiple times to add +/// the various currencies to the basket, and then call +/// OT_API_issueBasket to send the request to the server. +/// +const char * OT_API_GenerateBasketCreation(const char * USER_ID, + const char * MINIMUM_TRANSFER); // If basket is X=2,3,4, then this is X. + + +// ---------------------------------------------------- +/// ADD BASKET CREATION ITEM +/// +/// (returns the updated basket in string form.) +/// +/// Call OT_API_GenerateBasketCreation first (above), then +/// call this function multiple times to add the various +/// currencies to the basket, and then call OT_API_issueBasket +/// to send the request to the server. +/// +const char * OT_API_AddBasketCreationItem(const char * USER_ID, // for signature. + const char * THE_BASKET, // created in above call. + const char * ASSET_TYPE_ID, // Adding an asset type to the new basket. + const char * MINIMUM_TRANSFER); // If basket is 5=X,X,X then this is an X. + + +// -------------------------------------------------------------------------- +/// ISSUE BASKET CURRENCY +/// +/// Issue a new asset type based on a BASKET of other asset types! +/// You cannot call this function until you first set up the BASKET_INFO object. +/// I will provide functions for setting up that object, so that you can then +/// call this function to actually message the server with your request. +/// +/// ANYONE can issue a new basket type, but they will have no control over the +/// issuer account. Normally when issuing a currency, you therefore control the +/// issuer account. But with baskets, that is managed internally by the server. +/// This means anyone can define a basket, and all may use it -- but no one +/// controls it except the server. +/// +void OT_API_issueBasket(const char * SERVER_ID, + const char * USER_ID, + const char * THE_BASKET); + + + + + + + + + + +// ---------------------------------------------------- +/// GENERATE BASKET EXCHANGE REQUEST +/// +/// (Returns the new basket exchange request in string form.) +/// +/// Call this function first. Then call OT_API_AddBasketExchangeItem +/// multiple times, and then finally call OT_API_exchangeBasket to +/// send the request to the server. +/// +const char * OT_API_GenerateBasketExchange(const char * SERVER_ID, + const char * USER_ID, + const char * BASKET_ASSET_TYPE_ID, + const char * BASKET_ASSET_ACCT_ID, + // ------------------------------------- + const int TRANSFER_MULTIPLE); + // 1 2 3 + // 5=2,3,4 OR 10=4,6,8 OR 15=6,9,12 Etc. (The MULTIPLE.) + + +// ---------------------------------------------------- +/// ADD BASKET EXCHANGE ITEM +/// +/// Returns the updated basket exchange request in string form. +/// (Or NULL.) +/// +/// Call the above function first. Then call this one multiple +/// times, and then finally call OT_API_exchangeBasket to send +/// the request to the server. +/// +const char * OT_API_AddBasketExchangeItem(const char * SERVER_ID, + const char * USER_ID, + const char * THE_BASKET, + const char * ASSET_TYPE_ID, + const char * ASSET_ACCT_ID); + +// -------------------------------------------------------------------------- +/// EXCHANGE BASKET +/// +/// Send a request to the server asking to exchange in or out of a basket +/// currency. +/// +/// For example, maybe you have 3 gold, 2 silver, and 5 dollars, and those are +/// the ingredients of the "Rand" basket currency. This message allows you to +/// ask the server to convert from your gold, silver, and dollar accounts into +/// your Rand account. (Or convert from your Rand account back into your gold, +/// silver, and dollar accounts.) +/// +/// Other than this conversion process, (with the reserves stored internally by +/// the server) basket accounts are identical to normal asset accounts -- they +/// are merely another asset type ID, and you can use them the same as you would +/// use any other asset type (open accounts, write cheques, withdraw cash, trade +/// on markets, etc.) +/// +void OT_API_exchangeBasket(const char * SERVER_ID, + const char * USER_ID, + const char * BASKET_ASSET_ID, + const char * THE_BASKET, + const int BOOL_EXCHANGE_IN_OR_OUT); // exchanging in == OT_TRUE, out == OT_FALSE. + + + + + + + + + + +// -------------------------------------------------------------------------- +/// WITHDRAW CASH +/// +/// User is requesting the server to withdraw AMOUNT from ACCT_ID and return +/// a purse containing cash tokens. +/// +/// Cash tokens come in specific denominations, such as 10, 25, 100, etc. +/// Thus, if you want to withdraw a specific amount, such as 1291, then +/// you are not withdrawing a single token, but a purse full of them. +/// (An "OTPurse" is the object that contains a list of tokens.) +/// +/// Therefore, any transactions involving cash withdrawals or deposits, +/// you are actually using an OTPurse, rather than manipulating the individual +/// tokens. +/// +/// If Open Transactions receives a purse in reply from the server, it +/// will automatically save the tokens in that purse into your purse +/// file for that asset type. You can then reload the purse using +/// OT_API_LoadPurse, if you want to see the updated contents. +/// +void OT_API_notarizeWithdrawal(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * AMOUNT); + +// -------------------------------------------------------------------------- +/// DEPOSIT CASH +/// +/// Use OT_API_LoadPurse to load a purse from storage, and then use this +/// function to actually deposit that cash into a server account. (The cash +/// must, of course, be the same asset type as the account.) +/// +void OT_API_notarizeDeposit(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * THE_PURSE); + +// -------------------------------------------------------------------------- +/// TRANSFER FROM ONE ASSET ACCOUNT TO ANOTHER +/// +/// Send a request to the server to initiate a transfer from my account to +/// another account's inbox. (With "transfer pending" notice in my outbox). +/// Until the recipient accepts the transfer, I have the option to cancel +/// it while it is still sitting in my outbox. But once he accepts it, it +/// cannot be reversed. +/// The server has signatures from BOTH parties requesting the transfer, and +/// each party has the signature on the other party's request. Receipts are +/// dropped into their respective inboxes. +/// +void OT_API_notarizeTransfer(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_FROM, + const char * ACCT_TO, + const char * AMOUNT, + const char * NOTE); + +// -------------------------------------------------------------------------- +/// GET A COPY OF MY INBOX +/// +/// Each asset account has its own inbox/outbox. +/// If a pending transfer is in my inbox, or a new receipt, I might want to see +/// that. This message asks the server to send me the latest copy of the inbox +/// for any given account (and will save it to my local storage, so I can then +/// load it using OT_API_LoadInbox, which I haven't written yet. +/* + NOTE: the test client, upon receiving a @getInbox response from the server, + will automatically process that into a processInbox command back to the server, + automatically accepting all of the transactions, resulting in a final + @processInbox reply from the server. Obviously a real GUI client would merely + display the inbox to the user, where the user could choose to accept the items + individually. + */ +/** + SO HOW WOULD YOU **USE** THIS? To process your inbox... + + -- First you call OT_API_getInbox to grab the latest inbox from the server. + (You will also want to call OT_API_getOutbox as well as + OT_API_getAccount, since you need to have the latest versions of + those files, or your balance agreement will be calculated wrong, + causing your transaction to fail.) + + -- Then you call OT_API_LoadInbox to load it from local storage. + + During this time, your user has the opportunity to peruse the + inbox, and to decide which transactions therein he wishes to + accept or reject. If you want to display the inbox items on + the screen, use these functions to loop through them: + OT_API_Ledger_GetCount + OT_API_Ledger_GetTransactionByIndex + OT_API_Ledger_GetTransactionIDByIndex + + You will probably ask me for more introspection on the transactions themselves. + (Just ask -- No problem.) Here's what you have right now: + OT_API_Transaction_GetType + + -- Then call OT_API_Ledger_CreateResponse in order to create a + 'response' ledger for that inbox, which will be sent to the server. + + -- Then call OT_API_Ledger_GetCount (pass it the inbox) to find out how many + transactions are inside of it. Use that count to LOOP through them... + + -- Use OT_API_Ledger_GetTransactionByIndex to grab each transaction as + you iterate through the inbox. + + -- Call OT_API_Transaction_CreateResponse to create a response for each + transaction, accepting or rejecting it, and adding it to the response + ledger. + + -- Penultimately, call OT_API_Ledger_FinalizeResponse() which will create + a Balance Agreement for the ledger. + + -- Finally, call OT_API_processInbox to send that response ledger to the + server and process the various items. + */ + +void OT_API_getInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID); + +void OT_API_getOutbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID); + + + +/// from server (pop message buf for the response) +void OT_API_getNymbox(const char * SERVER_ID, + const char * USER_ID); + +/// from local storage. +const char * OT_API_LoadNymbox(const char * SERVER_ID, + const char * USER_ID); // Returns NULL, or a Nymbox. + + + +// -------------------------------------------------------------------------- +/** + PROCESS INBOX + + Assuming I have gone through the various transactions in my inbox, + and chosen some that I wish to accept or reject, this message asks + the server to accept or reject those transactions. + + You must include a copy of the ledger, which contains your accept or + reject requests for the various inbox items. In other words, you will + need to use some other function call first to set up that ledger with + the various requests (accept transfer, accept receipt, etc) before you + can then use THIS function call to actually send those requests to + the server. (See all the Ledger functions.) + + (Try the 'i' command in the test client, if you want to empty out the + inbox and automatically accept all of the transactions within.) + + */ +void OT_API_processInbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * ACCT_LEDGER); + +/// I use this automatically to save the API developers the hassle (for now) +/// added here for completeness. +void OT_API_processNymbox(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_LEDGER); + + +// -------------------------------------------------------------------------- +/// WITHDRAW VOUCHER -- aka CASHIER'S CHEQUE. +/// +/// This is VERY similar to withdrawing cash, except the server gives you +/// a voucher instead of cash. It's the same thing as a CASHIER'S CHEQUE... +/// +/// Basically the funds are moved into an internal server account, and then +/// the server gives you a cheque drawn on its own account. This way you can +/// use it like a cheque, but it will never bounce. +/// +void OT_API_withdrawVoucher(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * RECIPIENT_USER_ID, + const char * CHEQUE_MEMO, + const char * AMOUNT); +// -------------------------------------------------- + + + + + +// -------------------------------------------------------------------------- +/// DEPOSIT A CHEQUE (or VOUCHER) INTO AN ASSET ACCOUNT. +/// +/// If someone gives you a cheque, you can use this function to message the +/// server asking it to deposit the cheque into one of your asset accounts. +/// (Of course the account and the cheque must be the same asset type.) +/// +/// Since a voucher is simply a cheque drawn on an internal server account, +/// you can deposit a voucher the same as any other cheque. +/// +void OT_API_depositCheque(const char * SERVER_ID, + const char * USER_ID, + const char * ACCT_ID, + const char * THE_CHEQUE); +// -------------------------------------------------- + + + + + +// -------------------------------------------------- +/// DEPOSIT (ACTIVATE) PAYMENT PLAN +/// +/// See OT_API_WritePaymentPlan as well. +/// +void OT_API_depositPaymentPlan(const char * SERVER_ID, + const char * USER_ID, + const char * THE_PAYMENT_PLAN); +// -------------------------------------------------- + + + + + +// -------------------------------------------------- +/// ISSUE MARKET OFFER +/// +void OT_API_issueMarketOffer(const char * SERVER_ID, + const char * USER_ID, + // ------------------------------------------- + const char * ASSET_TYPE_ID, // Perhaps this is the + const char * ASSET_ACCT_ID, // wheat market. + // ------------------------------------------- + const char * CURRENCY_TYPE_ID, // Perhaps I'm buying the + const char * CURRENCY_ACCT_ID, // wheat with rubles. + // ------------------------------------------- + const char * MARKET_SCALE, // Defaults to minimum of 1. Market granularity. + const char * MINIMUM_INCREMENT, // This will be multiplied by the Scale. Min 1. + const char * TOTAL_ASSETS_ON_OFFER, // Total assets available for sale or purchase. Will be multiplied by minimum increment. + const char * PRICE_LIMIT, // Per Minimum Increment... + int bBuyingOrSelling); // Actually OT_BOOL. SELLING == OT_TRUE, BUYING == OT_FALSE. + + +// -------------------------------------------------- + + + + +/* + + What objects are actually stored in local storage after a successful server call? + + A "MarketList", which contains a list of Market Datas. Load this up and you can get + pointers to the elements as needed. THERE IS ONLY ONE OF THESE. + + An "OfferList" which contains "all" offers for a specific Market ID. There may be + many markets, so this should be saved by Server / Asset / User the same as Purses. + If you load this object, you can loop through its offers. I don't think a sub-object + is necessary here since the data is so simple. + + A "TradeList" which contains "all" trades for a specific Market ID. There many be + many markets, so this should be saved Server/Asset/User the same as purses. + If you load this object you can loop through the trades, which again, no sub-object + needed since the data here is so simple. But we shall see! + + A "NymOfferList" which contains all offers for a specific nym. Unlike the above offers, + these offers are full-featured and should contain a LOT more details. + + */ + + +// Retrieves details for each market. +// +void OT_API_getMarketList(const char * SERVER_ID, const char * USER_ID); + +// Gets all offers for a specific market and their details (up until maximum depth) +void OT_API_getMarketOffers(const char * SERVER_ID, const char * USER_ID, + const char * MARKET_ID, const char * MAX_DEPTH); // Market Depth + +// Gets all recent trades (up until maximum depth) +void OT_API_getMarketRecentTrades(const char * SERVER_ID, const char * USER_ID, + const char * MARKET_ID); + +// This "Market Offer" data is a lot more detailed than the OT_API_Market_GetOffers() call, which seems similar otherwise. +void OT_API_getNym_MarketOffers(const char * SERVER_ID, const char * USER_ID); // Offers this Nym has out on market. +// These may just be the Cron Receipts... + + + + + +void OT_API_cancelMarketOffer(const char * SERVER_ID, + const char * USER_ID, + const char * ASSET_ACCT_ID, + const char * TRANSACTION_NUMBER); + +void OT_API_cancelPaymentPlan(const char * SERVER_ID, + const char * USER_ID, + const char * FROM_ACCT_ID, + const char * TRANSACTION_NUMBER); + + + + + +// ----------------------------------------------------------- +/// POP MESSAGE BUFFER +/// +/// If there are any replies from the server, they are stored in +/// the message buffer. This function will return those messages +/// (and remove them from the list) one-by-one, newest first. +/// +/// Returns the message as a string. +/// +const char * OT_API_PopMessageBuffer(void); + +void OT_API_FlushMessageBuffer(void); + + +// ----------------------------------------------------------- +/// GET MESSAGE COMMAND TYPE +/// +/// This way you can discover what kind of command it was. +/// All server replies are pre-pended with the @ sign. For example, if +/// you send a "getAccount" message, the server reply is "@getAccount", +/// and if you send "getMint" the reply is "@getMint", and so on. +/// +const char * OT_API_Message_GetCommand(const char * THE_MESSAGE); + + + +// ----------------------------------------------------------- +/// GET MESSAGE SUCCESS (True or False) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. +/// +int OT_API_Message_GetSuccess(const char * THE_MESSAGE); + + + +// ----------------------------------------------------------- +/// GET MESSAGE "DEPTH" (USED FOR MARKET-SPECIFIC MESSAGES.) +/// +/// Returns the count of relevant items, so you know whether to bother reading the payload. +/// Returns -1 if error. +/// +/// The "depth" variable stores the count of items being returned. +/// For example, if I call getMarketList, and 10 markets are returned, +/// then depth will be set to 10. OR, if I call getNym_MarketOffers, and +/// the Nym has 16 offers on the various markets, then the depth will be 16. +/// +/// This value is important when processing server replies to market inquiries. +/// If the depth is 0, then you are done. End. BUT! if it contains a number, such as 10, +/// then that means you will want to next READ those 10 markets (or offers, or trades, etc) +/// out of the server reply's payload. +/// +/// Whereas if success is TRUE, but depth is 0, that means while the message processed +/// successfully, the list was simply empty (and thus it would be a waste of time trying +/// to unpack the non-existent, empty list of data items from the payload of your successful +/// reply.) +/// +int OT_API_Message_GetDepth(const char * THE_MESSAGE); + + + + + +// ----------------------------------------------------------- +/// GET MESSAGE TRANSACTION SUCCESS (True or False) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. +/// +int OT_API_Message_GetTransactionSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_MESSAGE); + + + +// ----------------------------------------------------------- +/// GET BALANCE AGREEMENT SUCCESS (From a MESSAGE.) +/// +/// Returns OT_TRUE (1) for Success and OT_FALSE (0) for Failure. +/// Also returns OT_FALSE for error. (Sorry.) +/// +int OT_API_Message_GetBalanceAgreementSuccess(const char * SERVER_ID, + const char * USER_ID, + const char * ACCOUNT_ID, + const char * THE_MESSAGE); + +// ----------------------------------------------------------- +/// GET MESSAGE LEDGER +/// +/// If you just received a server response to a transaction, and +/// you want to actually iterate through the response ledger for +/// that transaction, this function will retrieve it for you. +/// +const char * OT_API_Message_GetLedger(const char * THE_MESSAGE); + + + + +// ----------------------------------------------------------- +/// GET NEW ASSET TYPE ID +/// +/// If you just issued a new asset type, you'll want to read the +/// server reply and get the new asset type ID out of it. +/// Otherwise how will you ever open accounts in that new type? +/// +const char * OT_API_Message_GetNewAssetTypeID(const char * THE_MESSAGE); + + + +// ----------------------------------------------------------- +/// GET NEW ISSUER ACCOUNT ID +/// +/// If you just issued a new asset type, you'll want to read the +/// server reply and get the new issuer acct ID out of it. +/// Otherwise how will you ever issue anything with it? +/// +const char * OT_API_Message_GetNewIssuerAcctID(const char * THE_MESSAGE); + + +// ----------------------------------------------------------- +/// GET NEW ACCOUNT ID +/// +/// If you just opened a new asset account, you'll want to read the +/// server reply and get the new acct ID out of it. +/// Otherwise how will you know which account you just created? +/// This function allows you to get the new account ID out of the +/// server reply message. +/// +const char * OT_API_Message_GetNewAcctID(const char * THE_MESSAGE); + + +// ------------------------------------------------------------ + + + + + + + +// -------------------------------------------------------------------- +/// CONNECT TO SERVER, and PROCESS SOCKETS +/// +/// NOTE: These two functions are NOT NECESSARY in ZMQ mode! +/// They are only useful in TCP/SSL mode. --Otherwise IGNORE THEM.-- +/// +/// actually returns BOOL // Not necessary in HTTP mode. +int OT_API_ConnectServer(const char * SERVER_ID, const char * USER_ID, + const char * szCA_FILE, const char * szKEY_FILE, + const char * szKEY_PASSWORD); +int OT_API_ProcessSockets(void); // Not necessary in ZMQ mode. +// -------------------------------------------------------------------- + + + + + + + + + + + + + + +// =======> + +// I am actively supporting developers on the API and will be responsive... +// So feel free to ask for what you need on the API, and I'll add it for you. +// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testwallet/OTAPI_java.cpp b/testwallet/OTAPI_java.cpp new file mode 100644 index 000000000..04c3ad5e3 --- /dev/null +++ b/testwallet/OTAPI_java.cpp @@ -0,0 +1,15415 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGJAVA +#define SWIG_DIRECTORS + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + + +/* Fix for jlong on some versions of gcc on Windows */ +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) + typedef long long __int64; +#endif + +/* Fix for jlong on 64-bit x86 Solaris */ +#if defined(__x86_64) +# ifdef _LP64 +# undef _LP64 +# endif +#endif + +#include +#include +#include + + +/* Support for throwing Java exceptions */ +typedef enum { + SWIG_JavaOutOfMemoryError = 1, + SWIG_JavaIOException, + SWIG_JavaRuntimeException, + SWIG_JavaIndexOutOfBoundsException, + SWIG_JavaArithmeticException, + SWIG_JavaIllegalArgumentException, + SWIG_JavaNullPointerException, + SWIG_JavaDirectorPureVirtual, + SWIG_JavaUnknownError +} SWIG_JavaExceptionCodes; + +typedef struct { + SWIG_JavaExceptionCodes code; + const char *java_exception; +} SWIG_JavaExceptions_t; + + +static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { + jclass excep; + static const SWIG_JavaExceptions_t java_exceptions[] = { + { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, + { SWIG_JavaIOException, "java/io/IOException" }, + { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, + { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, + { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, + { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, + { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, + { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, + { SWIG_JavaUnknownError, "java/lang/UnknownError" }, + { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } + }; + const SWIG_JavaExceptions_t *except_ptr = java_exceptions; + + while (except_ptr->code != code && except_ptr->code) + except_ptr++; + + jenv->ExceptionClear(); + excep = jenv->FindClass(except_ptr->java_exception); + if (excep) + jenv->ThrowNew(excep, msg); +} + + +/* Contract support */ + +#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else + +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to Java extensions. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus + +#if defined(DEBUG_DIRECTOR_OWNED) +#include +#endif + +namespace Swig { + /* Java object wrapper */ + class JObjectWrapper { + public: + JObjectWrapper() : jthis_(NULL), weak_global_(true) { + } + + ~JObjectWrapper() { + jthis_ = NULL; + weak_global_ = true; + } + + bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { + if (!jthis_) { + weak_global_ = weak_global; + if (jobj) + jthis_ = ((weak_global_ || !mem_own) ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj)); +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; +#endif + return true; + } else { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; +#endif + return false; + } + } + + jobject get(JNIEnv *jenv) const { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::get("; + if (jthis_) + std::cout << jthis_; + else + std::cout << "null"; + std::cout << ") -> return new local ref" << std::endl; +#endif + return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); + } + + void release(JNIEnv *jenv) { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; +#endif + if (jthis_) { + if (weak_global_) { + if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) + jenv->DeleteWeakGlobalRef((jweak)jthis_); + } else + jenv->DeleteGlobalRef(jthis_); + } + + jthis_ = NULL; + weak_global_ = true; + } + + jobject peek() { + return jthis_; + } + + /* Java proxy releases ownership of C++ object, C++ object is now + responsible for destruction (creates NewGlobalRef to pin Java + proxy) */ + void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { + if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ + if (!weak_global_) { + jenv->DeleteGlobalRef(jthis_); + jthis_ = jenv->NewWeakGlobalRef(jself); + weak_global_ = true; + } + } else { /* Java releases ownership of C++ object's lifetime */ + if (weak_global_) { + jenv->DeleteWeakGlobalRef((jweak)jthis_); + jthis_ = jenv->NewGlobalRef(jself); + weak_global_ = false; + } + } + } + + private: + /* pointer to Java object */ + jobject jthis_; + /* Local or global reference flag */ + bool weak_global_; + }; + + /* director base class */ + class Director { + /* pointer to Java virtual machine */ + JavaVM *swig_jvm_; + + protected: +#if defined (_MSC_VER) && (_MSC_VER<1300) + class JNIEnvWrapper; + friend class JNIEnvWrapper; +#endif + /* Utility class for managing the JNI environment */ + class JNIEnvWrapper { + const Director *director_; + JNIEnv *jenv_; + public: + JNIEnvWrapper(const Director *director) : director_(director), jenv_(0) { +#if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) + // Attach a daemon thread to the JVM. Useful when the JVM should not wait for + // the thread to exit upon shutdown. Only for jdk-1.4 and later. + director_->swig_jvm_->AttachCurrentThreadAsDaemon((void **) &jenv_, NULL); +#else + director_->swig_jvm_->AttachCurrentThread((void **) &jenv_, NULL); +#endif + } + ~JNIEnvWrapper() { +#if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) + // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. + // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. + director_->swig_jvm_->DetachCurrentThread(); +#endif + } + JNIEnv *getJNIEnv() const { + return jenv_; + } + }; + + /* Java object wrapper */ + JObjectWrapper swig_self_; + + /* Disconnect director from Java object */ + void swig_disconnect_director_self(const char *disconn_method) { + JNIEnvWrapper jnienv(this) ; + JNIEnv *jenv = jnienv.getJNIEnv() ; + jobject jobj = swig_self_.peek(); +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; +#endif + if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { + jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); + if (disconn_meth) { +#if defined(DEBUG_DIRECTOR_OWNED) + std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; +#endif + jenv->CallVoidMethod(jobj, disconn_meth); + } + } + } + + public: + Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { + /* Acquire the Java VM pointer */ + jenv->GetJavaVM(&swig_jvm_); + } + + virtual ~Director() { + JNIEnvWrapper jnienv(this) ; + JNIEnv *jenv = jnienv.getJNIEnv() ; + swig_self_.release(jenv); + } + + bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { + return swig_self_.set(jenv, jself, mem_own, weak_global); + } + + jobject swig_get_self(JNIEnv *jenv) const { + return swig_self_.get(jenv); + } + + // Change C++ object's ownership, relative to Java + void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { + swig_self_.java_change_ownership(jenv, jself, take_or_release); + } + }; +} + +#endif /* __cplusplus */ + + +namespace Swig { + namespace { + jclass jclass_otapiJNI = NULL; + jmethodID director_methids[2]; + } +} + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + + using namespace OTDB; + + + +/* --------------------------------------------------- + * C++ director class methods + * --------------------------------------------------- */ + +#include "OTAPI_wrap.h" + +SwigDirector_OTCallback::SwigDirector_OTCallback(JNIEnv *jenv) : OTCallback(), Swig::Director(jenv) { +} + +SwigDirector_OTCallback::~SwigDirector_OTCallback() { + swig_disconnect_director_self("swigDirectorDisconnect"); +} + + +std::string SwigDirector_OTCallback::runOne() { + std::string c_result ; + jstring jresult = 0 ; + JNIEnvWrapper swigjnienv(this) ; + JNIEnv * jenv = swigjnienv.getJNIEnv() ; + jobject swigjobj = (jobject) NULL ; + + if (!swig_override[0]) { + return OTCallback::runOne(); + } + swigjobj = swig_get_self(jenv); + if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { + jresult = (jstring) jenv->CallStaticObjectMethod(Swig::jclass_otapiJNI, Swig::director_methids[0], swigjobj); + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; + if(!jresult) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return c_result; + } + const char *c_result_pstr = (const char *)jenv->GetStringUTFChars(jresult, 0); + if (!c_result_pstr) return c_result; + c_result.assign(c_result_pstr); + jenv->ReleaseStringUTFChars(jresult, c_result_pstr); + } else { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); + } + if (swigjobj) jenv->DeleteLocalRef(swigjobj); + return c_result; +} + +std::string SwigDirector_OTCallback::runTwo() { + std::string c_result ; + jstring jresult = 0 ; + JNIEnvWrapper swigjnienv(this) ; + JNIEnv * jenv = swigjnienv.getJNIEnv() ; + jobject swigjobj = (jobject) NULL ; + + if (!swig_override[1]) { + return OTCallback::runTwo(); + } + swigjobj = swig_get_self(jenv); + if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) { + jresult = (jstring) jenv->CallStaticObjectMethod(Swig::jclass_otapiJNI, Swig::director_methids[1], swigjobj); + if (jenv->ExceptionCheck() == JNI_TRUE) return c_result; + if(!jresult) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return c_result; + } + const char *c_result_pstr = (const char *)jenv->GetStringUTFChars(jresult, 0); + if (!c_result_pstr) return c_result; + c_result.assign(c_result_pstr); + jenv->ReleaseStringUTFChars(jresult, c_result_pstr); + } else { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null upcall object"); + } + if (swigjobj) jenv->DeleteLocalRef(swigjobj); + return c_result; +} + +void SwigDirector_OTCallback::swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global) { + static struct { + const char *mname; + const char *mdesc; + jmethodID base_methid; + } methods[] = { + { + "runOne", "()Ljava/lang/String;", NULL + }, + { + "runTwo", "()Ljava/lang/String;", NULL + } + }; + + static jclass baseclass = 0 ; + + if (swig_set_self(jenv, jself, swig_mem_own, weak_global)) { + if (!baseclass) { + baseclass = jenv->FindClass("com/wrapper/core/jni/OTCallback"); + if (!baseclass) return; + baseclass = (jclass) jenv->NewGlobalRef(baseclass); + } + bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true); + for (int i = 0; i < 2; ++i) { + if (!methods[i].base_methid) { + methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc); + if (!methods[i].base_methid) return; + } + swig_override[i] = false; + if (derived) { + jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc); + swig_override[i] = (methid != methods[i].base_methid); + jenv->ExceptionClear(); + } + } + } +} + + + +#ifdef __cplusplus +extern "C" { +#endif + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_new_1OTCallback(JNIEnv *jenv, jclass jcls) { + jlong jresult = 0 ; + OTCallback *result = 0 ; + + (void)jenv; + (void)jcls; + result = (OTCallback *)new SwigDirector_OTCallback(jenv); + *(OTCallback **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OTCallback(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTCallback *arg1 = (OTCallback *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTCallback **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1runOne(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCallback **)&jarg1; + result = (arg1)->runOne(); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1runOneSwigExplicitOTCallback(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCallback **)&jarg1; + result = (arg1)->OTCallback::runOne(); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1runTwo(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCallback **)&jarg1; + result = (arg1)->runTwo(); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1runTwoSwigExplicitOTCallback(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTCallback *arg1 = (OTCallback *) 0 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCallback **)&jarg1; + result = (arg1)->OTCallback::runTwo(); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1director_1connect(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jswig_mem_own, jboolean jweak_global) { + OTCallback *obj = *((OTCallback **)&objarg); + (void)jcls; + SwigDirector_OTCallback *director = dynamic_cast(obj); + if (director) { + director->swig_connect_director(jenv, jself, jenv->GetObjectClass(jself), (jswig_mem_own == JNI_TRUE), (jweak_global == JNI_TRUE)); + } +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCallback_1change_1ownership(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jtake_or_release) { + OTCallback *obj = *((OTCallback **)&objarg); + SwigDirector_OTCallback *director = dynamic_cast(obj); + (void)jcls; + if (director) { + director->swig_java_change_ownership(jenv, jself, jtake_or_release ? true : false); + } +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_new_1OTCaller(JNIEnv *jenv, jclass jcls) { + jlong jresult = 0 ; + OTCaller *result = 0 ; + + (void)jenv; + (void)jcls; + result = (OTCaller *)new OTCaller(); + *(OTCaller **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OTCaller(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTCaller *arg1 = (OTCaller *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTCaller **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1GetPassword(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTCaller *arg1 = (OTCaller *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + result = (char *)(arg1)->GetPassword(); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1delCallback(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + OTCaller *arg1 = (OTCaller *) 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + (arg1)->delCallback(); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1setCallback(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTCaller **)&jarg1; + arg2 = *(OTCallback **)&jarg2; + (arg1)->setCallback(arg2); +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1isCallbackSet(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jboolean jresult = 0 ; + OTCaller *arg1 = (OTCaller *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + result = (bool)(arg1)->isCallbackSet(); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1callOne(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + OTCaller *arg1 = (OTCaller *) 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + (arg1)->callOne(); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTCaller_1callTwo(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + OTCaller *arg1 = (OTCaller *) 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + (arg1)->callTwo(); +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Set_1PasswordCallback(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jboolean jresult = 0 ; + OTCaller *arg1 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTCaller **)&jarg1; + if (!arg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTCaller & reference is null"); + return 0; + } + result = (bool)OT_API_Set_PasswordCallback(*arg1); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Init(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Init((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadWallet(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_LoadWallet((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SwitchWallet(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetMemlogSize(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_GetMemlogSize(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetMemlogAtIndex(JNIEnv *jenv, jclass jcls, jint jarg1) { + jstring jresult = 0 ; + int arg1 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + result = (char *)OT_API_GetMemlogAtIndex(arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1PeekMemlogFront(JNIEnv *jenv, jclass jcls) { + jstring jresult = 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + result = (char *)OT_API_PeekMemlogFront(); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1PeekMemlogBack(JNIEnv *jenv, jclass jcls) { + jstring jresult = 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + result = (char *)OT_API_PeekMemlogBack(); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1PopMemlogFront(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_PopMemlogFront(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1PopMemlogBack(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_PopMemlogBack(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1CreateNym(JNIEnv *jenv, jclass jcls) { + jstring jresult = 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + result = (char *)OT_API_CreateNym(); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1AddServerContract(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_AddServerContract((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1AddAssetContract(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_AddAssetContract((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetServerCount(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_GetServerCount(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAssetTypeCount(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_GetAssetTypeCount(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountCount(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_GetAccountCount(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNymCount(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_GetNymCount(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetServer_1ID(JNIEnv *jenv, jclass jcls, jint jarg1) { + jstring jresult = 0 ; + int arg1 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + result = (char *)OT_API_GetServer_ID(arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetServer_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetServer_Name((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAssetType_1ID(JNIEnv *jenv, jclass jcls, jint jarg1) { + jstring jresult = 0 ; + int arg1 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + result = (char *)OT_API_GetAssetType_ID(arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAssetType_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1ID(JNIEnv *jenv, jclass jcls, jint jarg1) { + jstring jresult = 0 ; + int arg1 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + result = (char *)OT_API_GetAccountWallet_ID(arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1Balance(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1Type(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1AssetTypeID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1ServerID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetAccountWallet_1NymID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1VerifyAccountReceipt(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1TransactionNumCount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1ID(JNIEnv *jenv, jclass jcls, jint jarg1) { + jstring jresult = 0 ; + int arg1 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (int)jarg1; + result = (char *)OT_API_GetNym_ID(arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetNym_Name((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1Stats(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1IsNym_1RegisteredAtServer(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1MailCount(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1MailContentsByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1MailSenderIDByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1MailServerIDByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Nym_1RemoveMailByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Nym_1VerifyMailByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1OutmailCount(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1OutmailContentsByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1OutmailRecipientIDByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GetNym_1OutmailServerIDByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Nym_1RemoveOutmailByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Nym_1VerifyOutmailByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1CanRemoveServer(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1RemoveServer(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1CanRemoveAssetType(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1RemoveAssetType(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1CanRemoveNym(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1RemoveNym(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1CanRemoveAccount(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1ImportNym(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SetNym_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SetAccountWallet_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SetAssetType_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SetServer_1Name(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1VerifyAndRetrieveXMLContents(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1WriteCheque(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7, jstring jarg8) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + arg6 = 0; + if (jarg6) { + arg6 = (char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6) return 0; + } + arg7 = 0; + if (jarg7) { + arg7 = (char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7) return 0; + } + arg8 = 0; + if (jarg8) { + arg8 = (char *)jenv->GetStringUTFChars(jarg8, 0); + if (!arg8) return 0; + } + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6); + if (arg7) jenv->ReleaseStringUTFChars(jarg7, (const char *)arg7); + if (arg8) jenv->ReleaseStringUTFChars(jarg8, (const char *)arg8); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1ProposePaymentPlan(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7, jstring jarg8, jstring jarg9, jstring jarg10, jstring jarg11, jstring jarg12, jstring jarg13, jstring jarg14, jstring jarg15) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + arg6 = 0; + if (jarg6) { + arg6 = (char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6) return 0; + } + arg7 = 0; + if (jarg7) { + arg7 = (char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7) return 0; + } + arg8 = 0; + if (jarg8) { + arg8 = (char *)jenv->GetStringUTFChars(jarg8, 0); + if (!arg8) return 0; + } + arg9 = 0; + if (jarg9) { + arg9 = (char *)jenv->GetStringUTFChars(jarg9, 0); + if (!arg9) return 0; + } + arg10 = 0; + if (jarg10) { + arg10 = (char *)jenv->GetStringUTFChars(jarg10, 0); + if (!arg10) return 0; + } + arg11 = 0; + if (jarg11) { + arg11 = (char *)jenv->GetStringUTFChars(jarg11, 0); + if (!arg11) return 0; + } + arg12 = 0; + if (jarg12) { + arg12 = (char *)jenv->GetStringUTFChars(jarg12, 0); + if (!arg12) return 0; + } + arg13 = 0; + if (jarg13) { + arg13 = (char *)jenv->GetStringUTFChars(jarg13, 0); + if (!arg13) return 0; + } + arg14 = 0; + if (jarg14) { + arg14 = (char *)jenv->GetStringUTFChars(jarg14, 0); + if (!arg14) return 0; + } + arg15 = 0; + if (jarg15) { + arg15 = (char *)jenv->GetStringUTFChars(jarg15, 0); + if (!arg15) return 0; + } + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6); + if (arg7) jenv->ReleaseStringUTFChars(jarg7, (const char *)arg7); + if (arg8) jenv->ReleaseStringUTFChars(jarg8, (const char *)arg8); + if (arg9) jenv->ReleaseStringUTFChars(jarg9, (const char *)arg9); + if (arg10) jenv->ReleaseStringUTFChars(jarg10, (const char *)arg10); + if (arg11) jenv->ReleaseStringUTFChars(jarg11, (const char *)arg11); + if (arg12) jenv->ReleaseStringUTFChars(jarg12, (const char *)arg12); + if (arg13) jenv->ReleaseStringUTFChars(jarg13, (const char *)arg13); + if (arg14) jenv->ReleaseStringUTFChars(jarg14, (const char *)arg14); + if (arg15) jenv->ReleaseStringUTFChars(jarg15, (const char *)arg15); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1ConfirmPaymentPlan(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadUserPubkey(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadPubkey(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_LoadPubkey((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1VerifyUserPrivateKey(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadPurse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadMint(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadAssetContract(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadServerContract(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_LoadServerContract((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Mint_1IsStillGood(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1IsBasketCurrency(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Basket_1GetMemberCount(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Basket_1GetMemberType(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Basket_1GetMinimumTransferAmount(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Basket_1GetMemberMinimumTransferAmount(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + int arg2 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = (int)jarg2; + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadAssetAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadInbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadOutbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1GetCount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1CreateResponse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1GetTransactionByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jint jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = (int)jarg5; + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1GetTransactionByID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1GetTransactionIDByIndex(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jint jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = (int)jarg5; + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1AddTransaction(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1CreateResponse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jint jarg6) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + arg6 = (int)jarg6; + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Ledger_1FinalizeResponse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetType(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetVoucher(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetSuccess(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetBalanceAgreementSuccess(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetDateSigned(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetAmount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Pending_1GetNote(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetSenderUserID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetSenderAcctID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetRecipientUserID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetRecipientAcctID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Transaction_1GetDisplayReferenceToNum(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1CreatePurse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1SavePurse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Purse_1GetTotalValue(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Purse_1Count(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Purse_1Peek(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Purse_1Pop(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Purse_1Push(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Wallet_1ImportPurse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1exchangePurse(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1ChangeOwner(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetDenomination(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetSeries(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetValidFrom(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetValidTo(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetAssetID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Token_1GetServerID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1checkServerID(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1createUserAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1deleteUserAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1deleteAssetAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1checkUser(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1sendUserMessage(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return ; + } + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getRequest(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_getRequest((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getTransactionNumber(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1issueAssetType(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getContract(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getMint(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1createAssetAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getAccount(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GenerateBasketCreation(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1AddBasketCreationItem(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1issueBasket(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1GenerateBasketExchange(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jint jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = (int)jarg5; + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1AddBasketExchangeItem(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1exchangeBasket(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jint jarg5) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + arg5 = (int)jarg5; + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1notarizeWithdrawal(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1notarizeDeposit(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1notarizeTransfer(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return ; + } + arg6 = 0; + if (jarg6) { + arg6 = (char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6) return ; + } + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getInbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getOutbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getNymbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1LoadNymbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1processInbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1processNymbox(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1withdrawVoucher(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return ; + } + arg6 = 0; + if (jarg6) { + arg6 = (char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6) return ; + } + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1depositCheque(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1depositPaymentPlan(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1issueMarketOffer(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7, jstring jarg8, jstring jarg9, jstring jarg10, jint jarg11) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return ; + } + arg6 = 0; + if (jarg6) { + arg6 = (char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6) return ; + } + arg7 = 0; + if (jarg7) { + arg7 = (char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7) return ; + } + arg8 = 0; + if (jarg8) { + arg8 = (char *)jenv->GetStringUTFChars(jarg8, 0); + if (!arg8) return ; + } + arg9 = 0; + if (jarg9) { + arg9 = (char *)jenv->GetStringUTFChars(jarg9, 0); + if (!arg9) return ; + } + arg10 = 0; + if (jarg10) { + arg10 = (char *)jenv->GetStringUTFChars(jarg10, 0); + if (!arg10) return ; + } + arg11 = (int)jarg11; + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6); + if (arg7) jenv->ReleaseStringUTFChars(jarg7, (const char *)arg7); + if (arg8) jenv->ReleaseStringUTFChars(jarg8, (const char *)arg8); + if (arg9) jenv->ReleaseStringUTFChars(jarg9, (const char *)arg9); + if (arg10) jenv->ReleaseStringUTFChars(jarg10, (const char *)arg10); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getMarketList(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getMarketOffers(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getMarketRecentTrades(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1getNym_1MarketOffers(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1cancelMarketOffer(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1cancelPaymentPlan(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return ; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return ; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return ; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return ; + } + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1PopMessageBuffer(JNIEnv *jenv, jclass jcls) { + jstring jresult = 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + result = (char *)OT_API_PopMessageBuffer(); + if (result) jresult = jenv->NewStringUTF((const char *)result); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1FlushMessageBuffer(JNIEnv *jenv, jclass jcls) { + (void)jenv; + (void)jcls; + OT_API_FlushMessageBuffer(); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetCommand(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetSuccess(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetDepth(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (int)OT_API_Message_GetDepth((char const *)arg1); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetTransactionSuccess(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetBalanceAgreementSuccess(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetLedger(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetNewAssetTypeID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetNewIssuerAcctID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1Message_1GetNewAcctID(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + char *arg1 = (char *) 0 ; + char *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + if (result) jresult = jenv->NewStringUTF((const char *)result); + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1ConnectServer(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jint jresult = 0 ; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int result; + + (void)jenv; + (void)jcls; + arg1 = 0; + if (jarg1) { + arg1 = (char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1) return 0; + } + arg2 = 0; + if (jarg2) { + arg2 = (char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2) return 0; + } + arg3 = 0; + if (jarg3) { + arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3) return 0; + } + arg4 = 0; + if (jarg4) { + arg4 = (char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4) return 0; + } + arg5 = 0; + if (jarg5) { + arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5) return 0; + } + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + jresult = (jint)result; + if (arg1) jenv->ReleaseStringUTFChars(jarg1, (const char *)arg1); + if (arg2) jenv->ReleaseStringUTFChars(jarg2, (const char *)arg2); + if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3); + if (arg4) jenv->ReleaseStringUTFChars(jarg4, (const char *)arg4); + if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5); + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_OT_1API_1ProcessSockets(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + int result; + + (void)jenv; + (void)jcls; + result = (int)OT_API_ProcessSockets(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_PACK_1MESSAGE_1PACK_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::PackType result; + + (void)jenv; + (void)jcls; + result = (OTDB::PackType)OTDB::PACK_MESSAGE_PACK; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_PACK_1PROTOCOL_1BUFFERS_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::PackType result; + + (void)jenv; + (void)jcls; + result = (OTDB::PackType)OTDB::PACK_PROTOCOL_BUFFERS; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_PACK_1TYPE_1ERROR_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::PackType result; + + (void)jenv; + (void)jcls; + result = (OTDB::PackType)OTDB::PACK_TYPE_ERROR; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORE_1FILESYSTEM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StorageType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StorageType)OTDB::STORE_FILESYSTEM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORE_1TYPE_1SUBCLASS_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StorageType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StorageType)OTDB::STORE_TYPE_SUBCLASS; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1STRING_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_STRING; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1BLOB_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_BLOB; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1STRING_1MAP_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_STRING_MAP; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1WALLET_1DATA_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_WALLET_DATA; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1BITCOIN_1ACCT_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_BITCOIN_ACCT; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1BITCOIN_1SERVER_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_BITCOIN_SERVER; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1RIPPLE_1SERVER_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_RIPPLE_SERVER; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1LOOM_1SERVER_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_LOOM_SERVER; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1SERVER_1INFO_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_SERVER_INFO; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1CONTACT_1NYM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_CONTACT_NYM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1CONTACT_1ACCT_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_CONTACT_ACCT; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1CONTACT_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_CONTACT; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1ADDRESS_1BOOK_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_ADDRESS_BOOK; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1MARKET_1DATA_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_MARKET_DATA; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1MARKET_1LIST_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_MARKET_LIST; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1BID_1DATA_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_BID_DATA; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1ASK_1DATA_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_ASK_DATA; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1OFFER_1LIST_1MARKET_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_OFFER_LIST_MARKET; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1TRADE_1DATA_1MARKET_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_TRADE_DATA_MARKET; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1TRADE_1LIST_1MARKET_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_TRADE_LIST_MARKET; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1OFFER_1DATA_1NYM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_OFFER_DATA_NYM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1OFFER_1LIST_1NYM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_OFFER_LIST_NYM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1TRADE_1DATA_1NYM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_TRADE_DATA_NYM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1TRADE_1LIST_1NYM_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_TRADE_LIST_NYM; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_STORED_1OBJ_1ERROR_1get(JNIEnv *jenv, jclass jcls) { + jint jresult = 0 ; + OTDB::StoredObjectType result; + + (void)jenv; + (void)jcls; + result = (OTDB::StoredObjectType)OTDB::STORED_OBJ_ERROR; + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Storable(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Storable **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storable_1Create(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storable_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1GetPacker_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + OTPacker *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTPacker *)(arg1)->GetPacker(arg2); + *(OTPacker **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1GetPacker_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTPacker *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + result = (OTPacker *)(arg1)->GetPacker(); + *(OTPacker **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + if(!jarg7) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg7_pstr = (const char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7_pstr) return 0; + (&arg7)->assign(arg7_pstr); + jenv->ReleaseStringUTFChars(jarg7, arg7_pstr); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->Init(arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_14(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->Init(arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_15(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)(arg1)->Init(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Init_1_1SWIG_16(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + result = (bool)(arg1)->Init(); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Exists_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Exists_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Exists_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->Exists(arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Exists_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)(arg1)->Exists(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Storage(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Storage **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->StoreString(arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (arg1)->QueryString(arg2,arg3,arg4); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (arg1)->QueryString(arg2,arg3); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (arg1)->QueryString(arg2); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StorePlainString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StorePlainString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StorePlainString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StorePlainString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->StorePlainString(arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryPlainString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryPlainString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryPlainString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (arg1)->QueryPlainString(arg2,arg3); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryPlainString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jstring jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (arg1)->QueryPlainString(arg2); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreObject_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = *(OTDB::Storable **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreObject_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = *(OTDB::Storable **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreObject_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = *(OTDB::Storable **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1StoreObject_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = *(OTDB::Storable **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->StoreObject(*arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryObject_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryObject_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryObject_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jstring jarg4) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1QueryObject_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1EraseValueByKey_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1EraseValueByKey_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1EraseValueByKey_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1EraseValueByKey_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)(arg1)->EraseValueByKey(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1CreateObject(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { + jlong jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + arg2 = (OTDB::StoredObjectType)jarg2; + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1Create(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2) { + jlong jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storage *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + *(OTDB::Storage **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_com_wrapper_core_jni_otapiJNI_Storage_1GetType(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jint jresult = 0 ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StorageType result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storage **)&jarg1; + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7, jstring jarg8) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + if(!jarg7) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg7_pstr = (const char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7_pstr) return 0; + (&arg7)->assign(arg7_pstr); + jenv->ReleaseStringUTFChars(jarg7, arg7_pstr); + if(!jarg8) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg8_pstr = (const char *)jenv->GetStringUTFChars(jarg8, 0); + if (!arg8_pstr) return 0; + (&arg8)->assign(arg8_pstr); + jenv->ReleaseStringUTFChars(jarg8, arg8_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6, jstring jarg7) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + if(!jarg7) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg7_pstr = (const char *)jenv->GetStringUTFChars(jarg7, 0); + if (!arg7_pstr) return 0; + (&arg7)->assign(arg7_pstr); + jenv->ReleaseStringUTFChars(jarg7, arg7_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5, jstring jarg6) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + if(!jarg6) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg6_pstr = (const char *)jenv->GetStringUTFChars(jarg6, 0); + if (!arg6_pstr) return 0; + (&arg6)->assign(arg6_pstr); + jenv->ReleaseStringUTFChars(jarg6, arg6_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_14(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_15(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_InitDefaultStorage_1_1SWIG_16(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2) { + jboolean jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + bool result; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_GetDefaultStorage(JNIEnv *jenv, jclass jcls) { + jlong jresult = 0 ; + OTDB::Storage *result = 0 ; + + (void)jenv; + (void)jcls; + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + *(OTDB::Storage **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_CreateStorageContext_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2) { + jlong jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + OTDB::Storage *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + arg2 = (OTDB::PackType)jarg2; + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + *(OTDB::Storage **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_CreateStorageContext_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jint jarg1) { + jlong jresult = 0 ; + OTDB::StorageType arg1 ; + OTDB::Storage *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StorageType)jarg1; + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + *(OTDB::Storage **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_CreateObject(JNIEnv *jenv, jclass jcls, jint jarg1) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Exists_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Exists_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::Exists(arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Exists_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)OTDB::Exists(arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Exists_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jboolean jresult = 0 ; + std::string arg1 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + result = (bool)OTDB::Exists(arg1); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)OTDB::StoreString(arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = OTDB::QueryString(arg1,arg2,arg3); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = OTDB::QueryString(arg1,arg2); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + std::string arg1 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + result = OTDB::QueryString(arg1); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StorePlainString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StorePlainString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StorePlainString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StorePlainString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)OTDB::StorePlainString(arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryPlainString_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryPlainString_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = OTDB::QueryPlainString(arg1,arg2,arg3); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryPlainString_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jstring jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = OTDB::QueryPlainString(arg1,arg2); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryPlainString_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jstring jresult = 0 ; + std::string arg1 ; + std::string result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + result = OTDB::QueryPlainString(arg1); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreObject_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jboolean jresult = 0 ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + if (!arg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreObject_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + if (!arg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreObject_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + if (!arg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_StoreObject_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jboolean jresult = 0 ; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + if (!arg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Storable & reference is null"); + return 0; + } + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)OTDB::StoreObject(*arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryObject_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2, jstring jarg3, jstring jarg4, jstring jarg5) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + if(!jarg5) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg5_pstr = (const char *)jenv->GetStringUTFChars(jarg5, 0); + if (!arg5_pstr) return 0; + (&arg5)->assign(arg5_pstr); + jenv->ReleaseStringUTFChars(jarg5, arg5_pstr); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryObject_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryObject_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2, jstring jarg3) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_QueryObject_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jint jarg1, jstring jarg2) { + jlong jresult = 0 ; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + OTDB::Storable *result = 0 ; + + (void)jenv; + (void)jcls; + arg1 = (OTDB::StoredObjectType)jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + *(OTDB::Storable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_EraseValueByKey_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3, jstring jarg4) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + if(!jarg4) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg4_pstr = (const char *)jenv->GetStringUTFChars(jarg4, 0); + if (!arg4_pstr) return 0; + (&arg4)->assign(arg4_pstr); + jenv->ReleaseStringUTFChars(jarg4, arg4_pstr); + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_EraseValueByKey_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2, jstring jarg3) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return 0; + (&arg3)->assign(arg3_pstr); + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_EraseValueByKey_1_1SWIG_12(JNIEnv *jenv, jclass jcls, jstring jarg1, jstring jarg2) { + jboolean jresult = 0 ; + std::string arg1 ; + std::string arg2 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + (&arg2)->assign(arg2_pstr); + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_EraseValueByKey_1_1SWIG_13(JNIEnv *jenv, jclass jcls, jstring jarg1) { + jboolean jresult = 0 ; + std::string arg1 ; + bool result; + + (void)jenv; + (void)jcls; + if(!jarg1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg1_pstr = (const char *)jenv->GetStringUTFChars(jarg1, 0); + if (!arg1_pstr) return 0; + (&arg1)->assign(arg1_pstr); + jenv->ReleaseStringUTFChars(jarg1, arg1_pstr); + result = (bool)OTDB::EraseValueByKey(arg1); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OTDBString(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::OTDBString **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OTDBString_1m_1string_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OTDBString **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->m_string = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OTDBString_1m_1string_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OTDBString **)&jarg1; + result = (std::string *) & ((arg1)->m_string); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OTDBString_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OTDBString *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + *(OTDB::OTDBString **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Blob(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Blob **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Blob_1m_1memBuffer_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + std::vector< unsigned char > *argp2 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Blob **)&jarg1; + argp2 = *(std::vector< unsigned char > **)&jarg2; + if (!argp2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null std::vector< unsigned char >"); + return ; + } + arg2 = *argp2; + if (arg1) (arg1)->m_memBuffer = arg2; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Blob_1m_1memBuffer_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Blob **)&jarg1; + result = ((arg1)->m_memBuffer); + *(std::vector< unsigned char > **)&jresult = new std::vector< unsigned char >((const std::vector< unsigned char > &)result); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Blob_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Blob *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + *(OTDB::Blob **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1StringMap(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::StringMap **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1the_1map_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::StringMap **)&jarg1; + arg2 = *(std::map< std::string,std::string > **)&jarg2; + if (arg1) (arg1)->the_map = *arg2; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1the_1map_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::StringMap **)&jarg1; + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + *(std::map< std::string,std::string > **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1SetValue(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2, jstring jarg3) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::StringMap **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if(!jarg3) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg3_pstr = (const char *)jenv->GetStringUTFChars(jarg3, 0); + if (!arg3_pstr) return ; + std::string arg3_str(arg3_pstr); + arg3 = &arg3_str; + jenv->ReleaseStringUTFChars(jarg3, arg3_pstr); + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1GetValue(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + jstring jresult = 0 ; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::StringMap **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return 0; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return 0; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + result = (arg1)->GetValue((std::string const &)*arg2); + jresult = jenv->NewStringUTF((&result)->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::StringMap *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + *(OTDB::StringMap **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Displayable(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Displayable **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Displayable_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Displayable **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Displayable_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Displayable **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Displayable_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Displayable *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + *(OTDB::Displayable **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1MarketData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::MarketData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1market_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->market_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1market_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->market_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1asset_1type_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1asset_1type_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1currency_1type_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->currency_type_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1currency_1type_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->currency_type_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1total_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->total_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1total_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->total_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1number_1bids_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->number_bids = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1number_1bids_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->number_bids); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1number_1asks_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->number_asks = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1number_1asks_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->number_asks); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1last_1sale_1price_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->last_sale_price = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1last_1sale_1price_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->last_sale_price); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1current_1bid_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->current_bid = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1current_1bid_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->current_bid); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1current_1ask_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->current_ask = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1current_1ask_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->current_ask); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1trades_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->volume_trades = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1trades_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->volume_trades); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->volume_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->volume_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1currency_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->volume_currency = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1volume_1currency_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->volume_currency); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1recent_1highest_1bid_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->recent_highest_bid = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1recent_1highest_1bid_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->recent_highest_bid); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1recent_1lowest_1ask_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->recent_lowest_ask = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1recent_1lowest_1ask_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketData **)&jarg1; + result = (std::string *) & ((arg1)->recent_lowest_ask); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::MarketData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + *(OTDB::MarketData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1MarketList(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::MarketList **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1GetMarketDataCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketList **)&jarg1; + result = (arg1)->GetMarketDataCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1GetMarketData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + OTDB::MarketData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketList **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + *(OTDB::MarketData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1RemoveMarketData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::MarketList **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveMarketData(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1AddMarketData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::MarketList **)&jarg1; + arg2 = *(OTDB::MarketData **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::MarketData & reference is null"); + return 0; + } + result = (bool)(arg1)->AddMarketData(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::MarketList *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + *(OTDB::MarketList **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OfferDataMarket(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1price_1per_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1price_1per_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1available_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1available_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1minimum_1increment_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1minimum_1increment_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferDataMarket *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + *(OTDB::OfferDataMarket **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1BidData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::BidData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1price_1per_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1price_1per_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1available_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1available_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1minimum_1increment_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1minimum_1increment_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BidData **)&jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BidData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + *(OTDB::BidData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1AskData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::AskData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1price_1per_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1price_1per_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1available_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->available_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1available_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + result = (std::string *) & ((arg1)->available_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1minimum_1increment_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1minimum_1increment_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AskData **)&jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::AskData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + *(OTDB::AskData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OfferListMarket(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1GetBidDataCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + result = (arg1)->GetBidDataCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1GetBidData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + OTDB::BidData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + *(OTDB::BidData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1RemoveBidData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBidData(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1AddBidData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = *(OTDB::BidData **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::BidData & reference is null"); + return 0; + } + result = (bool)(arg1)->AddBidData(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1GetAskDataCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + result = (arg1)->GetAskDataCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1GetAskData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + OTDB::AskData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + *(OTDB::AskData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1RemoveAskData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveAskData(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1AddAskData(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::OfferListMarket **)&jarg1; + arg2 = *(OTDB::AskData **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::AskData & reference is null"); + return 0; + } + result = (bool)(arg1)->AddAskData(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferListMarket *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + *(OTDB::OfferListMarket **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1TradeDataMarket(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1date_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->date = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1date_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->date); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1price_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1price_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->price); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1amount_1sold_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->amount_sold = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1amount_1sold_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataMarket **)&jarg1; + result = (std::string *) & ((arg1)->amount_sold); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeDataMarket *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + *(OTDB::TradeDataMarket **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1TradeListMarket(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::TradeListMarket **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1GetTradeDataMarketCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListMarket **)&jarg1; + result = (arg1)->GetTradeDataMarketCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1GetTradeDataMarket(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + OTDB::TradeDataMarket *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + *(OTDB::TradeDataMarket **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1RemoveTradeDataMarket(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListMarket **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1AddTradeDataMarket(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::TradeListMarket **)&jarg1; + arg2 = *(OTDB::TradeDataMarket **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::TradeDataMarket & reference is null"); + return 0; + } + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeListMarket *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + *(OTDB::TradeListMarket **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OfferDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1valid_1from_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->valid_from = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1valid_1from_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->valid_from); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1valid_1to_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->valid_to = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1valid_1to_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->valid_to); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1asset_1type_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1asset_1type_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1asset_1acct_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->asset_acct_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1asset_1acct_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->asset_acct_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1currency_1type_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->currency_type_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1currency_1type_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->currency_type_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1currency_1acct_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->currency_acct_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1currency_1acct_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->currency_acct_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1selling_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jboolean jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + arg2 = jarg2 ? true : false; + if (arg1) (arg1)->selling = arg2; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1selling_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jboolean jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (bool) ((arg1)->selling); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1price_1per_1scale_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price_per_scale = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1price_1per_1scale_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->price_per_scale); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1total_1assets_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->total_assets = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1total_1assets_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->total_assets); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1finished_1so_1far_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->finished_so_far = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1finished_1so_1far_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->finished_so_far); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1minimum_1increment_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->minimum_increment = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1minimum_1increment_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->minimum_increment); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1stop_1sign_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->stop_sign = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1stop_1sign_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->stop_sign); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1stop_1price_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->stop_price = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1stop_1price_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferDataNym **)&jarg1; + result = (std::string *) & ((arg1)->stop_price); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferDataNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + *(OTDB::OfferDataNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1OfferListNym(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::OfferListNym **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1GetOfferDataNymCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListNym **)&jarg1; + result = (arg1)->GetOfferDataNymCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1GetOfferDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + OTDB::OfferDataNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + *(OTDB::OfferDataNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1RemoveOfferDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::OfferListNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1AddOfferDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::OfferListNym **)&jarg1; + arg2 = *(OTDB::OfferDataNym **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::OfferDataNym & reference is null"); + return 0; + } + result = (bool)(arg1)->AddOfferDataNym(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::OfferListNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + *(OTDB::OfferListNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1TradeDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1transaction_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->transaction_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1transaction_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->transaction_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1completed_1count_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->completed_count = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1completed_1count_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->completed_count); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1date_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->date = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1date_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->date); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1price_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->price = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1price_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->price); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1amount_1sold_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->amount_sold = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1amount_1sold_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeDataNym **)&jarg1; + result = (std::string *) & ((arg1)->amount_sold); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeDataNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + *(OTDB::TradeDataNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1TradeListNym(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::TradeListNym **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1GetTradeDataNymCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListNym **)&jarg1; + result = (arg1)->GetTradeDataNymCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1GetTradeDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + OTDB::TradeDataNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + *(OTDB::TradeDataNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1RemoveTradeDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::TradeListNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1AddTradeDataNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::TradeListNym **)&jarg1; + arg2 = *(OTDB::TradeDataNym **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::TradeDataNym & reference is null"); + return 0; + } + result = (bool)(arg1)->AddTradeDataNym(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::TradeListNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + *(OTDB::TradeListNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Acct(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Acct **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1acct_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1acct_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Acct **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Acct *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + *(OTDB::Acct **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1BitcoinAcct(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1acct_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1acct_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1bitcoin_1acct_1name_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->bitcoin_acct_name = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1bitcoin_1acct_1name_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinAcct **)&jarg1; + result = (std::string *) & ((arg1)->bitcoin_acct_name); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BitcoinAcct *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + *(OTDB::BitcoinAcct **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1ServerInfo(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::ServerInfo **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ServerInfo **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ServerInfo *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + *(OTDB::ServerInfo **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Server(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Server **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1host_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1host_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1port_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1server_1port_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Server **)&jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Server *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + *(OTDB::Server **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1BitcoinServer(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1host_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1host_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1port_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1server_1port_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1bitcoin_1username_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->bitcoin_username = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1bitcoin_1username_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->bitcoin_username); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1bitcoin_1password_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->bitcoin_password = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1bitcoin_1password_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::BitcoinServer **)&jarg1; + result = (std::string *) & ((arg1)->bitcoin_password); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::BitcoinServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + *(OTDB::BitcoinServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1RippleServer(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::RippleServer **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1host_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1host_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1port_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1server_1port_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1ripple_1username_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->ripple_username = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1ripple_1username_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->ripple_username); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1ripple_1password_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->ripple_password = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1ripple_1password_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->ripple_password); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1namefield_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->namefield_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1namefield_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->namefield_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1passfield_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->passfield_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1passfield_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::RippleServer **)&jarg1; + result = (std::string *) & ((arg1)->passfield_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::RippleServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + *(OTDB::RippleServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1LoomServer(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::LoomServer **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1host_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_host = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1host_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->server_host); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1port_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_port = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1server_1port_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->server_port); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1loom_1username_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->loom_username = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1loom_1username_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->loom_username); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1namefield_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->namefield_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1namefield_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::LoomServer **)&jarg1; + result = (std::string *) & ((arg1)->namefield_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::LoomServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + *(OTDB::LoomServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1ContactNym(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::ContactNym **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1nym_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->nym_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1nym_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (std::string *) & ((arg1)->nym_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1nym_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->nym_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1nym_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (std::string *) & ((arg1)->nym_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1public_1key_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1public_1key_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1memo_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1memo_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1GetServerInfoCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + result = (arg1)->GetServerInfoCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1GetServerInfo(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + OTDB::ServerInfo *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + *(OTDB::ServerInfo **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1RemoveServerInfo(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactNym **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveServerInfo(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1AddServerInfo(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::ContactNym **)&jarg1; + arg2 = *(OTDB::ServerInfo **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::ServerInfo & reference is null"); + return 0; + } + result = (bool)(arg1)->AddServerInfo(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ContactNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + *(OTDB::ContactNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1WalletData(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::WalletData **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetBitcoinServerCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + result = (arg1)->GetBitcoinServerCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetBitcoinServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::BitcoinServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + *(OTDB::BitcoinServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1RemoveBitcoinServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1AddBitcoinServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = *(OTDB::BitcoinServer **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::BitcoinServer & reference is null"); + return 0; + } + result = (bool)(arg1)->AddBitcoinServer(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetBitcoinAcctCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + result = (arg1)->GetBitcoinAcctCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetBitcoinAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::BitcoinAcct *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + *(OTDB::BitcoinAcct **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1RemoveBitcoinAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1AddBitcoinAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = *(OTDB::BitcoinAcct **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::BitcoinAcct & reference is null"); + return 0; + } + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetRippleServerCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + result = (arg1)->GetRippleServerCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetRippleServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::RippleServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + *(OTDB::RippleServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1RemoveRippleServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveRippleServer(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1AddRippleServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = *(OTDB::RippleServer **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::RippleServer & reference is null"); + return 0; + } + result = (bool)(arg1)->AddRippleServer(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetLoomServerCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + result = (arg1)->GetLoomServerCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1GetLoomServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + OTDB::LoomServer *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + *(OTDB::LoomServer **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1RemoveLoomServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveLoomServer(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1AddLoomServer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::WalletData **)&jarg1; + arg2 = *(OTDB::LoomServer **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::LoomServer & reference is null"); + return 0; + } + result = (bool)(arg1)->AddLoomServer(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::WalletData *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + *(OTDB::WalletData **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1ContactAcct(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::ContactAcct **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1server_1type_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_type = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1server_1type_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->server_type); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1server_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->server_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1server_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->server_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1asset_1type_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->asset_type_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1asset_1type_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->asset_type_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1acct_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->acct_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1acct_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->acct_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1nym_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->nym_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1nym_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->nym_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1memo_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1memo_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1public_1key_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1public_1key_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::ContactAcct **)&jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::ContactAcct *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + *(OTDB::ContactAcct **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1Contact(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::Contact **)&jarg1; + delete arg1; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1gui_1label_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->gui_label = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1gui_1label_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (std::string *) & ((arg1)->gui_label); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1contact_1id_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->contact_id = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1contact_1id_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (std::string *) & ((arg1)->contact_id); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1email_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->email = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1email_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (std::string *) & ((arg1)->email); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1memo_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->memo = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1memo_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (std::string *) & ((arg1)->memo); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1public_1key_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jstring jarg2) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + if(!jarg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::string"); + return ; + } + const char *arg2_pstr = (const char *)jenv->GetStringUTFChars(jarg2, 0); + if (!arg2_pstr) return ; + std::string arg2_str(arg2_pstr); + arg2 = &arg2_str; + jenv->ReleaseStringUTFChars(jarg2, arg2_pstr); + if (arg1) (arg1)->public_key = *arg2; +} + + +SWIGEXPORT jstring JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1public_1key_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jstring jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (std::string *) & ((arg1)->public_key); + jresult = jenv->NewStringUTF(result->c_str()); + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1GetContactNymCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (arg1)->GetContactNymCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1GetContactNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + OTDB::ContactNym *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + *(OTDB::ContactNym **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1RemoveContactNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContactNym(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1AddContactNym(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = *(OTDB::ContactNym **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::ContactNym & reference is null"); + return 0; + } + result = (bool)(arg1)->AddContactNym(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1GetContactAcctCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + result = (arg1)->GetContactAcctCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1GetContactAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + OTDB::ContactAcct *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + *(OTDB::ContactAcct **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1RemoveContactAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContactAcct(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1AddContactAcct(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::Contact **)&jarg1; + arg2 = *(OTDB::ContactAcct **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::ContactAcct & reference is null"); + return 0; + } + result = (bool)(arg1)->AddContactAcct(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::Contact *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + *(OTDB::Contact **)&jresult = result; + return jresult; +} + + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_delete_1AddressBook(JNIEnv *jenv, jclass jcls, jlong jarg1) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + + (void)jenv; + (void)jcls; + arg1 = *(OTDB::AddressBook **)&jarg1; + delete arg1; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1GetContactCount(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AddressBook **)&jarg1; + result = (arg1)->GetContactCount(); + jresult = (jlong)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1GetContact(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jlong jresult = 0 ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + OTDB::Contact *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AddressBook **)&jarg1; + arg2 = (size_t)jarg2; + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + *(OTDB::Contact **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1RemoveContact(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2) { + jboolean jresult = 0 ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::AddressBook **)&jarg1; + arg2 = (size_t)jarg2; + result = (bool)(arg1)->RemoveContact(arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1AddContact(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { + jboolean jresult = 0 ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + bool result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + (void)jarg2_; + arg1 = *(OTDB::AddressBook **)&jarg1; + arg2 = *(OTDB::Contact **)&jarg2; + if (!arg2) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "OTDB::Contact & reference is null"); + return 0; + } + result = (bool)(arg1)->AddContact(*arg2); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1ot_1dynamic_1cast(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) { + jlong jresult = 0 ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + OTDB::AddressBook *result = 0 ; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(OTDB::Storable **)&jarg1; + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + *(OTDB::AddressBook **)&jresult = result; + return jresult; +} + + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OTDBString_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::OTDBString **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Blob_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::Blob **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_StringMap_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::StringMap **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Displayable_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::Displayable **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketData_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::MarketData **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_MarketList_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::MarketList **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataMarket_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::OfferDataMarket **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BidData_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::OfferDataMarket **)&baseptr = *(OTDB::BidData **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AskData_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::OfferDataMarket **)&baseptr = *(OTDB::AskData **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListMarket_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::OfferListMarket **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataMarket_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::TradeDataMarket **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListMarket_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::TradeListMarket **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferDataNym_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::OfferDataNym **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_OfferListNym_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::OfferListNym **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeDataNym_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::TradeDataNym **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_TradeListNym_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::TradeListNym **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Acct_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::Acct **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinAcct_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Acct **)&baseptr = *(OTDB::BitcoinAcct **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ServerInfo_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::ServerInfo **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Server_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::ServerInfo **)&baseptr = *(OTDB::Server **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_BitcoinServer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Server **)&baseptr = *(OTDB::BitcoinServer **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_RippleServer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Server **)&baseptr = *(OTDB::RippleServer **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_LoomServer_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Server **)&baseptr = *(OTDB::LoomServer **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactNym_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::ContactNym **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_WalletData_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::WalletData **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_ContactAcct_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::ContactAcct **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_Contact_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Displayable **)&baseptr = *(OTDB::Contact **)&jarg1; + return baseptr; +} + +SWIGEXPORT jlong JNICALL Java_com_wrapper_core_jni_otapiJNI_AddressBook_1SWIGUpcast(JNIEnv *jenv, jclass jcls, jlong jarg1) { + jlong baseptr = 0; + (void)jenv; + (void)jcls; + *(OTDB::Storable **)&baseptr = *(OTDB::AddressBook **)&jarg1; + return baseptr; +} + +SWIGEXPORT void JNICALL Java_com_wrapper_core_jni_otapiJNI_swig_1module_1init(JNIEnv *jenv, jclass jcls) { + int i; + + static struct { + const char *method; + const char *signature; + } methods[2] = { + { + "SwigDirector_OTCallback_runOne", "(Lcom/wrapper/core/jni/OTCallback;)Ljava/lang/String;" + }, + { + "SwigDirector_OTCallback_runTwo", "(Lcom/wrapper/core/jni/OTCallback;)Ljava/lang/String;" + } + }; + Swig::jclass_otapiJNI = (jclass) jenv->NewGlobalRef(jcls); + if (!Swig::jclass_otapiJNI) return; + for (i = 0; i < (int) (sizeof(methods)/sizeof(methods[0])); ++i) { + Swig::director_methids[i] = jenv->GetStaticMethodID(jcls, methods[i].method, methods[i].signature); + if (!Swig::director_methids[i]) return; + } +} + + +#ifdef __cplusplus +} +#endif + diff --git a/testwallet/OTAPI_java.h b/testwallet/OTAPI_java.h new file mode 100644 index 000000000..d0da99589 --- /dev/null +++ b/testwallet/OTAPI_java.h @@ -0,0 +1,31 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_otapi_WRAP_H_ +#define SWIG_otapi_WRAP_H_ + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global); + SwigDirector_OTCallback(JNIEnv *jenv); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); +public: + bool swig_overrides(int n) { + return (n < 2 ? swig_override[n] : false); + } +protected: + bool swig_override[2]; +}; + + +#endif diff --git a/testwallet/OTAPI_perl5.cpp b/testwallet/OTAPI_perl5.cpp new file mode 100644 index 000000000..cbacfde3e --- /dev/null +++ b/testwallet/OTAPI_perl5.cpp @@ -0,0 +1,32410 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPERL +#define SWIG_CASTRANK_MODE + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +#ifdef __cplusplus +/* Needed on some windows machines---since MS plays funny games with the header files under C++ */ +#include +#include +extern "C" { +#endif +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +/* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ + +/* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION +# endif +#endif + +#if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) +#define PerlIO_exportFILE(fh,fl) (FILE*)(fh) +#endif + +#ifndef SvIOK_UV +# define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) +#endif + +#ifndef SvUOK +# define SvUOK(sv) SvIOK_UV(sv) +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) +# define PL_sv_undef sv_undef +# define PL_na na +# define PL_errgv errgv +# define PL_sv_no sv_no +# define PL_sv_yes sv_yes +# define PL_markstack_ptr markstack_ptr +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif /* !INT2PTR */ + +#ifndef SvPV_nolen +# define SvPV_nolen(x) SvPV(x,PL_na) +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +#ifndef pTHX_ +#define pTHX_ +#endif + +#include +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGINTERN const char* +SWIG_Perl_ErrorType(int code) { + const char* type = 0; + switch(code) { + case SWIG_MemoryError: + type = "MemoryError"; + break; + case SWIG_IOError: + type = "IOError"; + break; + case SWIG_RuntimeError: + type = "RuntimeError"; + break; + case SWIG_IndexError: + type = "IndexError"; + break; + case SWIG_TypeError: + type = "TypeError"; + break; + case SWIG_DivisionByZero: + type = "ZeroDivisionError"; + break; + case SWIG_OverflowError: + type = "OverflowError"; + break; + case SWIG_SyntaxError: + type = "SyntaxError"; + break; + case SWIG_ValueError: + type = "ValueError"; + break; + case SWIG_SystemError: + type = "SystemError"; + break; + case SWIG_AttributeError: + type = "AttributeError"; + break; + default: + type = "RuntimeError"; + } + return type; +} + + + + +/* ----------------------------------------------------------------------------- + * perlrun.swg + * + * This file contains the runtime support for Perl modules + * and includes code for managing global variables and pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +#ifdef PERL_OBJECT +#define SWIG_PERL_OBJECT_DECL CPerlObj *SWIGUNUSEDPARM(pPerl), +#define SWIG_PERL_OBJECT_CALL pPerl, +#else +#define SWIG_PERL_OBJECT_DECL +#define SWIG_PERL_OBJECT_CALL +#endif + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) +#define SWIG_ConvertPtrAndOwn(obj, pp, type, flags,own) SWIG_Perl_ConvertPtrAndOwn(SWIG_PERL_OBJECT_CALL obj, pp, type, flags, own) +#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, p, s, type) SWIG_Perl_ConvertPacked(SWIG_PERL_OBJECT_CALL obj, p, s, type) +#define SWIG_NewPackedObj(p, s, type) SWIG_Perl_NewPackedObj(SWIG_PERL_OBJECT_CALL p, s, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Perl_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Perl_SetModule(pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Perl_ErrorType(code) +#define SWIG_Error(code, msg) sv_setpvf(GvSV(PL_errgv),"%s %s\n", SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + +/* Perl-specific SWIG API */ + +#define SWIG_MakePtr(sv, ptr, type, flags) SWIG_Perl_MakePtr(SWIG_PERL_OBJECT_CALL sv, ptr, type, flags) +#define SWIG_MakePackedObj(sv, p, s, type) SWIG_Perl_MakePackedObj(SWIG_PERL_OBJECT_CALL sv, p, s, type) +#define SWIG_SetError(str) SWIG_Error(SWIG_RuntimeError, str) + + +#define SWIG_PERL_DECL_ARGS_1(arg1) (SWIG_PERL_OBJECT_DECL arg1) +#define SWIG_PERL_CALL_ARGS_1(arg1) (SWIG_PERL_OBJECT_CALL arg1) +#define SWIG_PERL_DECL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_DECL arg1, arg2) +#define SWIG_PERL_CALL_ARGS_2(arg1, arg2) (SWIG_PERL_OBJECT_CALL arg1, arg2) + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 + +#ifdef __cplusplus +extern "C" { +#endif + +#define SWIG_OWNER SWIG_POINTER_OWN +#define SWIG_SHADOW SWIG_OWNER << 1 + +#define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL + +/* SWIG Perl macros */ + +/* Macro to declare an XS function */ +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +/* Macro to call an XS function */ +#ifdef PERL_OBJECT +# define SWIG_CALLXS(_name) _name(cv,pPerl) +#else +# ifndef MULTIPLICITY +# define SWIG_CALLXS(_name) _name(cv) +# else +# define SWIG_CALLXS(_name) _name(PERL_GET_THX, cv) +# endif +#endif + +#ifdef PERL_OBJECT +#define MAGIC_PPERL CPerlObj *pPerl = (CPerlObj *) this; + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (CPerlObj::*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) +#define SWIGCLASS_STATIC + +#else /* PERL_OBJECT */ + +#define MAGIC_PPERL +#define SWIGCLASS_STATIC static SWIGUNUSED + +#ifndef MULTIPLICITY +#define SWIG_MAGIC(a,b) (SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#else /* MULTIPLICITY */ + +#define SWIG_MAGIC(a,b) (struct interpreter *interp, SV *a, MAGIC *b) + +#ifdef __cplusplus +extern "C" { +#endif +typedef int (*SwigMagicFunc)(struct interpreter *, SV *, MAGIC *); +#ifdef __cplusplus +} +#endif + +#endif /* MULTIPLICITY */ +#endif /* PERL_OBJECT */ + +/* Workaround for bug in perl 5.6.x croak and earlier */ +#if (PERL_VERSION < 8) +# ifdef PERL_OBJECT +# define SWIG_croak_null() SWIG_Perl_croak_null(pPerl) +static void SWIG_Perl_croak_null(CPerlObj *pPerl) +# else +static void SWIG_croak_null() +# endif +{ + SV *err=ERRSV; +# if (PERL_VERSION < 6) + croak("%_", err); +# else + if (SvOK(err) && !SvROK(err)) croak("%_", err); + croak(Nullch); +# endif +} +#else +# define SWIG_croak_null() croak(Nullch) +#endif + + +/* + Define how strict is the cast between strings and integers/doubles + when overloading between these types occurs. + + The default is making it as strict as possible by using SWIG_AddCast + when needed. + + You can use -DSWIG_PERL_NO_STRICT_STR2NUM at compilation time to + disable the SWIG_AddCast, making the casting between string and + numbers less strict. + + In the end, we try to solve the overloading between strings and + numerical types in the more natural way, but if you can avoid it, + well, avoid it using %rename, for example. +*/ +#ifndef SWIG_PERL_NO_STRICT_STR2NUM +# ifndef SWIG_PERL_STRICT_STR2NUM +# define SWIG_PERL_STRICT_STR2NUM +# endif +#endif +#ifdef SWIG_PERL_STRICT_STR2NUM +/* string takes precedence */ +#define SWIG_Str2NumCast(x) SWIG_AddCast(x) +#else +/* number takes precedence */ +#define SWIG_Str2NumCast(x) x +#endif + + + +#include + +SWIGRUNTIME const char * +SWIG_Perl_TypeProxyName(const swig_type_info *type) { + if (!type) return NULL; + if (type->clientdata != NULL) { + return (const char*) type->clientdata; + } + else { + return type->name; + } +} + +/* Identical to SWIG_TypeCheck, except for strcmp comparison */ +SWIGRUNTIME swig_cast_info * +SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if ( (!iter->type->clientdata && (strcmp(iter->type->name, c) == 0)) || + (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0)) ) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* Function for getting a pointer value */ + +SWIGRUNTIME int +SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) { + swig_cast_info *tc; + void *voidptr = (void *)0; + SV *tsv = 0; + + if (own) + *own = 0; + + /* If magical, apply more magic */ + if (SvGMAGICAL(sv)) + mg_get(sv); + + /* Check to see if this is an object */ + if (sv_isobject(sv)) { + IV tmp = 0; + tsv = (SV*) SvRV(sv); + if ((SvTYPE(tsv) == SVt_PVHV)) { + MAGIC *mg; + if (SvMAGICAL(tsv)) { + mg = mg_find(tsv,'P'); + if (mg) { + sv = mg->mg_obj; + if (sv_isobject(sv)) { + tsv = (SV*)SvRV(sv); + tmp = SvIV(tsv); + } + } + } else { + return SWIG_ERROR; + } + } else { + tmp = SvIV(tsv); + } + voidptr = INT2PTR(void *,tmp); + } else if (! SvOK(sv)) { /* Check for undef */ + *(ptr) = (void *) 0; + return SWIG_OK; + } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ + if (!SvROK(sv)) { + /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value. */ + if (SvIOK(sv)) { + return SWIG_ERROR; + } else { + /* NULL pointer (reference to undef). */ + *(ptr) = (void *) 0; + return SWIG_OK; + } + } else { + return SWIG_ERROR; + } + } else { /* Don't know what it is */ + return SWIG_ERROR; + } + if (_t) { + /* Now see if the types match */ + char *_c = HvNAME(SvSTASH(SvRV(sv))); + tc = SWIG_TypeProxyCheck(_c,_t); + if (!tc) { + return SWIG_ERROR; + } + { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + } else { + *ptr = voidptr; + } + + /* + * DISOWN implementation: we need a perl guru to check this one. + */ + if (tsv && (flags & SWIG_POINTER_DISOWN)) { + /* + * almost copy paste code from below SWIG_POINTER_OWN setting + */ + SV *obj = sv; + HV *stash = SvSTASH(SvRV(obj)); + GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (isGV(gv)) { + HV *hv = GvHVn(gv); + /* + * To set ownership (see below), a newSViv(1) entry is added. + * Hence, to remove ownership, we delete the entry. + */ + if (hv_exists_ent(hv, obj, 0)) { + hv_delete_ent(hv, obj, 0, 0); + } + } + } + return SWIG_OK; +} + +SWIGRUNTIME int +SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { + return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0); +} + +SWIGRUNTIME void +SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { + if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) { + SV *self; + SV *obj=newSV(0); + HV *hash=newHV(); + HV *stash; + sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); + stash=SvSTASH(SvRV(obj)); + if (flags & SWIG_POINTER_OWN) { + HV *hv; + GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); + if (!isGV(gv)) + gv_init(gv, stash, "OWNER", 5, FALSE); + hv=GvHVn(gv); + hv_store_ent(hv, obj, newSViv(1), 0); + } + sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); + SvREFCNT_dec(obj); + self=newRV_noinc((SV *)hash); + sv_setsv(sv, self); + SvREFCNT_dec((SV *)self); + sv_bless(sv, stash); + } + else { + sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); + } +} + +SWIGRUNTIMEINLINE SV * +SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { + SV *result = sv_newmortal(); + SWIG_MakePtr(result, ptr, t, flags); + return result; +} + +SWIGRUNTIME void +SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + strcpy(r,SWIG_Perl_TypeProxyName(type)); + sv_setpv(sv, result); +} + +SWIGRUNTIME SV * +SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { + SV *result = sv_newmortal(); + SWIG_Perl_MakePackedObj(result, ptr, sz, type); + return result; +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c = 0; + + if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; + c = SvPV_nolen(obj); + /* Pointer values must start with leading underscore */ + if (*c != '_') return SWIG_ERROR; + c++; + c = SWIG_UnpackData(c,ptr,sz); + if (ty) { + tc = SWIG_TypeCheck(c,ty); + if (!tc) return SWIG_ERROR; + } + return SWIG_OK; +} + + +/* Macros for low-level exception handling */ +#define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } + + +typedef XSPROTO(SwigPerlWrapper); +typedef SwigPerlWrapper *SwigPerlWrapperPtr; + +/* Structure for command table */ +typedef struct { + const char *name; + SwigPerlWrapperPtr wrapper; +} swig_command_info; + +/* Information for constant table */ + +#define SWIG_INT 1 +#define SWIG_FLOAT 2 +#define SWIG_STRING 3 +#define SWIG_POINTER 4 +#define SWIG_BINARY 5 + +/* Constant information structure */ +typedef struct swig_constant_info { + int type; + const char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_constant_info; + + +/* Structure for variable table */ +typedef struct { + const char *name; + SwigMagicFunc set; + SwigMagicFunc get; + swig_type_info **type; +} swig_variable_info; + +/* Magic variable code */ +#ifndef PERL_OBJECT +#define swig_create_magic(s,a,b,c) _swig_create_magic(s,a,b,c) + #ifndef MULTIPLICITY + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) + #else + SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) + #endif +#else +# define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) +SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) +#endif +{ + MAGIC *mg; + sv_magic(sv,sv,'U',(char *) name,strlen(name)); + mg = mg_find(sv,'U'); + mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); + mg->mg_virtual->svt_get = (SwigMagicFunc) get; + mg->mg_virtual->svt_set = (SwigMagicFunc) set; + mg->mg_virtual->svt_len = 0; + mg->mg_virtual->svt_clear = 0; + mg->mg_virtual->svt_free = 0; +} + + +SWIGRUNTIME swig_module_info * +SWIG_Perl_GetModule(void) { + static void *type_pointer = (void *)0; + SV *pointer; + + /* first check if pointer already created */ + if (!type_pointer) { + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); + if (pointer && SvOK(pointer)) { + type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); + } + } + + return (swig_module_info *) type_pointer; +} + +SWIGRUNTIME void +SWIG_Perl_SetModule(swig_module_info *module) { + SV *pointer; + + /* create a new pointer */ + pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); + sv_setiv(pointer, PTR2IV(module)); +} + +#ifdef __cplusplus +} +#endif + +/* Workaround perl5 global namespace pollution. Note that undefining library + * functions like fopen will not solve the problem on all platforms as fopen + * might be a macro on Windows but not necessarily on other operating systems. */ +#ifdef do_open + #undef do_open +#endif +#ifdef do_close + #undef do_close +#endif +#ifdef do_exec + #undef do_exec +#endif +#ifdef scalar + #undef scalar +#endif +#ifdef list + #undef list +#endif +#ifdef apply + #undef apply +#endif +#ifdef convert + #undef convert +#endif +#ifdef Error + #undef Error +#endif +#ifdef form + #undef form +#endif +#ifdef vform + #undef vform +#endif +#ifdef LABEL + #undef LABEL +#endif +#ifdef METHOD + #undef METHOD +#endif +#ifdef Move + #undef Move +#endif +#ifdef yylex + #undef yylex +#endif +#ifdef yyparse + #undef yyparse +#endif +#ifdef yyerror + #undef yyerror +#endif +#ifdef invert + #undef invert +#endif +#ifdef ref + #undef ref +#endif +#ifdef read + #undef read +#endif +#ifdef write + #undef write +#endif +#ifdef eof + #undef eof +#endif +#ifdef bool + #undef bool +#endif +#ifdef close + #undef close +#endif +#ifdef rewind + #undef rewind +#endif +#ifdef free + #undef free +#endif +#ifdef malloc + #undef malloc +#endif +#ifdef calloc + #undef calloc +#endif +#ifdef Stat + #undef Stat +#endif +#ifdef check + #undef check +#endif +#ifdef seekdir + #undef seekdir +#endif +#ifdef open + #undef open +#endif +#ifdef readdir + #undef readdir +#endif +#ifdef bind + #undef bind +#endif +#ifdef access + #undef access +#endif +#ifdef stat + #undef stat +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_OTCallback swig_types[0] +#define SWIGTYPE_p_OTCaller swig_types[1] +#define SWIGTYPE_p_OTDB__Acct swig_types[2] +#define SWIGTYPE_p_OTDB__AddressBook swig_types[3] +#define SWIGTYPE_p_OTDB__AskData swig_types[4] +#define SWIGTYPE_p_OTDB__BidData swig_types[5] +#define SWIGTYPE_p_OTDB__BitcoinAcct swig_types[6] +#define SWIGTYPE_p_OTDB__BitcoinServer swig_types[7] +#define SWIGTYPE_p_OTDB__Blob swig_types[8] +#define SWIGTYPE_p_OTDB__Contact swig_types[9] +#define SWIGTYPE_p_OTDB__ContactAcct swig_types[10] +#define SWIGTYPE_p_OTDB__ContactNym swig_types[11] +#define SWIGTYPE_p_OTDB__Displayable swig_types[12] +#define SWIGTYPE_p_OTDB__LoomServer swig_types[13] +#define SWIGTYPE_p_OTDB__MarketData swig_types[14] +#define SWIGTYPE_p_OTDB__MarketList swig_types[15] +#define SWIGTYPE_p_OTDB__OTDBString swig_types[16] +#define SWIGTYPE_p_OTDB__OfferDataMarket swig_types[17] +#define SWIGTYPE_p_OTDB__OfferDataNym swig_types[18] +#define SWIGTYPE_p_OTDB__OfferListMarket swig_types[19] +#define SWIGTYPE_p_OTDB__OfferListNym swig_types[20] +#define SWIGTYPE_p_OTDB__RippleServer swig_types[21] +#define SWIGTYPE_p_OTDB__Server swig_types[22] +#define SWIGTYPE_p_OTDB__ServerInfo swig_types[23] +#define SWIGTYPE_p_OTDB__Storable swig_types[24] +#define SWIGTYPE_p_OTDB__Storage swig_types[25] +#define SWIGTYPE_p_OTDB__StringMap swig_types[26] +#define SWIGTYPE_p_OTDB__TradeDataMarket swig_types[27] +#define SWIGTYPE_p_OTDB__TradeDataNym swig_types[28] +#define SWIGTYPE_p_OTDB__TradeListMarket swig_types[29] +#define SWIGTYPE_p_OTDB__TradeListNym swig_types[30] +#define SWIGTYPE_p_OTDB__WalletData swig_types[31] +#define SWIGTYPE_p_OTPacker swig_types[32] +#define SWIGTYPE_p_char swig_types[33] +#define SWIGTYPE_p_std__mapT_std__string_std__string_t swig_types[34] +#define SWIGTYPE_p_std__vectorT_unsigned_char_t swig_types[35] +static swig_type_info *swig_types[37]; +static swig_module_info swig_module = {swig_types, 36, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#define SWIG_init boot_otapi + +#define SWIG_name "otapic::boot_otapi" +#define SWIG_prefix "otapic::" + +#define SWIGVERSION 0x020004 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +#ifdef __cplusplus +extern "C" +#endif +#ifndef PERL_OBJECT +#ifndef MULTIPLICITY +SWIGEXPORT void SWIG_init (CV* cv); +#else +SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); +#endif +#else +SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); +#endif + + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + SV *obj = sv_newmortal(); + if (carray) { + sv_setpvn(obj, carray, size); + } else { + sv_setsv(obj, &PL_sv_undef); + } + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_std_string SWIG_PERL_DECL_ARGS_1(const std::string& s) +{ + return SWIG_FromCharPtrAndSize(s.data(), s.size()); +} + + +SWIGINTERNINLINE SV * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +SWIGINTERNINLINE SV * +SWIG_From_bool SWIG_PERL_DECL_ARGS_1(bool value) +{ + SV *obj = sv_newmortal(); + if (value) { + sv_setsv(obj, &PL_sv_yes); + } else { + sv_setsv(obj, &PL_sv_no); + } + return obj; +} + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) +{ + if (SvMAGICAL(obj)) { + SV *tmp = sv_newmortal(); + SvSetSV(tmp, obj); + obj = tmp; + } + if (SvPOK(obj)) { + STRLEN len = 0; + char *cstr = SvPV(obj, len); + size_t size = len + 1; + if (cptr) { + if (alloc) { + if (*alloc == SWIG_NEWOBJ) { + *cptr = reinterpret_cast< char* >(memcpy((new char[size]), cstr, sizeof(char)*(size))); + } else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } + } + if (psize) *psize = size; + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + char* vptr = 0; + if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = vptr; + if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + + + + +SWIGINTERNINLINE SV * +SWIG_From_long SWIG_PERL_DECL_ARGS_1(long value) +{ + SV *obj = sv_newmortal(); + sv_setiv(obj, (IV) value); + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_int SWIG_PERL_DECL_ARGS_1(int value) +{ + return SWIG_From_long SWIG_PERL_CALL_ARGS_1(value); +} + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double SWIG_PERL_DECL_ARGS_2(SV *obj, double *val) +{ + if (SvNIOK(obj)) { + if (val) *val = SvNV(obj); + return SWIG_OK; + } else if (SvIOK(obj)) { + if (val) *val = (double) SvIV(obj); + return SWIG_AddCast(SWIG_OK); + } else { + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + double v; + errno = 0; + v = strtod(nptr, &endptr); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + } + return SWIG_TypeError; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long SWIG_PERL_DECL_ARGS_2(SV *obj, long* val) +{ + if (SvIOK(obj)) { + if (val) *val = SvIV(obj); + return SWIG_OK; + } else { + int dispatch = 0; + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + long v; + errno = 0; + v = strtol(nptr, &endptr,0); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int SWIG_PERL_DECL_ARGS_2(SV * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long SWIG_PERL_CALL_ARGS_2(obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERN int +SWIG_AsPtr_std_string SWIG_PERL_DECL_ARGS_2(SV * obj, std::string **val) +{ + char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; + if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { + if (buf) { + if (val) *val = new std::string(buf, size - 1); + if (alloc == SWIG_NEWOBJ) delete[] buf; + return SWIG_NEWOBJ; + } else { + if (val) *val = 0; + return SWIG_OLDOBJ; + } + } else { + static int init = 0; + static swig_type_info* descriptor = 0; + if (!init) { + descriptor = SWIG_TypeQuery("std::string" " *"); + init = 1; + } + if (descriptor) { + std::string *vptr; + int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); + if (SWIG_IsOK(res) && val) *val = vptr; + return res; + } + } + return SWIG_ERROR; +} + + +SWIGINTERNINLINE SV * +SWIG_From_unsigned_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long value) +{ + SV *obj = sv_newmortal(); + sv_setuv(obj, (UV) value); + return obj; +} + + +SWIGINTERNINLINE SV * +SWIG_From_size_t SWIG_PERL_DECL_ARGS_1(size_t value) +{ + return SWIG_From_unsigned_SS_long SWIG_PERL_CALL_ARGS_1(static_cast< unsigned long >(value)); +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, unsigned long *val) +{ + if (SvUOK(obj)) { + if (val) *val = SvUV(obj); + return SWIG_OK; + } else if (SvIOK(obj)) { + long v = SvIV(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else { + int dispatch = 0; + const char *nptr = SvPV_nolen(obj); + if (nptr) { + char *endptr; + unsigned long v; + errno = 0; + v = strtoul(nptr, &endptr,0); + if (errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_Str2NumCast(SWIG_OK); + } + } + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double SWIG_PERL_CALL_ARGS_2(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERNINLINE int +SWIG_AsVal_size_t SWIG_PERL_DECL_ARGS_2(SV * obj, size_t *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long SWIG_PERL_CALL_ARGS_2(obj, val ? &v : 0); + if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); + return res; +} + + +SWIGINTERN int +SWIG_AsVal_bool SWIG_PERL_DECL_ARGS_2(SV *obj, bool* val) +{ + if (obj == &PL_sv_yes) { + if (val) *val = true; + return SWIG_OK; + } else if (obj == &PL_sv_no) { + if (val) *val = false; + return SWIG_OK; + } else { + if (val) *val = SvTRUE(obj) ? true: false; + return SWIG_AddCast(SWIG_OK); + } + return SWIG_TypeError; +} + + + using namespace OTDB; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PERL_OBJECT +#define MAGIC_CLASS _wrap_otapi_var:: +class _wrap_otapi_var : public CPerlObj { +public: +#else +#define MAGIC_CLASS +#endif +SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) { + MAGIC_PPERL + croak("Value is read-only."); + return 0; +} + + +#ifdef PERL_OBJECT +}; +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif +XS(_wrap_new_OTCallback) { + { + int argvi = 0; + OTCallback *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: new_OTCallback();"); + } + result = (OTCallback *)new OTCallback(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTCallback, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OTCallback) { + { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OTCallback(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCallback, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCallback" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCallback_runOne) { + { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCallback_runOne(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runOne" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + result = (arg1)->runOne(); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCallback_runTwo) { + { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCallback_runTwo(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runTwo" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + result = (arg1)->runTwo(); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_new_OTCaller) { + { + int argvi = 0; + OTCaller *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: new_OTCaller();"); + } + result = (OTCaller *)new OTCaller(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTCaller, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OTCaller) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OTCaller(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCaller" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_GetPassword) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCaller_GetPassword(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_GetPassword" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (char *)(arg1)->GetPassword(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_delCallback) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCaller_delCallback(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_delCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->delCallback(); + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_setCallback) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OTCaller_setCallback(self,cb);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_setCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTCaller_setCallback" "', argument " "2"" of type '" "OTCallback *""'"); + } + arg2 = reinterpret_cast< OTCallback * >(argp2); + (arg1)->setCallback(arg2); + ST(argvi) = sv_newmortal(); + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_isCallbackSet) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCaller_isCallbackSet(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_isCallbackSet" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)(arg1)->isCallbackSet(); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_callOne) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCaller_callOne(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callOne" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callOne(); + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTCaller_callTwo) { + { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTCaller_callTwo(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callTwo" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callTwo(); + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Set_PasswordCallback) { + { + OTCaller *arg1 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Set_PasswordCallback(theCaller);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_OTCaller, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)OT_API_Set_PasswordCallback(*arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Init) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Init(szClientPath);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Init" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Init((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadWallet) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_LoadWallet(szWalletFilename);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_LoadWallet((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SwitchWallet) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_SwitchWallet(szDataFolderPath,szWalletFilename);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SwitchWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SwitchWallet" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetMemlogSize) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_GetMemlogSize();"); + } + result = (int)OT_API_GetMemlogSize(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetMemlogAtIndex) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetMemlogAtIndex(nIndex);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetMemlogAtIndex" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetMemlogAtIndex(arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_PeekMemlogFront) { + { + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_PeekMemlogFront();"); + } + result = (char *)OT_API_PeekMemlogFront(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_PeekMemlogBack) { + { + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_PeekMemlogBack();"); + } + result = (char *)OT_API_PeekMemlogBack(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_PopMemlogFront) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_PopMemlogFront();"); + } + result = (int)OT_API_PopMemlogFront(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_PopMemlogBack) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_PopMemlogBack();"); + } + result = (int)OT_API_PopMemlogBack(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_CreateNym) { + { + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_CreateNym();"); + } + result = (char *)OT_API_CreateNym(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_AddServerContract) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_AddServerContract(szContract);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddServerContract((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_AddAssetContract) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_AddAssetContract(szContract);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddAssetContract((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetServerCount) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_GetServerCount();"); + } + result = (int)OT_API_GetServerCount(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAssetTypeCount) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_GetAssetTypeCount();"); + } + result = (int)OT_API_GetAssetTypeCount(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountCount) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_GetAccountCount();"); + } + result = (int)OT_API_GetAccountCount(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNymCount) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_GetNymCount();"); + } + result = (int)OT_API_GetNymCount(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetServer_ID) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetServer_ID(nIndex);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetServer_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetServer_ID(arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetServer_Name) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetServer_Name(SERVER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetServer_Name((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAssetType_ID) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAssetType_ID(nIndex);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAssetType_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAssetType_ID(arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAssetType_Name) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAssetType_Name(ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_ID) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_ID(nIndex);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAccountWallet_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAccountWallet_ID(arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_Name) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_Name(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_Balance) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_Balance(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Balance" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_Type) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_Type(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Type" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_AssetTypeID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_AssetTypeID(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_AssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_ServerID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_ServerID(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_ServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetAccountWallet_NymID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetAccountWallet_NymID(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_NymID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_VerifyAccountReceipt) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_VerifyAccountReceipt(SERVER_ID,NYM_ID,ACCT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_TransactionNumCount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_TransactionNumCount(SERVER_ID,NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_ID) { + { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetNym_ID(nIndex);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetNym_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetNym_ID(arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_Name) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetNym_Name(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Name((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_Stats) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetNym_Stats(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Stats" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_IsNym_RegisteredAtServer) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_IsNym_RegisteredAtServer(NYM_ID,SERVER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_MailCount) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetNym_MailCount(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_MailContentsByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_MailContentsByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_MailSenderIDByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_MailSenderIDByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_MailServerIDByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_MailServerIDByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Nym_RemoveMailByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Nym_RemoveMailByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Nym_VerifyMailByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Nym_VerifyMailByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_OutmailCount) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_GetNym_OutmailCount(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_OutmailContentsByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_OutmailContentsByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_OutmailRecipientIDByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_OutmailRecipientIDByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GetNym_OutmailServerIDByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GetNym_OutmailServerIDByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Nym_RemoveOutmailByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Nym_RemoveOutmailByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Nym_VerifyOutmailByIndex) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Nym_VerifyOutmailByIndex(NYM_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_CanRemoveServer) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_CanRemoveServer(SERVER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_RemoveServer) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_RemoveServer(SERVER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_CanRemoveAssetType) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_CanRemoveAssetType(ASSET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_RemoveAssetType) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_RemoveAssetType(ASSET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_CanRemoveNym) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_CanRemoveNym(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_RemoveNym) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_RemoveNym(NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_CanRemoveAccount) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Wallet_CanRemoveAccount(ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_ImportNym) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Wallet_ImportNym(DISPLAY_NAME,KEY_FILE_CONTENTS);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportNym" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SetNym_Name) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_SetNym_Name(NYM_ID,SIGNER_NYM_ID,NYM_NEW_NAME);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetNym_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetNym_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SetAccountWallet_Name) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_SetAccountWallet_Name(ACCT_ID,SIGNER_NYM_ID,ACCT_NEW_NAME);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SetAssetType_Name) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_SetAssetType_Name(ASSET_ID,STR_NEW_NAME);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAssetType_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SetServer_Name) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_SetServer_Name(SERVER_ID,STR_NEW_NAME);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetServer_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_VerifyAndRetrieveXMLContents) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_VerifyAndRetrieveXMLContents(THE_CONTRACT,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_WriteCheque) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 8) || (items > 8)) { + SWIG_croak("Usage: OT_API_WriteCheque(SERVER_ID,CHEQUE_AMOUNT,VALID_FROM,VALID_TO,SENDER_ACCT_ID,SENDER_USER_ID,CHEQUE_MEMO,RECIPIENT_USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_WriteCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_WriteCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_WriteCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_WriteCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_WriteCheque" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_WriteCheque" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_WriteCheque" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_WriteCheque" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_ProposePaymentPlan) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int res11 ; + char *buf11 = 0 ; + int alloc11 = 0 ; + int res12 ; + char *buf12 = 0 ; + int alloc12 = 0 ; + int res13 ; + char *buf13 = 0 ; + int alloc13 = 0 ; + int res14 ; + char *buf14 = 0 ; + int alloc14 = 0 ; + int res15 ; + char *buf15 = 0 ; + int alloc15 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 15) || (items > 15)) { + SWIG_croak("Usage: OT_API_ProposePaymentPlan(SERVER_ID,VALID_FROM,VALID_TO,SENDER_ACCT_ID,SENDER_USER_ID,PLAN_CONSIDERATION,RECIPIENT_ACCT_ID,RECIPIENT_USER_ID,INITIAL_PAYMENT_AMOUNT,INITIAL_PAYMENT_DELAY,PAYMENT_PLAN_AMOUNT,PAYMENT_PLAN_DELAY,PAYMENT_PLAN_PERIOD,PAYMENT_PLAN_LENGTH,PAYMENT_PLAN_MAX_PAYMENTS);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ProposePaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ProposePaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ProposePaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ProposePaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ProposePaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_ProposePaymentPlan" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_ProposePaymentPlan" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_ProposePaymentPlan" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(ST(8), &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_ProposePaymentPlan" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(ST(9), &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_ProposePaymentPlan" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + res11 = SWIG_AsCharPtrAndSize(ST(10), &buf11, NULL, &alloc11); + if (!SWIG_IsOK(res11)) { + SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "OT_API_ProposePaymentPlan" "', argument " "11"" of type '" "char const *""'"); + } + arg11 = reinterpret_cast< char * >(buf11); + res12 = SWIG_AsCharPtrAndSize(ST(11), &buf12, NULL, &alloc12); + if (!SWIG_IsOK(res12)) { + SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "OT_API_ProposePaymentPlan" "', argument " "12"" of type '" "char const *""'"); + } + arg12 = reinterpret_cast< char * >(buf12); + res13 = SWIG_AsCharPtrAndSize(ST(12), &buf13, NULL, &alloc13); + if (!SWIG_IsOK(res13)) { + SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "OT_API_ProposePaymentPlan" "', argument " "13"" of type '" "char const *""'"); + } + arg13 = reinterpret_cast< char * >(buf13); + res14 = SWIG_AsCharPtrAndSize(ST(13), &buf14, NULL, &alloc14); + if (!SWIG_IsOK(res14)) { + SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "OT_API_ProposePaymentPlan" "', argument " "14"" of type '" "char const *""'"); + } + arg14 = reinterpret_cast< char * >(buf14); + res15 = SWIG_AsCharPtrAndSize(ST(14), &buf15, NULL, &alloc15); + if (!SWIG_IsOK(res15)) { + SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "OT_API_ProposePaymentPlan" "', argument " "15"" of type '" "char const *""'"); + } + arg15 = reinterpret_cast< char * >(buf15); + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_ConfirmPaymentPlan) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_ConfirmPaymentPlan(SERVER_ID,SENDER_USER_ID,SENDER_ACCT_ID,RECIPIENT_USER_ID,PAYMENT_PLAN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadUserPubkey) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_LoadUserPubkey(USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadUserPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadPubkey) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_LoadPubkey(USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadPubkey((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_VerifyUserPrivateKey) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_VerifyUserPrivateKey(USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyUserPrivateKey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadPurse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_LoadPurse(SERVER_ID,ASSET_TYPE_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadMint) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_LoadMint(SERVER_ID,ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadAssetContract) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_LoadAssetContract(ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadServerContract) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_LoadServerContract(SERVER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadServerContract((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Mint_IsStillGood) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Mint_IsStillGood(SERVER_ID,USER_ID,ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Mint_IsStillGood" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Mint_IsStillGood" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Mint_IsStillGood" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_IsBasketCurrency) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_IsBasketCurrency(ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsBasketCurrency" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Basket_GetMemberCount) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Basket_GetMemberCount(BASKET_ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Basket_GetMemberType) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Basket_GetMemberType(BASKET_ASSET_TYPE_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberType" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Basket_GetMinimumTransferAmount) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Basket_GetMinimumTransferAmount(BASKET_ASSET_TYPE_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Basket_GetMemberMinimumTransferAmount) { + { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_Basket_GetMemberMinimumTransferAmount(BASKET_ASSET_TYPE_ID,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadAssetAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_LoadAssetAccount(SERVER_ID,USER_ID,ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadInbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_LoadInbox(SERVER_ID,USER_ID,ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadOutbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_LoadOutbox(SERVER_ID,USER_ID,ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_GetCount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Ledger_GetCount(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetCount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetCount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_CreateResponse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Ledger_CreateResponse(SERVER_ID,USER_ID,ACCOUNT_ID,ORIGINAL_LEDGER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_GetTransactionByIndex) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Ledger_GetTransactionByIndex(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_GetTransactionByID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Ledger_GetTransactionByID(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER,TRANSACTION_NUMBER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_GetTransactionIDByIndex) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Ledger_GetTransactionIDByIndex(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER,nIndex);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_AddTransaction) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Ledger_AddTransaction(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_CreateResponse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int val6 ; + int ecode6 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: OT_API_Transaction_CreateResponse(SERVER_ID,USER_ID,ACCOUNT_ID,RESPONSE_LEDGER,ORIGINAL_TRANSACTION,BOOL_DO_I_ACCEPT);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + ecode6 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(5), &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "6"" of type '" "int""'"); + } + arg6 = static_cast< int >(val6); + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Ledger_FinalizeResponse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Ledger_FinalizeResponse(SERVER_ID,USER_ID,ACCOUNT_ID,THE_LEDGER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetType) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetType(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetType" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetVoucher) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetVoucher(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetSuccess) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetSuccess(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetBalanceAgreementSuccess) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetBalanceAgreementSuccess(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetDateSigned) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetDateSigned(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetAmount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetAmount(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetAmount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetAmount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetAmount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Pending_GetNote) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Pending_GetNote(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Pending_GetNote" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Pending_GetNote" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Pending_GetNote" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Pending_GetNote" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetSenderUserID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetSenderUserID(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetSenderAcctID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetSenderAcctID(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetRecipientUserID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetRecipientUserID(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetRecipientAcctID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetRecipientAcctID(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Transaction_GetDisplayReferenceToNum) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Transaction_GetDisplayReferenceToNum(SERVER_ID,USER_ID,ACCOUNT_ID,THE_TRANSACTION);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_CreatePurse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_CreatePurse(SERVER_ID,ASSET_TYPE_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_CreatePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_CreatePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_CreatePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_SavePurse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_SavePurse(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SavePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SavePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SavePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_SavePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Purse_GetTotalValue) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Purse_GetTotalValue(SERVER_ID,ASSET_TYPE_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Purse_Count) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Purse_Count(SERVER_ID,ASSET_TYPE_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Count" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Count" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Count" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Purse_Peek) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Purse_Peek(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Peek" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Peek" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Peek" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Peek" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Purse_Pop) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Purse_Pop(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Pop" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Pop" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Pop" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Pop" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Purse_Push) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Purse_Push(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Push" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Push" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Push" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Push" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Purse_Push" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Wallet_ImportPurse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Wallet_ImportPurse(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_exchangePurse) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_exchangePurse(SERVER_ID,ASSET_TYPE_ID,USER_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_ChangeOwner) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_Token_ChangeOwner(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN,OLD_OWNER_NYM_ID,NEW_OWNER_NYM_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_ChangeOwner" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_ChangeOwner" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_ChangeOwner" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Token_ChangeOwner" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Token_ChangeOwner" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Token_GetID(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetDenomination) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Token_GetDenomination(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetDenomination" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetDenomination" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetDenomination" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetSeries) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Token_GetSeries(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetSeries" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetSeries" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetSeries" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetValidFrom) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Token_GetValidFrom(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidFrom" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidFrom" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidFrom" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetValidTo) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_Token_GetValidTo(SERVER_ID,ASSET_TYPE_ID,THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidTo" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidTo" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidTo" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetAssetID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Token_GetAssetID(THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetAssetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Token_GetServerID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Token_GetServerID(THE_TOKEN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_checkServerID) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_checkServerID(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkServerID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_createUserAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_createUserAccount(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_deleteUserAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_deleteUserAccount(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_deleteAssetAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_deleteAssetAccount(SERVER_ID,USER_ID,ACCOUNT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_deleteAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_checkUser) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_checkUser(SERVER_ID,USER_ID,USER_ID_CHECK);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkUser" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkUser" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_checkUser" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_sendUserMessage) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_sendUserMessage(SERVER_ID,USER_ID,USER_ID_RECIPIENT,RECIPIENT_PUBKEY,THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_sendUserMessage" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_sendUserMessage" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_sendUserMessage" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_sendUserMessage" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_sendUserMessage" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getRequest) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_getRequest(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getRequest" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getRequest" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getRequest((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getTransactionNumber) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_getTransactionNumber(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getTransactionNumber" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getTransactionNumber" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_issueAssetType) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_issueAssetType(SERVER_ID,USER_ID,THE_CONTRACT);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueAssetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueAssetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getContract) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getContract(SERVER_ID,USER_ID,ASSET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getContract" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getContract" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getMint) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getMint(SERVER_ID,USER_ID,ASSET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMint" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_createAssetAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_createAssetAccount(SERVER_ID,USER_ID,ASSET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_createAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getAccount) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getAccount(SERVER_ID,USER_ID,ACCT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GenerateBasketCreation) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_GenerateBasketCreation(USER_ID,MINIMUM_TRANSFER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketCreation" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketCreation" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_AddBasketCreationItem) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_AddBasketCreationItem(USER_ID,THE_BASKET,ASSET_TYPE_ID,MINIMUM_TRANSFER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketCreationItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketCreationItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketCreationItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketCreationItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_issueBasket) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_issueBasket(SERVER_ID,USER_ID,THE_BASKET);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_GenerateBasketExchange) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_GenerateBasketExchange(SERVER_ID,USER_ID,BASKET_ASSET_TYPE_ID,BASKET_ASSET_ACCT_ID,TRANSFER_MULTIPLE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketExchange" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketExchange" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_GenerateBasketExchange" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_GenerateBasketExchange" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_GenerateBasketExchange" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_AddBasketExchangeItem) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_AddBasketExchangeItem(SERVER_ID,USER_ID,THE_BASKET,ASSET_TYPE_ID,ASSET_ACCT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_exchangeBasket) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_exchangeBasket(SERVER_ID,USER_ID,BASKET_ASSET_ID,THE_BASKET,BOOL_EXCHANGE_IN_OR_OUT);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangeBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangeBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangeBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangeBasket" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_exchangeBasket" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_notarizeWithdrawal) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_notarizeWithdrawal(SERVER_ID,USER_ID,ACCT_ID,AMOUNT);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeWithdrawal" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeWithdrawal" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeWithdrawal" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeWithdrawal" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_notarizeDeposit) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_notarizeDeposit(SERVER_ID,USER_ID,ACCT_ID,THE_PURSE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeDeposit" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeDeposit" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeDeposit" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeDeposit" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_notarizeTransfer) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: OT_API_notarizeTransfer(SERVER_ID,USER_ID,ACCT_FROM,ACCT_TO,AMOUNT,NOTE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeTransfer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeTransfer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeTransfer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeTransfer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_notarizeTransfer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_notarizeTransfer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getInbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getInbox(SERVER_ID,USER_ID,ACCT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getOutbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getOutbox(SERVER_ID,USER_ID,ACCT_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getNymbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_getNymbox(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_LoadNymbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_LoadNymbox(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_processInbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_processInbox(SERVER_ID,USER_ID,ACCT_ID,ACCT_LEDGER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_processInbox" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_processNymbox) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_processNymbox(SERVER_ID,USER_ID,ACCT_LEDGER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processNymbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_withdrawVoucher) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: OT_API_withdrawVoucher(SERVER_ID,USER_ID,ACCT_ID,RECIPIENT_USER_ID,CHEQUE_MEMO,AMOUNT);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_withdrawVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_withdrawVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_withdrawVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_withdrawVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_withdrawVoucher" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_withdrawVoucher" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_depositCheque) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_depositCheque(SERVER_ID,USER_ID,ACCT_ID,THE_CHEQUE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_depositCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_depositPaymentPlan) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_depositPaymentPlan(SERVER_ID,USER_ID,THE_PAYMENT_PLAN);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_issueMarketOffer) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int val11 ; + int ecode11 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 11) || (items > 11)) { + SWIG_croak("Usage: OT_API_issueMarketOffer(SERVER_ID,USER_ID,ASSET_TYPE_ID,ASSET_ACCT_ID,CURRENCY_TYPE_ID,CURRENCY_ACCT_ID,MARKET_SCALE,MINIMUM_INCREMENT,TOTAL_ASSETS_ON_OFFER,PRICE_LIMIT,bBuyingOrSelling);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_issueMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_issueMarketOffer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_issueMarketOffer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(ST(6), &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_issueMarketOffer" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(ST(7), &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_issueMarketOffer" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(ST(8), &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_issueMarketOffer" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(ST(9), &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_issueMarketOffer" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + ecode11 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(10), &val11); + if (!SWIG_IsOK(ecode11)) { + SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "OT_API_issueMarketOffer" "', argument " "11"" of type '" "int""'"); + } + arg11 = static_cast< int >(val11); + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getMarketList) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_getMarketList(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketList" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketList" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getMarketOffers) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_getMarketOffers(SERVER_ID,USER_ID,MARKET_ID,MAX_DEPTH);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketOffers" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_getMarketOffers" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getMarketRecentTrades) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: OT_API_getMarketRecentTrades(SERVER_ID,USER_ID,MARKET_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketRecentTrades" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketRecentTrades" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketRecentTrades" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_getNym_MarketOffers) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OT_API_getNym_MarketOffers(SERVER_ID,USER_ID);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNym_MarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNym_MarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_cancelMarketOffer) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_cancelMarketOffer(SERVER_ID,USER_ID,ASSET_ACCT_ID,TRANSACTION_NUMBER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_cancelPaymentPlan) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_cancelPaymentPlan(SERVER_ID,USER_ID,FROM_ACCT_ID,TRANSACTION_NUMBER);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = sv_newmortal(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_PopMessageBuffer) { + { + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_PopMessageBuffer();"); + } + result = (char *)OT_API_PopMessageBuffer(); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_FlushMessageBuffer) { + { + int argvi = 0; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_FlushMessageBuffer();"); + } + OT_API_FlushMessageBuffer(); + ST(argvi) = sv_newmortal(); + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetCommand) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetCommand(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetCommand" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetSuccess) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetSuccess(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetDepth) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetDepth(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetDepth" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetDepth((char const *)arg1); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetTransactionSuccess) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Message_GetTransactionSuccess(SERVER_ID,USER_ID,ACCOUNT_ID,THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetBalanceAgreementSuccess) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: OT_API_Message_GetBalanceAgreementSuccess(SERVER_ID,USER_ID,ACCOUNT_ID,THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetLedger) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetLedger(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetLedger" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetNewAssetTypeID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetNewAssetTypeID(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetNewIssuerAcctID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetNewIssuerAcctID(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewIssuerAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_Message_GetNewAcctID) { + { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int argvi = 0; + char *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OT_API_Message_GetNewAcctID(THE_MESSAGE);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_ConnectServer) { + { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int argvi = 0; + int result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: OT_API_ConnectServer(SERVER_ID,USER_ID,szCA_FILE,szKEY_FILE,szKEY_PASSWORD);"); + } + res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConnectServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConnectServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConnectServer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConnectServer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConnectServer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + XSRETURN(argvi); + fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + SWIG_croak_null(); + } +} + + +XS(_wrap_OT_API_ProcessSockets) { + { + int argvi = 0; + int result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: OT_API_ProcessSockets();"); + } + result = (int)OT_API_ProcessSockets(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Storable) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Storable(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storable" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storable_Create) { + { + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storable_Create(eType,thePackType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storable_Create" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storable_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storable_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Storable_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_GetPacker__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTPacker *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_GetPacker(self,ePackType);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_GetPacker" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTPacker *)(arg1)->GetPacker(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_GetPacker__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTPacker *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Storage_GetPacker(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTPacker *)(arg1)->GetPacker(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_GetPacker) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_GetPacker__SWIG_1); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_GetPacker__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_GetPacker'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_Init__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 7) || (items > 7)) { + SWIG_croak("Usage: Storage_Init(self,oneStr,twoStr,threeStr,fourStr,fiveStr,sixStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + + XSRETURN(argvi); + fail: + + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: Storage_Init(self,oneStr,twoStr,threeStr,fourStr,fiveStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_Init(self,oneStr,twoStr,threeStr,fourStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_Init(self,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_4) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_Init(self,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_5) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_Init(self,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init__SWIG_6) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Storage_Init(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (bool)(arg1)->Init(); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Init) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 5; + if (_rank == _rankm) goto dispatch; + } + } + check_5: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 6; + if (_rank == _rankm) goto dispatch; + } + } + check_6: + + if (items == 7) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 7; + if (_rank == _rankm) goto dispatch; + } + } + check_7: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_6); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_5); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_4); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_3); return; + case 5: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_2); return; + case 6: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_1); return; + case 7: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Init__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_Init'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_Exists__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_Exists(self,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Exists__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_Exists(self,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Exists__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_Exists(self,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Exists__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_Exists(self,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Exists) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Exists__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Exists__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Exists__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_Exists__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_Exists'"); + XSRETURN(0); +} + + +XS(_wrap_delete_Storage) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Storage(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storage" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreString__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: Storage_StoreString(self,strContents,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreString__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_StoreString(self,strContents,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreString__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_StoreString(self,strContents,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreString__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_StoreString(self,strContents,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_StoreString'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_QueryString__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_QueryString(self,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryString__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_QueryString(self,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryString__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_QueryString(self,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryString__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_QueryString(self,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_QueryString'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_StorePlainString__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: Storage_StorePlainString(self,strContents,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StorePlainString__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_StorePlainString(self,strContents,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StorePlainString__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_StorePlainString(self,strContents,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StorePlainString__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_StorePlainString(self,strContents,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StorePlainString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StorePlainString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StorePlainString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StorePlainString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StorePlainString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_StorePlainString'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_QueryPlainString__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_QueryPlainString(self,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryPlainString__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_QueryPlainString(self,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryPlainString__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_QueryPlainString(self,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryPlainString__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_QueryPlainString(self,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryPlainString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryPlainString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryPlainString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryPlainString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryPlainString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_QueryPlainString'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_StoreObject__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: Storage_StoreObject(self,theContents,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreObject__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_StoreObject(self,theContents,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreObject__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_StoreObject(self,theContents,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreObject__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_StoreObject(self,theContents,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_StoreObject) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(1), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(1), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(1), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(1), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreObject__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreObject__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreObject__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_StoreObject__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_StoreObject'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_QueryObject__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: Storage_QueryObject(self,theObjectType,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryObject__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_QueryObject(self,theObjectType,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryObject__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_QueryObject(self,theObjectType,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryObject__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_QueryObject(self,theObjectType,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_QueryObject) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryObject__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryObject__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryObject__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_QueryObject__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_QueryObject'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_EraseValueByKey__SWIG_0) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: Storage_EraseValueByKey(self,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_EraseValueByKey__SWIG_1) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Storage_EraseValueByKey(self,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_EraseValueByKey__SWIG_2) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Storage_EraseValueByKey(self,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_EraseValueByKey__SWIG_3) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_EraseValueByKey(self,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_EraseValueByKey) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_EraseValueByKey__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_EraseValueByKey__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_EraseValueByKey__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Storage_EraseValueByKey__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Storage_EraseValueByKey'"); + XSRETURN(0); +} + + +XS(_wrap_Storage_CreateObject) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_CreateObject(self,eType);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_CreateObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_CreateObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_Create) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storage *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Storage_Create(eStorageType,ePackType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storage_Create" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Storage_GetType) { + { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::StorageType result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Storage_GetType(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetType" "', argument " "1"" of type '" "OTDB::Storage const *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_0) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 8) || (items > 8)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr,twoStr,threeStr,fourStr,fiveStr,sixStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(7), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "8"" of type '" "std::string""'"); + } + arg8 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + + + XSRETURN(argvi); + fail: + + + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_1) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 7) || (items > 7)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr,twoStr,threeStr,fourStr,fiveStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + + XSRETURN(argvi); + fail: + + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_2) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 6) || (items > 6)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr,twoStr,threeStr,fourStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + + XSRETURN(argvi); + fail: + + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_3) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr,twoStr,threeStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_4) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr,twoStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_5) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType,oneStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage__SWIG_6) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: InitDefaultStorage(eStoreType,ePackType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_InitDefaultStorage) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + if (items == 6) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_5; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 5; + if (_rank == _rankm) goto dispatch; + } + } + check_5: + + if (items == 7) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_6; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 6; + if (_rank == _rankm) goto dispatch; + } + } + check_6: + + if (items == 8) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(5), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(6), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(7), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_7; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 7; + if (_rank == _rankm) goto dispatch; + } + } + check_7: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_6); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_5); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_4); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_3); return; + case 5: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_2); return; + case 6: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_1); return; + case 7: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_InitDefaultStorage__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'InitDefaultStorage'"); + XSRETURN(0); +} + + +XS(_wrap_GetDefaultStorage) { + { + int argvi = 0; + OTDB::Storage *result = 0 ; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: GetDefaultStorage();"); + } + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | SWIG_SHADOW); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_CreateStorageContext__SWIG_0) { + { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Storage *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: CreateStorageContext(eStoreType,ePackType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CreateStorageContext" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_CreateStorageContext__SWIG_1) { + { + OTDB::StorageType arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storage *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: CreateStorageContext(eStoreType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_CreateStorageContext) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_CreateStorageContext__SWIG_1); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_CreateStorageContext__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'CreateStorageContext'"); + XSRETURN(0); +} + + +XS(_wrap_CreateObject) { + { + OTDB::StoredObjectType arg1 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: CreateObject(eType);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Exists__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: Exists(strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Exists__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: Exists(strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Exists__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Exists(strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Exists__SWIG_3) { + { + std::string arg1 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Exists(strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Exists) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Exists__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Exists__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Exists__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_Exists__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'Exists'"); + XSRETURN(0); +} + + +XS(_wrap_StoreString__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: StoreString(strContents,strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreString__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: StoreString(strContents,strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreString__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: StoreString(strContents,strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreString__SWIG_3) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: StoreString(strContents,strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'StoreString'"); + XSRETURN(0); +} + + +XS(_wrap_QueryString__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: QueryString(strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryString__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: QueryString(strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryString__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: QueryString(strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryString__SWIG_3) { + { + std::string arg1 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: QueryString(strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'QueryString'"); + XSRETURN(0); +} + + +XS(_wrap_StorePlainString__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: StorePlainString(strContents,strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StorePlainString__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: StorePlainString(strContents,strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StorePlainString__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: StorePlainString(strContents,strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StorePlainString__SWIG_3) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: StorePlainString(strContents,strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StorePlainString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StorePlainString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StorePlainString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StorePlainString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StorePlainString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'StorePlainString'"); + XSRETURN(0); +} + + +XS(_wrap_QueryPlainString__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: QueryPlainString(strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryPlainString__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: QueryPlainString(strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryPlainString__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: QueryPlainString(strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryPlainString__SWIG_3) { + { + std::string arg1 ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: QueryPlainString(strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryPlainString) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryPlainString__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryPlainString__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryPlainString__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryPlainString__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'QueryPlainString'"); + XSRETURN(0); +} + + +XS(_wrap_StoreObject__SWIG_0) { + { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: StoreObject(theContents,strFolder,oneStr,twoStr,threeStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreObject__SWIG_1) { + { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: StoreObject(theContents,strFolder,oneStr,twoStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreObject__SWIG_2) { + { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: StoreObject(theContents,strFolder,oneStr);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreObject__SWIG_3) { + { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: StoreObject(theContents,strFolder);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StoreObject) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreObject__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreObject__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreObject__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_StoreObject__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'StoreObject'"); + XSRETURN(0); +} + + +XS(_wrap_QueryObject__SWIG_0) { + { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 5) || (items > 5)) { + SWIG_croak("Usage: QueryObject(theObjectType,strFolder,oneStr,twoStr,threeStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + + + XSRETURN(argvi); + fail: + + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryObject__SWIG_1) { + { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: QueryObject(theObjectType,strFolder,oneStr,twoStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryObject__SWIG_2) { + { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: QueryObject(theObjectType,strFolder,oneStr);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryObject__SWIG_3) { + { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + int val1 ; + int ecode1 = 0 ; + int argvi = 0; + OTDB::Storable *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: QueryObject(theObjectType,strFolder);"); + } + ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_OWNER | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_QueryObject) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 5) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(4), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryObject__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryObject__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryObject__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_QueryObject__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'QueryObject'"); + XSRETURN(0); +} + + +XS(_wrap_EraseValueByKey__SWIG_0) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 4) || (items > 4)) { + SWIG_croak("Usage: EraseValueByKey(strFolder,oneStr,twoStr,threeStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + + XSRETURN(argvi); + fail: + + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_EraseValueByKey__SWIG_1) { + { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: EraseValueByKey(strFolder,oneStr,twoStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_EraseValueByKey__SWIG_2) { + { + std::string arg1 ; + std::string arg2 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: EraseValueByKey(strFolder,oneStr);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_EraseValueByKey__SWIG_3) { + { + std::string arg1 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: EraseValueByKey(strFolder);"); + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_EraseValueByKey) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 1) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_3; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 3; + if (_rank == _rankm) goto dispatch; + } + } + check_3: + + if (items == 4) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(0), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + int res = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(3), (std::string**)(0)); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_4; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 4; + if (_rank == _rankm) goto dispatch; + } + } + check_4: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_EraseValueByKey__SWIG_3); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_EraseValueByKey__SWIG_2); return; + case 3: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_EraseValueByKey__SWIG_1); return; + case 4: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_EraseValueByKey__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'EraseValueByKey'"); + XSRETURN(0); +} + + +XS(_wrap_delete_OTDBString) { + { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OTDBString(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OTDBString, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTDBString" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTDBString_m_string_set) { + { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OTDBString_m_string_set(self,m_string);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_set" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->m_string = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OTDBString_m_string_get) { + { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTDBString_m_string_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_get" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + result = (std::string *) & ((arg1)->m_string); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OTDBString_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::OTDBString *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OTDBString_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OTDBString, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Blob) { + { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Blob(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Blob, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Blob" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Blob_m_memBuffer_set) { + { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Blob_m_memBuffer_set(self,m_memBuffer);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_set" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + { + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_std__vectorT_unsigned_char_t, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } else { + arg2 = *(reinterpret_cast< std::vector< unsigned char > * >(argp2)); + } + } + if (arg1) (arg1)->m_memBuffer = arg2; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Blob_m_memBuffer_get) { + { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::vector< unsigned char > result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Blob_m_memBuffer_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_get" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + result = ((arg1)->m_memBuffer); + ST(argvi) = SWIG_NewPointerObj((new std::vector< unsigned char >(static_cast< const std::vector< unsigned char >& >(result))), SWIGTYPE_p_std__vectorT_unsigned_char_t, SWIG_POINTER_OWN | 0); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Blob_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Blob *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Blob_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Blob, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_StringMap) { + { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_StringMap(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__StringMap, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_StringMap" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_StringMap_the_map_set) { + { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: StringMap_the_map_set(self,the_map);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_set" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2,SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_the_map_set" "', argument " "2"" of type '" "std::map< std::string,std::string > *""'"); + } + arg2 = reinterpret_cast< std::map< std::string,std::string > * >(argp2); + if (arg1) (arg1)->the_map = *arg2; + ST(argvi) = sv_newmortal(); + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_StringMap_the_map_get) { + { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::map< std::string,std::string > *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: StringMap_the_map_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_get" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_StringMap_SetValue) { + { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int res3 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: StringMap_SetValue(self,strKey,strValue);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_SetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + { + std::string *ptr = (std::string *)0; + res3 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(2), &ptr); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + arg3 = ptr; + } + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + SWIG_croak_null(); + } +} + + +XS(_wrap_StringMap_GetValue) { + { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + std::string result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: StringMap_GetValue(self,strKey);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_GetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + result = (arg1)->GetValue((std::string const &)*arg2); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(result)); argvi++ ; + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_StringMap_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::StringMap *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: StringMap_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__StringMap, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Displayable) { + { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Displayable(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Displayable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Displayable" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Displayable_gui_label_set) { + { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Displayable_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_set" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Displayable_gui_label_get) { + { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Displayable_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_get" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Displayable_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Displayable *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Displayable_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Displayable, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_MarketData) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_MarketData(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketData" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_gui_label_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_gui_label_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_server_id_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_server_id_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_market_id_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_market_id_set(self,market_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->market_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_market_id_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_market_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->market_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_asset_type_id_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_asset_type_id_set(self,asset_type_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_asset_type_id_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_asset_type_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_currency_type_id_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_currency_type_id_set(self,currency_type_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_currency_type_id_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_currency_type_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_scale_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_scale_set(self,scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_scale_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_total_assets_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_total_assets_set(self,total_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_total_assets_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_total_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_number_bids_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_number_bids_set(self,number_bids);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_bids = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_number_bids_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_number_bids_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_bids); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_number_asks_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_number_asks_set(self,number_asks);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_asks = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_number_asks_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_number_asks_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_asks); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_last_sale_price_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_last_sale_price_set(self,last_sale_price);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->last_sale_price = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_last_sale_price_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_last_sale_price_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->last_sale_price); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_current_bid_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_current_bid_set(self,current_bid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_bid = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_current_bid_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_current_bid_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_bid); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_current_ask_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_current_ask_set(self,current_ask);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_ask = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_current_ask_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_current_ask_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_ask); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_trades_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_volume_trades_set(self,volume_trades);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_trades = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_trades_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_volume_trades_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_trades); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_assets_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_volume_assets_set(self,volume_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_assets_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_volume_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_currency_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_volume_currency_set(self,volume_currency);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_currency = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_volume_currency_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_volume_currency_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_currency); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_recent_highest_bid_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_recent_highest_bid_set(self,recent_highest_bid);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_highest_bid = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_recent_highest_bid_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_recent_highest_bid_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_highest_bid); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_recent_lowest_ask_set) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketData_recent_lowest_ask_set(self,recent_lowest_ask);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_lowest_ask = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_recent_lowest_ask_get) { + { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_recent_lowest_ask_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_lowest_ask); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketData_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::MarketData *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketData_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_MarketList) { + { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_MarketList(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketList, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketList" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketList_GetMarketDataCount) { + { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketList_GetMarketDataCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketDataCount" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + result = (arg1)->GetMarketDataCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketList_GetMarketData) { + { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::MarketData *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketList_GetMarketData(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_GetMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketList_RemoveMarketData) { + { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketList_RemoveMarketData(self,nIndexMarketData);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_RemoveMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_RemoveMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveMarketData(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketList_AddMarketData) { + { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MarketList_AddMarketData(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_AddMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__MarketData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + arg2 = reinterpret_cast< OTDB::MarketData * >(argp2); + result = (bool)(arg1)->AddMarketData(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_MarketList_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::MarketList *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: MarketList_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketList, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OfferDataMarket) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OfferDataMarket(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataMarket" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_gui_label_set) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataMarket_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_gui_label_get) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_transaction_id_set) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataMarket_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_transaction_id_get) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_price_per_scale_set) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataMarket_price_per_scale_set(self,price_per_scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_price_per_scale_get) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_price_per_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_available_assets_set) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataMarket_available_assets_set(self,available_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_available_assets_get) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_available_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_minimum_increment_set) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataMarket_minimum_increment_set(self,minimum_increment);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_minimum_increment_get) { + { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_minimum_increment_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataMarket_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::OfferDataMarket *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataMarket_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataMarket, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_BidData) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_BidData(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BidData" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_gui_label_set) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BidData_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_gui_label_get) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_transaction_id_set) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BidData_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_transaction_id_get) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_price_per_scale_set) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BidData_price_per_scale_set(self,price_per_scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_price_per_scale_get) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_price_per_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_available_assets_set) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BidData_available_assets_set(self,available_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_available_assets_get) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_available_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_minimum_increment_set) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BidData_minimum_increment_set(self,minimum_increment);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_minimum_increment_get) { + { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_minimum_increment_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BidData_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::BidData *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BidData_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_AskData) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_AskData(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AskData" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_gui_label_set) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AskData_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_gui_label_get) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_transaction_id_set) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AskData_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_transaction_id_get) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_price_per_scale_set) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AskData_price_per_scale_set(self,price_per_scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_price_per_scale_get) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_price_per_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_available_assets_set) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AskData_available_assets_set(self,available_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_available_assets_get) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_available_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_minimum_increment_set) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AskData_minimum_increment_set(self,minimum_increment);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_minimum_increment_get) { + { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_minimum_increment_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AskData_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::AskData *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AskData_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OfferListMarket) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OfferListMarket(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListMarket" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_GetBidDataCount) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferListMarket_GetBidDataCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetBidDataCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_GetBidData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::BidData *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_GetBidData(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_RemoveBidData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_RemoveBidData(self,nIndexBidData);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBidData(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_AddBidData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_AddBidData(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__BidData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + arg2 = reinterpret_cast< OTDB::BidData * >(argp2); + result = (bool)(arg1)->AddBidData(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_GetAskDataCount) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferListMarket_GetAskDataCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetAskDataCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_GetAskData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::AskData *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_GetAskData(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_RemoveAskData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_RemoveAskData(self,nIndexAskData);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveAskData(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_AddAskData) { + { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListMarket_AddAskData(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__AskData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + arg2 = reinterpret_cast< OTDB::AskData * >(argp2); + result = (bool)(arg1)->AddAskData(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListMarket_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::OfferListMarket *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferListMarket_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListMarket, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_TradeDataMarket) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_TradeDataMarket(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_gui_label_set) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataMarket_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_gui_label_get) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_transaction_id_set) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataMarket_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_transaction_id_get) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_date_set) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataMarket_date_set(self,date);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_date_get) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_date_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->date); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_price_set) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataMarket_price_set(self,price);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_price_get) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_price_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_amount_sold_set) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataMarket_amount_sold_set(self,amount_sold);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_amount_sold_get) { + { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_amount_sold_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataMarket_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::TradeDataMarket *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataMarket_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_TradeListMarket) { + { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_TradeListMarket(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListMarket_GetTradeDataMarketCount) { + { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeListMarket_GetTradeDataMarketCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarketCount" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + result = (arg1)->GetTradeDataMarketCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListMarket_GetTradeDataMarket) { + { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::TradeDataMarket *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListMarket_GetTradeDataMarket(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListMarket_RemoveTradeDataMarket) { + { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListMarket_RemoveTradeDataMarket(self,nIndexTradeDataMarket);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListMarket_AddTradeDataMarket) { + { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListMarket_AddTradeDataMarket(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__TradeDataMarket, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataMarket * >(argp2); + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListMarket_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::TradeListMarket *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeListMarket_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListMarket, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OfferDataNym) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OfferDataNym(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataNym" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_gui_label_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_gui_label_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_valid_from_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_valid_from_set(self,valid_from);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_from = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_valid_from_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_valid_from_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_from); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_valid_to_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_valid_to_set(self,valid_to);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_to = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_valid_to_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_valid_to_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_to); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_server_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_server_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_asset_type_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_asset_type_id_set(self,asset_type_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_asset_type_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_asset_type_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_asset_acct_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_asset_acct_id_set(self,asset_acct_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_acct_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_asset_acct_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_asset_acct_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_acct_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_currency_type_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_currency_type_id_set(self,currency_type_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_currency_type_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_currency_type_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_currency_acct_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_currency_acct_id_set(self,currency_acct_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_acct_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_currency_acct_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_currency_acct_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_acct_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_selling_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_selling_set(self,selling);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + ecode2 = SWIG_AsVal_bool SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferDataNym_selling_set" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->selling = arg2; + ST(argvi) = sv_newmortal(); + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_selling_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_selling_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (bool) ((arg1)->selling); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_scale_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_scale_set(self,scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_scale_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_price_per_scale_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_price_per_scale_set(self,price_per_scale);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_price_per_scale_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_price_per_scale_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_transaction_id_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_transaction_id_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_total_assets_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_total_assets_set(self,total_assets);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_total_assets_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_total_assets_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_finished_so_far_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_finished_so_far_set(self,finished_so_far);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->finished_so_far = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_finished_so_far_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_finished_so_far_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->finished_so_far); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_minimum_increment_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_minimum_increment_set(self,minimum_increment);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_minimum_increment_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_minimum_increment_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_stop_sign_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_stop_sign_set(self,stop_sign);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_sign = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_stop_sign_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_stop_sign_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_sign); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_stop_price_set) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferDataNym_stop_price_set(self,stop_price);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_price = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_stop_price_get) { + { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_stop_price_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_price); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferDataNym_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::OfferDataNym *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferDataNym_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_OfferListNym) { + { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_OfferListNym(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListNym_GetOfferDataNymCount) { + { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferListNym_GetOfferDataNymCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNymCount" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + result = (arg1)->GetOfferDataNymCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListNym_GetOfferDataNym) { + { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::OfferDataNym *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListNym_GetOfferDataNym(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListNym_RemoveOfferDataNym) { + { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListNym_RemoveOfferDataNym(self,nIndexOfferDataNym);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListNym_AddOfferDataNym) { + { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: OfferListNym_AddOfferDataNym(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__OfferDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::OfferDataNym * >(argp2); + result = (bool)(arg1)->AddOfferDataNym(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_OfferListNym_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::OfferListNym *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: OfferListNym_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListNym, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_TradeDataNym) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_TradeDataNym(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataNym" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_gui_label_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_gui_label_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_transaction_id_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_transaction_id_set(self,transaction_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_transaction_id_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_transaction_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_completed_count_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_completed_count_set(self,completed_count);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->completed_count = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_completed_count_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_completed_count_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->completed_count); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_date_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_date_set(self,date);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_date_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_date_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->date); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_price_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_price_set(self,price);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_price_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_price_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->price); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_amount_sold_set) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeDataNym_amount_sold_set(self,amount_sold);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_amount_sold_get) { + { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_amount_sold_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeDataNym_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::TradeDataNym *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeDataNym_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_TradeListNym) { + { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_TradeListNym(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListNym_GetTradeDataNymCount) { + { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeListNym_GetTradeDataNymCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNymCount" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + result = (arg1)->GetTradeDataNymCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListNym_GetTradeDataNym) { + { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::TradeDataNym *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListNym_GetTradeDataNym(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListNym_RemoveTradeDataNym) { + { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListNym_RemoveTradeDataNym(self,nIndexTradeDataNym);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListNym_AddTradeDataNym) { + { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: TradeListNym_AddTradeDataNym(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__TradeDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataNym * >(argp2); + result = (bool)(arg1)->AddTradeDataNym(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_TradeListNym_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::TradeListNym *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: TradeListNym_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListNym, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Acct) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Acct(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Acct" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_gui_label_set) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Acct_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_gui_label_get) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Acct_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_acct_id_set) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Acct_acct_id_set(self,acct_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_acct_id_get) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Acct_acct_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_server_id_set) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Acct_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_server_id_get) { + { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Acct_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Acct_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Acct *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Acct_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Acct, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_BitcoinAcct) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_BitcoinAcct(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinAcct" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_gui_label_set) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinAcct_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_gui_label_get) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinAcct_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_acct_id_set) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinAcct_acct_id_set(self,acct_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_acct_id_get) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinAcct_acct_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_server_id_set) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinAcct_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_server_id_get) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinAcct_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_bitcoin_acct_name_set) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinAcct_bitcoin_acct_name_set(self,bitcoin_acct_name);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_acct_name = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_bitcoin_acct_name_get) { + { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinAcct_bitcoin_acct_name_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_acct_name); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinAcct_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::BitcoinAcct *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinAcct_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_ServerInfo) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_ServerInfo(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ServerInfo" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_gui_label_set) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ServerInfo_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_gui_label_get) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ServerInfo_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_server_id_set) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ServerInfo_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_server_id_get) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ServerInfo_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_server_type_set) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ServerInfo_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_server_type_get) { + { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ServerInfo_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ServerInfo_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::ServerInfo *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ServerInfo_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Server) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Server(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Server" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_gui_label_set) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Server_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_gui_label_get) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_id_set) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Server_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_id_get) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_type_set) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Server_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_type_get) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_host_set) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Server_server_host_set(self,server_host);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_host_get) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_server_host_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_host); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_port_set) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Server_server_port_set(self,server_port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_server_port_get) { + { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_server_port_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_port); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Server_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Server *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Server_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Server, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_BitcoinServer) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_BitcoinServer(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinServer" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_gui_label_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_gui_label_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_id_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_id_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_type_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_type_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_host_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_server_host_set(self,server_host);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_host_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_server_host_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_port_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_server_port_set(self,server_port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_server_port_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_server_port_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_bitcoin_username_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_bitcoin_username_set(self,bitcoin_username);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_username = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_bitcoin_username_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_bitcoin_username_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_username); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_bitcoin_password_set) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: BitcoinServer_bitcoin_password_set(self,bitcoin_password);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_password = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_bitcoin_password_get) { + { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_bitcoin_password_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_password); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_BitcoinServer_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::BitcoinServer *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: BitcoinServer_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_RippleServer) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_RippleServer(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RippleServer" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_gui_label_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_gui_label_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_id_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_id_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_type_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_type_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_host_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_server_host_set(self,server_host);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_host_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_server_host_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_port_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_server_port_set(self,server_port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_server_port_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_server_port_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_ripple_username_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_ripple_username_set(self,ripple_username);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_username = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_ripple_username_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_ripple_username_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_username); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_ripple_password_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_ripple_password_set(self,ripple_password);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_password = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_ripple_password_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_ripple_password_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_password); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_namefield_id_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_namefield_id_set(self,namefield_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_namefield_id_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_namefield_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_passfield_id_set) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: RippleServer_passfield_id_set(self,passfield_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->passfield_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_passfield_id_get) { + { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_passfield_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->passfield_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_RippleServer_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::RippleServer *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: RippleServer_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_LoomServer) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_LoomServer(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LoomServer" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_gui_label_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_gui_label_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_id_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_id_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_type_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_type_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_host_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_server_host_set(self,server_host);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_host_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_server_host_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_port_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_server_port_set(self,server_port);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_server_port_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_server_port_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_loom_username_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_loom_username_set(self,loom_username);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->loom_username = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_loom_username_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_loom_username_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->loom_username); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_namefield_id_set) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: LoomServer_namefield_id_set(self,namefield_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_namefield_id_get) { + { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_namefield_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_LoomServer_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::LoomServer *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: LoomServer_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_ContactNym) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_ContactNym(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactNym" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_gui_label_set) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_gui_label_get) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_nym_type_set) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_nym_type_set(self,nym_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_nym_type_get) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_nym_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_nym_id_set) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_nym_id_set(self,nym_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_nym_id_get) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_nym_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_public_key_set) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_public_key_set(self,public_key);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_public_key_get) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_public_key_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->public_key); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_memo_set) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_memo_set(self,memo);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_memo_get) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_memo_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->memo); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_GetServerInfoCount) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_GetServerInfoCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfoCount" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (arg1)->GetServerInfoCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_GetServerInfo) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::ServerInfo *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_GetServerInfo(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_GetServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_RemoveServerInfo) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_RemoveServerInfo(self,nIndexServerInfo);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_RemoveServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_RemoveServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveServerInfo(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_AddServerInfo) { + { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactNym_AddServerInfo(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_AddServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__ServerInfo, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + arg2 = reinterpret_cast< OTDB::ServerInfo * >(argp2); + result = (bool)(arg1)->AddServerInfo(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactNym_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::ContactNym *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactNym_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_WalletData) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_WalletData(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_WalletData" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetBitcoinServerCount) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: WalletData_GetBitcoinServerCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinServerCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetBitcoinServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::BitcoinServer *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_GetBitcoinServer(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_RemoveBitcoinServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_RemoveBitcoinServer(self,nIndexBitcoinServer);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_AddBitcoinServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_AddBitcoinServer(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__BitcoinServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinServer * >(argp2); + result = (bool)(arg1)->AddBitcoinServer(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetBitcoinAcctCount) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: WalletData_GetBitcoinAcctCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcctCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinAcctCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetBitcoinAcct) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::BitcoinAcct *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_GetBitcoinAcct(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_RemoveBitcoinAcct) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_RemoveBitcoinAcct(self,nIndexBitcoinAcct);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_AddBitcoinAcct) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_AddBitcoinAcct(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__BitcoinAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinAcct * >(argp2); + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetRippleServerCount) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: WalletData_GetRippleServerCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetRippleServerCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetRippleServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::RippleServer *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_GetRippleServer(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_RemoveRippleServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_RemoveRippleServer(self,nIndexRippleServer);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveRippleServer(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_AddRippleServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_AddRippleServer(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__RippleServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + arg2 = reinterpret_cast< OTDB::RippleServer * >(argp2); + result = (bool)(arg1)->AddRippleServer(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetLoomServerCount) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: WalletData_GetLoomServerCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetLoomServerCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_GetLoomServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::LoomServer *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_GetLoomServer(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_RemoveLoomServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_RemoveLoomServer(self,nIndexLoomServer);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveLoomServer(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_AddLoomServer) { + { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: WalletData_AddLoomServer(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__LoomServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + arg2 = reinterpret_cast< OTDB::LoomServer * >(argp2); + result = (bool)(arg1)->AddLoomServer(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_WalletData_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::WalletData *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: WalletData_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__WalletData, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_ContactAcct) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_ContactAcct(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactAcct" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_gui_label_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_gui_label_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_server_type_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_server_type_set(self,server_type);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_server_type_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_server_type_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_type); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_server_id_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_server_id_set(self,server_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_server_id_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_server_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_asset_type_id_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_asset_type_id_set(self,asset_type_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_asset_type_id_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_asset_type_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_acct_id_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_acct_id_set(self,acct_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_acct_id_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_acct_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_nym_id_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_nym_id_set(self,nym_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_nym_id_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_nym_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_memo_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_memo_set(self,memo);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_memo_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_memo_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->memo); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_public_key_set) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: ContactAcct_public_key_set(self,public_key);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_public_key_get) { + { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_public_key_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->public_key); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_ContactAcct_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::ContactAcct *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: ContactAcct_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_Contact) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_Contact(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Contact" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_gui_label_set) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_gui_label_set(self,gui_label);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_gui_label_get) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_gui_label_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_contact_id_set) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_contact_id_set(self,contact_id);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->contact_id = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_contact_id_get) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_contact_id_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->contact_id); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_email_set) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_email_set(self,email);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->email = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_email_get) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_email_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->email); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_memo_set) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_memo_set(self,memo);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_memo_get) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_memo_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->memo); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_public_key_set) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int argvi = 0; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_public_key_set(self,public_key);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_PERL_CALL_ARGS_2(ST(1), &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + ST(argvi) = sv_newmortal(); + + if (SWIG_IsNewObj(res2)) delete arg2; + XSRETURN(argvi); + fail: + + if (SWIG_IsNewObj(res2)) delete arg2; + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_public_key_get) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + std::string *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_public_key_get(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->public_key); + ST(argvi) = SWIG_From_std_string SWIG_PERL_CALL_ARGS_1(static_cast< std::string >(*result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_GetContactNymCount) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_GetContactNymCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNymCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactNymCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_GetContactNym) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::ContactNym *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_GetContactNym(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_RemoveContactNym) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_RemoveContactNym(self,nIndexContactNym);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactNym(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_AddContactNym) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_AddContactNym(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__ContactNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactNym * >(argp2); + result = (bool)(arg1)->AddContactNym(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_GetContactAcctCount) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_GetContactAcctCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcctCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactAcctCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_GetContactAcct) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::ContactAcct *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_GetContactAcct(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_RemoveContactAcct) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_RemoveContactAcct(self,nIndexContactAcct);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactAcct(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_AddContactAcct) { + { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: Contact_AddContactAcct(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__ContactAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactAcct * >(argp2); + result = (bool)(arg1)->AddContactAcct(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_Contact_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::Contact *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: Contact_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_delete_AddressBook) { + { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: delete_AddressBook(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AddressBook, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AddressBook" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + delete arg1; + ST(argvi) = sv_newmortal(); + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AddressBook_GetContactCount) { + { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + size_t result; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AddressBook_GetContactCount(self);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContactCount" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + result = (arg1)->GetContactCount(); + ST(argvi) = SWIG_From_size_t SWIG_PERL_CALL_ARGS_1(static_cast< size_t >(result)); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + +XS(_wrap_AddressBook_GetContact) { + { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + OTDB::Contact *result = 0 ; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AddressBook_GetContact(self,nIndex);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_GetContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | SWIG_SHADOW); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_AddressBook_RemoveContact) { + { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AddressBook_RemoveContact(self,nIndexContact);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_RemoveContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_RemoveContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContact(arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_AddressBook_AddContact) { + { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: AddressBook_AddContact(self,disownObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_AddContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_OTDB__Contact, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + arg2 = reinterpret_cast< OTDB::Contact * >(argp2); + result = (bool)(arg1)->AddContact(*arg2); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + +XS(_wrap_AddressBook_ot_dynamic_cast) { + { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int argvi = 0; + OTDB::AddressBook *result = 0 ; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: AddressBook_ot_dynamic_cast(pObject);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AddressBook, 0 | SWIG_SHADOW); argvi++ ; + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Acct(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__MarketListTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::MarketList *) x)); +} +static void *_p_OTDB__OfferListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListNym *) x)); +} +static void *_p_OTDB__TradeListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListNym *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__StringMapTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::StringMap *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__TradeListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListMarket *) x)); +} +static void *_p_OTDB__OfferListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListMarket *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__DisplayableTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Displayable *) x)); +} +static void *_p_OTDB__WalletDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::WalletData *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BlobTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Blob *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__OTDBStringTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OTDBString *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__AddressBookTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::AddressBook *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static swig_type_info _swigt__p_OTCallback = {"_p_OTCallback", "OTCallback *", 0, 0, (void*)"otapi::OTCallback", 0}; +static swig_type_info _swigt__p_OTCaller = {"_p_OTCaller", "OTCaller *", 0, 0, (void*)"otapi::OTCaller", 0}; +static swig_type_info _swigt__p_OTDB__Acct = {"_p_OTDB__Acct", "OTDB::Acct *", 0, 0, (void*)"otapi::Acct", 0}; +static swig_type_info _swigt__p_OTDB__AddressBook = {"_p_OTDB__AddressBook", "OTDB::AddressBook *", 0, 0, (void*)"otapi::AddressBook", 0}; +static swig_type_info _swigt__p_OTDB__AskData = {"_p_OTDB__AskData", "OTDB::AskData *", 0, 0, (void*)"otapi::AskData", 0}; +static swig_type_info _swigt__p_OTDB__BidData = {"_p_OTDB__BidData", "OTDB::BidData *", 0, 0, (void*)"otapi::BidData", 0}; +static swig_type_info _swigt__p_OTDB__BitcoinAcct = {"_p_OTDB__BitcoinAcct", "OTDB::BitcoinAcct *", 0, 0, (void*)"otapi::BitcoinAcct", 0}; +static swig_type_info _swigt__p_OTDB__BitcoinServer = {"_p_OTDB__BitcoinServer", "OTDB::BitcoinServer *", 0, 0, (void*)"otapi::BitcoinServer", 0}; +static swig_type_info _swigt__p_OTDB__Blob = {"_p_OTDB__Blob", "OTDB::Blob *", 0, 0, (void*)"otapi::Blob", 0}; +static swig_type_info _swigt__p_OTDB__Contact = {"_p_OTDB__Contact", "OTDB::Contact *", 0, 0, (void*)"otapi::Contact", 0}; +static swig_type_info _swigt__p_OTDB__ContactAcct = {"_p_OTDB__ContactAcct", "OTDB::ContactAcct *", 0, 0, (void*)"otapi::ContactAcct", 0}; +static swig_type_info _swigt__p_OTDB__ContactNym = {"_p_OTDB__ContactNym", "OTDB::ContactNym *", 0, 0, (void*)"otapi::ContactNym", 0}; +static swig_type_info _swigt__p_OTDB__Displayable = {"_p_OTDB__Displayable", "OTDB::Displayable *", 0, 0, (void*)"otapi::Displayable", 0}; +static swig_type_info _swigt__p_OTDB__LoomServer = {"_p_OTDB__LoomServer", "OTDB::LoomServer *", 0, 0, (void*)"otapi::LoomServer", 0}; +static swig_type_info _swigt__p_OTDB__MarketData = {"_p_OTDB__MarketData", "OTDB::MarketData *", 0, 0, (void*)"otapi::MarketData", 0}; +static swig_type_info _swigt__p_OTDB__MarketList = {"_p_OTDB__MarketList", "OTDB::MarketList *", 0, 0, (void*)"otapi::MarketList", 0}; +static swig_type_info _swigt__p_OTDB__OTDBString = {"_p_OTDB__OTDBString", "OTDB::OTDBString *", 0, 0, (void*)"otapi::OTDBString", 0}; +static swig_type_info _swigt__p_OTDB__OfferDataMarket = {"_p_OTDB__OfferDataMarket", "OTDB::OfferDataMarket *", 0, 0, (void*)"otapi::OfferDataMarket", 0}; +static swig_type_info _swigt__p_OTDB__OfferDataNym = {"_p_OTDB__OfferDataNym", "OTDB::OfferDataNym *", 0, 0, (void*)"otapi::OfferDataNym", 0}; +static swig_type_info _swigt__p_OTDB__OfferListMarket = {"_p_OTDB__OfferListMarket", "OTDB::OfferListMarket *", 0, 0, (void*)"otapi::OfferListMarket", 0}; +static swig_type_info _swigt__p_OTDB__OfferListNym = {"_p_OTDB__OfferListNym", "OTDB::OfferListNym *", 0, 0, (void*)"otapi::OfferListNym", 0}; +static swig_type_info _swigt__p_OTDB__RippleServer = {"_p_OTDB__RippleServer", "OTDB::RippleServer *", 0, 0, (void*)"otapi::RippleServer", 0}; +static swig_type_info _swigt__p_OTDB__Server = {"_p_OTDB__Server", "OTDB::Server *", 0, 0, (void*)"otapi::Server", 0}; +static swig_type_info _swigt__p_OTDB__ServerInfo = {"_p_OTDB__ServerInfo", "OTDB::ServerInfo *", 0, 0, (void*)"otapi::ServerInfo", 0}; +static swig_type_info _swigt__p_OTDB__Storable = {"_p_OTDB__Storable", "OTDB::Storable *", 0, 0, (void*)"otapi::Storable", 0}; +static swig_type_info _swigt__p_OTDB__Storage = {"_p_OTDB__Storage", "OTDB::Storage *", 0, 0, (void*)"otapi::Storage", 0}; +static swig_type_info _swigt__p_OTDB__StringMap = {"_p_OTDB__StringMap", "OTDB::StringMap *", 0, 0, (void*)"otapi::StringMap", 0}; +static swig_type_info _swigt__p_OTDB__TradeDataMarket = {"_p_OTDB__TradeDataMarket", "OTDB::TradeDataMarket *", 0, 0, (void*)"otapi::TradeDataMarket", 0}; +static swig_type_info _swigt__p_OTDB__TradeDataNym = {"_p_OTDB__TradeDataNym", "OTDB::TradeDataNym *", 0, 0, (void*)"otapi::TradeDataNym", 0}; +static swig_type_info _swigt__p_OTDB__TradeListMarket = {"_p_OTDB__TradeListMarket", "OTDB::TradeListMarket *", 0, 0, (void*)"otapi::TradeListMarket", 0}; +static swig_type_info _swigt__p_OTDB__TradeListNym = {"_p_OTDB__TradeListNym", "OTDB::TradeListNym *", 0, 0, (void*)"otapi::TradeListNym", 0}; +static swig_type_info _swigt__p_OTDB__WalletData = {"_p_OTDB__WalletData", "OTDB::WalletData *", 0, 0, (void*)"otapi::WalletData", 0}; +static swig_type_info _swigt__p_OTPacker = {"_p_OTPacker", "OTPacker *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__mapT_std__string_std__string_t = {"_p_std__mapT_std__string_std__string_t", "std::map< std::string,std::string > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_unsigned_char_t = {"_p_std__vectorT_unsigned_char_t", "std::vector< unsigned char > *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_OTCallback, + &_swigt__p_OTCaller, + &_swigt__p_OTDB__Acct, + &_swigt__p_OTDB__AddressBook, + &_swigt__p_OTDB__AskData, + &_swigt__p_OTDB__BidData, + &_swigt__p_OTDB__BitcoinAcct, + &_swigt__p_OTDB__BitcoinServer, + &_swigt__p_OTDB__Blob, + &_swigt__p_OTDB__Contact, + &_swigt__p_OTDB__ContactAcct, + &_swigt__p_OTDB__ContactNym, + &_swigt__p_OTDB__Displayable, + &_swigt__p_OTDB__LoomServer, + &_swigt__p_OTDB__MarketData, + &_swigt__p_OTDB__MarketList, + &_swigt__p_OTDB__OTDBString, + &_swigt__p_OTDB__OfferDataMarket, + &_swigt__p_OTDB__OfferDataNym, + &_swigt__p_OTDB__OfferListMarket, + &_swigt__p_OTDB__OfferListNym, + &_swigt__p_OTDB__RippleServer, + &_swigt__p_OTDB__Server, + &_swigt__p_OTDB__ServerInfo, + &_swigt__p_OTDB__Storable, + &_swigt__p_OTDB__Storage, + &_swigt__p_OTDB__StringMap, + &_swigt__p_OTDB__TradeDataMarket, + &_swigt__p_OTDB__TradeDataNym, + &_swigt__p_OTDB__TradeListMarket, + &_swigt__p_OTDB__TradeListNym, + &_swigt__p_OTDB__WalletData, + &_swigt__p_OTPacker, + &_swigt__p_char, + &_swigt__p_std__mapT_std__string_std__string_t, + &_swigt__p_std__vectorT_unsigned_char_t, +}; + +static swig_cast_info _swigc__p_OTCallback[] = { {&_swigt__p_OTCallback, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCaller[] = { {&_swigt__p_OTCaller, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Acct[] = { {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Acct, 0, 0}, {&_swigt__p_OTDB__Acct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AddressBook[] = { {&_swigt__p_OTDB__AddressBook, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AskData[] = { {&_swigt__p_OTDB__AskData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BidData[] = { {&_swigt__p_OTDB__BidData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinAcct[] = { {&_swigt__p_OTDB__BitcoinAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinServer[] = { {&_swigt__p_OTDB__BitcoinServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Blob[] = { {&_swigt__p_OTDB__Blob, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Contact[] = { {&_swigt__p_OTDB__Contact, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactAcct[] = { {&_swigt__p_OTDB__ContactAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactNym[] = { {&_swigt__p_OTDB__ContactNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Displayable[] = { {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Displayable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Displayable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__LoomServer[] = { {&_swigt__p_OTDB__LoomServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketData[] = { {&_swigt__p_OTDB__MarketData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketList[] = { {&_swigt__p_OTDB__MarketList, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OTDBString[] = { {&_swigt__p_OTDB__OTDBString, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataMarket[] = { {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__OfferDataMarket, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, 0, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__OfferDataMarket, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataNym[] = { {&_swigt__p_OTDB__OfferDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListMarket[] = { {&_swigt__p_OTDB__OfferListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListNym[] = { {&_swigt__p_OTDB__OfferListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__RippleServer[] = { {&_swigt__p_OTDB__RippleServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Server[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__Server, 0, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Server, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ServerInfo[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__ServerInfo, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storable[] = { {&_swigt__p_OTDB__MarketList, _p_OTDB__MarketListTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListNym, _p_OTDB__OfferListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListNym, _p_OTDB__TradeListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Blob, _p_OTDB__BlobTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__StringMap, _p_OTDB__StringMapTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListMarket, _p_OTDB__OfferListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListMarket, _p_OTDB__TradeListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Displayable, _p_OTDB__DisplayableTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__WalletData, _p_OTDB__WalletDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Storable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OTDBString, _p_OTDB__OTDBStringTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AddressBook, _p_OTDB__AddressBookTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Storable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storage[] = { {&_swigt__p_OTDB__Storage, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__StringMap[] = { {&_swigt__p_OTDB__StringMap, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataMarket[] = { {&_swigt__p_OTDB__TradeDataMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataNym[] = { {&_swigt__p_OTDB__TradeDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListMarket[] = { {&_swigt__p_OTDB__TradeListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListNym[] = { {&_swigt__p_OTDB__TradeListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__WalletData[] = { {&_swigt__p_OTDB__WalletData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTPacker[] = { {&_swigt__p_OTPacker, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t[] = { {&_swigt__p_std__mapT_std__string_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_unsigned_char_t[] = { {&_swigt__p_std__vectorT_unsigned_char_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_OTCallback, + _swigc__p_OTCaller, + _swigc__p_OTDB__Acct, + _swigc__p_OTDB__AddressBook, + _swigc__p_OTDB__AskData, + _swigc__p_OTDB__BidData, + _swigc__p_OTDB__BitcoinAcct, + _swigc__p_OTDB__BitcoinServer, + _swigc__p_OTDB__Blob, + _swigc__p_OTDB__Contact, + _swigc__p_OTDB__ContactAcct, + _swigc__p_OTDB__ContactNym, + _swigc__p_OTDB__Displayable, + _swigc__p_OTDB__LoomServer, + _swigc__p_OTDB__MarketData, + _swigc__p_OTDB__MarketList, + _swigc__p_OTDB__OTDBString, + _swigc__p_OTDB__OfferDataMarket, + _swigc__p_OTDB__OfferDataNym, + _swigc__p_OTDB__OfferListMarket, + _swigc__p_OTDB__OfferListNym, + _swigc__p_OTDB__RippleServer, + _swigc__p_OTDB__Server, + _swigc__p_OTDB__ServerInfo, + _swigc__p_OTDB__Storable, + _swigc__p_OTDB__Storage, + _swigc__p_OTDB__StringMap, + _swigc__p_OTDB__TradeDataMarket, + _swigc__p_OTDB__TradeDataNym, + _swigc__p_OTDB__TradeListMarket, + _swigc__p_OTDB__TradeListNym, + _swigc__p_OTDB__WalletData, + _swigc__p_OTPacker, + _swigc__p_char, + _swigc__p_std__mapT_std__string_std__string_t, + _swigc__p_std__vectorT_unsigned_char_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_constant_info swig_constants[] = { +{0,0,0,0,0,0} +}; +#ifdef __cplusplus +} +#endif +static swig_variable_info swig_variables[] = { +{0,0,0,0} +}; +static swig_command_info swig_commands[] = { +{"otapic::new_OTCallback", _wrap_new_OTCallback}, +{"otapic::delete_OTCallback", _wrap_delete_OTCallback}, +{"otapic::OTCallback_runOne", _wrap_OTCallback_runOne}, +{"otapic::OTCallback_runTwo", _wrap_OTCallback_runTwo}, +{"otapic::new_OTCaller", _wrap_new_OTCaller}, +{"otapic::delete_OTCaller", _wrap_delete_OTCaller}, +{"otapic::OTCaller_GetPassword", _wrap_OTCaller_GetPassword}, +{"otapic::OTCaller_delCallback", _wrap_OTCaller_delCallback}, +{"otapic::OTCaller_setCallback", _wrap_OTCaller_setCallback}, +{"otapic::OTCaller_isCallbackSet", _wrap_OTCaller_isCallbackSet}, +{"otapic::OTCaller_callOne", _wrap_OTCaller_callOne}, +{"otapic::OTCaller_callTwo", _wrap_OTCaller_callTwo}, +{"otapic::OT_API_Set_PasswordCallback", _wrap_OT_API_Set_PasswordCallback}, +{"otapic::OT_API_Init", _wrap_OT_API_Init}, +{"otapic::OT_API_LoadWallet", _wrap_OT_API_LoadWallet}, +{"otapic::OT_API_SwitchWallet", _wrap_OT_API_SwitchWallet}, +{"otapic::OT_API_GetMemlogSize", _wrap_OT_API_GetMemlogSize}, +{"otapic::OT_API_GetMemlogAtIndex", _wrap_OT_API_GetMemlogAtIndex}, +{"otapic::OT_API_PeekMemlogFront", _wrap_OT_API_PeekMemlogFront}, +{"otapic::OT_API_PeekMemlogBack", _wrap_OT_API_PeekMemlogBack}, +{"otapic::OT_API_PopMemlogFront", _wrap_OT_API_PopMemlogFront}, +{"otapic::OT_API_PopMemlogBack", _wrap_OT_API_PopMemlogBack}, +{"otapic::OT_API_CreateNym", _wrap_OT_API_CreateNym}, +{"otapic::OT_API_AddServerContract", _wrap_OT_API_AddServerContract}, +{"otapic::OT_API_AddAssetContract", _wrap_OT_API_AddAssetContract}, +{"otapic::OT_API_GetServerCount", _wrap_OT_API_GetServerCount}, +{"otapic::OT_API_GetAssetTypeCount", _wrap_OT_API_GetAssetTypeCount}, +{"otapic::OT_API_GetAccountCount", _wrap_OT_API_GetAccountCount}, +{"otapic::OT_API_GetNymCount", _wrap_OT_API_GetNymCount}, +{"otapic::OT_API_GetServer_ID", _wrap_OT_API_GetServer_ID}, +{"otapic::OT_API_GetServer_Name", _wrap_OT_API_GetServer_Name}, +{"otapic::OT_API_GetAssetType_ID", _wrap_OT_API_GetAssetType_ID}, +{"otapic::OT_API_GetAssetType_Name", _wrap_OT_API_GetAssetType_Name}, +{"otapic::OT_API_GetAccountWallet_ID", _wrap_OT_API_GetAccountWallet_ID}, +{"otapic::OT_API_GetAccountWallet_Name", _wrap_OT_API_GetAccountWallet_Name}, +{"otapic::OT_API_GetAccountWallet_Balance", _wrap_OT_API_GetAccountWallet_Balance}, +{"otapic::OT_API_GetAccountWallet_Type", _wrap_OT_API_GetAccountWallet_Type}, +{"otapic::OT_API_GetAccountWallet_AssetTypeID", _wrap_OT_API_GetAccountWallet_AssetTypeID}, +{"otapic::OT_API_GetAccountWallet_ServerID", _wrap_OT_API_GetAccountWallet_ServerID}, +{"otapic::OT_API_GetAccountWallet_NymID", _wrap_OT_API_GetAccountWallet_NymID}, +{"otapic::OT_API_VerifyAccountReceipt", _wrap_OT_API_VerifyAccountReceipt}, +{"otapic::OT_API_GetNym_TransactionNumCount", _wrap_OT_API_GetNym_TransactionNumCount}, +{"otapic::OT_API_GetNym_ID", _wrap_OT_API_GetNym_ID}, +{"otapic::OT_API_GetNym_Name", _wrap_OT_API_GetNym_Name}, +{"otapic::OT_API_GetNym_Stats", _wrap_OT_API_GetNym_Stats}, +{"otapic::OT_API_IsNym_RegisteredAtServer", _wrap_OT_API_IsNym_RegisteredAtServer}, +{"otapic::OT_API_GetNym_MailCount", _wrap_OT_API_GetNym_MailCount}, +{"otapic::OT_API_GetNym_MailContentsByIndex", _wrap_OT_API_GetNym_MailContentsByIndex}, +{"otapic::OT_API_GetNym_MailSenderIDByIndex", _wrap_OT_API_GetNym_MailSenderIDByIndex}, +{"otapic::OT_API_GetNym_MailServerIDByIndex", _wrap_OT_API_GetNym_MailServerIDByIndex}, +{"otapic::OT_API_Nym_RemoveMailByIndex", _wrap_OT_API_Nym_RemoveMailByIndex}, +{"otapic::OT_API_Nym_VerifyMailByIndex", _wrap_OT_API_Nym_VerifyMailByIndex}, +{"otapic::OT_API_GetNym_OutmailCount", _wrap_OT_API_GetNym_OutmailCount}, +{"otapic::OT_API_GetNym_OutmailContentsByIndex", _wrap_OT_API_GetNym_OutmailContentsByIndex}, +{"otapic::OT_API_GetNym_OutmailRecipientIDByIndex", _wrap_OT_API_GetNym_OutmailRecipientIDByIndex}, +{"otapic::OT_API_GetNym_OutmailServerIDByIndex", _wrap_OT_API_GetNym_OutmailServerIDByIndex}, +{"otapic::OT_API_Nym_RemoveOutmailByIndex", _wrap_OT_API_Nym_RemoveOutmailByIndex}, +{"otapic::OT_API_Nym_VerifyOutmailByIndex", _wrap_OT_API_Nym_VerifyOutmailByIndex}, +{"otapic::OT_API_Wallet_CanRemoveServer", _wrap_OT_API_Wallet_CanRemoveServer}, +{"otapic::OT_API_Wallet_RemoveServer", _wrap_OT_API_Wallet_RemoveServer}, +{"otapic::OT_API_Wallet_CanRemoveAssetType", _wrap_OT_API_Wallet_CanRemoveAssetType}, +{"otapic::OT_API_Wallet_RemoveAssetType", _wrap_OT_API_Wallet_RemoveAssetType}, +{"otapic::OT_API_Wallet_CanRemoveNym", _wrap_OT_API_Wallet_CanRemoveNym}, +{"otapic::OT_API_Wallet_RemoveNym", _wrap_OT_API_Wallet_RemoveNym}, +{"otapic::OT_API_Wallet_CanRemoveAccount", _wrap_OT_API_Wallet_CanRemoveAccount}, +{"otapic::OT_API_Wallet_ImportNym", _wrap_OT_API_Wallet_ImportNym}, +{"otapic::OT_API_SetNym_Name", _wrap_OT_API_SetNym_Name}, +{"otapic::OT_API_SetAccountWallet_Name", _wrap_OT_API_SetAccountWallet_Name}, +{"otapic::OT_API_SetAssetType_Name", _wrap_OT_API_SetAssetType_Name}, +{"otapic::OT_API_SetServer_Name", _wrap_OT_API_SetServer_Name}, +{"otapic::OT_API_VerifyAndRetrieveXMLContents", _wrap_OT_API_VerifyAndRetrieveXMLContents}, +{"otapic::OT_API_WriteCheque", _wrap_OT_API_WriteCheque}, +{"otapic::OT_API_ProposePaymentPlan", _wrap_OT_API_ProposePaymentPlan}, +{"otapic::OT_API_ConfirmPaymentPlan", _wrap_OT_API_ConfirmPaymentPlan}, +{"otapic::OT_API_LoadUserPubkey", _wrap_OT_API_LoadUserPubkey}, +{"otapic::OT_API_LoadPubkey", _wrap_OT_API_LoadPubkey}, +{"otapic::OT_API_VerifyUserPrivateKey", _wrap_OT_API_VerifyUserPrivateKey}, +{"otapic::OT_API_LoadPurse", _wrap_OT_API_LoadPurse}, +{"otapic::OT_API_LoadMint", _wrap_OT_API_LoadMint}, +{"otapic::OT_API_LoadAssetContract", _wrap_OT_API_LoadAssetContract}, +{"otapic::OT_API_LoadServerContract", _wrap_OT_API_LoadServerContract}, +{"otapic::OT_API_Mint_IsStillGood", _wrap_OT_API_Mint_IsStillGood}, +{"otapic::OT_API_IsBasketCurrency", _wrap_OT_API_IsBasketCurrency}, +{"otapic::OT_API_Basket_GetMemberCount", _wrap_OT_API_Basket_GetMemberCount}, +{"otapic::OT_API_Basket_GetMemberType", _wrap_OT_API_Basket_GetMemberType}, +{"otapic::OT_API_Basket_GetMinimumTransferAmount", _wrap_OT_API_Basket_GetMinimumTransferAmount}, +{"otapic::OT_API_Basket_GetMemberMinimumTransferAmount", _wrap_OT_API_Basket_GetMemberMinimumTransferAmount}, +{"otapic::OT_API_LoadAssetAccount", _wrap_OT_API_LoadAssetAccount}, +{"otapic::OT_API_LoadInbox", _wrap_OT_API_LoadInbox}, +{"otapic::OT_API_LoadOutbox", _wrap_OT_API_LoadOutbox}, +{"otapic::OT_API_Ledger_GetCount", _wrap_OT_API_Ledger_GetCount}, +{"otapic::OT_API_Ledger_CreateResponse", _wrap_OT_API_Ledger_CreateResponse}, +{"otapic::OT_API_Ledger_GetTransactionByIndex", _wrap_OT_API_Ledger_GetTransactionByIndex}, +{"otapic::OT_API_Ledger_GetTransactionByID", _wrap_OT_API_Ledger_GetTransactionByID}, +{"otapic::OT_API_Ledger_GetTransactionIDByIndex", _wrap_OT_API_Ledger_GetTransactionIDByIndex}, +{"otapic::OT_API_Ledger_AddTransaction", _wrap_OT_API_Ledger_AddTransaction}, +{"otapic::OT_API_Transaction_CreateResponse", _wrap_OT_API_Transaction_CreateResponse}, +{"otapic::OT_API_Ledger_FinalizeResponse", _wrap_OT_API_Ledger_FinalizeResponse}, +{"otapic::OT_API_Transaction_GetType", _wrap_OT_API_Transaction_GetType}, +{"otapic::OT_API_Transaction_GetVoucher", _wrap_OT_API_Transaction_GetVoucher}, +{"otapic::OT_API_Transaction_GetSuccess", _wrap_OT_API_Transaction_GetSuccess}, +{"otapic::OT_API_Transaction_GetBalanceAgreementSuccess", _wrap_OT_API_Transaction_GetBalanceAgreementSuccess}, +{"otapic::OT_API_Transaction_GetDateSigned", _wrap_OT_API_Transaction_GetDateSigned}, +{"otapic::OT_API_Transaction_GetAmount", _wrap_OT_API_Transaction_GetAmount}, +{"otapic::OT_API_Pending_GetNote", _wrap_OT_API_Pending_GetNote}, +{"otapic::OT_API_Transaction_GetSenderUserID", _wrap_OT_API_Transaction_GetSenderUserID}, +{"otapic::OT_API_Transaction_GetSenderAcctID", _wrap_OT_API_Transaction_GetSenderAcctID}, +{"otapic::OT_API_Transaction_GetRecipientUserID", _wrap_OT_API_Transaction_GetRecipientUserID}, +{"otapic::OT_API_Transaction_GetRecipientAcctID", _wrap_OT_API_Transaction_GetRecipientAcctID}, +{"otapic::OT_API_Transaction_GetDisplayReferenceToNum", _wrap_OT_API_Transaction_GetDisplayReferenceToNum}, +{"otapic::OT_API_CreatePurse", _wrap_OT_API_CreatePurse}, +{"otapic::OT_API_SavePurse", _wrap_OT_API_SavePurse}, +{"otapic::OT_API_Purse_GetTotalValue", _wrap_OT_API_Purse_GetTotalValue}, +{"otapic::OT_API_Purse_Count", _wrap_OT_API_Purse_Count}, +{"otapic::OT_API_Purse_Peek", _wrap_OT_API_Purse_Peek}, +{"otapic::OT_API_Purse_Pop", _wrap_OT_API_Purse_Pop}, +{"otapic::OT_API_Purse_Push", _wrap_OT_API_Purse_Push}, +{"otapic::OT_API_Wallet_ImportPurse", _wrap_OT_API_Wallet_ImportPurse}, +{"otapic::OT_API_exchangePurse", _wrap_OT_API_exchangePurse}, +{"otapic::OT_API_Token_ChangeOwner", _wrap_OT_API_Token_ChangeOwner}, +{"otapic::OT_API_Token_GetID", _wrap_OT_API_Token_GetID}, +{"otapic::OT_API_Token_GetDenomination", _wrap_OT_API_Token_GetDenomination}, +{"otapic::OT_API_Token_GetSeries", _wrap_OT_API_Token_GetSeries}, +{"otapic::OT_API_Token_GetValidFrom", _wrap_OT_API_Token_GetValidFrom}, +{"otapic::OT_API_Token_GetValidTo", _wrap_OT_API_Token_GetValidTo}, +{"otapic::OT_API_Token_GetAssetID", _wrap_OT_API_Token_GetAssetID}, +{"otapic::OT_API_Token_GetServerID", _wrap_OT_API_Token_GetServerID}, +{"otapic::OT_API_checkServerID", _wrap_OT_API_checkServerID}, +{"otapic::OT_API_createUserAccount", _wrap_OT_API_createUserAccount}, +{"otapic::OT_API_deleteUserAccount", _wrap_OT_API_deleteUserAccount}, +{"otapic::OT_API_deleteAssetAccount", _wrap_OT_API_deleteAssetAccount}, +{"otapic::OT_API_checkUser", _wrap_OT_API_checkUser}, +{"otapic::OT_API_sendUserMessage", _wrap_OT_API_sendUserMessage}, +{"otapic::OT_API_getRequest", _wrap_OT_API_getRequest}, +{"otapic::OT_API_getTransactionNumber", _wrap_OT_API_getTransactionNumber}, +{"otapic::OT_API_issueAssetType", _wrap_OT_API_issueAssetType}, +{"otapic::OT_API_getContract", _wrap_OT_API_getContract}, +{"otapic::OT_API_getMint", _wrap_OT_API_getMint}, +{"otapic::OT_API_createAssetAccount", _wrap_OT_API_createAssetAccount}, +{"otapic::OT_API_getAccount", _wrap_OT_API_getAccount}, +{"otapic::OT_API_GenerateBasketCreation", _wrap_OT_API_GenerateBasketCreation}, +{"otapic::OT_API_AddBasketCreationItem", _wrap_OT_API_AddBasketCreationItem}, +{"otapic::OT_API_issueBasket", _wrap_OT_API_issueBasket}, +{"otapic::OT_API_GenerateBasketExchange", _wrap_OT_API_GenerateBasketExchange}, +{"otapic::OT_API_AddBasketExchangeItem", _wrap_OT_API_AddBasketExchangeItem}, +{"otapic::OT_API_exchangeBasket", _wrap_OT_API_exchangeBasket}, +{"otapic::OT_API_notarizeWithdrawal", _wrap_OT_API_notarizeWithdrawal}, +{"otapic::OT_API_notarizeDeposit", _wrap_OT_API_notarizeDeposit}, +{"otapic::OT_API_notarizeTransfer", _wrap_OT_API_notarizeTransfer}, +{"otapic::OT_API_getInbox", _wrap_OT_API_getInbox}, +{"otapic::OT_API_getOutbox", _wrap_OT_API_getOutbox}, +{"otapic::OT_API_getNymbox", _wrap_OT_API_getNymbox}, +{"otapic::OT_API_LoadNymbox", _wrap_OT_API_LoadNymbox}, +{"otapic::OT_API_processInbox", _wrap_OT_API_processInbox}, +{"otapic::OT_API_processNymbox", _wrap_OT_API_processNymbox}, +{"otapic::OT_API_withdrawVoucher", _wrap_OT_API_withdrawVoucher}, +{"otapic::OT_API_depositCheque", _wrap_OT_API_depositCheque}, +{"otapic::OT_API_depositPaymentPlan", _wrap_OT_API_depositPaymentPlan}, +{"otapic::OT_API_issueMarketOffer", _wrap_OT_API_issueMarketOffer}, +{"otapic::OT_API_getMarketList", _wrap_OT_API_getMarketList}, +{"otapic::OT_API_getMarketOffers", _wrap_OT_API_getMarketOffers}, +{"otapic::OT_API_getMarketRecentTrades", _wrap_OT_API_getMarketRecentTrades}, +{"otapic::OT_API_getNym_MarketOffers", _wrap_OT_API_getNym_MarketOffers}, +{"otapic::OT_API_cancelMarketOffer", _wrap_OT_API_cancelMarketOffer}, +{"otapic::OT_API_cancelPaymentPlan", _wrap_OT_API_cancelPaymentPlan}, +{"otapic::OT_API_PopMessageBuffer", _wrap_OT_API_PopMessageBuffer}, +{"otapic::OT_API_FlushMessageBuffer", _wrap_OT_API_FlushMessageBuffer}, +{"otapic::OT_API_Message_GetCommand", _wrap_OT_API_Message_GetCommand}, +{"otapic::OT_API_Message_GetSuccess", _wrap_OT_API_Message_GetSuccess}, +{"otapic::OT_API_Message_GetDepth", _wrap_OT_API_Message_GetDepth}, +{"otapic::OT_API_Message_GetTransactionSuccess", _wrap_OT_API_Message_GetTransactionSuccess}, +{"otapic::OT_API_Message_GetBalanceAgreementSuccess", _wrap_OT_API_Message_GetBalanceAgreementSuccess}, +{"otapic::OT_API_Message_GetLedger", _wrap_OT_API_Message_GetLedger}, +{"otapic::OT_API_Message_GetNewAssetTypeID", _wrap_OT_API_Message_GetNewAssetTypeID}, +{"otapic::OT_API_Message_GetNewIssuerAcctID", _wrap_OT_API_Message_GetNewIssuerAcctID}, +{"otapic::OT_API_Message_GetNewAcctID", _wrap_OT_API_Message_GetNewAcctID}, +{"otapic::OT_API_ConnectServer", _wrap_OT_API_ConnectServer}, +{"otapic::OT_API_ProcessSockets", _wrap_OT_API_ProcessSockets}, +{"otapic::delete_Storable", _wrap_delete_Storable}, +{"otapic::Storable_Create", _wrap_Storable_Create}, +{"otapic::Storable_ot_dynamic_cast", _wrap_Storable_ot_dynamic_cast}, +{"otapic::Storage_GetPacker", _wrap_Storage_GetPacker}, +{"otapic::Storage_Init", _wrap_Storage_Init}, +{"otapic::Storage_Exists", _wrap_Storage_Exists}, +{"otapic::delete_Storage", _wrap_delete_Storage}, +{"otapic::Storage_StoreString", _wrap_Storage_StoreString}, +{"otapic::Storage_QueryString", _wrap_Storage_QueryString}, +{"otapic::Storage_StorePlainString", _wrap_Storage_StorePlainString}, +{"otapic::Storage_QueryPlainString", _wrap_Storage_QueryPlainString}, +{"otapic::Storage_StoreObject", _wrap_Storage_StoreObject}, +{"otapic::Storage_QueryObject", _wrap_Storage_QueryObject}, +{"otapic::Storage_EraseValueByKey", _wrap_Storage_EraseValueByKey}, +{"otapic::Storage_CreateObject", _wrap_Storage_CreateObject}, +{"otapic::Storage_Create", _wrap_Storage_Create}, +{"otapic::Storage_GetType", _wrap_Storage_GetType}, +{"otapic::InitDefaultStorage", _wrap_InitDefaultStorage}, +{"otapic::GetDefaultStorage", _wrap_GetDefaultStorage}, +{"otapic::CreateStorageContext", _wrap_CreateStorageContext}, +{"otapic::CreateObject", _wrap_CreateObject}, +{"otapic::Exists", _wrap_Exists}, +{"otapic::StoreString", _wrap_StoreString}, +{"otapic::QueryString", _wrap_QueryString}, +{"otapic::StorePlainString", _wrap_StorePlainString}, +{"otapic::QueryPlainString", _wrap_QueryPlainString}, +{"otapic::StoreObject", _wrap_StoreObject}, +{"otapic::QueryObject", _wrap_QueryObject}, +{"otapic::EraseValueByKey", _wrap_EraseValueByKey}, +{"otapic::delete_OTDBString", _wrap_delete_OTDBString}, +{"otapic::OTDBString_m_string_set", _wrap_OTDBString_m_string_set}, +{"otapic::OTDBString_m_string_get", _wrap_OTDBString_m_string_get}, +{"otapic::OTDBString_ot_dynamic_cast", _wrap_OTDBString_ot_dynamic_cast}, +{"otapic::delete_Blob", _wrap_delete_Blob}, +{"otapic::Blob_m_memBuffer_set", _wrap_Blob_m_memBuffer_set}, +{"otapic::Blob_m_memBuffer_get", _wrap_Blob_m_memBuffer_get}, +{"otapic::Blob_ot_dynamic_cast", _wrap_Blob_ot_dynamic_cast}, +{"otapic::delete_StringMap", _wrap_delete_StringMap}, +{"otapic::StringMap_the_map_set", _wrap_StringMap_the_map_set}, +{"otapic::StringMap_the_map_get", _wrap_StringMap_the_map_get}, +{"otapic::StringMap_SetValue", _wrap_StringMap_SetValue}, +{"otapic::StringMap_GetValue", _wrap_StringMap_GetValue}, +{"otapic::StringMap_ot_dynamic_cast", _wrap_StringMap_ot_dynamic_cast}, +{"otapic::delete_Displayable", _wrap_delete_Displayable}, +{"otapic::Displayable_gui_label_set", _wrap_Displayable_gui_label_set}, +{"otapic::Displayable_gui_label_get", _wrap_Displayable_gui_label_get}, +{"otapic::Displayable_ot_dynamic_cast", _wrap_Displayable_ot_dynamic_cast}, +{"otapic::delete_MarketData", _wrap_delete_MarketData}, +{"otapic::MarketData_gui_label_set", _wrap_MarketData_gui_label_set}, +{"otapic::MarketData_gui_label_get", _wrap_MarketData_gui_label_get}, +{"otapic::MarketData_server_id_set", _wrap_MarketData_server_id_set}, +{"otapic::MarketData_server_id_get", _wrap_MarketData_server_id_get}, +{"otapic::MarketData_market_id_set", _wrap_MarketData_market_id_set}, +{"otapic::MarketData_market_id_get", _wrap_MarketData_market_id_get}, +{"otapic::MarketData_asset_type_id_set", _wrap_MarketData_asset_type_id_set}, +{"otapic::MarketData_asset_type_id_get", _wrap_MarketData_asset_type_id_get}, +{"otapic::MarketData_currency_type_id_set", _wrap_MarketData_currency_type_id_set}, +{"otapic::MarketData_currency_type_id_get", _wrap_MarketData_currency_type_id_get}, +{"otapic::MarketData_scale_set", _wrap_MarketData_scale_set}, +{"otapic::MarketData_scale_get", _wrap_MarketData_scale_get}, +{"otapic::MarketData_total_assets_set", _wrap_MarketData_total_assets_set}, +{"otapic::MarketData_total_assets_get", _wrap_MarketData_total_assets_get}, +{"otapic::MarketData_number_bids_set", _wrap_MarketData_number_bids_set}, +{"otapic::MarketData_number_bids_get", _wrap_MarketData_number_bids_get}, +{"otapic::MarketData_number_asks_set", _wrap_MarketData_number_asks_set}, +{"otapic::MarketData_number_asks_get", _wrap_MarketData_number_asks_get}, +{"otapic::MarketData_last_sale_price_set", _wrap_MarketData_last_sale_price_set}, +{"otapic::MarketData_last_sale_price_get", _wrap_MarketData_last_sale_price_get}, +{"otapic::MarketData_current_bid_set", _wrap_MarketData_current_bid_set}, +{"otapic::MarketData_current_bid_get", _wrap_MarketData_current_bid_get}, +{"otapic::MarketData_current_ask_set", _wrap_MarketData_current_ask_set}, +{"otapic::MarketData_current_ask_get", _wrap_MarketData_current_ask_get}, +{"otapic::MarketData_volume_trades_set", _wrap_MarketData_volume_trades_set}, +{"otapic::MarketData_volume_trades_get", _wrap_MarketData_volume_trades_get}, +{"otapic::MarketData_volume_assets_set", _wrap_MarketData_volume_assets_set}, +{"otapic::MarketData_volume_assets_get", _wrap_MarketData_volume_assets_get}, +{"otapic::MarketData_volume_currency_set", _wrap_MarketData_volume_currency_set}, +{"otapic::MarketData_volume_currency_get", _wrap_MarketData_volume_currency_get}, +{"otapic::MarketData_recent_highest_bid_set", _wrap_MarketData_recent_highest_bid_set}, +{"otapic::MarketData_recent_highest_bid_get", _wrap_MarketData_recent_highest_bid_get}, +{"otapic::MarketData_recent_lowest_ask_set", _wrap_MarketData_recent_lowest_ask_set}, +{"otapic::MarketData_recent_lowest_ask_get", _wrap_MarketData_recent_lowest_ask_get}, +{"otapic::MarketData_ot_dynamic_cast", _wrap_MarketData_ot_dynamic_cast}, +{"otapic::delete_MarketList", _wrap_delete_MarketList}, +{"otapic::MarketList_GetMarketDataCount", _wrap_MarketList_GetMarketDataCount}, +{"otapic::MarketList_GetMarketData", _wrap_MarketList_GetMarketData}, +{"otapic::MarketList_RemoveMarketData", _wrap_MarketList_RemoveMarketData}, +{"otapic::MarketList_AddMarketData", _wrap_MarketList_AddMarketData}, +{"otapic::MarketList_ot_dynamic_cast", _wrap_MarketList_ot_dynamic_cast}, +{"otapic::delete_OfferDataMarket", _wrap_delete_OfferDataMarket}, +{"otapic::OfferDataMarket_gui_label_set", _wrap_OfferDataMarket_gui_label_set}, +{"otapic::OfferDataMarket_gui_label_get", _wrap_OfferDataMarket_gui_label_get}, +{"otapic::OfferDataMarket_transaction_id_set", _wrap_OfferDataMarket_transaction_id_set}, +{"otapic::OfferDataMarket_transaction_id_get", _wrap_OfferDataMarket_transaction_id_get}, +{"otapic::OfferDataMarket_price_per_scale_set", _wrap_OfferDataMarket_price_per_scale_set}, +{"otapic::OfferDataMarket_price_per_scale_get", _wrap_OfferDataMarket_price_per_scale_get}, +{"otapic::OfferDataMarket_available_assets_set", _wrap_OfferDataMarket_available_assets_set}, +{"otapic::OfferDataMarket_available_assets_get", _wrap_OfferDataMarket_available_assets_get}, +{"otapic::OfferDataMarket_minimum_increment_set", _wrap_OfferDataMarket_minimum_increment_set}, +{"otapic::OfferDataMarket_minimum_increment_get", _wrap_OfferDataMarket_minimum_increment_get}, +{"otapic::OfferDataMarket_ot_dynamic_cast", _wrap_OfferDataMarket_ot_dynamic_cast}, +{"otapic::delete_BidData", _wrap_delete_BidData}, +{"otapic::BidData_gui_label_set", _wrap_BidData_gui_label_set}, +{"otapic::BidData_gui_label_get", _wrap_BidData_gui_label_get}, +{"otapic::BidData_transaction_id_set", _wrap_BidData_transaction_id_set}, +{"otapic::BidData_transaction_id_get", _wrap_BidData_transaction_id_get}, +{"otapic::BidData_price_per_scale_set", _wrap_BidData_price_per_scale_set}, +{"otapic::BidData_price_per_scale_get", _wrap_BidData_price_per_scale_get}, +{"otapic::BidData_available_assets_set", _wrap_BidData_available_assets_set}, +{"otapic::BidData_available_assets_get", _wrap_BidData_available_assets_get}, +{"otapic::BidData_minimum_increment_set", _wrap_BidData_minimum_increment_set}, +{"otapic::BidData_minimum_increment_get", _wrap_BidData_minimum_increment_get}, +{"otapic::BidData_ot_dynamic_cast", _wrap_BidData_ot_dynamic_cast}, +{"otapic::delete_AskData", _wrap_delete_AskData}, +{"otapic::AskData_gui_label_set", _wrap_AskData_gui_label_set}, +{"otapic::AskData_gui_label_get", _wrap_AskData_gui_label_get}, +{"otapic::AskData_transaction_id_set", _wrap_AskData_transaction_id_set}, +{"otapic::AskData_transaction_id_get", _wrap_AskData_transaction_id_get}, +{"otapic::AskData_price_per_scale_set", _wrap_AskData_price_per_scale_set}, +{"otapic::AskData_price_per_scale_get", _wrap_AskData_price_per_scale_get}, +{"otapic::AskData_available_assets_set", _wrap_AskData_available_assets_set}, +{"otapic::AskData_available_assets_get", _wrap_AskData_available_assets_get}, +{"otapic::AskData_minimum_increment_set", _wrap_AskData_minimum_increment_set}, +{"otapic::AskData_minimum_increment_get", _wrap_AskData_minimum_increment_get}, +{"otapic::AskData_ot_dynamic_cast", _wrap_AskData_ot_dynamic_cast}, +{"otapic::delete_OfferListMarket", _wrap_delete_OfferListMarket}, +{"otapic::OfferListMarket_GetBidDataCount", _wrap_OfferListMarket_GetBidDataCount}, +{"otapic::OfferListMarket_GetBidData", _wrap_OfferListMarket_GetBidData}, +{"otapic::OfferListMarket_RemoveBidData", _wrap_OfferListMarket_RemoveBidData}, +{"otapic::OfferListMarket_AddBidData", _wrap_OfferListMarket_AddBidData}, +{"otapic::OfferListMarket_GetAskDataCount", _wrap_OfferListMarket_GetAskDataCount}, +{"otapic::OfferListMarket_GetAskData", _wrap_OfferListMarket_GetAskData}, +{"otapic::OfferListMarket_RemoveAskData", _wrap_OfferListMarket_RemoveAskData}, +{"otapic::OfferListMarket_AddAskData", _wrap_OfferListMarket_AddAskData}, +{"otapic::OfferListMarket_ot_dynamic_cast", _wrap_OfferListMarket_ot_dynamic_cast}, +{"otapic::delete_TradeDataMarket", _wrap_delete_TradeDataMarket}, +{"otapic::TradeDataMarket_gui_label_set", _wrap_TradeDataMarket_gui_label_set}, +{"otapic::TradeDataMarket_gui_label_get", _wrap_TradeDataMarket_gui_label_get}, +{"otapic::TradeDataMarket_transaction_id_set", _wrap_TradeDataMarket_transaction_id_set}, +{"otapic::TradeDataMarket_transaction_id_get", _wrap_TradeDataMarket_transaction_id_get}, +{"otapic::TradeDataMarket_date_set", _wrap_TradeDataMarket_date_set}, +{"otapic::TradeDataMarket_date_get", _wrap_TradeDataMarket_date_get}, +{"otapic::TradeDataMarket_price_set", _wrap_TradeDataMarket_price_set}, +{"otapic::TradeDataMarket_price_get", _wrap_TradeDataMarket_price_get}, +{"otapic::TradeDataMarket_amount_sold_set", _wrap_TradeDataMarket_amount_sold_set}, +{"otapic::TradeDataMarket_amount_sold_get", _wrap_TradeDataMarket_amount_sold_get}, +{"otapic::TradeDataMarket_ot_dynamic_cast", _wrap_TradeDataMarket_ot_dynamic_cast}, +{"otapic::delete_TradeListMarket", _wrap_delete_TradeListMarket}, +{"otapic::TradeListMarket_GetTradeDataMarketCount", _wrap_TradeListMarket_GetTradeDataMarketCount}, +{"otapic::TradeListMarket_GetTradeDataMarket", _wrap_TradeListMarket_GetTradeDataMarket}, +{"otapic::TradeListMarket_RemoveTradeDataMarket", _wrap_TradeListMarket_RemoveTradeDataMarket}, +{"otapic::TradeListMarket_AddTradeDataMarket", _wrap_TradeListMarket_AddTradeDataMarket}, +{"otapic::TradeListMarket_ot_dynamic_cast", _wrap_TradeListMarket_ot_dynamic_cast}, +{"otapic::delete_OfferDataNym", _wrap_delete_OfferDataNym}, +{"otapic::OfferDataNym_gui_label_set", _wrap_OfferDataNym_gui_label_set}, +{"otapic::OfferDataNym_gui_label_get", _wrap_OfferDataNym_gui_label_get}, +{"otapic::OfferDataNym_valid_from_set", _wrap_OfferDataNym_valid_from_set}, +{"otapic::OfferDataNym_valid_from_get", _wrap_OfferDataNym_valid_from_get}, +{"otapic::OfferDataNym_valid_to_set", _wrap_OfferDataNym_valid_to_set}, +{"otapic::OfferDataNym_valid_to_get", _wrap_OfferDataNym_valid_to_get}, +{"otapic::OfferDataNym_server_id_set", _wrap_OfferDataNym_server_id_set}, +{"otapic::OfferDataNym_server_id_get", _wrap_OfferDataNym_server_id_get}, +{"otapic::OfferDataNym_asset_type_id_set", _wrap_OfferDataNym_asset_type_id_set}, +{"otapic::OfferDataNym_asset_type_id_get", _wrap_OfferDataNym_asset_type_id_get}, +{"otapic::OfferDataNym_asset_acct_id_set", _wrap_OfferDataNym_asset_acct_id_set}, +{"otapic::OfferDataNym_asset_acct_id_get", _wrap_OfferDataNym_asset_acct_id_get}, +{"otapic::OfferDataNym_currency_type_id_set", _wrap_OfferDataNym_currency_type_id_set}, +{"otapic::OfferDataNym_currency_type_id_get", _wrap_OfferDataNym_currency_type_id_get}, +{"otapic::OfferDataNym_currency_acct_id_set", _wrap_OfferDataNym_currency_acct_id_set}, +{"otapic::OfferDataNym_currency_acct_id_get", _wrap_OfferDataNym_currency_acct_id_get}, +{"otapic::OfferDataNym_selling_set", _wrap_OfferDataNym_selling_set}, +{"otapic::OfferDataNym_selling_get", _wrap_OfferDataNym_selling_get}, +{"otapic::OfferDataNym_scale_set", _wrap_OfferDataNym_scale_set}, +{"otapic::OfferDataNym_scale_get", _wrap_OfferDataNym_scale_get}, +{"otapic::OfferDataNym_price_per_scale_set", _wrap_OfferDataNym_price_per_scale_set}, +{"otapic::OfferDataNym_price_per_scale_get", _wrap_OfferDataNym_price_per_scale_get}, +{"otapic::OfferDataNym_transaction_id_set", _wrap_OfferDataNym_transaction_id_set}, +{"otapic::OfferDataNym_transaction_id_get", _wrap_OfferDataNym_transaction_id_get}, +{"otapic::OfferDataNym_total_assets_set", _wrap_OfferDataNym_total_assets_set}, +{"otapic::OfferDataNym_total_assets_get", _wrap_OfferDataNym_total_assets_get}, +{"otapic::OfferDataNym_finished_so_far_set", _wrap_OfferDataNym_finished_so_far_set}, +{"otapic::OfferDataNym_finished_so_far_get", _wrap_OfferDataNym_finished_so_far_get}, +{"otapic::OfferDataNym_minimum_increment_set", _wrap_OfferDataNym_minimum_increment_set}, +{"otapic::OfferDataNym_minimum_increment_get", _wrap_OfferDataNym_minimum_increment_get}, +{"otapic::OfferDataNym_stop_sign_set", _wrap_OfferDataNym_stop_sign_set}, +{"otapic::OfferDataNym_stop_sign_get", _wrap_OfferDataNym_stop_sign_get}, +{"otapic::OfferDataNym_stop_price_set", _wrap_OfferDataNym_stop_price_set}, +{"otapic::OfferDataNym_stop_price_get", _wrap_OfferDataNym_stop_price_get}, +{"otapic::OfferDataNym_ot_dynamic_cast", _wrap_OfferDataNym_ot_dynamic_cast}, +{"otapic::delete_OfferListNym", _wrap_delete_OfferListNym}, +{"otapic::OfferListNym_GetOfferDataNymCount", _wrap_OfferListNym_GetOfferDataNymCount}, +{"otapic::OfferListNym_GetOfferDataNym", _wrap_OfferListNym_GetOfferDataNym}, +{"otapic::OfferListNym_RemoveOfferDataNym", _wrap_OfferListNym_RemoveOfferDataNym}, +{"otapic::OfferListNym_AddOfferDataNym", _wrap_OfferListNym_AddOfferDataNym}, +{"otapic::OfferListNym_ot_dynamic_cast", _wrap_OfferListNym_ot_dynamic_cast}, +{"otapic::delete_TradeDataNym", _wrap_delete_TradeDataNym}, +{"otapic::TradeDataNym_gui_label_set", _wrap_TradeDataNym_gui_label_set}, +{"otapic::TradeDataNym_gui_label_get", _wrap_TradeDataNym_gui_label_get}, +{"otapic::TradeDataNym_transaction_id_set", _wrap_TradeDataNym_transaction_id_set}, +{"otapic::TradeDataNym_transaction_id_get", _wrap_TradeDataNym_transaction_id_get}, +{"otapic::TradeDataNym_completed_count_set", _wrap_TradeDataNym_completed_count_set}, +{"otapic::TradeDataNym_completed_count_get", _wrap_TradeDataNym_completed_count_get}, +{"otapic::TradeDataNym_date_set", _wrap_TradeDataNym_date_set}, +{"otapic::TradeDataNym_date_get", _wrap_TradeDataNym_date_get}, +{"otapic::TradeDataNym_price_set", _wrap_TradeDataNym_price_set}, +{"otapic::TradeDataNym_price_get", _wrap_TradeDataNym_price_get}, +{"otapic::TradeDataNym_amount_sold_set", _wrap_TradeDataNym_amount_sold_set}, +{"otapic::TradeDataNym_amount_sold_get", _wrap_TradeDataNym_amount_sold_get}, +{"otapic::TradeDataNym_ot_dynamic_cast", _wrap_TradeDataNym_ot_dynamic_cast}, +{"otapic::delete_TradeListNym", _wrap_delete_TradeListNym}, +{"otapic::TradeListNym_GetTradeDataNymCount", _wrap_TradeListNym_GetTradeDataNymCount}, +{"otapic::TradeListNym_GetTradeDataNym", _wrap_TradeListNym_GetTradeDataNym}, +{"otapic::TradeListNym_RemoveTradeDataNym", _wrap_TradeListNym_RemoveTradeDataNym}, +{"otapic::TradeListNym_AddTradeDataNym", _wrap_TradeListNym_AddTradeDataNym}, +{"otapic::TradeListNym_ot_dynamic_cast", _wrap_TradeListNym_ot_dynamic_cast}, +{"otapic::delete_Acct", _wrap_delete_Acct}, +{"otapic::Acct_gui_label_set", _wrap_Acct_gui_label_set}, +{"otapic::Acct_gui_label_get", _wrap_Acct_gui_label_get}, +{"otapic::Acct_acct_id_set", _wrap_Acct_acct_id_set}, +{"otapic::Acct_acct_id_get", _wrap_Acct_acct_id_get}, +{"otapic::Acct_server_id_set", _wrap_Acct_server_id_set}, +{"otapic::Acct_server_id_get", _wrap_Acct_server_id_get}, +{"otapic::Acct_ot_dynamic_cast", _wrap_Acct_ot_dynamic_cast}, +{"otapic::delete_BitcoinAcct", _wrap_delete_BitcoinAcct}, +{"otapic::BitcoinAcct_gui_label_set", _wrap_BitcoinAcct_gui_label_set}, +{"otapic::BitcoinAcct_gui_label_get", _wrap_BitcoinAcct_gui_label_get}, +{"otapic::BitcoinAcct_acct_id_set", _wrap_BitcoinAcct_acct_id_set}, +{"otapic::BitcoinAcct_acct_id_get", _wrap_BitcoinAcct_acct_id_get}, +{"otapic::BitcoinAcct_server_id_set", _wrap_BitcoinAcct_server_id_set}, +{"otapic::BitcoinAcct_server_id_get", _wrap_BitcoinAcct_server_id_get}, +{"otapic::BitcoinAcct_bitcoin_acct_name_set", _wrap_BitcoinAcct_bitcoin_acct_name_set}, +{"otapic::BitcoinAcct_bitcoin_acct_name_get", _wrap_BitcoinAcct_bitcoin_acct_name_get}, +{"otapic::BitcoinAcct_ot_dynamic_cast", _wrap_BitcoinAcct_ot_dynamic_cast}, +{"otapic::delete_ServerInfo", _wrap_delete_ServerInfo}, +{"otapic::ServerInfo_gui_label_set", _wrap_ServerInfo_gui_label_set}, +{"otapic::ServerInfo_gui_label_get", _wrap_ServerInfo_gui_label_get}, +{"otapic::ServerInfo_server_id_set", _wrap_ServerInfo_server_id_set}, +{"otapic::ServerInfo_server_id_get", _wrap_ServerInfo_server_id_get}, +{"otapic::ServerInfo_server_type_set", _wrap_ServerInfo_server_type_set}, +{"otapic::ServerInfo_server_type_get", _wrap_ServerInfo_server_type_get}, +{"otapic::ServerInfo_ot_dynamic_cast", _wrap_ServerInfo_ot_dynamic_cast}, +{"otapic::delete_Server", _wrap_delete_Server}, +{"otapic::Server_gui_label_set", _wrap_Server_gui_label_set}, +{"otapic::Server_gui_label_get", _wrap_Server_gui_label_get}, +{"otapic::Server_server_id_set", _wrap_Server_server_id_set}, +{"otapic::Server_server_id_get", _wrap_Server_server_id_get}, +{"otapic::Server_server_type_set", _wrap_Server_server_type_set}, +{"otapic::Server_server_type_get", _wrap_Server_server_type_get}, +{"otapic::Server_server_host_set", _wrap_Server_server_host_set}, +{"otapic::Server_server_host_get", _wrap_Server_server_host_get}, +{"otapic::Server_server_port_set", _wrap_Server_server_port_set}, +{"otapic::Server_server_port_get", _wrap_Server_server_port_get}, +{"otapic::Server_ot_dynamic_cast", _wrap_Server_ot_dynamic_cast}, +{"otapic::delete_BitcoinServer", _wrap_delete_BitcoinServer}, +{"otapic::BitcoinServer_gui_label_set", _wrap_BitcoinServer_gui_label_set}, +{"otapic::BitcoinServer_gui_label_get", _wrap_BitcoinServer_gui_label_get}, +{"otapic::BitcoinServer_server_id_set", _wrap_BitcoinServer_server_id_set}, +{"otapic::BitcoinServer_server_id_get", _wrap_BitcoinServer_server_id_get}, +{"otapic::BitcoinServer_server_type_set", _wrap_BitcoinServer_server_type_set}, +{"otapic::BitcoinServer_server_type_get", _wrap_BitcoinServer_server_type_get}, +{"otapic::BitcoinServer_server_host_set", _wrap_BitcoinServer_server_host_set}, +{"otapic::BitcoinServer_server_host_get", _wrap_BitcoinServer_server_host_get}, +{"otapic::BitcoinServer_server_port_set", _wrap_BitcoinServer_server_port_set}, +{"otapic::BitcoinServer_server_port_get", _wrap_BitcoinServer_server_port_get}, +{"otapic::BitcoinServer_bitcoin_username_set", _wrap_BitcoinServer_bitcoin_username_set}, +{"otapic::BitcoinServer_bitcoin_username_get", _wrap_BitcoinServer_bitcoin_username_get}, +{"otapic::BitcoinServer_bitcoin_password_set", _wrap_BitcoinServer_bitcoin_password_set}, +{"otapic::BitcoinServer_bitcoin_password_get", _wrap_BitcoinServer_bitcoin_password_get}, +{"otapic::BitcoinServer_ot_dynamic_cast", _wrap_BitcoinServer_ot_dynamic_cast}, +{"otapic::delete_RippleServer", _wrap_delete_RippleServer}, +{"otapic::RippleServer_gui_label_set", _wrap_RippleServer_gui_label_set}, +{"otapic::RippleServer_gui_label_get", _wrap_RippleServer_gui_label_get}, +{"otapic::RippleServer_server_id_set", _wrap_RippleServer_server_id_set}, +{"otapic::RippleServer_server_id_get", _wrap_RippleServer_server_id_get}, +{"otapic::RippleServer_server_type_set", _wrap_RippleServer_server_type_set}, +{"otapic::RippleServer_server_type_get", _wrap_RippleServer_server_type_get}, +{"otapic::RippleServer_server_host_set", _wrap_RippleServer_server_host_set}, +{"otapic::RippleServer_server_host_get", _wrap_RippleServer_server_host_get}, +{"otapic::RippleServer_server_port_set", _wrap_RippleServer_server_port_set}, +{"otapic::RippleServer_server_port_get", _wrap_RippleServer_server_port_get}, +{"otapic::RippleServer_ripple_username_set", _wrap_RippleServer_ripple_username_set}, +{"otapic::RippleServer_ripple_username_get", _wrap_RippleServer_ripple_username_get}, +{"otapic::RippleServer_ripple_password_set", _wrap_RippleServer_ripple_password_set}, +{"otapic::RippleServer_ripple_password_get", _wrap_RippleServer_ripple_password_get}, +{"otapic::RippleServer_namefield_id_set", _wrap_RippleServer_namefield_id_set}, +{"otapic::RippleServer_namefield_id_get", _wrap_RippleServer_namefield_id_get}, +{"otapic::RippleServer_passfield_id_set", _wrap_RippleServer_passfield_id_set}, +{"otapic::RippleServer_passfield_id_get", _wrap_RippleServer_passfield_id_get}, +{"otapic::RippleServer_ot_dynamic_cast", _wrap_RippleServer_ot_dynamic_cast}, +{"otapic::delete_LoomServer", _wrap_delete_LoomServer}, +{"otapic::LoomServer_gui_label_set", _wrap_LoomServer_gui_label_set}, +{"otapic::LoomServer_gui_label_get", _wrap_LoomServer_gui_label_get}, +{"otapic::LoomServer_server_id_set", _wrap_LoomServer_server_id_set}, +{"otapic::LoomServer_server_id_get", _wrap_LoomServer_server_id_get}, +{"otapic::LoomServer_server_type_set", _wrap_LoomServer_server_type_set}, +{"otapic::LoomServer_server_type_get", _wrap_LoomServer_server_type_get}, +{"otapic::LoomServer_server_host_set", _wrap_LoomServer_server_host_set}, +{"otapic::LoomServer_server_host_get", _wrap_LoomServer_server_host_get}, +{"otapic::LoomServer_server_port_set", _wrap_LoomServer_server_port_set}, +{"otapic::LoomServer_server_port_get", _wrap_LoomServer_server_port_get}, +{"otapic::LoomServer_loom_username_set", _wrap_LoomServer_loom_username_set}, +{"otapic::LoomServer_loom_username_get", _wrap_LoomServer_loom_username_get}, +{"otapic::LoomServer_namefield_id_set", _wrap_LoomServer_namefield_id_set}, +{"otapic::LoomServer_namefield_id_get", _wrap_LoomServer_namefield_id_get}, +{"otapic::LoomServer_ot_dynamic_cast", _wrap_LoomServer_ot_dynamic_cast}, +{"otapic::delete_ContactNym", _wrap_delete_ContactNym}, +{"otapic::ContactNym_gui_label_set", _wrap_ContactNym_gui_label_set}, +{"otapic::ContactNym_gui_label_get", _wrap_ContactNym_gui_label_get}, +{"otapic::ContactNym_nym_type_set", _wrap_ContactNym_nym_type_set}, +{"otapic::ContactNym_nym_type_get", _wrap_ContactNym_nym_type_get}, +{"otapic::ContactNym_nym_id_set", _wrap_ContactNym_nym_id_set}, +{"otapic::ContactNym_nym_id_get", _wrap_ContactNym_nym_id_get}, +{"otapic::ContactNym_public_key_set", _wrap_ContactNym_public_key_set}, +{"otapic::ContactNym_public_key_get", _wrap_ContactNym_public_key_get}, +{"otapic::ContactNym_memo_set", _wrap_ContactNym_memo_set}, +{"otapic::ContactNym_memo_get", _wrap_ContactNym_memo_get}, +{"otapic::ContactNym_GetServerInfoCount", _wrap_ContactNym_GetServerInfoCount}, +{"otapic::ContactNym_GetServerInfo", _wrap_ContactNym_GetServerInfo}, +{"otapic::ContactNym_RemoveServerInfo", _wrap_ContactNym_RemoveServerInfo}, +{"otapic::ContactNym_AddServerInfo", _wrap_ContactNym_AddServerInfo}, +{"otapic::ContactNym_ot_dynamic_cast", _wrap_ContactNym_ot_dynamic_cast}, +{"otapic::delete_WalletData", _wrap_delete_WalletData}, +{"otapic::WalletData_GetBitcoinServerCount", _wrap_WalletData_GetBitcoinServerCount}, +{"otapic::WalletData_GetBitcoinServer", _wrap_WalletData_GetBitcoinServer}, +{"otapic::WalletData_RemoveBitcoinServer", _wrap_WalletData_RemoveBitcoinServer}, +{"otapic::WalletData_AddBitcoinServer", _wrap_WalletData_AddBitcoinServer}, +{"otapic::WalletData_GetBitcoinAcctCount", _wrap_WalletData_GetBitcoinAcctCount}, +{"otapic::WalletData_GetBitcoinAcct", _wrap_WalletData_GetBitcoinAcct}, +{"otapic::WalletData_RemoveBitcoinAcct", _wrap_WalletData_RemoveBitcoinAcct}, +{"otapic::WalletData_AddBitcoinAcct", _wrap_WalletData_AddBitcoinAcct}, +{"otapic::WalletData_GetRippleServerCount", _wrap_WalletData_GetRippleServerCount}, +{"otapic::WalletData_GetRippleServer", _wrap_WalletData_GetRippleServer}, +{"otapic::WalletData_RemoveRippleServer", _wrap_WalletData_RemoveRippleServer}, +{"otapic::WalletData_AddRippleServer", _wrap_WalletData_AddRippleServer}, +{"otapic::WalletData_GetLoomServerCount", _wrap_WalletData_GetLoomServerCount}, +{"otapic::WalletData_GetLoomServer", _wrap_WalletData_GetLoomServer}, +{"otapic::WalletData_RemoveLoomServer", _wrap_WalletData_RemoveLoomServer}, +{"otapic::WalletData_AddLoomServer", _wrap_WalletData_AddLoomServer}, +{"otapic::WalletData_ot_dynamic_cast", _wrap_WalletData_ot_dynamic_cast}, +{"otapic::delete_ContactAcct", _wrap_delete_ContactAcct}, +{"otapic::ContactAcct_gui_label_set", _wrap_ContactAcct_gui_label_set}, +{"otapic::ContactAcct_gui_label_get", _wrap_ContactAcct_gui_label_get}, +{"otapic::ContactAcct_server_type_set", _wrap_ContactAcct_server_type_set}, +{"otapic::ContactAcct_server_type_get", _wrap_ContactAcct_server_type_get}, +{"otapic::ContactAcct_server_id_set", _wrap_ContactAcct_server_id_set}, +{"otapic::ContactAcct_server_id_get", _wrap_ContactAcct_server_id_get}, +{"otapic::ContactAcct_asset_type_id_set", _wrap_ContactAcct_asset_type_id_set}, +{"otapic::ContactAcct_asset_type_id_get", _wrap_ContactAcct_asset_type_id_get}, +{"otapic::ContactAcct_acct_id_set", _wrap_ContactAcct_acct_id_set}, +{"otapic::ContactAcct_acct_id_get", _wrap_ContactAcct_acct_id_get}, +{"otapic::ContactAcct_nym_id_set", _wrap_ContactAcct_nym_id_set}, +{"otapic::ContactAcct_nym_id_get", _wrap_ContactAcct_nym_id_get}, +{"otapic::ContactAcct_memo_set", _wrap_ContactAcct_memo_set}, +{"otapic::ContactAcct_memo_get", _wrap_ContactAcct_memo_get}, +{"otapic::ContactAcct_public_key_set", _wrap_ContactAcct_public_key_set}, +{"otapic::ContactAcct_public_key_get", _wrap_ContactAcct_public_key_get}, +{"otapic::ContactAcct_ot_dynamic_cast", _wrap_ContactAcct_ot_dynamic_cast}, +{"otapic::delete_Contact", _wrap_delete_Contact}, +{"otapic::Contact_gui_label_set", _wrap_Contact_gui_label_set}, +{"otapic::Contact_gui_label_get", _wrap_Contact_gui_label_get}, +{"otapic::Contact_contact_id_set", _wrap_Contact_contact_id_set}, +{"otapic::Contact_contact_id_get", _wrap_Contact_contact_id_get}, +{"otapic::Contact_email_set", _wrap_Contact_email_set}, +{"otapic::Contact_email_get", _wrap_Contact_email_get}, +{"otapic::Contact_memo_set", _wrap_Contact_memo_set}, +{"otapic::Contact_memo_get", _wrap_Contact_memo_get}, +{"otapic::Contact_public_key_set", _wrap_Contact_public_key_set}, +{"otapic::Contact_public_key_get", _wrap_Contact_public_key_get}, +{"otapic::Contact_GetContactNymCount", _wrap_Contact_GetContactNymCount}, +{"otapic::Contact_GetContactNym", _wrap_Contact_GetContactNym}, +{"otapic::Contact_RemoveContactNym", _wrap_Contact_RemoveContactNym}, +{"otapic::Contact_AddContactNym", _wrap_Contact_AddContactNym}, +{"otapic::Contact_GetContactAcctCount", _wrap_Contact_GetContactAcctCount}, +{"otapic::Contact_GetContactAcct", _wrap_Contact_GetContactAcct}, +{"otapic::Contact_RemoveContactAcct", _wrap_Contact_RemoveContactAcct}, +{"otapic::Contact_AddContactAcct", _wrap_Contact_AddContactAcct}, +{"otapic::Contact_ot_dynamic_cast", _wrap_Contact_ot_dynamic_cast}, +{"otapic::delete_AddressBook", _wrap_delete_AddressBook}, +{"otapic::AddressBook_GetContactCount", _wrap_AddressBook_GetContactCount}, +{"otapic::AddressBook_GetContact", _wrap_AddressBook_GetContact}, +{"otapic::AddressBook_RemoveContact", _wrap_AddressBook_RemoveContact}, +{"otapic::AddressBook_AddContact", _wrap_AddressBook_AddContact}, +{"otapic::AddressBook_ot_dynamic_cast", _wrap_AddressBook_ot_dynamic_cast}, +{0,0} +}; +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" +#endif + +XS(SWIG_init) { + dXSARGS; + int i; + + SWIG_InitializeModule(0); + + /* Install commands */ + for (i = 0; swig_commands[i].name; i++) { + newXS((char*) swig_commands[i].name,swig_commands[i].wrapper, (char*)__FILE__); + } + + /* Install variables */ + for (i = 0; swig_variables[i].name; i++) { + SV *sv; + sv = get_sv((char*) swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); + if (swig_variables[i].type) { + SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); + } else { + sv_setiv(sv,(IV) 0); + } + swig_create_magic(sv, (char *) swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); + } + + /* Install constant */ + for (i = 0; swig_constants[i].type; i++) { + SV *sv; + sv = get_sv((char*)swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); + switch(swig_constants[i].type) { + case SWIG_INT: + sv_setiv(sv, (IV) swig_constants[i].lvalue); + break; + case SWIG_FLOAT: + sv_setnv(sv, (double) swig_constants[i].dvalue); + break; + case SWIG_STRING: + sv_setpv(sv, (char *) swig_constants[i].pvalue); + break; + case SWIG_POINTER: + SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); + break; + case SWIG_BINARY: + SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); + break; + default: + break; + } + SvREADONLY_on(sv); + } + + SWIG_TypeClientData(SWIGTYPE_p_OTCallback, (void*) "otapi::OTCallback"); + SWIG_TypeClientData(SWIGTYPE_p_OTCaller, (void*) "otapi::OTCaller"); + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "PACK_MESSAGE_PACK", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::PACK_MESSAGE_PACK))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "PACK_PROTOCOL_BUFFERS", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::PACK_PROTOCOL_BUFFERS))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "PACK_TYPE_ERROR", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::PACK_TYPE_ERROR))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORE_FILESYSTEM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORE_FILESYSTEM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORE_TYPE_SUBCLASS", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORE_TYPE_SUBCLASS))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_STRING", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_STRING))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_BLOB", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_BLOB))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_STRING_MAP", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_STRING_MAP))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_WALLET_DATA", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_WALLET_DATA))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_BITCOIN_ACCT", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_ACCT))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_BITCOIN_SERVER", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_SERVER))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_RIPPLE_SERVER", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_RIPPLE_SERVER))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_LOOM_SERVER", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_LOOM_SERVER))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_SERVER_INFO", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_SERVER_INFO))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_CONTACT_NYM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_CONTACT_NYM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_CONTACT_ACCT", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_CONTACT_ACCT))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_CONTACT", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_CONTACT))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_ADDRESS_BOOK", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_ADDRESS_BOOK))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_MARKET_DATA", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_MARKET_DATA))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_MARKET_LIST", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_MARKET_LIST))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_BID_DATA", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_BID_DATA))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_ASK_DATA", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_ASK_DATA))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_OFFER_LIST_MARKET", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_MARKET))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_TRADE_DATA_MARKET", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_MARKET))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_TRADE_LIST_MARKET", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_MARKET))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_OFFER_DATA_NYM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_OFFER_DATA_NYM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_OFFER_LIST_NYM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_NYM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_TRADE_DATA_NYM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_NYM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_TRADE_LIST_NYM", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_NYM))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + /*@SWIG:/opt/local/share/swig/2.0.4/perl5/perltypemaps.swg,65,%set_constant@*/ do { + SV *sv = get_sv((char*) SWIG_prefix "STORED_OBJ_ERROR", TRUE | 0x2 | GV_ADDMULTI); + sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(OTDB::STORED_OBJ_ERROR))); + SvREADONLY_on(sv); + } while(0) /*@SWIG@*/; + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storable, (void*) "otapi::Storable"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storage, (void*) "otapi::Storage"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OTDBString, (void*) "otapi::OTDBString"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Blob, (void*) "otapi::Blob"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__StringMap, (void*) "otapi::StringMap"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Displayable, (void*) "otapi::Displayable"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketData, (void*) "otapi::MarketData"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketList, (void*) "otapi::MarketList"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataMarket, (void*) "otapi::OfferDataMarket"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BidData, (void*) "otapi::BidData"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__AskData, (void*) "otapi::AskData"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListMarket, (void*) "otapi::OfferListMarket"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataMarket, (void*) "otapi::TradeDataMarket"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListMarket, (void*) "otapi::TradeListMarket"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataNym, (void*) "otapi::OfferDataNym"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListNym, (void*) "otapi::OfferListNym"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataNym, (void*) "otapi::TradeDataNym"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListNym, (void*) "otapi::TradeListNym"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Acct, (void*) "otapi::Acct"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinAcct, (void*) "otapi::BitcoinAcct"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ServerInfo, (void*) "otapi::ServerInfo"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Server, (void*) "otapi::Server"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinServer, (void*) "otapi::BitcoinServer"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__RippleServer, (void*) "otapi::RippleServer"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__LoomServer, (void*) "otapi::LoomServer"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactNym, (void*) "otapi::ContactNym"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__WalletData, (void*) "otapi::WalletData"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactAcct, (void*) "otapi::ContactAcct"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Contact, (void*) "otapi::Contact"); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__AddressBook, (void*) "otapi::AddressBook"); + ST(0) = &PL_sv_yes; + XSRETURN(1); +} + diff --git a/testwallet/OTAPI_perl5.h b/testwallet/OTAPI_perl5.h new file mode 100644 index 000000000..e69de29bb diff --git a/testwallet/OTAPI_php.cpp b/testwallet/OTAPI_php.cpp new file mode 100644 index 000000000..0a8f3b3dd --- /dev/null +++ b/testwallet/OTAPI_php.cpp @@ -0,0 +1,26210 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPHP + +#define SWIG_DIRECTORS + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * phprun.swg + * + * PHP runtime library + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif +#include "zend.h" +#include "zend_API.h" +#include "zend_exceptions.h" +#include "php.h" +#include "ext/standard/php_string.h" + +#ifdef ZEND_RAW_FENTRY +/* ZEND_RAW_FENTRY was added somewhere between 5.2.0 and 5.2.3 */ +# define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_RAW_FENTRY((char*)#ZN, N, A, 0) +#else +/* This causes warnings from GCC >= 4.2 (assigning a string literal to char*). + * But this seems to be unavoidable without directly assuming knowledge of + * the structure, which changed between PHP4 and PHP5. */ +# define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) +#endif + +#ifndef Z_SET_ISREF_P +/* For PHP < 5.3 */ +# define Z_SET_ISREF_P(z) (z)->is_ref = 1 +#endif +#ifndef Z_SET_REFCOUNT_P +/* For PHP < 5.3 */ +# define Z_SET_REFCOUNT_P(z, rc) (z)->refcount = (rc) +#endif + +#define SWIG_LONG_CONSTANT(N, V) zend_register_long_constant((char*)#N, sizeof(#N), V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) +#define SWIG_DOUBLE_CONSTANT(N, V) zend_register_double_constant((char*)#N, sizeof(#N), V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) +#define SWIG_STRING_CONSTANT(N, V) zend_register_stringl_constant((char*)#N, sizeof(#N), (char*)(V), strlen(V), CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) +#define SWIG_CHAR_CONSTANT(N, V) do {\ + static char swig_char = (V);\ + zend_register_stringl_constant((char*)#N, sizeof(#N), &swig_char, 1, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC);\ +} while (0) + +/* These TSRMLS_ stuff should already be defined now, but with older php under + redhat are not... */ +#ifndef TSRMLS_D +#define TSRMLS_D +#endif +#ifndef TSRMLS_DC +#define TSRMLS_DC +#endif +#ifndef TSRMLS_C +#define TSRMLS_C +#endif +#ifndef TSRMLS_CC +#define TSRMLS_CC +#endif + +#ifdef __cplusplus +} +#endif + +/* But in fact SWIG_ConvertPtr is the native interface for getting typed + pointer values out of zvals. We need the TSRMLS_ macros for when we + make PHP type calls later as we handle php resources */ +#define SWIG_ConvertPtr(obj,pp,type,flags) SWIG_ZTS_ConvertPtr(obj,pp,type,flags TSRMLS_CC) + + +#define SWIG_fail goto fail + +static const char *default_error_msg = "Unknown error occurred"; +static int default_error_code = E_ERROR; + +#define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg + +#define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) + +#define SWIG_contract_assert(expr,msg) \ + if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else + +/* Standard SWIG API */ +#define SWIG_GetModule(clientdata) SWIG_Php_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer) + +/* used to wrap returned objects in so we know whether they are newobject + and need freeing, or not */ +typedef struct { + void * ptr; + int newobject; +} swig_object_wrapper; + +/* empty zend destructor for types without one */ +static ZEND_RSRC_DTOR_FUNC(SWIG_landfill) { (void)rsrc; } + +#define SWIG_SetPointerZval(a,b,c,d) SWIG_ZTS_SetPointerZval(a,b,c,d TSRMLS_CC) +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) + +static void +SWIG_ZTS_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject TSRMLS_DC) { + swig_object_wrapper *value=NULL; + /* + * First test for Null pointers. Return those as PHP native NULL + */ + if (!ptr ) { + ZVAL_NULL(z); + return; + } + if (type->clientdata) { + if (! (*(int *)(type->clientdata))) + zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); + value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); + value->ptr=ptr; + value->newobject=newobject; + if (newobject <= 1) { + /* Just register the pointer as a resource. */ + ZEND_REGISTER_RESOURCE(z, value, *(int *)(type->clientdata)); + } else { + /* + * Wrap the resource in an object, the resource will be accessible + * via the "_cPtr" member. This is currently only used by + * directorin typemaps. + */ + value->newobject = 0; + zval *resource; + MAKE_STD_ZVAL(resource); + ZEND_REGISTER_RESOURCE(resource, value, *(int *)(type->clientdata)); + zend_class_entry **ce = NULL; + zval *classname; + MAKE_STD_ZVAL(classname); + /* _p_Foo -> Foo */ + ZVAL_STRING(classname, (char*)type->name+3, 1); + /* class names are stored in lowercase */ + php_strtolower(Z_STRVAL_PP(&classname), Z_STRLEN_PP(&classname)); + if (zend_lookup_class(Z_STRVAL_P(classname), Z_STRLEN_P(classname), &ce TSRMLS_CC) != SUCCESS) { + /* class does not exist */ + object_init(z); + } else { + object_init_ex(z, *ce); + } + Z_SET_REFCOUNT_P(z, 1); + Z_SET_ISREF_P(z); + zend_hash_update(HASH_OF(z), (char*)"_cPtr", sizeof("_cPtr"), (void*)&resource, sizeof(zval), NULL); + FREE_ZVAL(classname); + } + return; + } + zend_error(E_ERROR, "Type: %s not registered with zend",type->name); +} + +/* This pointer conversion routine takes the native pointer p (along with + its type name) and converts it by calling appropriate casting functions + according to ty. The resultant pointer is returned, or NULL is returned + if the pointer can't be cast. + + Sadly PHP has no API to find a type name from a type id, only from an + instance of a resource of the type id, so we have to pass type_name as well. + + The two functions which might call this are: + SWIG_ZTS_ConvertResourcePtr which gets the type name from the resource + and the registered zend destructors for which we have one per type each + with the type name hard wired in. */ +static void * +SWIG_ZTS_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty TSRMLS_DC) { + swig_cast_info *tc; + void *result = 0; + + if (!ty) { + /* They don't care about the target type, so just pass on the pointer! */ + return p; + } + + if (! type_name) { + /* can't convert p to ptr type ty if we don't know what type p is */ + return NULL; + } + + /* convert and cast p from type_name to ptr as ty. */ + tc = SWIG_TypeCheck(type_name, ty); + if (tc) { + int newmemory = 0; + result = SWIG_TypeCast(tc, p, &newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } + return result; +} + +/* This function returns a pointer of type ty by extracting the pointer + and type info from the resource in z. z must be a resource. + If it fails, NULL is returned. + It uses SWIG_ZTS_ConvertResourceData to do the real work. */ +static void * +SWIG_ZTS_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags TSRMLS_DC) { + swig_object_wrapper *value; + void *p; + int type; + char *type_name; + + value = (swig_object_wrapper *) zend_list_find(z->value.lval, &type); + if ( flags & SWIG_POINTER_DISOWN ) { + value->newobject = 0; + } + p = value->ptr; + if (type==-1) return NULL; + + type_name=zend_rsrc_list_get_rsrc_type(z->value.lval TSRMLS_CC); + + return SWIG_ZTS_ConvertResourceData(p, type_name, ty TSRMLS_CC); +} + +/* We allow passing of a RESOURCE pointing to the object or an OBJECT whose + _cPtr is a resource pointing to the object */ +static int +SWIG_ZTS_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags TSRMLS_DC) { + if (z == NULL) { + *ptr = 0; + return 0; + } + + switch (z->type) { + case IS_OBJECT: { + zval ** _cPtr; + if (zend_hash_find(HASH_OF(z),(char*)"_cPtr",sizeof("_cPtr"),(void**)&_cPtr)==SUCCESS) { + if ((*_cPtr)->type==IS_RESOURCE) { + *ptr = SWIG_ZTS_ConvertResourcePtr(*_cPtr, ty, flags TSRMLS_CC); + return (*ptr == NULL ? -1 : 0); + } + } + break; + } + case IS_RESOURCE: + *ptr = SWIG_ZTS_ConvertResourcePtr(z, ty, flags TSRMLS_CC); + return (*ptr == NULL ? -1 : 0); + case IS_NULL: + *ptr = 0; + return 0; + } + + return -1; +} + +static char const_name[] = "swig_runtime_data_type_pointer"; +static swig_module_info *SWIG_Php_GetModule() { + zval *pointer; + swig_module_info *ret = 0; + + MAKE_STD_ZVAL(pointer); + + TSRMLS_FETCH(); + + if (zend_get_constant(const_name, sizeof(const_name) - 1, pointer TSRMLS_CC)) { + if (pointer->type == IS_LONG) { + ret = (swig_module_info *) pointer->value.lval; + } + } + FREE_ZVAL(pointer); + return ret; +} + +static void SWIG_Php_SetModule(swig_module_info *pointer) { + TSRMLS_FETCH(); + REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, 0); +} + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_int swig_types[0] +#define SWIGTYPE_p_OTCallback swig_types[1] +#define SWIGTYPE_p_OTCaller swig_types[2] +#define SWIGTYPE_p_OTDB__Acct swig_types[3] +#define SWIGTYPE_p_OTDB__AddressBook swig_types[4] +#define SWIGTYPE_p_OTDB__AskData swig_types[5] +#define SWIGTYPE_p_OTDB__BidData swig_types[6] +#define SWIGTYPE_p_OTDB__BitcoinAcct swig_types[7] +#define SWIGTYPE_p_OTDB__BitcoinServer swig_types[8] +#define SWIGTYPE_p_OTDB__Blob swig_types[9] +#define SWIGTYPE_p_OTDB__Contact swig_types[10] +#define SWIGTYPE_p_OTDB__ContactAcct swig_types[11] +#define SWIGTYPE_p_OTDB__ContactNym swig_types[12] +#define SWIGTYPE_p_OTDB__Displayable swig_types[13] +#define SWIGTYPE_p_OTDB__LoomServer swig_types[14] +#define SWIGTYPE_p_OTDB__MarketData swig_types[15] +#define SWIGTYPE_p_OTDB__MarketList swig_types[16] +#define SWIGTYPE_p_OTDB__OTDBString swig_types[17] +#define SWIGTYPE_p_OTDB__OfferDataMarket swig_types[18] +#define SWIGTYPE_p_OTDB__OfferDataNym swig_types[19] +#define SWIGTYPE_p_OTDB__OfferListMarket swig_types[20] +#define SWIGTYPE_p_OTDB__OfferListNym swig_types[21] +#define SWIGTYPE_p_OTDB__RippleServer swig_types[22] +#define SWIGTYPE_p_OTDB__Server swig_types[23] +#define SWIGTYPE_p_OTDB__ServerInfo swig_types[24] +#define SWIGTYPE_p_OTDB__Storable swig_types[25] +#define SWIGTYPE_p_OTDB__Storage swig_types[26] +#define SWIGTYPE_p_OTDB__StringMap swig_types[27] +#define SWIGTYPE_p_OTDB__TradeDataMarket swig_types[28] +#define SWIGTYPE_p_OTDB__TradeDataNym swig_types[29] +#define SWIGTYPE_p_OTDB__TradeListMarket swig_types[30] +#define SWIGTYPE_p_OTDB__TradeListNym swig_types[31] +#define SWIGTYPE_p_OTDB__WalletData swig_types[32] +#define SWIGTYPE_p_OTPacker swig_types[33] +#define SWIGTYPE_p_std__mapT_std__string_std__string_t swig_types[34] +#define SWIGTYPE_p_std__vectorT_unsigned_char_t swig_types[35] +static swig_type_info *swig_types[37]; +static swig_module_info swig_module = {swig_types, 36, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +/* header section */ +ZEND_BEGIN_MODULE_GLOBALS(otapi) +const char *error_msg; +int error_code; +ZEND_END_MODULE_GLOBALS(otapi) +ZEND_DECLARE_MODULE_GLOBALS(otapi) +#ifdef ZTS +#define SWIG_ErrorMsg() TSRMG(otapi_globals_id, zend_otapi_globals *, error_msg ) +#define SWIG_ErrorCode() TSRMG(otapi_globals_id, zend_otapi_globals *, error_code ) +#else +#define SWIG_ErrorMsg() (otapi_globals.error_msg) +#define SWIG_ErrorCode() (otapi_globals.error_code) +#endif + +// Allow the user to workaround a PHP bug on some platforms/architectures by +// compiling with -DSWIG_ZEND_ERROR_NORETURN=zend_error +#ifndef SWIG_ZEND_ERROR_NORETURN +# define SWIG_ZEND_ERROR_NORETURN zend_error_noreturn +#endif + +static void otapi_init_globals(zend_otapi_globals *globals ) { + globals->error_msg = default_error_msg; + globals->error_code = default_error_code; +} +static void otapi_destroy_globals(zend_otapi_globals * globals) { (void)globals; } + +static void SWIG_ResetError() { + TSRMLS_FETCH(); + SWIG_ErrorMsg() = default_error_msg; + SWIG_ErrorCode() = default_error_code; +} + +ZEND_NAMED_FUNCTION(_wrap_swig_otapi_alter_newobject) { + zval **args[2]; + swig_object_wrapper *value; + int type; + int thisown; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + value = (swig_object_wrapper *) zend_list_find((*args[0])->value.lval, &type); + value->newobject = zval_is_true(*args[1]); + + return; +} +ZEND_NAMED_FUNCTION(_wrap_swig_otapi_get_newobject) { + zval **args[1]; + swig_object_wrapper *value; + int type; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + value = (swig_object_wrapper *) zend_list_find((*args[0])->value.lval, &type); + RETVAL_LONG(value->newobject); + + return; +} +#define SWIG_name "otapi" +#ifdef __cplusplus +extern "C" { +#endif +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "php_otapi.h" +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to PHP extensions. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_DIRECTOR_PHP_HEADER_ +#define SWIG_DIRECTOR_PHP_HEADER_ + +#ifdef __cplusplus + +#include +#include + +/* + Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the + 'Swig' namespace. This could be useful for multi-modules projects. +*/ +#ifdef SWIG_DIRECTOR_STATIC +/* Force anonymous (static) namespace */ +#define Swig +#endif + +namespace Swig { + /* memory handler */ + struct GCItem + { + virtual ~GCItem() {} + + virtual int get_own() const + { + return 0; + } + }; + + struct GCItem_var + { + GCItem_var(GCItem *item = 0) : _item(item) + { + } + + GCItem_var& operator=(GCItem *item) + { + GCItem *tmp = _item; + _item = item; + delete tmp; + return *this; + } + + ~GCItem_var() + { + delete _item; + } + + GCItem * operator->() const + { + return _item; + } + + private: + GCItem *_item; + }; + + struct GCItem_Object : GCItem + { + GCItem_Object(int own) : _own(own) + { + } + + virtual ~GCItem_Object() + { + } + + int get_own() const + { + return _own; + } + + private: + int _own; + }; + + template + struct GCItem_T : GCItem + { + GCItem_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCItem_T() + { + delete _ptr; + } + + private: + Type *_ptr; + }; + + class Director { + protected: + zval *swig_self; + typedef std::map swig_ownership_map; + mutable swig_ownership_map swig_owner; + public: + Director(zval* self) : swig_self(self) { + } + + bool swig_is_overridden_method(char *cname, char *lc_fname) { + zval classname; + zend_class_entry **ce; + zend_function *mptr; + int name_len = strlen(lc_fname); + + ZVAL_STRING(&classname, cname, 0); + if (zend_lookup_class(Z_STRVAL_P(&classname), Z_STRLEN_P(&classname), &ce TSRMLS_CC) != SUCCESS) { + return false; + } + if (zend_hash_find(&(*ce)->function_table, lc_fname, name_len + 1, (void**) &mptr) != SUCCESS) { + return false; + } + // common.scope points to the declaring class + return strcmp(mptr->common.scope->name, cname); + } + + template + void swig_acquire_ownership(Type *vptr) const + { + if (vptr) { + swig_owner[vptr] = new GCItem_T(vptr); + } + } + }; + + /* base class for director exceptions */ + class DirectorException { + protected: + std::string swig_msg; + public: + DirectorException(int code, const char *hdr, const char* msg) + : swig_msg(hdr) + { + if (strlen(msg)) { + swig_msg += " "; + swig_msg += msg; + } + SWIG_ErrorCode() = code; + SWIG_ErrorMsg() = swig_msg.c_str(); + } + + static void raise(int code, const char *hdr, const char* msg) + { + throw DirectorException(code, hdr, msg); + } + }; + + /* attempt to call a pure virtual method via a director method */ + class DirectorPureVirtualException : public Swig::DirectorException + { + public: + DirectorPureVirtualException(const char* msg) + : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorPureVirtualException(msg); + } + }; + /* any php exception that occurs during a director method call */ + class DirectorMethodException : public Swig::DirectorException + { + public: + DirectorMethodException(const char* msg = "") + : DirectorException(E_ERROR, "SWIG director method error", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorMethodException(msg); + } + }; +} + +#endif /* __cplusplus */ + +#endif + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#if PHP_MAJOR_VERSION < 5 +# define SWIG_exception(code, msg) { zend_error(E_ERROR, msg); } +#else +# include "zend_exceptions.h" +# define SWIG_exception(code, msg) { zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC); } +#endif + + +#include + + +#include + + + using namespace OTDB; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Acct(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__MarketListTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::MarketList *) x)); +} +static void *_p_OTDB__OfferListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListNym *) x)); +} +static void *_p_OTDB__TradeListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListNym *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__StringMapTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::StringMap *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__TradeListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListMarket *) x)); +} +static void *_p_OTDB__OfferListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListMarket *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__DisplayableTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Displayable *) x)); +} +static void *_p_OTDB__WalletDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::WalletData *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BlobTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Blob *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__OTDBStringTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OTDBString *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__AddressBookTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::AddressBook *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static swig_type_info _swigt__int = {"_int", "int", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTCallback = {"_p_OTCallback", "OTCallback *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTCaller = {"_p_OTCaller", "OTCaller *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Acct = {"_p_OTDB__Acct", "OTDB::Acct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AddressBook = {"_p_OTDB__AddressBook", "OTDB::AddressBook *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AskData = {"_p_OTDB__AskData", "OTDB::AskData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BidData = {"_p_OTDB__BidData", "OTDB::BidData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinAcct = {"_p_OTDB__BitcoinAcct", "OTDB::BitcoinAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinServer = {"_p_OTDB__BitcoinServer", "OTDB::BitcoinServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Blob = {"_p_OTDB__Blob", "OTDB::Blob *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Contact = {"_p_OTDB__Contact", "OTDB::Contact *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactAcct = {"_p_OTDB__ContactAcct", "OTDB::ContactAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactNym = {"_p_OTDB__ContactNym", "OTDB::ContactNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Displayable = {"_p_OTDB__Displayable", "OTDB::Displayable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__LoomServer = {"_p_OTDB__LoomServer", "OTDB::LoomServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketData = {"_p_OTDB__MarketData", "OTDB::MarketData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketList = {"_p_OTDB__MarketList", "OTDB::MarketList *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OTDBString = {"_p_OTDB__OTDBString", "OTDB::OTDBString *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataMarket = {"_p_OTDB__OfferDataMarket", "OTDB::OfferDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataNym = {"_p_OTDB__OfferDataNym", "OTDB::OfferDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListMarket = {"_p_OTDB__OfferListMarket", "OTDB::OfferListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListNym = {"_p_OTDB__OfferListNym", "OTDB::OfferListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__RippleServer = {"_p_OTDB__RippleServer", "OTDB::RippleServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Server = {"_p_OTDB__Server", "OTDB::Server *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ServerInfo = {"_p_OTDB__ServerInfo", "OTDB::ServerInfo *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storable = {"_p_OTDB__Storable", "OTDB::Storable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storage = {"_p_OTDB__Storage", "OTDB::Storage *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__StringMap = {"_p_OTDB__StringMap", "OTDB::StringMap *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataMarket = {"_p_OTDB__TradeDataMarket", "OTDB::TradeDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataNym = {"_p_OTDB__TradeDataNym", "OTDB::TradeDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListMarket = {"_p_OTDB__TradeListMarket", "OTDB::TradeListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListNym = {"_p_OTDB__TradeListNym", "OTDB::TradeListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__WalletData = {"_p_OTDB__WalletData", "OTDB::WalletData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTPacker = {"_p_OTPacker", "OTPacker *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__mapT_std__string_std__string_t = {"_p_std__mapT_std__string_std__string_t", "std::map< std::string,std::string > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_unsigned_char_t = {"_p_std__vectorT_unsigned_char_t", "std::vector< unsigned char > *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__int, + &_swigt__p_OTCallback, + &_swigt__p_OTCaller, + &_swigt__p_OTDB__Acct, + &_swigt__p_OTDB__AddressBook, + &_swigt__p_OTDB__AskData, + &_swigt__p_OTDB__BidData, + &_swigt__p_OTDB__BitcoinAcct, + &_swigt__p_OTDB__BitcoinServer, + &_swigt__p_OTDB__Blob, + &_swigt__p_OTDB__Contact, + &_swigt__p_OTDB__ContactAcct, + &_swigt__p_OTDB__ContactNym, + &_swigt__p_OTDB__Displayable, + &_swigt__p_OTDB__LoomServer, + &_swigt__p_OTDB__MarketData, + &_swigt__p_OTDB__MarketList, + &_swigt__p_OTDB__OTDBString, + &_swigt__p_OTDB__OfferDataMarket, + &_swigt__p_OTDB__OfferDataNym, + &_swigt__p_OTDB__OfferListMarket, + &_swigt__p_OTDB__OfferListNym, + &_swigt__p_OTDB__RippleServer, + &_swigt__p_OTDB__Server, + &_swigt__p_OTDB__ServerInfo, + &_swigt__p_OTDB__Storable, + &_swigt__p_OTDB__Storage, + &_swigt__p_OTDB__StringMap, + &_swigt__p_OTDB__TradeDataMarket, + &_swigt__p_OTDB__TradeDataNym, + &_swigt__p_OTDB__TradeListMarket, + &_swigt__p_OTDB__TradeListNym, + &_swigt__p_OTDB__WalletData, + &_swigt__p_OTPacker, + &_swigt__p_std__mapT_std__string_std__string_t, + &_swigt__p_std__vectorT_unsigned_char_t, +}; + +static swig_cast_info _swigc__int[] = { {&_swigt__int, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCallback[] = { {&_swigt__p_OTCallback, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCaller[] = { {&_swigt__p_OTCaller, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Acct[] = { {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Acct, 0, 0}, {&_swigt__p_OTDB__Acct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AddressBook[] = { {&_swigt__p_OTDB__AddressBook, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AskData[] = { {&_swigt__p_OTDB__AskData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BidData[] = { {&_swigt__p_OTDB__BidData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinAcct[] = { {&_swigt__p_OTDB__BitcoinAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinServer[] = { {&_swigt__p_OTDB__BitcoinServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Blob[] = { {&_swigt__p_OTDB__Blob, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Contact[] = { {&_swigt__p_OTDB__Contact, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactAcct[] = { {&_swigt__p_OTDB__ContactAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactNym[] = { {&_swigt__p_OTDB__ContactNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Displayable[] = { {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Displayable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Displayable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__LoomServer[] = { {&_swigt__p_OTDB__LoomServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketData[] = { {&_swigt__p_OTDB__MarketData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketList[] = { {&_swigt__p_OTDB__MarketList, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OTDBString[] = { {&_swigt__p_OTDB__OTDBString, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataMarket[] = { {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__OfferDataMarket, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, 0, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__OfferDataMarket, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataNym[] = { {&_swigt__p_OTDB__OfferDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListMarket[] = { {&_swigt__p_OTDB__OfferListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListNym[] = { {&_swigt__p_OTDB__OfferListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__RippleServer[] = { {&_swigt__p_OTDB__RippleServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Server[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__Server, 0, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Server, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ServerInfo[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__ServerInfo, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storable[] = { {&_swigt__p_OTDB__MarketList, _p_OTDB__MarketListTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListNym, _p_OTDB__OfferListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListNym, _p_OTDB__TradeListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Blob, _p_OTDB__BlobTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__StringMap, _p_OTDB__StringMapTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListMarket, _p_OTDB__OfferListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListMarket, _p_OTDB__TradeListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Displayable, _p_OTDB__DisplayableTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__WalletData, _p_OTDB__WalletDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Storable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OTDBString, _p_OTDB__OTDBStringTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AddressBook, _p_OTDB__AddressBookTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Storable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storage[] = { {&_swigt__p_OTDB__Storage, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__StringMap[] = { {&_swigt__p_OTDB__StringMap, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataMarket[] = { {&_swigt__p_OTDB__TradeDataMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataNym[] = { {&_swigt__p_OTDB__TradeDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListMarket[] = { {&_swigt__p_OTDB__TradeListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListNym[] = { {&_swigt__p_OTDB__TradeListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__WalletData[] = { {&_swigt__p_OTDB__WalletData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTPacker[] = { {&_swigt__p_OTPacker, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t[] = { {&_swigt__p_std__mapT_std__string_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_unsigned_char_t[] = { {&_swigt__p_std__vectorT_unsigned_char_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__int, + _swigc__p_OTCallback, + _swigc__p_OTCaller, + _swigc__p_OTDB__Acct, + _swigc__p_OTDB__AddressBook, + _swigc__p_OTDB__AskData, + _swigc__p_OTDB__BidData, + _swigc__p_OTDB__BitcoinAcct, + _swigc__p_OTDB__BitcoinServer, + _swigc__p_OTDB__Blob, + _swigc__p_OTDB__Contact, + _swigc__p_OTDB__ContactAcct, + _swigc__p_OTDB__ContactNym, + _swigc__p_OTDB__Displayable, + _swigc__p_OTDB__LoomServer, + _swigc__p_OTDB__MarketData, + _swigc__p_OTDB__MarketList, + _swigc__p_OTDB__OTDBString, + _swigc__p_OTDB__OfferDataMarket, + _swigc__p_OTDB__OfferDataNym, + _swigc__p_OTDB__OfferListMarket, + _swigc__p_OTDB__OfferListNym, + _swigc__p_OTDB__RippleServer, + _swigc__p_OTDB__Server, + _swigc__p_OTDB__ServerInfo, + _swigc__p_OTDB__Storable, + _swigc__p_OTDB__Storage, + _swigc__p_OTDB__StringMap, + _swigc__p_OTDB__TradeDataMarket, + _swigc__p_OTDB__TradeDataNym, + _swigc__p_OTDB__TradeListMarket, + _swigc__p_OTDB__TradeListNym, + _swigc__p_OTDB__WalletData, + _swigc__p_OTPacker, + _swigc__p_std__mapT_std__string_std__string_t, + _swigc__p_std__vectorT_unsigned_char_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +/* end header section */ + +#include "OTAPI_wrap.h" + +SwigDirector_OTCallback::SwigDirector_OTCallback(zval *self): OTCallback(), Swig::Director(self) { + +} + + + +SwigDirector_OTCallback::~SwigDirector_OTCallback() { +} + +std::string SwigDirector_OTCallback::runOne() { + std::string c_result; + zval **args = NULL; + zval *result, funcname; + MAKE_STD_ZVAL(result); + ZVAL_STRING(&funcname, (char *)"runOne", 0); + if (!swig_self) { + SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + } + + call_user_function(EG(function_table), (zval**)&swig_self, &funcname, + result, 0, args TSRMLS_CC); + + convert_to_string_ex(&result); + c_result.assign(Z_STRVAL_PP(&result), Z_STRLEN_PP(&result)); + + FREE_ZVAL(result); + return (std::string) c_result; +fail: + SWIG_ZEND_ERROR_NORETURN(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +std::string SwigDirector_OTCallback::runTwo() { + std::string c_result; + zval **args = NULL; + zval *result, funcname; + MAKE_STD_ZVAL(result); + ZVAL_STRING(&funcname, (char *)"runTwo", 0); + if (!swig_self) { + SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + } + + call_user_function(EG(function_table), (zval**)&swig_self, &funcname, + result, 0, args TSRMLS_CC); + + convert_to_string_ex(&result); + c_result.assign(Z_STRVAL_PP(&result), Z_STRLEN_PP(&result)); + + FREE_ZVAL(result); + return (std::string) c_result; +fail: + SWIG_ZEND_ERROR_NORETURN(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* vdecl subsection */ +static int le_swig__p_std__vectorT_unsigned_char_t=0; /* handle for _p_std__vectorT_unsigned_char_t */ +static int le_swig__p_OTDB__Storage=0; /* handle for Storage */ +static int le_swig__p_OTDB__BitcoinAcct=0; /* handle for BitcoinAcct */ +static int le_swig__p_OTDB__BidData=0; /* handle for BidData */ +static int le_swig__p_OTDB__ContactAcct=0; /* handle for ContactAcct */ +static int le_swig__p_OTDB__Blob=0; /* handle for Blob */ +static int le_swig__p_OTDB__TradeListNym=0; /* handle for TradeListNym */ +static int le_swig__p_OTDB__OfferListNym=0; /* handle for OfferListNym */ +static int le_swig__p_OTDB__TradeListMarket=0; /* handle for TradeListMarket */ +static int le_swig__p_OTDB__OfferListMarket=0; /* handle for OfferListMarket */ +static int le_swig__p_OTDB__WalletData=0; /* handle for WalletData */ +static int le_swig__p_OTDB__StringMap=0; /* handle for StringMap */ +static int le_swig__int=0; /* handle for _int */ +static int le_swig__p_OTDB__BitcoinServer=0; /* handle for BitcoinServer */ +static int le_swig__p_OTDB__Displayable=0; /* handle for Displayable */ +static int le_swig__p_OTPacker=0; /* handle for _p_OTPacker */ +static int le_swig__p_OTDB__AskData=0; /* handle for AskData */ +static int le_swig__p_OTDB__OTDBString=0; /* handle for OTDBString */ +static int le_swig__p_OTDB__TradeDataMarket=0; /* handle for TradeDataMarket */ +static int le_swig__p_OTDB__OfferDataMarket=0; /* handle for OfferDataMarket */ +static int le_swig__p_OTDB__Acct=0; /* handle for Acct */ +static int le_swig__p_OTDB__ContactNym=0; /* handle for ContactNym */ +static int le_swig__p_OTDB__ServerInfo=0; /* handle for ServerInfo */ +static int le_swig__p_OTDB__Contact=0; /* handle for Contact */ +static int le_swig__p_OTCaller=0; /* handle for OTCaller */ +static int le_swig__p_OTDB__LoomServer=0; /* handle for LoomServer */ +static int le_swig__p_OTDB__RippleServer=0; /* handle for RippleServer */ +static int le_swig__p_OTDB__Server=0; /* handle for Server */ +static int le_swig__p_OTDB__Storable=0; /* handle for Storable */ +static int le_swig__p_OTDB__AddressBook=0; /* handle for AddressBook */ +static int le_swig__p_OTCallback=0; /* handle for OTCallback */ +static int le_swig__p_OTDB__TradeDataNym=0; /* handle for TradeDataNym */ +static int le_swig__p_OTDB__OfferDataNym=0; /* handle for OfferDataNym */ +static int le_swig__p_OTDB__MarketData=0; /* handle for MarketData */ +static int le_swig__p_std__mapT_std__string_std__string_t=0; /* handle for _p_std__mapT_std__string_std__string_t */ +static int le_swig__p_OTDB__MarketList=0; /* handle for MarketList */ +/* end vdecl subsection */ +/* wrapper section */ +ZEND_NAMED_FUNCTION(_wrap_new_OTCallback) { + zval *arg0; + zval **args[1]; + OTCallback *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + arg0 = *args[0]; + + if ( arg0->type == IS_NULL ) { + /* not subclassed */ + result = (OTCallback *)new OTCallback(); + } else { + result = (OTCallback *)new SwigDirector_OTCallback(arg0); + } + + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTCallback, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OTCallback(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTCallback *arg1 = (OTCallback *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTCallback *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTCallback TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTCallback resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCallback_runOne) { + OTCallback *arg1 = (OTCallback *) 0 ; + zval **args[1]; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + + director = dynamic_cast(arg1); + upcall = !director->swig_is_overridden_method((char *)"OTCallback", (char *)"runOne"); + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCallback, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCallback_runOne. Expected SWIGTYPE_p_OTCallback"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + if (upcall) { + result = (arg1)->OTCallback::runOne(); + } else { + result = (arg1)->runOne(); + } + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCallback_runTwo) { + OTCallback *arg1 = (OTCallback *) 0 ; + zval **args[1]; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + + director = dynamic_cast(arg1); + upcall = !director->swig_is_overridden_method((char *)"OTCallback", (char *)"runTwo"); + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCallback, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCallback_runTwo. Expected SWIGTYPE_p_OTCallback"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + if (upcall) { + result = (arg1)->OTCallback::runTwo(); + } else { + result = (arg1)->runTwo(); + } + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_new_OTCaller) { + OTCaller *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (OTCaller *)new OTCaller(); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTCaller, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OTCaller(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTCaller *arg1 = (OTCaller *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTCaller *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTCaller TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTCaller resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_GetPassword) { + OTCaller *arg1 = (OTCaller *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_GetPassword. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (char *)(arg1)->GetPassword(); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_delCallback) { + OTCaller *arg1 = (OTCaller *) 0 ; + zval **args[1]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_delCallback. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + (arg1)->delCallback(); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_setCallback) { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_setCallback. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTCallback, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of OTCaller_setCallback. Expected SWIGTYPE_p_OTCallback"); + } + } + (arg1)->setCallback(arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_isCallbackSet) { + OTCaller *arg1 = (OTCaller *) 0 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_isCallbackSet. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (bool)(arg1)->isCallbackSet(); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_callOne) { + OTCaller *arg1 = (OTCaller *) 0 ; + zval **args[1]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_callOne. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + (arg1)->callOne(); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTCaller_callTwo) { + OTCaller *arg1 = (OTCaller *) 0 ; + zval **args[1]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTCaller_callTwo. Expected SWIGTYPE_p_OTCaller"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + (arg1)->callTwo(); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Set_PasswordCallback) { + OTCaller *arg1 = 0 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTCaller, 0) < 0 || arg1 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OT_API_Set_PasswordCallback. Expected SWIGTYPE_p_OTCaller"); + } + } + result = (bool)OT_API_Set_PasswordCallback(*arg1); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Init) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Init((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadWallet) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_LoadWallet((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SwitchWallet) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetMemlogSize) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_GetMemlogSize(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetMemlogAtIndex) { + int arg1 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (int) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (char *)OT_API_GetMemlogAtIndex(arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_PeekMemlogFront) { + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (char *)OT_API_PeekMemlogFront(); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_PeekMemlogBack) { + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (char *)OT_API_PeekMemlogBack(); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMemlogFront) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_PopMemlogFront(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMemlogBack) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_PopMemlogBack(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_CreateNym) { + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (char *)OT_API_CreateNym(); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddServerContract) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_AddServerContract((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddAssetContract) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_AddAssetContract((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServerCount) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_GetServerCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetTypeCount) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_GetAssetTypeCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountCount) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_GetAccountCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNymCount) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_GetNymCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServer_ID) { + int arg1 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (int) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (char *)OT_API_GetServer_ID(arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServer_Name) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetServer_Name((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetType_ID) { + int arg1 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (int) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (char *)OT_API_GetAssetType_ID(arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetType_Name) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_ID) { + int arg1 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (int) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_ID(arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Name) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Balance) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Type) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_AssetTypeID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_ServerID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_NymID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyAccountReceipt) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_TransactionNumCount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_ID) { + int arg1 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (int) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_ID(arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_Name) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_Name((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_Stats) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_IsNym_RegisteredAtServer) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailCount) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailContentsByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailSenderIDByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailServerIDByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_RemoveMailByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_VerifyMailByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailCount) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailContentsByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailRecipientIDByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailServerIDByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_RemoveOutmailByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_VerifyOutmailByIndex) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveServer) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveServer) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveAssetType) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveAssetType) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveNym) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveNym) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveAccount) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_ImportNym) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetNym_Name) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetAccountWallet_Name) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetAssetType_Name) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetServer_Name) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyAndRetrieveXMLContents) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_WriteCheque) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + zval **args[8]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 8 || zend_get_parameters_array_ex(8, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[5])->type==IS_NULL) { + arg6 = (char *) 0; + } else { + convert_to_string_ex(args[5]); + arg6 = (char *) Z_STRVAL_PP(args[5]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[6])->type==IS_NULL) { + arg7 = (char *) 0; + } else { + convert_to_string_ex(args[6]); + arg7 = (char *) Z_STRVAL_PP(args[6]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[7])->type==IS_NULL) { + arg8 = (char *) 0; + } else { + convert_to_string_ex(args[7]); + arg8 = (char *) Z_STRVAL_PP(args[7]); + } + /*@SWIG@*/; + + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_ProposePaymentPlan) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + zval **args[15]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 15 || zend_get_parameters_array_ex(15, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[5])->type==IS_NULL) { + arg6 = (char *) 0; + } else { + convert_to_string_ex(args[5]); + arg6 = (char *) Z_STRVAL_PP(args[5]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[6])->type==IS_NULL) { + arg7 = (char *) 0; + } else { + convert_to_string_ex(args[6]); + arg7 = (char *) Z_STRVAL_PP(args[6]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[7])->type==IS_NULL) { + arg8 = (char *) 0; + } else { + convert_to_string_ex(args[7]); + arg8 = (char *) Z_STRVAL_PP(args[7]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[8])->type==IS_NULL) { + arg9 = (char *) 0; + } else { + convert_to_string_ex(args[8]); + arg9 = (char *) Z_STRVAL_PP(args[8]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[9])->type==IS_NULL) { + arg10 = (char *) 0; + } else { + convert_to_string_ex(args[9]); + arg10 = (char *) Z_STRVAL_PP(args[9]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[10])->type==IS_NULL) { + arg11 = (char *) 0; + } else { + convert_to_string_ex(args[10]); + arg11 = (char *) Z_STRVAL_PP(args[10]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[11])->type==IS_NULL) { + arg12 = (char *) 0; + } else { + convert_to_string_ex(args[11]); + arg12 = (char *) Z_STRVAL_PP(args[11]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[12])->type==IS_NULL) { + arg13 = (char *) 0; + } else { + convert_to_string_ex(args[12]); + arg13 = (char *) Z_STRVAL_PP(args[12]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[13])->type==IS_NULL) { + arg14 = (char *) 0; + } else { + convert_to_string_ex(args[13]); + arg14 = (char *) Z_STRVAL_PP(args[13]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[14])->type==IS_NULL) { + arg15 = (char *) 0; + } else { + convert_to_string_ex(args[14]); + arg15 = (char *) Z_STRVAL_PP(args[14]); + } + /*@SWIG@*/; + + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_ConfirmPaymentPlan) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadUserPubkey) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadPubkey) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadPubkey((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyUserPrivateKey) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadPurse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadMint) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadAssetContract) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadServerContract) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadServerContract((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Mint_IsStillGood) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_IsBasketCurrency) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberCount) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberType) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMinimumTransferAmount) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberMinimumTransferAmount) { + char *arg1 = (char *) 0 ; + int arg2 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (int) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadAssetAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadInbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadOutbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetCount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_CreateResponse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionByIndex) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[4]); + arg5 = (int) Z_LVAL_PP(args[4]); + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionByID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionIDByIndex) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[4]); + arg5 = (int) Z_LVAL_PP(args[4]); + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_AddTransaction) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_CreateResponse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + zval **args[6]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[5]); + arg6 = (int) Z_LVAL_PP(args[5]); + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_FinalizeResponse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetType) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetVoucher) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSuccess) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetBalanceAgreementSuccess) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetDateSigned) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetAmount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Pending_GetNote) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSenderUserID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSenderAcctID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetRecipientUserID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetRecipientAcctID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetDisplayReferenceToNum) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_CreatePurse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_SavePurse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_GetTotalValue) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Count) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Peek) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Pop) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Push) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_ImportPurse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_exchangePurse) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_ChangeOwner) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetDenomination) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetSeries) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetValidFrom) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetValidTo) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetAssetID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetServerID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_checkServerID) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_createUserAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_deleteUserAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_deleteAssetAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_checkUser) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_sendUserMessage) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getRequest) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_getRequest((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getTransactionNumber) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueAssetType) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getContract) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMint) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_createAssetAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getAccount) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GenerateBasketCreation) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddBasketCreationItem) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueBasket) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_GenerateBasketExchange) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[4]); + arg5 = (int) Z_LVAL_PP(args[4]); + /*@SWIG@*/; + + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddBasketExchangeItem) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_exchangeBasket) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + zval **args[5]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[4]); + arg5 = (int) Z_LVAL_PP(args[4]); + /*@SWIG@*/; + + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeWithdrawal) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeDeposit) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeTransfer) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + zval **args[6]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[5])->type==IS_NULL) { + arg6 = (char *) 0; + } else { + convert_to_string_ex(args[5]); + arg6 = (char *) Z_STRVAL_PP(args[5]); + } + /*@SWIG@*/; + + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getInbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getOutbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getNymbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadNymbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_processInbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_processNymbox) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_withdrawVoucher) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + zval **args[6]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[5])->type==IS_NULL) { + arg6 = (char *) 0; + } else { + convert_to_string_ex(args[5]); + arg6 = (char *) Z_STRVAL_PP(args[5]); + } + /*@SWIG@*/; + + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_depositCheque) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_depositPaymentPlan) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueMarketOffer) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + zval **args[11]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 11 || zend_get_parameters_array_ex(11, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[5])->type==IS_NULL) { + arg6 = (char *) 0; + } else { + convert_to_string_ex(args[5]); + arg6 = (char *) Z_STRVAL_PP(args[5]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[6])->type==IS_NULL) { + arg7 = (char *) 0; + } else { + convert_to_string_ex(args[6]); + arg7 = (char *) Z_STRVAL_PP(args[6]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[7])->type==IS_NULL) { + arg8 = (char *) 0; + } else { + convert_to_string_ex(args[7]); + arg8 = (char *) Z_STRVAL_PP(args[7]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[8])->type==IS_NULL) { + arg9 = (char *) 0; + } else { + convert_to_string_ex(args[8]); + arg9 = (char *) Z_STRVAL_PP(args[8]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[9])->type==IS_NULL) { + arg10 = (char *) 0; + } else { + convert_to_string_ex(args[9]); + arg10 = (char *) Z_STRVAL_PP(args[9]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[10]); + arg11 = (int) Z_LVAL_PP(args[10]); + /*@SWIG@*/; + + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketList) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketOffers) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketRecentTrades) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_getNym_MarketOffers) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_cancelMarketOffer) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_cancelPaymentPlan) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMessageBuffer) { + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (char *)OT_API_PopMessageBuffer(); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_FlushMessageBuffer) { + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + OT_API_FlushMessageBuffer(); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetCommand) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetSuccess) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetDepth) { + char *arg1 = (char *) 0 ; + zval **args[1]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (int)OT_API_Message_GetDepth((char const *)arg1); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetTransactionSuccess) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetBalanceAgreementSuccess) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + zval **args[4]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetLedger) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewAssetTypeID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewIssuerAcctID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewAcctID) { + char *arg1 = (char *) 0 ; + zval **args[1]; + char *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + { + if(!result) { + ZVAL_NULL(return_value); + } else { + ZVAL_STRING(return_value, (char *)result, 1); + } + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_ConnectServer) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + zval **args[5]; + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[0])->type==IS_NULL) { + arg1 = (char *) 0; + } else { + convert_to_string_ex(args[0]); + arg1 = (char *) Z_STRVAL_PP(args[0]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[1])->type==IS_NULL) { + arg2 = (char *) 0; + } else { + convert_to_string_ex(args[1]); + arg2 = (char *) Z_STRVAL_PP(args[1]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[2])->type==IS_NULL) { + arg3 = (char *) 0; + } else { + convert_to_string_ex(args[2]); + arg3 = (char *) Z_STRVAL_PP(args[2]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[3])->type==IS_NULL) { + arg4 = (char *) 0; + } else { + convert_to_string_ex(args[3]); + arg4 = (char *) Z_STRVAL_PP(args[3]); + } + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,62,CONVERT_STRING_IN@*/ + if ((*args[4])->type==IS_NULL) { + arg5 = (char *) 0; + } else { + convert_to_string_ex(args[4]); + arg5 = (char *) Z_STRVAL_PP(args[4]); + } + /*@SWIG@*/; + + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OT_API_ProcessSockets) { + int result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (int)OT_API_ProcessSockets(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Storable(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Storable *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Storable TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Storable resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storable_Create) { + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + zval **args[2]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storable_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storable_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_GetPacker__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + zval **args[2]; + OTPacker *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_GetPacker. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTPacker *)(arg1)->GetPacker(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTPacker, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_GetPacker__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + zval **args[1]; + OTPacker *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_GetPacker. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (OTPacker *)(arg1)->GetPacker(); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTPacker, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_GetPacker) { + int argc; + zval **argv[2]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _wrap_Storage_GetPacker__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _wrap_Storage_GetPacker__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_GetPacker'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + zval **args[7]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 7 || zend_get_parameters_array_ex(7, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + + convert_to_string_ex(args[6]); + (&arg7)->assign(Z_STRVAL_PP(args[6]), Z_STRLEN_PP(args[6])); + + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->Init(arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_4) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->Init(arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_5) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)(arg1)->Init(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init__SWIG_6) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Init. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (bool)(arg1)->Init(); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Init) { + int argc; + zval **argv[7]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _wrap_Storage_Init__SWIG_6(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_5(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_4(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[6]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Init__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_Init'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Exists. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Exists. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Exists. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->Exists(arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_Exists. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)(arg1)->Exists(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Exists__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Exists__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Exists__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_Exists__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_Exists'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Storage(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Storage *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Storage TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Storage resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->StoreString(arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString) { + int argc; + zval **argv[6]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_StoreString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (arg1)->QueryString(arg2,arg3,arg4); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (arg1)->QueryString(arg2,arg3); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + zval **args[2]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (arg1)->QueryString(arg2); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_QueryString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StorePlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StorePlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StorePlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StorePlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->StorePlainString(arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString) { + int argc; + zval **argv[6]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StorePlainString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StorePlainString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StorePlainString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StorePlainString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_StorePlainString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryPlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryPlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryPlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (arg1)->QueryPlainString(arg2,arg3); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + zval **args[2]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryPlainString. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (arg1)->QueryPlainString(arg2); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryPlainString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryPlainString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryPlainString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryPlainString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_QueryPlainString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Storage_StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->StoreObject(*arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject) { + int argc; + zval **argv[6]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[1], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreObject__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[1], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreObject__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[1], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreObject__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[1], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_StoreObject__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_StoreObject'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::StoredObjectType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::StoredObjectType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::StoredObjectType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + zval **args[3]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_QueryObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::StoredObjectType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject) { + int argc; + zval **argv[6]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryObject__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryObject__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryObject__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_QueryObject__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_QueryObject'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey__SWIG_0) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_EraseValueByKey. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey__SWIG_1) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_EraseValueByKey. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey__SWIG_2) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_EraseValueByKey. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey__SWIG_3) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_EraseValueByKey. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)(arg1)->EraseValueByKey(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_EraseValueByKey__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_EraseValueByKey__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_EraseValueByKey__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storage, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Storage_EraseValueByKey__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Storage_EraseValueByKey'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_CreateObject) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + zval **args[2]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_CreateObject. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::StoredObjectType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_Create) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + zval **args[2]; + OTDB::Storage *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storage, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Storage_GetType) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + zval **args[1]; + OTDB::StorageType result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storage, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Storage_GetType. Expected SWIGTYPE_p_OTDB__Storage"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_0) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + zval **args[8]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 8 || zend_get_parameters_array_ex(8, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + + convert_to_string_ex(args[6]); + (&arg7)->assign(Z_STRVAL_PP(args[6]), Z_STRLEN_PP(args[6])); + + + convert_to_string_ex(args[7]); + (&arg8)->assign(Z_STRVAL_PP(args[7]), Z_STRLEN_PP(args[7])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_1) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + zval **args[7]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 7 || zend_get_parameters_array_ex(7, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + + convert_to_string_ex(args[6]); + (&arg7)->assign(Z_STRVAL_PP(args[6]), Z_STRLEN_PP(args[6])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_2) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + zval **args[6]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + + convert_to_string_ex(args[5]); + (&arg6)->assign(Z_STRVAL_PP(args[5]), Z_STRLEN_PP(args[5])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_3) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_4) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_5) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage__SWIG_6) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage) { + int argc; + zval **argv[8]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _wrap_InitDefaultStorage__SWIG_6(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_5(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_4(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + if (argc == 6) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[6]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + } + if (argc == 8) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[5]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[6]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[7]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_InitDefaultStorage__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'InitDefaultStorage'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_GetDefaultStorage) { + OTDB::Storage *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storage, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_CreateStorageContext__SWIG_0) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + zval **args[2]; + OTDB::Storage *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (OTDB::PackType) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storage, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_CreateStorageContext__SWIG_1) { + OTDB::StorageType arg1 ; + zval **args[1]; + OTDB::Storage *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StorageType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storage, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_CreateStorageContext) { + int argc; + zval **argv[2]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _wrap_CreateStorageContext__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = (Z_TYPE_PP(argv[1]) == IS_LONG); + if (_v) { + _wrap_CreateStorageContext__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'CreateStorageContext'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_CreateObject) { + OTDB::StoredObjectType arg1 ; + zval **args[1]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Exists__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Exists__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::Exists(arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Exists__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)OTDB::Exists(arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Exists__SWIG_3) { + std::string arg1 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + result = (bool)OTDB::Exists(arg1); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Exists) { + int argc; + zval **argv[4]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Exists__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Exists__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Exists__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_Exists__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'Exists'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreString__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreString__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreString__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreString__SWIG_3) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)OTDB::StoreString(arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreString) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'StoreString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryString__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryString__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = OTDB::QueryString(arg1,arg2,arg3); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryString__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = OTDB::QueryString(arg1,arg2); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryString__SWIG_3) { + std::string arg1 ; + zval **args[1]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + result = OTDB::QueryString(arg1); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryString) { + int argc; + zval **argv[4]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'QueryString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StorePlainString__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StorePlainString__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StorePlainString__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StorePlainString__SWIG_3) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)OTDB::StorePlainString(arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StorePlainString) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StorePlainString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StorePlainString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StorePlainString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StorePlainString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'StorePlainString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = OTDB::QueryPlainString(arg1,arg2,arg3); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = OTDB::QueryPlainString(arg1,arg2); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString__SWIG_3) { + std::string arg1 ; + zval **args[1]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + result = OTDB::QueryPlainString(arg1); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString) { + int argc; + zval **argv[4]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryPlainString__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryPlainString__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryPlainString__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryPlainString__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'QueryPlainString'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreObject__SWIG_0) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg1 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreObject__SWIG_1) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg1 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreObject__SWIG_2) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg1 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreObject__SWIG_3) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0 || arg1 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StoreObject. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)OTDB::StoreObject(*arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StoreObject) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreObject__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreObject__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreObject__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + { + void *tmp; + _v = (SWIG_ConvertPtr(*argv[0], (void**)&tmp, SWIGTYPE_p_OTDB__Storable, 0) >= 0); + } + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_StoreObject__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'StoreObject'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryObject__SWIG_0) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + zval **args[5]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 5 || zend_get_parameters_array_ex(5, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + + convert_to_string_ex(args[4]); + (&arg5)->assign(Z_STRVAL_PP(args[4]), Z_STRLEN_PP(args[4])); + + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryObject__SWIG_1) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryObject__SWIG_2) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryObject__SWIG_3) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + zval **args[2]; + OTDB::Storable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[0]); + arg1 = (OTDB::StoredObjectType) Z_LVAL_PP(args[0]); + /*@SWIG@*/; + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Storable, 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_QueryObject) { + int argc; + zval **argv[5]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 2) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryObject__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryObject__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryObject__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + if (argc == 5) { + int _v; + _v = (Z_TYPE_PP(argv[0]) == IS_LONG); + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[4]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_QueryObject__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'QueryObject'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey__SWIG_0) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + zval **args[4]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 4 || zend_get_parameters_array_ex(4, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + + convert_to_string_ex(args[3]); + (&arg4)->assign(Z_STRVAL_PP(args[3]), Z_STRLEN_PP(args[3])); + + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey__SWIG_1) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + zval **args[3]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + + convert_to_string_ex(args[2]); + (&arg3)->assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey__SWIG_2) { + std::string arg1 ; + std::string arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + + convert_to_string_ex(args[1]); + (&arg2)->assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey__SWIG_3) { + std::string arg1 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + + convert_to_string_ex(args[0]); + (&arg1)->assign(Z_STRVAL_PP(args[0]), Z_STRLEN_PP(args[0])); + + result = (bool)OTDB::EraseValueByKey(arg1); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey) { + int argc; + zval **argv[4]; + + argc = ZEND_NUM_ARGS(); + zend_get_parameters_array_ex(argc,argv); + if (argc == 1) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_EraseValueByKey__SWIG_3(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + if (argc == 2) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_EraseValueByKey__SWIG_2(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + if (argc == 3) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_EraseValueByKey__SWIG_1(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + if (argc == 4) { + int _v; + + _v = ( Z_TYPE_PP(argv[0]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[1]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[2]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _v = ( Z_TYPE_PP(argv[3]) == IS_STRING ) ? 1 : 0; + + if (_v) { + _wrap_EraseValueByKey__SWIG_0(INTERNAL_FUNCTION_PARAM_PASSTHRU); return; + } + } + } + } + } + + SWIG_ErrorCode() = E_ERROR; + SWIG_ErrorMsg() = "No matching function for overloaded 'EraseValueByKey'"; + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OTDBString(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::OTDBString *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__OTDBString TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::OTDBString resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTDBString_m_string_set) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OTDBString, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTDBString_m_string_set. Expected SWIGTYPE_p_OTDB__OTDBString"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->m_string = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTDBString_m_string_get) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OTDBString, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTDBString_m_string_get. Expected SWIGTYPE_p_OTDB__OTDBString"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->m_string); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OTDBString_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::OTDBString *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OTDBString_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OTDBString, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Blob(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Blob *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Blob TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Blob resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Blob_m_memBuffer_set) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + std::vector< unsigned char > *tmp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Blob, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Blob_m_memBuffer_set. Expected SWIGTYPE_p_OTDB__Blob"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &tmp2, SWIGTYPE_p_std__vectorT_unsigned_char_t, 0) < 0 || tmp2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Blob_m_memBuffer_set. Expected SWIGTYPE_p_std__vectorT_unsigned_char_t"); + } + arg2 = *tmp2; + } + if (arg1) (arg1)->m_memBuffer = arg2; + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Blob_m_memBuffer_get) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + zval **args[1]; + std::vector< unsigned char > result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Blob, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Blob_m_memBuffer_get. Expected SWIGTYPE_p_OTDB__Blob"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = ((arg1)->m_memBuffer); + { + std::vector< unsigned char > * resultobj = new std::vector< unsigned char >((const std::vector< unsigned char > &) result); + SWIG_SetPointerZval(return_value, (void *)resultobj, SWIGTYPE_p_std__vectorT_unsigned_char_t, 1); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Blob_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Blob *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Blob_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Blob, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_StringMap(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::StringMap *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__StringMap TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::StringMap resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StringMap_the_map_set) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__StringMap, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StringMap_the_map_set. Expected SWIGTYPE_p_OTDB__StringMap"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_std__mapT_std__string_std__string_t, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of StringMap_the_map_set. Expected SWIGTYPE_p_std__mapT_std__string_std__string_t"); + } + } + if (arg1) (arg1)->the_map = *arg2; + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StringMap_the_map_get) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + zval **args[1]; + std::map< std::string,std::string > *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__StringMap, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StringMap_the_map_get. Expected SWIGTYPE_p_OTDB__StringMap"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_std__mapT_std__string_std__string_t, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StringMap_SetValue) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + std::string temp2 ; + std::string temp3 ; + zval **args[3]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 3 || zend_get_parameters_array_ex(3, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__StringMap, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StringMap_SetValue. Expected SWIGTYPE_p_OTDB__StringMap"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + + convert_to_string_ex(args[2]); + temp3.assign(Z_STRVAL_PP(args[2]), Z_STRLEN_PP(args[2])); + arg3 = &temp3; + + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); + + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StringMap_GetValue) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + std::string result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__StringMap, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StringMap_GetValue. Expected SWIGTYPE_p_OTDB__StringMap"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + result = (arg1)->GetValue((std::string const &)*arg2); + + ZVAL_STRINGL(return_value, const_cast((&result)->data()), (&result)->size(), 1); + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_StringMap_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::StringMap *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of StringMap_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__StringMap, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Displayable(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Displayable *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Displayable TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Displayable resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Displayable_gui_label_set) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Displayable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Displayable_gui_label_set. Expected SWIGTYPE_p_OTDB__Displayable"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Displayable_gui_label_get) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Displayable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Displayable_gui_label_get. Expected SWIGTYPE_p_OTDB__Displayable"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Displayable_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Displayable *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Displayable_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Displayable, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_MarketData(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::MarketData *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__MarketData TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::MarketData resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_gui_label_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_gui_label_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_gui_label_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_gui_label_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_server_id_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_server_id_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_server_id_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_server_id_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_market_id_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_market_id_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->market_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_market_id_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_market_id_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->market_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_asset_type_id_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_asset_type_id_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->asset_type_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_asset_type_id_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_asset_type_id_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->asset_type_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_currency_type_id_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_currency_type_id_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->currency_type_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_currency_type_id_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_currency_type_id_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->currency_type_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_scale_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_scale_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_scale_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_scale_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_total_assets_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_total_assets_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->total_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_total_assets_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_total_assets_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->total_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_bids_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_number_bids_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->number_bids = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_bids_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_number_bids_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->number_bids); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_asks_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_number_asks_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->number_asks = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_asks_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_number_asks_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->number_asks); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_last_sale_price_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_last_sale_price_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->last_sale_price = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_last_sale_price_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_last_sale_price_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->last_sale_price); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_bid_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_current_bid_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->current_bid = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_bid_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_current_bid_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->current_bid); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_ask_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_current_ask_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->current_ask = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_ask_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_current_ask_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->current_ask); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_trades_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_trades_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->volume_trades = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_trades_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_trades_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->volume_trades); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_assets_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_assets_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->volume_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_assets_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_assets_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->volume_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_currency_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_currency_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->volume_currency = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_currency_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_volume_currency_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->volume_currency); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_highest_bid_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_recent_highest_bid_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->recent_highest_bid = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_highest_bid_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_recent_highest_bid_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->recent_highest_bid); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_lowest_ask_set) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_recent_lowest_ask_set. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->recent_lowest_ask = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_lowest_ask_get) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_recent_lowest_ask_get. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->recent_lowest_ask); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketData_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::MarketData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketData_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__MarketData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_MarketList(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::MarketList *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__MarketList TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::MarketList resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketList_GetMarketDataCount) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketList, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketList_GetMarketDataCount. Expected SWIGTYPE_p_OTDB__MarketList"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetMarketDataCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketList_GetMarketData) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::MarketData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketList, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketList_GetMarketData. Expected SWIGTYPE_p_OTDB__MarketList"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__MarketData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketList_RemoveMarketData) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketList, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketList_RemoveMarketData. Expected SWIGTYPE_p_OTDB__MarketList"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveMarketData(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketList_AddMarketData) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__MarketList, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketList_AddMarketData. Expected SWIGTYPE_p_OTDB__MarketList"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__MarketData, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of MarketList_AddMarketData. Expected SWIGTYPE_p_OTDB__MarketData"); + } + } + result = (bool)(arg1)->AddMarketData(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_MarketList_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::MarketList *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of MarketList_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__MarketList, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OfferDataMarket(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::OfferDataMarket *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__OfferDataMarket TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::OfferDataMarket resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_gui_label_set) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_gui_label_set. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_gui_label_get) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_gui_label_get. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_transaction_id_set) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_transaction_id_set. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_transaction_id_get) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_transaction_id_get. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_price_per_scale_set) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_price_per_scale_set. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price_per_scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_price_per_scale_get) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_price_per_scale_get. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price_per_scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_available_assets_set) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_available_assets_set. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->available_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_available_assets_get) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_available_assets_get. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->available_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_minimum_increment_set) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_minimum_increment_set. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->minimum_increment = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_minimum_increment_get) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_minimum_increment_get. Expected SWIGTYPE_p_OTDB__OfferDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->minimum_increment); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::OfferDataMarket *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataMarket_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OfferDataMarket, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_BidData(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::BidData *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__BidData TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::BidData resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_gui_label_set) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_gui_label_set. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_gui_label_get) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_gui_label_get. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_transaction_id_set) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_transaction_id_set. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_transaction_id_get) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_transaction_id_get. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_price_per_scale_set) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_price_per_scale_set. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price_per_scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_price_per_scale_get) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_price_per_scale_get. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price_per_scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_available_assets_set) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_available_assets_set. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->available_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_available_assets_get) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_available_assets_get. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->available_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_minimum_increment_set) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_minimum_increment_set. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->minimum_increment = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_minimum_increment_get) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BidData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_minimum_increment_get. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->minimum_increment); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BidData_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::BidData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BidData_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BidData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_AskData(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::AskData *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__AskData TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::AskData resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_gui_label_set) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_gui_label_set. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_gui_label_get) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_gui_label_get. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_transaction_id_set) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_transaction_id_set. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_transaction_id_get) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_transaction_id_get. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_price_per_scale_set) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_price_per_scale_set. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price_per_scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_price_per_scale_get) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_price_per_scale_get. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price_per_scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_available_assets_set) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_available_assets_set. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->available_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_available_assets_get) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_available_assets_get. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->available_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_minimum_increment_set) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_minimum_increment_set. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->minimum_increment = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_minimum_increment_get) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AskData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_minimum_increment_get. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->minimum_increment); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AskData_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::AskData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AskData_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__AskData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OfferListMarket(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::OfferListMarket *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__OfferListMarket TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::OfferListMarket resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetBidDataCount) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_GetBidDataCount. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetBidDataCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetBidData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::BidData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_GetBidData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BidData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_RemoveBidData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_RemoveBidData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveBidData(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_AddBidData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_AddBidData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__BidData, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of OfferListMarket_AddBidData. Expected SWIGTYPE_p_OTDB__BidData"); + } + } + result = (bool)(arg1)->AddBidData(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetAskDataCount) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_GetAskDataCount. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetAskDataCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetAskData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::AskData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_GetAskData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__AskData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_RemoveAskData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_RemoveAskData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveAskData(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_AddAskData) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_AddAskData. Expected SWIGTYPE_p_OTDB__OfferListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__AskData, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of OfferListMarket_AddAskData. Expected SWIGTYPE_p_OTDB__AskData"); + } + } + result = (bool)(arg1)->AddAskData(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::OfferListMarket *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListMarket_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OfferListMarket, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_TradeDataMarket(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::TradeDataMarket *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__TradeDataMarket TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::TradeDataMarket resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_gui_label_set) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_gui_label_set. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_gui_label_get) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_gui_label_get. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_transaction_id_set) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_transaction_id_set. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_transaction_id_get) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_transaction_id_get. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_date_set) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_date_set. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->date = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_date_get) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_date_get. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->date); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_price_set) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_price_set. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_price_get) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_price_get. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_amount_sold_set) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_amount_sold_set. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->amount_sold = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_amount_sold_get) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_amount_sold_get. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->amount_sold); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::TradeDataMarket *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataMarket_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeDataMarket, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_TradeListMarket(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::TradeListMarket *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__TradeListMarket TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::TradeListMarket resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_GetTradeDataMarketCount) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListMarket_GetTradeDataMarketCount. Expected SWIGTYPE_p_OTDB__TradeListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetTradeDataMarketCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_GetTradeDataMarket) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::TradeDataMarket *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListMarket_GetTradeDataMarket. Expected SWIGTYPE_p_OTDB__TradeListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeDataMarket, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_RemoveTradeDataMarket) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListMarket_RemoveTradeDataMarket. Expected SWIGTYPE_p_OTDB__TradeListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_AddTradeDataMarket) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListMarket, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListMarket_AddTradeDataMarket. Expected SWIGTYPE_p_OTDB__TradeListMarket"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__TradeDataMarket, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of TradeListMarket_AddTradeDataMarket. Expected SWIGTYPE_p_OTDB__TradeDataMarket"); + } + } + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::TradeListMarket *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListMarket_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeListMarket, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OfferDataNym(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::OfferDataNym *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__OfferDataNym TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::OfferDataNym resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_gui_label_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_gui_label_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_gui_label_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_gui_label_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_from_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_valid_from_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->valid_from = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_from_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_valid_from_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->valid_from); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_to_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_valid_to_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->valid_to = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_to_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_valid_to_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->valid_to); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_server_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_server_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_server_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_server_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_type_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_asset_type_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->asset_type_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_type_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_asset_type_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->asset_type_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_acct_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_asset_acct_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->asset_acct_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_acct_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_asset_acct_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->asset_acct_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_type_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_currency_type_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->currency_type_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_type_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_currency_type_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->currency_type_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_acct_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_currency_acct_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->currency_acct_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_acct_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_currency_acct_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->currency_acct_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_selling_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_selling_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,2,CONVERT_BOOL_IN@*/ + convert_to_boolean_ex(args[1]); + arg2 = (bool) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + if (arg1) (arg1)->selling = arg2; + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_selling_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_selling_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (bool) ((arg1)->selling); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_scale_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_scale_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_scale_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_scale_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_price_per_scale_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_price_per_scale_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price_per_scale = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_price_per_scale_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_price_per_scale_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price_per_scale); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_transaction_id_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_transaction_id_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_transaction_id_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_transaction_id_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_total_assets_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_total_assets_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->total_assets = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_total_assets_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_total_assets_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->total_assets); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_finished_so_far_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_finished_so_far_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->finished_so_far = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_finished_so_far_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_finished_so_far_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->finished_so_far); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_minimum_increment_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_minimum_increment_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->minimum_increment = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_minimum_increment_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_minimum_increment_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->minimum_increment); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_sign_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_stop_sign_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->stop_sign = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_sign_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_stop_sign_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->stop_sign); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_price_set) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_stop_price_set. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->stop_price = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_price_get) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_stop_price_get. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->stop_price); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::OfferDataNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferDataNym_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OfferDataNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_OfferListNym(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::OfferListNym *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__OfferListNym TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::OfferListNym resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_GetOfferDataNymCount) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListNym_GetOfferDataNymCount. Expected SWIGTYPE_p_OTDB__OfferListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetOfferDataNymCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_GetOfferDataNym) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::OfferDataNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListNym_GetOfferDataNym. Expected SWIGTYPE_p_OTDB__OfferListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OfferDataNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_RemoveOfferDataNym) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListNym_RemoveOfferDataNym. Expected SWIGTYPE_p_OTDB__OfferListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_AddOfferDataNym) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__OfferListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListNym_AddOfferDataNym. Expected SWIGTYPE_p_OTDB__OfferListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__OfferDataNym, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of OfferListNym_AddOfferDataNym. Expected SWIGTYPE_p_OTDB__OfferDataNym"); + } + } + result = (bool)(arg1)->AddOfferDataNym(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::OfferListNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of OfferListNym_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__OfferListNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_TradeDataNym(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::TradeDataNym *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__TradeDataNym TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::TradeDataNym resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_gui_label_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_gui_label_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_gui_label_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_gui_label_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_transaction_id_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_transaction_id_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->transaction_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_transaction_id_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_transaction_id_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->transaction_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_completed_count_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_completed_count_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->completed_count = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_completed_count_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_completed_count_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->completed_count); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_date_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_date_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->date = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_date_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_date_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->date); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_price_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_price_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->price = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_price_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_price_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->price); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_amount_sold_set) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_amount_sold_set. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->amount_sold = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_amount_sold_get) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_amount_sold_get. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->amount_sold); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::TradeDataNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeDataNym_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeDataNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_TradeListNym(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::TradeListNym *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__TradeListNym TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::TradeListNym resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_GetTradeDataNymCount) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListNym_GetTradeDataNymCount. Expected SWIGTYPE_p_OTDB__TradeListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetTradeDataNymCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_GetTradeDataNym) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::TradeDataNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListNym_GetTradeDataNym. Expected SWIGTYPE_p_OTDB__TradeListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeDataNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_RemoveTradeDataNym) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListNym_RemoveTradeDataNym. Expected SWIGTYPE_p_OTDB__TradeListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_AddTradeDataNym) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__TradeListNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListNym_AddTradeDataNym. Expected SWIGTYPE_p_OTDB__TradeListNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__TradeDataNym, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of TradeListNym_AddTradeDataNym. Expected SWIGTYPE_p_OTDB__TradeDataNym"); + } + } + result = (bool)(arg1)->AddTradeDataNym(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::TradeListNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of TradeListNym_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__TradeListNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Acct(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Acct *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Acct TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Acct resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_gui_label_set) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_gui_label_set. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_gui_label_get) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_gui_label_get. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_acct_id_set) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_acct_id_set. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->acct_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_acct_id_get) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_acct_id_get. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->acct_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_server_id_set) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_server_id_set. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_server_id_get) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Acct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_server_id_get. Expected SWIGTYPE_p_OTDB__Acct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Acct_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Acct *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Acct_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Acct, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_BitcoinAcct(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::BitcoinAcct *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__BitcoinAcct TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::BitcoinAcct resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_gui_label_set) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_gui_label_set. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_gui_label_get) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_gui_label_get. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_acct_id_set) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_acct_id_set. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->acct_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_acct_id_get) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_acct_id_get. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->acct_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_server_id_set) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_server_id_set. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_server_id_get) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_server_id_get. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_bitcoin_acct_name_set) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_bitcoin_acct_name_set. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->bitcoin_acct_name = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_bitcoin_acct_name_get) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_bitcoin_acct_name_get. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->bitcoin_acct_name); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::BitcoinAcct *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinAcct_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BitcoinAcct, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_ServerInfo(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::ServerInfo *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__ServerInfo TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::ServerInfo resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_gui_label_set) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_gui_label_set. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_gui_label_get) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_gui_label_get. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_id_set) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_server_id_set. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_id_get) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_server_id_get. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_type_set) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_server_type_set. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_type_get) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_server_type_get. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::ServerInfo *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ServerInfo_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ServerInfo, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Server(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Server *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Server TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Server resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_gui_label_set) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_gui_label_set. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_gui_label_get) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_gui_label_get. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_id_set) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_id_set. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_id_get) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_id_get. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_type_set) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_type_set. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_type_get) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_type_get. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_host_set) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_host_set. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_host = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_host_get) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_host_get. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_host); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_port_set) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_port_set. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_port = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_server_port_get) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Server, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_server_port_get. Expected SWIGTYPE_p_OTDB__Server"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_port); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Server_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Server *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Server_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Server, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_BitcoinServer(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::BitcoinServer *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__BitcoinServer TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::BitcoinServer resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_gui_label_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_gui_label_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_gui_label_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_gui_label_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_id_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_id_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_id_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_id_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_type_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_type_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_type_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_type_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_host_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_host_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_host = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_host_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_host_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_host); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_port_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_port_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_port = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_port_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_server_port_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_port); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_username_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_bitcoin_username_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->bitcoin_username = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_username_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_bitcoin_username_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->bitcoin_username); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_password_set) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_bitcoin_password_set. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->bitcoin_password = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_password_get) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_bitcoin_password_get. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->bitcoin_password); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::BitcoinServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of BitcoinServer_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BitcoinServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_RippleServer(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::RippleServer *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__RippleServer TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::RippleServer resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_gui_label_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_gui_label_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_gui_label_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_gui_label_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_id_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_id_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_id_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_id_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_type_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_type_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_type_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_type_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_host_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_host_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_host = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_host_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_host_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_host); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_port_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_port_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_port = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_port_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_server_port_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_port); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_username_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_ripple_username_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->ripple_username = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_username_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_ripple_username_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->ripple_username); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_password_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_ripple_password_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->ripple_password = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_password_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_ripple_password_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->ripple_password); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_namefield_id_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_namefield_id_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->namefield_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_namefield_id_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_namefield_id_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->namefield_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_passfield_id_set) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_passfield_id_set. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->passfield_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_passfield_id_get) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__RippleServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_passfield_id_get. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->passfield_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::RippleServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of RippleServer_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__RippleServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_LoomServer(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::LoomServer *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__LoomServer TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::LoomServer resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_gui_label_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_gui_label_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_gui_label_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_gui_label_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_id_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_id_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_id_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_id_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_type_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_type_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_type_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_type_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_host_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_host_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_host = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_host_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_host_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_host); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_port_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_port_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_port = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_port_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_server_port_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_port); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_loom_username_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_loom_username_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->loom_username = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_loom_username_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_loom_username_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->loom_username); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_namefield_id_set) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_namefield_id_set. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->namefield_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_namefield_id_get) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__LoomServer, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_namefield_id_get. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->namefield_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_LoomServer_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::LoomServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of LoomServer_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__LoomServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_ContactNym(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::ContactNym *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__ContactNym TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::ContactNym resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_gui_label_set) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_gui_label_set. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_gui_label_get) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_gui_label_get. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_type_set) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_nym_type_set. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->nym_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_type_get) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_nym_type_get. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->nym_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_id_set) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_nym_id_set. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->nym_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_id_get) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_nym_id_get. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->nym_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_public_key_set) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_public_key_set. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->public_key = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_public_key_get) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_public_key_get. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->public_key); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_memo_set) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_memo_set. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->memo = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_memo_get) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_memo_get. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->memo); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_GetServerInfoCount) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_GetServerInfoCount. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetServerInfoCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_GetServerInfo) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::ServerInfo *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_GetServerInfo. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ServerInfo, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_RemoveServerInfo) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_RemoveServerInfo. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveServerInfo(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_AddServerInfo) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactNym, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_AddServerInfo. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__ServerInfo, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of ContactNym_AddServerInfo. Expected SWIGTYPE_p_OTDB__ServerInfo"); + } + } + result = (bool)(arg1)->AddServerInfo(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactNym_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::ContactNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactNym_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ContactNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_WalletData(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::WalletData *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__WalletData TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::WalletData resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinServerCount) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetBitcoinServerCount. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetBitcoinServerCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::BitcoinServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetBitcoinServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BitcoinServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveBitcoinServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_RemoveBitcoinServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddBitcoinServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_AddBitcoinServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__BitcoinServer, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of WalletData_AddBitcoinServer. Expected SWIGTYPE_p_OTDB__BitcoinServer"); + } + } + result = (bool)(arg1)->AddBitcoinServer(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinAcctCount) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetBitcoinAcctCount. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetBitcoinAcctCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinAcct) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::BitcoinAcct *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetBitcoinAcct. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__BitcoinAcct, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveBitcoinAcct) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_RemoveBitcoinAcct. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddBitcoinAcct) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_AddBitcoinAcct. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__BitcoinAcct, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of WalletData_AddBitcoinAcct. Expected SWIGTYPE_p_OTDB__BitcoinAcct"); + } + } + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetRippleServerCount) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetRippleServerCount. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetRippleServerCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetRippleServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::RippleServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetRippleServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__RippleServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveRippleServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_RemoveRippleServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveRippleServer(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddRippleServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_AddRippleServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__RippleServer, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of WalletData_AddRippleServer. Expected SWIGTYPE_p_OTDB__RippleServer"); + } + } + result = (bool)(arg1)->AddRippleServer(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetLoomServerCount) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetLoomServerCount. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetLoomServerCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetLoomServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::LoomServer *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_GetLoomServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__LoomServer, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveLoomServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_RemoveLoomServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveLoomServer(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddLoomServer) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__WalletData, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_AddLoomServer. Expected SWIGTYPE_p_OTDB__WalletData"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__LoomServer, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of WalletData_AddLoomServer. Expected SWIGTYPE_p_OTDB__LoomServer"); + } + } + result = (bool)(arg1)->AddLoomServer(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_WalletData_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::WalletData *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of WalletData_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__WalletData, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_ContactAcct(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::ContactAcct *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__ContactAcct TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::ContactAcct resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_gui_label_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_gui_label_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_gui_label_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_gui_label_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_type_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_server_type_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_type = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_type_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_server_type_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_type); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_id_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_server_id_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->server_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_id_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_server_id_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->server_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_asset_type_id_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_asset_type_id_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->asset_type_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_asset_type_id_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_asset_type_id_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->asset_type_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_acct_id_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_acct_id_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->acct_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_acct_id_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_acct_id_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->acct_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_nym_id_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_nym_id_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->nym_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_nym_id_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_nym_id_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->nym_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_memo_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_memo_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->memo = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_memo_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_memo_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->memo); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_public_key_set) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_public_key_set. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->public_key = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_public_key_get) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_public_key_get. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->public_key); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::ContactAcct *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of ContactAcct_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ContactAcct, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_Contact(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::Contact *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__Contact TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::Contact resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_gui_label_set) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_gui_label_set. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->gui_label = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_gui_label_get) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_gui_label_get. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->gui_label); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_contact_id_set) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_contact_id_set. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->contact_id = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_contact_id_get) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_contact_id_get. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->contact_id); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_email_set) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_email_set. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->email = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_email_get) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_email_get. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->email); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_memo_set) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_memo_set. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->memo = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_memo_get) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_memo_get. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->memo); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_public_key_set) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + std::string temp2 ; + zval **args[2]; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_public_key_set. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + convert_to_string_ex(args[1]); + temp2.assign(Z_STRVAL_PP(args[1]), Z_STRLEN_PP(args[1])); + arg2 = &temp2; + + if (arg1) (arg1)->public_key = *arg2; + + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_public_key_get) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + std::string *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_public_key_get. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (std::string *) & ((arg1)->public_key); + + ZVAL_STRINGL(return_value, const_cast(result->data()), result->size(), 1); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactNymCount) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_GetContactNymCount. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetContactNymCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactNym) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::ContactNym *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_GetContactNym. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ContactNym, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_RemoveContactNym) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_RemoveContactNym. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveContactNym(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_AddContactNym) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_AddContactNym. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__ContactNym, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Contact_AddContactNym. Expected SWIGTYPE_p_OTDB__ContactNym"); + } + } + result = (bool)(arg1)->AddContactNym(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactAcctCount) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_GetContactAcctCount. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetContactAcctCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactAcct) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::ContactAcct *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_GetContactAcct. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__ContactAcct, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_RemoveContactAcct) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_RemoveContactAcct. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveContactAcct(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_AddContactAcct) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Contact, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_AddContactAcct. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__ContactAcct, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of Contact_AddContactAcct. Expected SWIGTYPE_p_OTDB__ContactAcct"); + } + } + result = (bool)(arg1)->AddContactAcct(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_Contact_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::Contact *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of Contact_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Contact, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +/* This function is designed to be called by the zend list destructors */ +/* to typecast and do the actual destruction */ +static void __wrap_delete_AddressBook(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) { + swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr ; + void *ptr=value->ptr ; + int newobject=value->newobject ; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + + efree(value); + if (! newobject) return; /* can't delete it! */ + arg1 = (OTDB::AddressBook *)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE_p_OTDB__AddressBook TSRMLS_CC); + if (! arg1) zend_error(E_ERROR, "OTDB::AddressBook resource already free'd"); + delete arg1; + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AddressBook_GetContactCount) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + zval **args[1]; + size_t result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AddressBook, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AddressBook_GetContactCount. Expected SWIGTYPE_p_OTDB__AddressBook"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + result = (arg1)->GetContactCount(); + { + ZVAL_LONG(return_value,result); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AddressBook_GetContact) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + zval **args[2]; + OTDB::Contact *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AddressBook, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AddressBook_GetContact. Expected SWIGTYPE_p_OTDB__AddressBook"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__Contact, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AddressBook_RemoveContact) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AddressBook, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AddressBook_RemoveContact. Expected SWIGTYPE_p_OTDB__AddressBook"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + + /*@SWIG:/opt/local/share/swig/2.0.4/php/utils.i,7,CONVERT_INT_IN@*/ + convert_to_long_ex(args[1]); + arg2 = (size_t) Z_LVAL_PP(args[1]); + /*@SWIG@*/; + + result = (bool)(arg1)->RemoveContact(arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AddressBook_AddContact) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + zval **args[2]; + bool result; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__AddressBook, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AddressBook_AddContact. Expected SWIGTYPE_p_OTDB__AddressBook"); + } + } + if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); + { + if(SWIG_ConvertPtr(*args[1], (void **) &arg2, SWIGTYPE_p_OTDB__Contact, 0) < 0 || arg2 == NULL) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 2 of AddressBook_AddContact. Expected SWIGTYPE_p_OTDB__Contact"); + } + } + result = (bool)(arg1)->AddContact(*arg2); + { + ZVAL_BOOL(return_value,(result)?1:0); + } + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +ZEND_NAMED_FUNCTION(_wrap_AddressBook_ot_dynamic_cast) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + zval **args[1]; + OTDB::AddressBook *result = 0 ; + + SWIG_ResetError(); + if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) { + WRONG_PARAM_COUNT; + } + + { + if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_OTDB__Storable, 0) < 0) { + SWIG_PHP_Error(E_ERROR, "Type error in argument 1 of AddressBook_ot_dynamic_cast. Expected SWIGTYPE_p_OTDB__Storable"); + } + } + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + + SWIG_SetPointerZval(return_value, (void *)result, SWIGTYPE_p_OTDB__AddressBook, 0); + + return; +fail: + zend_error(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); +} + + +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_std__vectorT_unsigned_char_t) { + /* No destructor for simple type _p_std__vectorT_unsigned_char_t */ + efree(rsrc->ptr); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Storage) { + __wrap_delete_Storage(rsrc, SWIGTYPE_p_OTDB__Storage->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__BitcoinAcct) { + __wrap_delete_BitcoinAcct(rsrc, SWIGTYPE_p_OTDB__BitcoinAcct->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__BidData) { + __wrap_delete_BidData(rsrc, SWIGTYPE_p_OTDB__BidData->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__ContactAcct) { + __wrap_delete_ContactAcct(rsrc, SWIGTYPE_p_OTDB__ContactAcct->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Blob) { + __wrap_delete_Blob(rsrc, SWIGTYPE_p_OTDB__Blob->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__TradeListNym) { + __wrap_delete_TradeListNym(rsrc, SWIGTYPE_p_OTDB__TradeListNym->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__OfferListNym) { + __wrap_delete_OfferListNym(rsrc, SWIGTYPE_p_OTDB__OfferListNym->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__TradeListMarket) { + __wrap_delete_TradeListMarket(rsrc, SWIGTYPE_p_OTDB__TradeListMarket->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__OfferListMarket) { + __wrap_delete_OfferListMarket(rsrc, SWIGTYPE_p_OTDB__OfferListMarket->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__WalletData) { + __wrap_delete_WalletData(rsrc, SWIGTYPE_p_OTDB__WalletData->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__StringMap) { + __wrap_delete_StringMap(rsrc, SWIGTYPE_p_OTDB__StringMap->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_int) { + /* No destructor for simple type _int */ + efree(rsrc->ptr); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__BitcoinServer) { + __wrap_delete_BitcoinServer(rsrc, SWIGTYPE_p_OTDB__BitcoinServer->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Displayable) { + __wrap_delete_Displayable(rsrc, SWIGTYPE_p_OTDB__Displayable->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTPacker) { + /* No destructor for simple type _p_OTPacker */ + efree(rsrc->ptr); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__AskData) { + __wrap_delete_AskData(rsrc, SWIGTYPE_p_OTDB__AskData->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__OTDBString) { + __wrap_delete_OTDBString(rsrc, SWIGTYPE_p_OTDB__OTDBString->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__TradeDataMarket) { + __wrap_delete_TradeDataMarket(rsrc, SWIGTYPE_p_OTDB__TradeDataMarket->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__OfferDataMarket) { + __wrap_delete_OfferDataMarket(rsrc, SWIGTYPE_p_OTDB__OfferDataMarket->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Acct) { + __wrap_delete_Acct(rsrc, SWIGTYPE_p_OTDB__Acct->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__ContactNym) { + __wrap_delete_ContactNym(rsrc, SWIGTYPE_p_OTDB__ContactNym->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__ServerInfo) { + __wrap_delete_ServerInfo(rsrc, SWIGTYPE_p_OTDB__ServerInfo->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Contact) { + __wrap_delete_Contact(rsrc, SWIGTYPE_p_OTDB__Contact->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTCaller) { + __wrap_delete_OTCaller(rsrc, SWIGTYPE_p_OTCaller->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__LoomServer) { + __wrap_delete_LoomServer(rsrc, SWIGTYPE_p_OTDB__LoomServer->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__RippleServer) { + __wrap_delete_RippleServer(rsrc, SWIGTYPE_p_OTDB__RippleServer->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Server) { + __wrap_delete_Server(rsrc, SWIGTYPE_p_OTDB__Server->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__Storable) { + __wrap_delete_Storable(rsrc, SWIGTYPE_p_OTDB__Storable->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__AddressBook) { + __wrap_delete_AddressBook(rsrc, SWIGTYPE_p_OTDB__AddressBook->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTCallback) { + __wrap_delete_OTCallback(rsrc, SWIGTYPE_p_OTCallback->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__TradeDataNym) { + __wrap_delete_TradeDataNym(rsrc, SWIGTYPE_p_OTDB__TradeDataNym->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__OfferDataNym) { + __wrap_delete_OfferDataNym(rsrc, SWIGTYPE_p_OTDB__OfferDataNym->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__MarketData) { + __wrap_delete_MarketData(rsrc, SWIGTYPE_p_OTDB__MarketData->name TSRMLS_CC); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_std__mapT_std__string_std__string_t) { + /* No destructor for simple type _p_std__mapT_std__string_std__string_t */ + efree(rsrc->ptr); +} +static ZEND_RSRC_DTOR_FUNC(_wrap_destroy_p_OTDB__MarketList) { + __wrap_delete_MarketList(rsrc, SWIGTYPE_p_OTDB__MarketList->name TSRMLS_CC); +} +/* end wrapper section */ +/* class entry subsection */ + + +/* entry subsection */ +/* Every non-class user visible function must have an entry here */ +static zend_function_entry otapi_functions[] = { + SWIG_ZEND_NAMED_FE(new_otcallback,_wrap_new_OTCallback,NULL) + SWIG_ZEND_NAMED_FE(otcallback_runone,_wrap_OTCallback_runOne,NULL) + SWIG_ZEND_NAMED_FE(otcallback_runtwo,_wrap_OTCallback_runTwo,NULL) + SWIG_ZEND_NAMED_FE(new_otcaller,_wrap_new_OTCaller,NULL) + SWIG_ZEND_NAMED_FE(otcaller_getpassword,_wrap_OTCaller_GetPassword,NULL) + SWIG_ZEND_NAMED_FE(otcaller_delcallback,_wrap_OTCaller_delCallback,NULL) + SWIG_ZEND_NAMED_FE(otcaller_setcallback,_wrap_OTCaller_setCallback,NULL) + SWIG_ZEND_NAMED_FE(otcaller_iscallbackset,_wrap_OTCaller_isCallbackSet,NULL) + SWIG_ZEND_NAMED_FE(otcaller_callone,_wrap_OTCaller_callOne,NULL) + SWIG_ZEND_NAMED_FE(otcaller_calltwo,_wrap_OTCaller_callTwo,NULL) + SWIG_ZEND_NAMED_FE(ot_api_set_passwordcallback,_wrap_OT_API_Set_PasswordCallback,NULL) + SWIG_ZEND_NAMED_FE(ot_api_init,_wrap_OT_API_Init,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadwallet,_wrap_OT_API_LoadWallet,NULL) + SWIG_ZEND_NAMED_FE(ot_api_switchwallet,_wrap_OT_API_SwitchWallet,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmemlogsize,_wrap_OT_API_GetMemlogSize,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmemlogatindex,_wrap_OT_API_GetMemlogAtIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_peekmemlogfront,_wrap_OT_API_PeekMemlogFront,NULL) + SWIG_ZEND_NAMED_FE(ot_api_peekmemlogback,_wrap_OT_API_PeekMemlogBack,NULL) + SWIG_ZEND_NAMED_FE(ot_api_popmemlogfront,_wrap_OT_API_PopMemlogFront,NULL) + SWIG_ZEND_NAMED_FE(ot_api_popmemlogback,_wrap_OT_API_PopMemlogBack,NULL) + SWIG_ZEND_NAMED_FE(ot_api_createnym,_wrap_OT_API_CreateNym,NULL) + SWIG_ZEND_NAMED_FE(ot_api_addservercontract,_wrap_OT_API_AddServerContract,NULL) + SWIG_ZEND_NAMED_FE(ot_api_addassetcontract,_wrap_OT_API_AddAssetContract,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getservercount,_wrap_OT_API_GetServerCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getassettypecount,_wrap_OT_API_GetAssetTypeCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountcount,_wrap_OT_API_GetAccountCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnymcount,_wrap_OT_API_GetNymCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getserver_id,_wrap_OT_API_GetServer_ID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getserver_name,_wrap_OT_API_GetServer_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getassettype_id,_wrap_OT_API_GetAssetType_ID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getassettype_name,_wrap_OT_API_GetAssetType_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_id,_wrap_OT_API_GetAccountWallet_ID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_name,_wrap_OT_API_GetAccountWallet_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_balance,_wrap_OT_API_GetAccountWallet_Balance,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_type,_wrap_OT_API_GetAccountWallet_Type,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_assettypeid,_wrap_OT_API_GetAccountWallet_AssetTypeID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_serverid,_wrap_OT_API_GetAccountWallet_ServerID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccountwallet_nymid,_wrap_OT_API_GetAccountWallet_NymID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_verifyaccountreceipt,_wrap_OT_API_VerifyAccountReceipt,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_transactionnumcount,_wrap_OT_API_GetNym_TransactionNumCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_id,_wrap_OT_API_GetNym_ID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_name,_wrap_OT_API_GetNym_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_stats,_wrap_OT_API_GetNym_Stats,NULL) + SWIG_ZEND_NAMED_FE(ot_api_isnym_registeredatserver,_wrap_OT_API_IsNym_RegisteredAtServer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_mailcount,_wrap_OT_API_GetNym_MailCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_mailcontentsbyindex,_wrap_OT_API_GetNym_MailContentsByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_mailsenderidbyindex,_wrap_OT_API_GetNym_MailSenderIDByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_mailserveridbyindex,_wrap_OT_API_GetNym_MailServerIDByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_nym_removemailbyindex,_wrap_OT_API_Nym_RemoveMailByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_nym_verifymailbyindex,_wrap_OT_API_Nym_VerifyMailByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_outmailcount,_wrap_OT_API_GetNym_OutmailCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_outmailcontentsbyindex,_wrap_OT_API_GetNym_OutmailContentsByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_outmailrecipientidbyindex,_wrap_OT_API_GetNym_OutmailRecipientIDByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_outmailserveridbyindex,_wrap_OT_API_GetNym_OutmailServerIDByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_nym_removeoutmailbyindex,_wrap_OT_API_Nym_RemoveOutmailByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_nym_verifyoutmailbyindex,_wrap_OT_API_Nym_VerifyOutmailByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_canremoveserver,_wrap_OT_API_Wallet_CanRemoveServer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_removeserver,_wrap_OT_API_Wallet_RemoveServer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_canremoveassettype,_wrap_OT_API_Wallet_CanRemoveAssetType,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_removeassettype,_wrap_OT_API_Wallet_RemoveAssetType,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_canremovenym,_wrap_OT_API_Wallet_CanRemoveNym,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_removenym,_wrap_OT_API_Wallet_RemoveNym,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_canremoveaccount,_wrap_OT_API_Wallet_CanRemoveAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_importnym,_wrap_OT_API_Wallet_ImportNym,NULL) + SWIG_ZEND_NAMED_FE(ot_api_setnym_name,_wrap_OT_API_SetNym_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_setaccountwallet_name,_wrap_OT_API_SetAccountWallet_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_setassettype_name,_wrap_OT_API_SetAssetType_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_setserver_name,_wrap_OT_API_SetServer_Name,NULL) + SWIG_ZEND_NAMED_FE(ot_api_verifyandretrievexmlcontents,_wrap_OT_API_VerifyAndRetrieveXMLContents,NULL) + SWIG_ZEND_NAMED_FE(ot_api_writecheque,_wrap_OT_API_WriteCheque,NULL) + SWIG_ZEND_NAMED_FE(ot_api_proposepaymentplan,_wrap_OT_API_ProposePaymentPlan,NULL) + SWIG_ZEND_NAMED_FE(ot_api_confirmpaymentplan,_wrap_OT_API_ConfirmPaymentPlan,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loaduserpubkey,_wrap_OT_API_LoadUserPubkey,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadpubkey,_wrap_OT_API_LoadPubkey,NULL) + SWIG_ZEND_NAMED_FE(ot_api_verifyuserprivatekey,_wrap_OT_API_VerifyUserPrivateKey,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadpurse,_wrap_OT_API_LoadPurse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadmint,_wrap_OT_API_LoadMint,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadassetcontract,_wrap_OT_API_LoadAssetContract,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadservercontract,_wrap_OT_API_LoadServerContract,NULL) + SWIG_ZEND_NAMED_FE(ot_api_mint_isstillgood,_wrap_OT_API_Mint_IsStillGood,NULL) + SWIG_ZEND_NAMED_FE(ot_api_isbasketcurrency,_wrap_OT_API_IsBasketCurrency,NULL) + SWIG_ZEND_NAMED_FE(ot_api_basket_getmembercount,_wrap_OT_API_Basket_GetMemberCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_basket_getmembertype,_wrap_OT_API_Basket_GetMemberType,NULL) + SWIG_ZEND_NAMED_FE(ot_api_basket_getminimumtransferamount,_wrap_OT_API_Basket_GetMinimumTransferAmount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_basket_getmemberminimumtransferamount,_wrap_OT_API_Basket_GetMemberMinimumTransferAmount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadassetaccount,_wrap_OT_API_LoadAssetAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadinbox,_wrap_OT_API_LoadInbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadoutbox,_wrap_OT_API_LoadOutbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_getcount,_wrap_OT_API_Ledger_GetCount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_createresponse,_wrap_OT_API_Ledger_CreateResponse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_gettransactionbyindex,_wrap_OT_API_Ledger_GetTransactionByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_gettransactionbyid,_wrap_OT_API_Ledger_GetTransactionByID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_gettransactionidbyindex,_wrap_OT_API_Ledger_GetTransactionIDByIndex,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_addtransaction,_wrap_OT_API_Ledger_AddTransaction,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_createresponse,_wrap_OT_API_Transaction_CreateResponse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_ledger_finalizeresponse,_wrap_OT_API_Ledger_FinalizeResponse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_gettype,_wrap_OT_API_Transaction_GetType,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getvoucher,_wrap_OT_API_Transaction_GetVoucher,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getsuccess,_wrap_OT_API_Transaction_GetSuccess,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getbalanceagreementsuccess,_wrap_OT_API_Transaction_GetBalanceAgreementSuccess,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getdatesigned,_wrap_OT_API_Transaction_GetDateSigned,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getamount,_wrap_OT_API_Transaction_GetAmount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_pending_getnote,_wrap_OT_API_Pending_GetNote,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getsenderuserid,_wrap_OT_API_Transaction_GetSenderUserID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getsenderacctid,_wrap_OT_API_Transaction_GetSenderAcctID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getrecipientuserid,_wrap_OT_API_Transaction_GetRecipientUserID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getrecipientacctid,_wrap_OT_API_Transaction_GetRecipientAcctID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_transaction_getdisplayreferencetonum,_wrap_OT_API_Transaction_GetDisplayReferenceToNum,NULL) + SWIG_ZEND_NAMED_FE(ot_api_createpurse,_wrap_OT_API_CreatePurse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_savepurse,_wrap_OT_API_SavePurse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_purse_gettotalvalue,_wrap_OT_API_Purse_GetTotalValue,NULL) + SWIG_ZEND_NAMED_FE(ot_api_purse_count,_wrap_OT_API_Purse_Count,NULL) + SWIG_ZEND_NAMED_FE(ot_api_purse_peek,_wrap_OT_API_Purse_Peek,NULL) + SWIG_ZEND_NAMED_FE(ot_api_purse_pop,_wrap_OT_API_Purse_Pop,NULL) + SWIG_ZEND_NAMED_FE(ot_api_purse_push,_wrap_OT_API_Purse_Push,NULL) + SWIG_ZEND_NAMED_FE(ot_api_wallet_importpurse,_wrap_OT_API_Wallet_ImportPurse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_exchangepurse,_wrap_OT_API_exchangePurse,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_changeowner,_wrap_OT_API_Token_ChangeOwner,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getid,_wrap_OT_API_Token_GetID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getdenomination,_wrap_OT_API_Token_GetDenomination,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getseries,_wrap_OT_API_Token_GetSeries,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getvalidfrom,_wrap_OT_API_Token_GetValidFrom,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getvalidto,_wrap_OT_API_Token_GetValidTo,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getassetid,_wrap_OT_API_Token_GetAssetID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_token_getserverid,_wrap_OT_API_Token_GetServerID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_checkserverid,_wrap_OT_API_checkServerID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_createuseraccount,_wrap_OT_API_createUserAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_deleteuseraccount,_wrap_OT_API_deleteUserAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_deleteassetaccount,_wrap_OT_API_deleteAssetAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_checkuser,_wrap_OT_API_checkUser,NULL) + SWIG_ZEND_NAMED_FE(ot_api_sendusermessage,_wrap_OT_API_sendUserMessage,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getrequest,_wrap_OT_API_getRequest,NULL) + SWIG_ZEND_NAMED_FE(ot_api_gettransactionnumber,_wrap_OT_API_getTransactionNumber,NULL) + SWIG_ZEND_NAMED_FE(ot_api_issueassettype,_wrap_OT_API_issueAssetType,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getcontract,_wrap_OT_API_getContract,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmint,_wrap_OT_API_getMint,NULL) + SWIG_ZEND_NAMED_FE(ot_api_createassetaccount,_wrap_OT_API_createAssetAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getaccount,_wrap_OT_API_getAccount,NULL) + SWIG_ZEND_NAMED_FE(ot_api_generatebasketcreation,_wrap_OT_API_GenerateBasketCreation,NULL) + SWIG_ZEND_NAMED_FE(ot_api_addbasketcreationitem,_wrap_OT_API_AddBasketCreationItem,NULL) + SWIG_ZEND_NAMED_FE(ot_api_issuebasket,_wrap_OT_API_issueBasket,NULL) + SWIG_ZEND_NAMED_FE(ot_api_generatebasketexchange,_wrap_OT_API_GenerateBasketExchange,NULL) + SWIG_ZEND_NAMED_FE(ot_api_addbasketexchangeitem,_wrap_OT_API_AddBasketExchangeItem,NULL) + SWIG_ZEND_NAMED_FE(ot_api_exchangebasket,_wrap_OT_API_exchangeBasket,NULL) + SWIG_ZEND_NAMED_FE(ot_api_notarizewithdrawal,_wrap_OT_API_notarizeWithdrawal,NULL) + SWIG_ZEND_NAMED_FE(ot_api_notarizedeposit,_wrap_OT_API_notarizeDeposit,NULL) + SWIG_ZEND_NAMED_FE(ot_api_notarizetransfer,_wrap_OT_API_notarizeTransfer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getinbox,_wrap_OT_API_getInbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getoutbox,_wrap_OT_API_getOutbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnymbox,_wrap_OT_API_getNymbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_loadnymbox,_wrap_OT_API_LoadNymbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_processinbox,_wrap_OT_API_processInbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_processnymbox,_wrap_OT_API_processNymbox,NULL) + SWIG_ZEND_NAMED_FE(ot_api_withdrawvoucher,_wrap_OT_API_withdrawVoucher,NULL) + SWIG_ZEND_NAMED_FE(ot_api_depositcheque,_wrap_OT_API_depositCheque,NULL) + SWIG_ZEND_NAMED_FE(ot_api_depositpaymentplan,_wrap_OT_API_depositPaymentPlan,NULL) + SWIG_ZEND_NAMED_FE(ot_api_issuemarketoffer,_wrap_OT_API_issueMarketOffer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmarketlist,_wrap_OT_API_getMarketList,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmarketoffers,_wrap_OT_API_getMarketOffers,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getmarketrecenttrades,_wrap_OT_API_getMarketRecentTrades,NULL) + SWIG_ZEND_NAMED_FE(ot_api_getnym_marketoffers,_wrap_OT_API_getNym_MarketOffers,NULL) + SWIG_ZEND_NAMED_FE(ot_api_cancelmarketoffer,_wrap_OT_API_cancelMarketOffer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_cancelpaymentplan,_wrap_OT_API_cancelPaymentPlan,NULL) + SWIG_ZEND_NAMED_FE(ot_api_popmessagebuffer,_wrap_OT_API_PopMessageBuffer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_flushmessagebuffer,_wrap_OT_API_FlushMessageBuffer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getcommand,_wrap_OT_API_Message_GetCommand,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getsuccess,_wrap_OT_API_Message_GetSuccess,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getdepth,_wrap_OT_API_Message_GetDepth,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_gettransactionsuccess,_wrap_OT_API_Message_GetTransactionSuccess,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getbalanceagreementsuccess,_wrap_OT_API_Message_GetBalanceAgreementSuccess,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getledger,_wrap_OT_API_Message_GetLedger,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getnewassettypeid,_wrap_OT_API_Message_GetNewAssetTypeID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getnewissueracctid,_wrap_OT_API_Message_GetNewIssuerAcctID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_message_getnewacctid,_wrap_OT_API_Message_GetNewAcctID,NULL) + SWIG_ZEND_NAMED_FE(ot_api_connectserver,_wrap_OT_API_ConnectServer,NULL) + SWIG_ZEND_NAMED_FE(ot_api_processsockets,_wrap_OT_API_ProcessSockets,NULL) + SWIG_ZEND_NAMED_FE(storable_create,_wrap_Storable_Create,NULL) + SWIG_ZEND_NAMED_FE(storable_ot_dynamic_cast,_wrap_Storable_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(storage_getpacker,_wrap_Storage_GetPacker,NULL) + SWIG_ZEND_NAMED_FE(storage_init,_wrap_Storage_Init,NULL) + SWIG_ZEND_NAMED_FE(storage_exists,_wrap_Storage_Exists,NULL) + SWIG_ZEND_NAMED_FE(storage_storestring,_wrap_Storage_StoreString,NULL) + SWIG_ZEND_NAMED_FE(storage_querystring,_wrap_Storage_QueryString,NULL) + SWIG_ZEND_NAMED_FE(storage_storeplainstring,_wrap_Storage_StorePlainString,NULL) + SWIG_ZEND_NAMED_FE(storage_queryplainstring,_wrap_Storage_QueryPlainString,NULL) + SWIG_ZEND_NAMED_FE(storage_storeobject,_wrap_Storage_StoreObject,NULL) + SWIG_ZEND_NAMED_FE(storage_queryobject,_wrap_Storage_QueryObject,NULL) + SWIG_ZEND_NAMED_FE(storage_erasevaluebykey,_wrap_Storage_EraseValueByKey,NULL) + SWIG_ZEND_NAMED_FE(storage_createobject,_wrap_Storage_CreateObject,NULL) + SWIG_ZEND_NAMED_FE(storage_create,_wrap_Storage_Create,NULL) + SWIG_ZEND_NAMED_FE(storage_gettype,_wrap_Storage_GetType,NULL) + SWIG_ZEND_NAMED_FE(initdefaultstorage,_wrap_InitDefaultStorage,NULL) + SWIG_ZEND_NAMED_FE(getdefaultstorage,_wrap_GetDefaultStorage,NULL) + SWIG_ZEND_NAMED_FE(createstoragecontext,_wrap_CreateStorageContext,NULL) + SWIG_ZEND_NAMED_FE(createobject,_wrap_CreateObject,NULL) + SWIG_ZEND_NAMED_FE(exists,_wrap_Exists,NULL) + SWIG_ZEND_NAMED_FE(storestring,_wrap_StoreString,NULL) + SWIG_ZEND_NAMED_FE(querystring,_wrap_QueryString,NULL) + SWIG_ZEND_NAMED_FE(storeplainstring,_wrap_StorePlainString,NULL) + SWIG_ZEND_NAMED_FE(queryplainstring,_wrap_QueryPlainString,NULL) + SWIG_ZEND_NAMED_FE(storeobject,_wrap_StoreObject,NULL) + SWIG_ZEND_NAMED_FE(queryobject,_wrap_QueryObject,NULL) + SWIG_ZEND_NAMED_FE(erasevaluebykey,_wrap_EraseValueByKey,NULL) + SWIG_ZEND_NAMED_FE(otdbstring_m_string_set,_wrap_OTDBString_m_string_set,NULL) + SWIG_ZEND_NAMED_FE(otdbstring_m_string_get,_wrap_OTDBString_m_string_get,NULL) + SWIG_ZEND_NAMED_FE(otdbstring_ot_dynamic_cast,_wrap_OTDBString_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(blob_m_membuffer_set,_wrap_Blob_m_memBuffer_set,NULL) + SWIG_ZEND_NAMED_FE(blob_m_membuffer_get,_wrap_Blob_m_memBuffer_get,NULL) + SWIG_ZEND_NAMED_FE(blob_ot_dynamic_cast,_wrap_Blob_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(stringmap_the_map_set,_wrap_StringMap_the_map_set,NULL) + SWIG_ZEND_NAMED_FE(stringmap_the_map_get,_wrap_StringMap_the_map_get,NULL) + SWIG_ZEND_NAMED_FE(stringmap_setvalue,_wrap_StringMap_SetValue,NULL) + SWIG_ZEND_NAMED_FE(stringmap_getvalue,_wrap_StringMap_GetValue,NULL) + SWIG_ZEND_NAMED_FE(stringmap_ot_dynamic_cast,_wrap_StringMap_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(displayable_gui_label_set,_wrap_Displayable_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(displayable_gui_label_get,_wrap_Displayable_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(displayable_ot_dynamic_cast,_wrap_Displayable_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(marketdata_gui_label_set,_wrap_MarketData_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_gui_label_get,_wrap_MarketData_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_server_id_set,_wrap_MarketData_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_server_id_get,_wrap_MarketData_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_market_id_set,_wrap_MarketData_market_id_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_market_id_get,_wrap_MarketData_market_id_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_asset_type_id_set,_wrap_MarketData_asset_type_id_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_asset_type_id_get,_wrap_MarketData_asset_type_id_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_currency_type_id_set,_wrap_MarketData_currency_type_id_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_currency_type_id_get,_wrap_MarketData_currency_type_id_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_scale_set,_wrap_MarketData_scale_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_scale_get,_wrap_MarketData_scale_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_total_assets_set,_wrap_MarketData_total_assets_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_total_assets_get,_wrap_MarketData_total_assets_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_number_bids_set,_wrap_MarketData_number_bids_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_number_bids_get,_wrap_MarketData_number_bids_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_number_asks_set,_wrap_MarketData_number_asks_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_number_asks_get,_wrap_MarketData_number_asks_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_last_sale_price_set,_wrap_MarketData_last_sale_price_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_last_sale_price_get,_wrap_MarketData_last_sale_price_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_current_bid_set,_wrap_MarketData_current_bid_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_current_bid_get,_wrap_MarketData_current_bid_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_current_ask_set,_wrap_MarketData_current_ask_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_current_ask_get,_wrap_MarketData_current_ask_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_trades_set,_wrap_MarketData_volume_trades_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_trades_get,_wrap_MarketData_volume_trades_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_assets_set,_wrap_MarketData_volume_assets_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_assets_get,_wrap_MarketData_volume_assets_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_currency_set,_wrap_MarketData_volume_currency_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_volume_currency_get,_wrap_MarketData_volume_currency_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_recent_highest_bid_set,_wrap_MarketData_recent_highest_bid_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_recent_highest_bid_get,_wrap_MarketData_recent_highest_bid_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_recent_lowest_ask_set,_wrap_MarketData_recent_lowest_ask_set,NULL) + SWIG_ZEND_NAMED_FE(marketdata_recent_lowest_ask_get,_wrap_MarketData_recent_lowest_ask_get,NULL) + SWIG_ZEND_NAMED_FE(marketdata_ot_dynamic_cast,_wrap_MarketData_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(marketlist_getmarketdatacount,_wrap_MarketList_GetMarketDataCount,NULL) + SWIG_ZEND_NAMED_FE(marketlist_getmarketdata,_wrap_MarketList_GetMarketData,NULL) + SWIG_ZEND_NAMED_FE(marketlist_removemarketdata,_wrap_MarketList_RemoveMarketData,NULL) + SWIG_ZEND_NAMED_FE(marketlist_addmarketdata,_wrap_MarketList_AddMarketData,NULL) + SWIG_ZEND_NAMED_FE(marketlist_ot_dynamic_cast,_wrap_MarketList_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_gui_label_set,_wrap_OfferDataMarket_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_gui_label_get,_wrap_OfferDataMarket_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_transaction_id_set,_wrap_OfferDataMarket_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_transaction_id_get,_wrap_OfferDataMarket_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_price_per_scale_set,_wrap_OfferDataMarket_price_per_scale_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_price_per_scale_get,_wrap_OfferDataMarket_price_per_scale_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_available_assets_set,_wrap_OfferDataMarket_available_assets_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_available_assets_get,_wrap_OfferDataMarket_available_assets_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_minimum_increment_set,_wrap_OfferDataMarket_minimum_increment_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_minimum_increment_get,_wrap_OfferDataMarket_minimum_increment_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatamarket_ot_dynamic_cast,_wrap_OfferDataMarket_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(biddata_gui_label_set,_wrap_BidData_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(biddata_gui_label_get,_wrap_BidData_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(biddata_transaction_id_set,_wrap_BidData_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(biddata_transaction_id_get,_wrap_BidData_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(biddata_price_per_scale_set,_wrap_BidData_price_per_scale_set,NULL) + SWIG_ZEND_NAMED_FE(biddata_price_per_scale_get,_wrap_BidData_price_per_scale_get,NULL) + SWIG_ZEND_NAMED_FE(biddata_available_assets_set,_wrap_BidData_available_assets_set,NULL) + SWIG_ZEND_NAMED_FE(biddata_available_assets_get,_wrap_BidData_available_assets_get,NULL) + SWIG_ZEND_NAMED_FE(biddata_minimum_increment_set,_wrap_BidData_minimum_increment_set,NULL) + SWIG_ZEND_NAMED_FE(biddata_minimum_increment_get,_wrap_BidData_minimum_increment_get,NULL) + SWIG_ZEND_NAMED_FE(biddata_ot_dynamic_cast,_wrap_BidData_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(askdata_gui_label_set,_wrap_AskData_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(askdata_gui_label_get,_wrap_AskData_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(askdata_transaction_id_set,_wrap_AskData_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(askdata_transaction_id_get,_wrap_AskData_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(askdata_price_per_scale_set,_wrap_AskData_price_per_scale_set,NULL) + SWIG_ZEND_NAMED_FE(askdata_price_per_scale_get,_wrap_AskData_price_per_scale_get,NULL) + SWIG_ZEND_NAMED_FE(askdata_available_assets_set,_wrap_AskData_available_assets_set,NULL) + SWIG_ZEND_NAMED_FE(askdata_available_assets_get,_wrap_AskData_available_assets_get,NULL) + SWIG_ZEND_NAMED_FE(askdata_minimum_increment_set,_wrap_AskData_minimum_increment_set,NULL) + SWIG_ZEND_NAMED_FE(askdata_minimum_increment_get,_wrap_AskData_minimum_increment_get,NULL) + SWIG_ZEND_NAMED_FE(askdata_ot_dynamic_cast,_wrap_AskData_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_getbiddatacount,_wrap_OfferListMarket_GetBidDataCount,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_getbiddata,_wrap_OfferListMarket_GetBidData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_removebiddata,_wrap_OfferListMarket_RemoveBidData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_addbiddata,_wrap_OfferListMarket_AddBidData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_getaskdatacount,_wrap_OfferListMarket_GetAskDataCount,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_getaskdata,_wrap_OfferListMarket_GetAskData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_removeaskdata,_wrap_OfferListMarket_RemoveAskData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_addaskdata,_wrap_OfferListMarket_AddAskData,NULL) + SWIG_ZEND_NAMED_FE(offerlistmarket_ot_dynamic_cast,_wrap_OfferListMarket_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_gui_label_set,_wrap_TradeDataMarket_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_gui_label_get,_wrap_TradeDataMarket_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_transaction_id_set,_wrap_TradeDataMarket_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_transaction_id_get,_wrap_TradeDataMarket_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_date_set,_wrap_TradeDataMarket_date_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_date_get,_wrap_TradeDataMarket_date_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_price_set,_wrap_TradeDataMarket_price_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_price_get,_wrap_TradeDataMarket_price_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_amount_sold_set,_wrap_TradeDataMarket_amount_sold_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_amount_sold_get,_wrap_TradeDataMarket_amount_sold_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatamarket_ot_dynamic_cast,_wrap_TradeDataMarket_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(tradelistmarket_gettradedatamarketcount,_wrap_TradeListMarket_GetTradeDataMarketCount,NULL) + SWIG_ZEND_NAMED_FE(tradelistmarket_gettradedatamarket,_wrap_TradeListMarket_GetTradeDataMarket,NULL) + SWIG_ZEND_NAMED_FE(tradelistmarket_removetradedatamarket,_wrap_TradeListMarket_RemoveTradeDataMarket,NULL) + SWIG_ZEND_NAMED_FE(tradelistmarket_addtradedatamarket,_wrap_TradeListMarket_AddTradeDataMarket,NULL) + SWIG_ZEND_NAMED_FE(tradelistmarket_ot_dynamic_cast,_wrap_TradeListMarket_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_gui_label_set,_wrap_OfferDataNym_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_gui_label_get,_wrap_OfferDataNym_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_valid_from_set,_wrap_OfferDataNym_valid_from_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_valid_from_get,_wrap_OfferDataNym_valid_from_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_valid_to_set,_wrap_OfferDataNym_valid_to_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_valid_to_get,_wrap_OfferDataNym_valid_to_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_server_id_set,_wrap_OfferDataNym_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_server_id_get,_wrap_OfferDataNym_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_asset_type_id_set,_wrap_OfferDataNym_asset_type_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_asset_type_id_get,_wrap_OfferDataNym_asset_type_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_asset_acct_id_set,_wrap_OfferDataNym_asset_acct_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_asset_acct_id_get,_wrap_OfferDataNym_asset_acct_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_currency_type_id_set,_wrap_OfferDataNym_currency_type_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_currency_type_id_get,_wrap_OfferDataNym_currency_type_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_currency_acct_id_set,_wrap_OfferDataNym_currency_acct_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_currency_acct_id_get,_wrap_OfferDataNym_currency_acct_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_selling_set,_wrap_OfferDataNym_selling_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_selling_get,_wrap_OfferDataNym_selling_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_scale_set,_wrap_OfferDataNym_scale_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_scale_get,_wrap_OfferDataNym_scale_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_price_per_scale_set,_wrap_OfferDataNym_price_per_scale_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_price_per_scale_get,_wrap_OfferDataNym_price_per_scale_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_transaction_id_set,_wrap_OfferDataNym_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_transaction_id_get,_wrap_OfferDataNym_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_total_assets_set,_wrap_OfferDataNym_total_assets_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_total_assets_get,_wrap_OfferDataNym_total_assets_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_finished_so_far_set,_wrap_OfferDataNym_finished_so_far_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_finished_so_far_get,_wrap_OfferDataNym_finished_so_far_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_minimum_increment_set,_wrap_OfferDataNym_minimum_increment_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_minimum_increment_get,_wrap_OfferDataNym_minimum_increment_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_stop_sign_set,_wrap_OfferDataNym_stop_sign_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_stop_sign_get,_wrap_OfferDataNym_stop_sign_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_stop_price_set,_wrap_OfferDataNym_stop_price_set,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_stop_price_get,_wrap_OfferDataNym_stop_price_get,NULL) + SWIG_ZEND_NAMED_FE(offerdatanym_ot_dynamic_cast,_wrap_OfferDataNym_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(offerlistnym_getofferdatanymcount,_wrap_OfferListNym_GetOfferDataNymCount,NULL) + SWIG_ZEND_NAMED_FE(offerlistnym_getofferdatanym,_wrap_OfferListNym_GetOfferDataNym,NULL) + SWIG_ZEND_NAMED_FE(offerlistnym_removeofferdatanym,_wrap_OfferListNym_RemoveOfferDataNym,NULL) + SWIG_ZEND_NAMED_FE(offerlistnym_addofferdatanym,_wrap_OfferListNym_AddOfferDataNym,NULL) + SWIG_ZEND_NAMED_FE(offerlistnym_ot_dynamic_cast,_wrap_OfferListNym_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_gui_label_set,_wrap_TradeDataNym_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_gui_label_get,_wrap_TradeDataNym_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_transaction_id_set,_wrap_TradeDataNym_transaction_id_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_transaction_id_get,_wrap_TradeDataNym_transaction_id_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_completed_count_set,_wrap_TradeDataNym_completed_count_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_completed_count_get,_wrap_TradeDataNym_completed_count_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_date_set,_wrap_TradeDataNym_date_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_date_get,_wrap_TradeDataNym_date_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_price_set,_wrap_TradeDataNym_price_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_price_get,_wrap_TradeDataNym_price_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_amount_sold_set,_wrap_TradeDataNym_amount_sold_set,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_amount_sold_get,_wrap_TradeDataNym_amount_sold_get,NULL) + SWIG_ZEND_NAMED_FE(tradedatanym_ot_dynamic_cast,_wrap_TradeDataNym_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(tradelistnym_gettradedatanymcount,_wrap_TradeListNym_GetTradeDataNymCount,NULL) + SWIG_ZEND_NAMED_FE(tradelistnym_gettradedatanym,_wrap_TradeListNym_GetTradeDataNym,NULL) + SWIG_ZEND_NAMED_FE(tradelistnym_removetradedatanym,_wrap_TradeListNym_RemoveTradeDataNym,NULL) + SWIG_ZEND_NAMED_FE(tradelistnym_addtradedatanym,_wrap_TradeListNym_AddTradeDataNym,NULL) + SWIG_ZEND_NAMED_FE(tradelistnym_ot_dynamic_cast,_wrap_TradeListNym_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(acct_gui_label_set,_wrap_Acct_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(acct_gui_label_get,_wrap_Acct_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(acct_acct_id_set,_wrap_Acct_acct_id_set,NULL) + SWIG_ZEND_NAMED_FE(acct_acct_id_get,_wrap_Acct_acct_id_get,NULL) + SWIG_ZEND_NAMED_FE(acct_server_id_set,_wrap_Acct_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(acct_server_id_get,_wrap_Acct_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(acct_ot_dynamic_cast,_wrap_Acct_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_gui_label_set,_wrap_BitcoinAcct_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_gui_label_get,_wrap_BitcoinAcct_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_acct_id_set,_wrap_BitcoinAcct_acct_id_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_acct_id_get,_wrap_BitcoinAcct_acct_id_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_server_id_set,_wrap_BitcoinAcct_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_server_id_get,_wrap_BitcoinAcct_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_bitcoin_acct_name_set,_wrap_BitcoinAcct_bitcoin_acct_name_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_bitcoin_acct_name_get,_wrap_BitcoinAcct_bitcoin_acct_name_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinacct_ot_dynamic_cast,_wrap_BitcoinAcct_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_gui_label_set,_wrap_ServerInfo_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_gui_label_get,_wrap_ServerInfo_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_server_id_set,_wrap_ServerInfo_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_server_id_get,_wrap_ServerInfo_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_server_type_set,_wrap_ServerInfo_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_server_type_get,_wrap_ServerInfo_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(serverinfo_ot_dynamic_cast,_wrap_ServerInfo_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(server_gui_label_set,_wrap_Server_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(server_gui_label_get,_wrap_Server_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(server_server_id_set,_wrap_Server_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(server_server_id_get,_wrap_Server_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(server_server_type_set,_wrap_Server_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(server_server_type_get,_wrap_Server_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(server_server_host_set,_wrap_Server_server_host_set,NULL) + SWIG_ZEND_NAMED_FE(server_server_host_get,_wrap_Server_server_host_get,NULL) + SWIG_ZEND_NAMED_FE(server_server_port_set,_wrap_Server_server_port_set,NULL) + SWIG_ZEND_NAMED_FE(server_server_port_get,_wrap_Server_server_port_get,NULL) + SWIG_ZEND_NAMED_FE(server_ot_dynamic_cast,_wrap_Server_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_gui_label_set,_wrap_BitcoinServer_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_gui_label_get,_wrap_BitcoinServer_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_id_set,_wrap_BitcoinServer_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_id_get,_wrap_BitcoinServer_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_type_set,_wrap_BitcoinServer_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_type_get,_wrap_BitcoinServer_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_host_set,_wrap_BitcoinServer_server_host_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_host_get,_wrap_BitcoinServer_server_host_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_port_set,_wrap_BitcoinServer_server_port_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_server_port_get,_wrap_BitcoinServer_server_port_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_bitcoin_username_set,_wrap_BitcoinServer_bitcoin_username_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_bitcoin_username_get,_wrap_BitcoinServer_bitcoin_username_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_bitcoin_password_set,_wrap_BitcoinServer_bitcoin_password_set,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_bitcoin_password_get,_wrap_BitcoinServer_bitcoin_password_get,NULL) + SWIG_ZEND_NAMED_FE(bitcoinserver_ot_dynamic_cast,_wrap_BitcoinServer_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_gui_label_set,_wrap_RippleServer_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_gui_label_get,_wrap_RippleServer_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_id_set,_wrap_RippleServer_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_id_get,_wrap_RippleServer_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_type_set,_wrap_RippleServer_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_type_get,_wrap_RippleServer_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_host_set,_wrap_RippleServer_server_host_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_host_get,_wrap_RippleServer_server_host_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_port_set,_wrap_RippleServer_server_port_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_server_port_get,_wrap_RippleServer_server_port_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_ripple_username_set,_wrap_RippleServer_ripple_username_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_ripple_username_get,_wrap_RippleServer_ripple_username_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_ripple_password_set,_wrap_RippleServer_ripple_password_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_ripple_password_get,_wrap_RippleServer_ripple_password_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_namefield_id_set,_wrap_RippleServer_namefield_id_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_namefield_id_get,_wrap_RippleServer_namefield_id_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_passfield_id_set,_wrap_RippleServer_passfield_id_set,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_passfield_id_get,_wrap_RippleServer_passfield_id_get,NULL) + SWIG_ZEND_NAMED_FE(rippleserver_ot_dynamic_cast,_wrap_RippleServer_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(loomserver_gui_label_set,_wrap_LoomServer_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_gui_label_get,_wrap_LoomServer_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_id_set,_wrap_LoomServer_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_id_get,_wrap_LoomServer_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_type_set,_wrap_LoomServer_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_type_get,_wrap_LoomServer_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_host_set,_wrap_LoomServer_server_host_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_host_get,_wrap_LoomServer_server_host_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_port_set,_wrap_LoomServer_server_port_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_server_port_get,_wrap_LoomServer_server_port_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_loom_username_set,_wrap_LoomServer_loom_username_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_loom_username_get,_wrap_LoomServer_loom_username_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_namefield_id_set,_wrap_LoomServer_namefield_id_set,NULL) + SWIG_ZEND_NAMED_FE(loomserver_namefield_id_get,_wrap_LoomServer_namefield_id_get,NULL) + SWIG_ZEND_NAMED_FE(loomserver_ot_dynamic_cast,_wrap_LoomServer_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(contactnym_gui_label_set,_wrap_ContactNym_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(contactnym_gui_label_get,_wrap_ContactNym_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(contactnym_nym_type_set,_wrap_ContactNym_nym_type_set,NULL) + SWIG_ZEND_NAMED_FE(contactnym_nym_type_get,_wrap_ContactNym_nym_type_get,NULL) + SWIG_ZEND_NAMED_FE(contactnym_nym_id_set,_wrap_ContactNym_nym_id_set,NULL) + SWIG_ZEND_NAMED_FE(contactnym_nym_id_get,_wrap_ContactNym_nym_id_get,NULL) + SWIG_ZEND_NAMED_FE(contactnym_public_key_set,_wrap_ContactNym_public_key_set,NULL) + SWIG_ZEND_NAMED_FE(contactnym_public_key_get,_wrap_ContactNym_public_key_get,NULL) + SWIG_ZEND_NAMED_FE(contactnym_memo_set,_wrap_ContactNym_memo_set,NULL) + SWIG_ZEND_NAMED_FE(contactnym_memo_get,_wrap_ContactNym_memo_get,NULL) + SWIG_ZEND_NAMED_FE(contactnym_getserverinfocount,_wrap_ContactNym_GetServerInfoCount,NULL) + SWIG_ZEND_NAMED_FE(contactnym_getserverinfo,_wrap_ContactNym_GetServerInfo,NULL) + SWIG_ZEND_NAMED_FE(contactnym_removeserverinfo,_wrap_ContactNym_RemoveServerInfo,NULL) + SWIG_ZEND_NAMED_FE(contactnym_addserverinfo,_wrap_ContactNym_AddServerInfo,NULL) + SWIG_ZEND_NAMED_FE(contactnym_ot_dynamic_cast,_wrap_ContactNym_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getbitcoinservercount,_wrap_WalletData_GetBitcoinServerCount,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getbitcoinserver,_wrap_WalletData_GetBitcoinServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_removebitcoinserver,_wrap_WalletData_RemoveBitcoinServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_addbitcoinserver,_wrap_WalletData_AddBitcoinServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getbitcoinacctcount,_wrap_WalletData_GetBitcoinAcctCount,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getbitcoinacct,_wrap_WalletData_GetBitcoinAcct,NULL) + SWIG_ZEND_NAMED_FE(walletdata_removebitcoinacct,_wrap_WalletData_RemoveBitcoinAcct,NULL) + SWIG_ZEND_NAMED_FE(walletdata_addbitcoinacct,_wrap_WalletData_AddBitcoinAcct,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getrippleservercount,_wrap_WalletData_GetRippleServerCount,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getrippleserver,_wrap_WalletData_GetRippleServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_removerippleserver,_wrap_WalletData_RemoveRippleServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_addrippleserver,_wrap_WalletData_AddRippleServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getloomservercount,_wrap_WalletData_GetLoomServerCount,NULL) + SWIG_ZEND_NAMED_FE(walletdata_getloomserver,_wrap_WalletData_GetLoomServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_removeloomserver,_wrap_WalletData_RemoveLoomServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_addloomserver,_wrap_WalletData_AddLoomServer,NULL) + SWIG_ZEND_NAMED_FE(walletdata_ot_dynamic_cast,_wrap_WalletData_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(contactacct_gui_label_set,_wrap_ContactAcct_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_gui_label_get,_wrap_ContactAcct_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_server_type_set,_wrap_ContactAcct_server_type_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_server_type_get,_wrap_ContactAcct_server_type_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_server_id_set,_wrap_ContactAcct_server_id_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_server_id_get,_wrap_ContactAcct_server_id_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_asset_type_id_set,_wrap_ContactAcct_asset_type_id_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_asset_type_id_get,_wrap_ContactAcct_asset_type_id_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_acct_id_set,_wrap_ContactAcct_acct_id_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_acct_id_get,_wrap_ContactAcct_acct_id_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_nym_id_set,_wrap_ContactAcct_nym_id_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_nym_id_get,_wrap_ContactAcct_nym_id_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_memo_set,_wrap_ContactAcct_memo_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_memo_get,_wrap_ContactAcct_memo_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_public_key_set,_wrap_ContactAcct_public_key_set,NULL) + SWIG_ZEND_NAMED_FE(contactacct_public_key_get,_wrap_ContactAcct_public_key_get,NULL) + SWIG_ZEND_NAMED_FE(contactacct_ot_dynamic_cast,_wrap_ContactAcct_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(contact_gui_label_set,_wrap_Contact_gui_label_set,NULL) + SWIG_ZEND_NAMED_FE(contact_gui_label_get,_wrap_Contact_gui_label_get,NULL) + SWIG_ZEND_NAMED_FE(contact_contact_id_set,_wrap_Contact_contact_id_set,NULL) + SWIG_ZEND_NAMED_FE(contact_contact_id_get,_wrap_Contact_contact_id_get,NULL) + SWIG_ZEND_NAMED_FE(contact_email_set,_wrap_Contact_email_set,NULL) + SWIG_ZEND_NAMED_FE(contact_email_get,_wrap_Contact_email_get,NULL) + SWIG_ZEND_NAMED_FE(contact_memo_set,_wrap_Contact_memo_set,NULL) + SWIG_ZEND_NAMED_FE(contact_memo_get,_wrap_Contact_memo_get,NULL) + SWIG_ZEND_NAMED_FE(contact_public_key_set,_wrap_Contact_public_key_set,NULL) + SWIG_ZEND_NAMED_FE(contact_public_key_get,_wrap_Contact_public_key_get,NULL) + SWIG_ZEND_NAMED_FE(contact_getcontactnymcount,_wrap_Contact_GetContactNymCount,NULL) + SWIG_ZEND_NAMED_FE(contact_getcontactnym,_wrap_Contact_GetContactNym,NULL) + SWIG_ZEND_NAMED_FE(contact_removecontactnym,_wrap_Contact_RemoveContactNym,NULL) + SWIG_ZEND_NAMED_FE(contact_addcontactnym,_wrap_Contact_AddContactNym,NULL) + SWIG_ZEND_NAMED_FE(contact_getcontactacctcount,_wrap_Contact_GetContactAcctCount,NULL) + SWIG_ZEND_NAMED_FE(contact_getcontactacct,_wrap_Contact_GetContactAcct,NULL) + SWIG_ZEND_NAMED_FE(contact_removecontactacct,_wrap_Contact_RemoveContactAcct,NULL) + SWIG_ZEND_NAMED_FE(contact_addcontactacct,_wrap_Contact_AddContactAcct,NULL) + SWIG_ZEND_NAMED_FE(contact_ot_dynamic_cast,_wrap_Contact_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(addressbook_getcontactcount,_wrap_AddressBook_GetContactCount,NULL) + SWIG_ZEND_NAMED_FE(addressbook_getcontact,_wrap_AddressBook_GetContact,NULL) + SWIG_ZEND_NAMED_FE(addressbook_removecontact,_wrap_AddressBook_RemoveContact,NULL) + SWIG_ZEND_NAMED_FE(addressbook_addcontact,_wrap_AddressBook_AddContact,NULL) + SWIG_ZEND_NAMED_FE(addressbook_ot_dynamic_cast,_wrap_AddressBook_ot_dynamic_cast,NULL) + SWIG_ZEND_NAMED_FE(swig_otapi_alter_newobject,_wrap_swig_otapi_alter_newobject,NULL) + SWIG_ZEND_NAMED_FE(swig_otapi_get_newobject,_wrap_swig_otapi_get_newobject,NULL) +{NULL, NULL, NULL} +}; + +/* init section */ +#if ZEND_MODULE_API_NO <= 20090626 +#undef ZEND_MODULE_BUILD_ID +#define ZEND_MODULE_BUILD_ID (char*)"API" ZEND_TOSTR(ZEND_MODULE_API_NO) ZEND_BUILD_TS ZEND_BUILD_DEBUG ZEND_BUILD_SYSTEM ZEND_BUILD_EXTRA +#endif +zend_module_entry otapi_module_entry = { +#if ZEND_MODULE_API_NO > 20010900 + STANDARD_MODULE_HEADER, +#endif + (char*)"otapi", + otapi_functions, + PHP_MINIT(otapi), + PHP_MSHUTDOWN(otapi), + PHP_RINIT(otapi), + PHP_RSHUTDOWN(otapi), + PHP_MINFO(otapi), +#if ZEND_MODULE_API_NO > 20010900 + NO_VERSION_YET, +#endif + STANDARD_MODULE_PROPERTIES +}; +zend_module_entry* SWIG_module_entry = &otapi_module_entry; + +#ifdef __cplusplus +extern "C" { +#endif +SWIGEXPORT zend_module_entry *get_module(void) { return &otapi_module_entry; } +#ifdef __cplusplus +} +#endif + +#define SWIG_php_minit PHP_MINIT_FUNCTION(otapi) +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ /* c-mode */ +#endif +} +#endif + + + SWIG_php_minit { + SWIG_InitializeModule(0); + +/* oinit subsection */ +ZEND_INIT_MODULE_GLOBALS(otapi, otapi_init_globals, otapi_destroy_globals); + +/* Register resource destructors for pointer types */ +le_swig__p_std__vectorT_unsigned_char_t=zend_register_list_destructors_ex(_wrap_destroy_p_std__vectorT_unsigned_char_t,NULL,(char *)(SWIGTYPE_p_std__vectorT_unsigned_char_t->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_unsigned_char_t,&le_swig__p_std__vectorT_unsigned_char_t); +le_swig__p_OTDB__Storage=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Storage,NULL,(char *)(SWIGTYPE_p_OTDB__Storage->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storage,&le_swig__p_OTDB__Storage); +le_swig__p_OTDB__BitcoinAcct=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__BitcoinAcct,NULL,(char *)(SWIGTYPE_p_OTDB__BitcoinAcct->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinAcct,&le_swig__p_OTDB__BitcoinAcct); +le_swig__p_OTDB__BidData=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__BidData,NULL,(char *)(SWIGTYPE_p_OTDB__BidData->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__BidData,&le_swig__p_OTDB__BidData); +le_swig__p_OTDB__ContactAcct=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__ContactAcct,NULL,(char *)(SWIGTYPE_p_OTDB__ContactAcct->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactAcct,&le_swig__p_OTDB__ContactAcct); +le_swig__p_OTDB__Blob=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Blob,NULL,(char *)(SWIGTYPE_p_OTDB__Blob->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Blob,&le_swig__p_OTDB__Blob); +le_swig__p_OTDB__TradeListNym=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__TradeListNym,NULL,(char *)(SWIGTYPE_p_OTDB__TradeListNym->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListNym,&le_swig__p_OTDB__TradeListNym); +le_swig__p_OTDB__OfferListNym=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__OfferListNym,NULL,(char *)(SWIGTYPE_p_OTDB__OfferListNym->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListNym,&le_swig__p_OTDB__OfferListNym); +le_swig__p_OTDB__TradeListMarket=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__TradeListMarket,NULL,(char *)(SWIGTYPE_p_OTDB__TradeListMarket->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListMarket,&le_swig__p_OTDB__TradeListMarket); +le_swig__p_OTDB__OfferListMarket=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__OfferListMarket,NULL,(char *)(SWIGTYPE_p_OTDB__OfferListMarket->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListMarket,&le_swig__p_OTDB__OfferListMarket); +le_swig__p_OTDB__WalletData=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__WalletData,NULL,(char *)(SWIGTYPE_p_OTDB__WalletData->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__WalletData,&le_swig__p_OTDB__WalletData); +le_swig__p_OTDB__StringMap=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__StringMap,NULL,(char *)(SWIGTYPE_p_OTDB__StringMap->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__StringMap,&le_swig__p_OTDB__StringMap); +le_swig__int=zend_register_list_destructors_ex(_wrap_destroy_int,NULL,(char *)(SWIGTYPE_int->name),module_number); +SWIG_TypeClientData(SWIGTYPE_int,&le_swig__int); +le_swig__p_OTDB__BitcoinServer=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__BitcoinServer,NULL,(char *)(SWIGTYPE_p_OTDB__BitcoinServer->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinServer,&le_swig__p_OTDB__BitcoinServer); +le_swig__p_OTDB__Displayable=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Displayable,NULL,(char *)(SWIGTYPE_p_OTDB__Displayable->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Displayable,&le_swig__p_OTDB__Displayable); +le_swig__p_OTPacker=zend_register_list_destructors_ex(_wrap_destroy_p_OTPacker,NULL,(char *)(SWIGTYPE_p_OTPacker->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTPacker,&le_swig__p_OTPacker); +le_swig__p_OTDB__AskData=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__AskData,NULL,(char *)(SWIGTYPE_p_OTDB__AskData->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__AskData,&le_swig__p_OTDB__AskData); +le_swig__p_OTDB__OTDBString=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__OTDBString,NULL,(char *)(SWIGTYPE_p_OTDB__OTDBString->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__OTDBString,&le_swig__p_OTDB__OTDBString); +le_swig__p_OTDB__TradeDataMarket=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__TradeDataMarket,NULL,(char *)(SWIGTYPE_p_OTDB__TradeDataMarket->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataMarket,&le_swig__p_OTDB__TradeDataMarket); +le_swig__p_OTDB__OfferDataMarket=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__OfferDataMarket,NULL,(char *)(SWIGTYPE_p_OTDB__OfferDataMarket->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataMarket,&le_swig__p_OTDB__OfferDataMarket); +le_swig__p_OTDB__Acct=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Acct,NULL,(char *)(SWIGTYPE_p_OTDB__Acct->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Acct,&le_swig__p_OTDB__Acct); +le_swig__p_OTDB__ContactNym=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__ContactNym,NULL,(char *)(SWIGTYPE_p_OTDB__ContactNym->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactNym,&le_swig__p_OTDB__ContactNym); +le_swig__p_OTDB__ServerInfo=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__ServerInfo,NULL,(char *)(SWIGTYPE_p_OTDB__ServerInfo->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__ServerInfo,&le_swig__p_OTDB__ServerInfo); +le_swig__p_OTDB__Contact=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Contact,NULL,(char *)(SWIGTYPE_p_OTDB__Contact->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Contact,&le_swig__p_OTDB__Contact); +le_swig__p_OTCaller=zend_register_list_destructors_ex(_wrap_destroy_p_OTCaller,NULL,(char *)(SWIGTYPE_p_OTCaller->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTCaller,&le_swig__p_OTCaller); +le_swig__p_OTDB__LoomServer=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__LoomServer,NULL,(char *)(SWIGTYPE_p_OTDB__LoomServer->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__LoomServer,&le_swig__p_OTDB__LoomServer); +le_swig__p_OTDB__RippleServer=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__RippleServer,NULL,(char *)(SWIGTYPE_p_OTDB__RippleServer->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__RippleServer,&le_swig__p_OTDB__RippleServer); +le_swig__p_OTDB__Server=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Server,NULL,(char *)(SWIGTYPE_p_OTDB__Server->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Server,&le_swig__p_OTDB__Server); +le_swig__p_OTDB__Storable=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__Storable,NULL,(char *)(SWIGTYPE_p_OTDB__Storable->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storable,&le_swig__p_OTDB__Storable); +le_swig__p_OTDB__AddressBook=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__AddressBook,NULL,(char *)(SWIGTYPE_p_OTDB__AddressBook->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__AddressBook,&le_swig__p_OTDB__AddressBook); +le_swig__p_OTCallback=zend_register_list_destructors_ex(_wrap_destroy_p_OTCallback,NULL,(char *)(SWIGTYPE_p_OTCallback->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTCallback,&le_swig__p_OTCallback); +le_swig__p_OTDB__TradeDataNym=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__TradeDataNym,NULL,(char *)(SWIGTYPE_p_OTDB__TradeDataNym->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataNym,&le_swig__p_OTDB__TradeDataNym); +le_swig__p_OTDB__OfferDataNym=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__OfferDataNym,NULL,(char *)(SWIGTYPE_p_OTDB__OfferDataNym->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataNym,&le_swig__p_OTDB__OfferDataNym); +le_swig__p_OTDB__MarketData=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__MarketData,NULL,(char *)(SWIGTYPE_p_OTDB__MarketData->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketData,&le_swig__p_OTDB__MarketData); +le_swig__p_std__mapT_std__string_std__string_t=zend_register_list_destructors_ex(_wrap_destroy_p_std__mapT_std__string_std__string_t,NULL,(char *)(SWIGTYPE_p_std__mapT_std__string_std__string_t->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_std__mapT_std__string_std__string_t,&le_swig__p_std__mapT_std__string_std__string_t); +le_swig__p_OTDB__MarketList=zend_register_list_destructors_ex(_wrap_destroy_p_OTDB__MarketList,NULL,(char *)(SWIGTYPE_p_OTDB__MarketList->name),module_number); +SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketList,&le_swig__p_OTDB__MarketList); +CG(active_class_entry) = NULL; +/* end oinit subsection */ + +/* cinit subsection */ +SWIG_LONG_CONSTANT(PACK_MESSAGE_PACK, OTDB::PACK_MESSAGE_PACK); +SWIG_LONG_CONSTANT(PACK_PROTOCOL_BUFFERS, OTDB::PACK_PROTOCOL_BUFFERS); +SWIG_LONG_CONSTANT(PACK_TYPE_ERROR, OTDB::PACK_TYPE_ERROR); +SWIG_LONG_CONSTANT(STORE_FILESYSTEM, OTDB::STORE_FILESYSTEM); +SWIG_LONG_CONSTANT(STORE_TYPE_SUBCLASS, OTDB::STORE_TYPE_SUBCLASS); +SWIG_LONG_CONSTANT(STORED_OBJ_STRING, OTDB::STORED_OBJ_STRING); +SWIG_LONG_CONSTANT(STORED_OBJ_BLOB, OTDB::STORED_OBJ_BLOB); +SWIG_LONG_CONSTANT(STORED_OBJ_STRING_MAP, OTDB::STORED_OBJ_STRING_MAP); +SWIG_LONG_CONSTANT(STORED_OBJ_WALLET_DATA, OTDB::STORED_OBJ_WALLET_DATA); +SWIG_LONG_CONSTANT(STORED_OBJ_BITCOIN_ACCT, OTDB::STORED_OBJ_BITCOIN_ACCT); +SWIG_LONG_CONSTANT(STORED_OBJ_BITCOIN_SERVER, OTDB::STORED_OBJ_BITCOIN_SERVER); +SWIG_LONG_CONSTANT(STORED_OBJ_RIPPLE_SERVER, OTDB::STORED_OBJ_RIPPLE_SERVER); +SWIG_LONG_CONSTANT(STORED_OBJ_LOOM_SERVER, OTDB::STORED_OBJ_LOOM_SERVER); +SWIG_LONG_CONSTANT(STORED_OBJ_SERVER_INFO, OTDB::STORED_OBJ_SERVER_INFO); +SWIG_LONG_CONSTANT(STORED_OBJ_CONTACT_NYM, OTDB::STORED_OBJ_CONTACT_NYM); +SWIG_LONG_CONSTANT(STORED_OBJ_CONTACT_ACCT, OTDB::STORED_OBJ_CONTACT_ACCT); +SWIG_LONG_CONSTANT(STORED_OBJ_CONTACT, OTDB::STORED_OBJ_CONTACT); +SWIG_LONG_CONSTANT(STORED_OBJ_ADDRESS_BOOK, OTDB::STORED_OBJ_ADDRESS_BOOK); +SWIG_LONG_CONSTANT(STORED_OBJ_MARKET_DATA, OTDB::STORED_OBJ_MARKET_DATA); +SWIG_LONG_CONSTANT(STORED_OBJ_MARKET_LIST, OTDB::STORED_OBJ_MARKET_LIST); +SWIG_LONG_CONSTANT(STORED_OBJ_BID_DATA, OTDB::STORED_OBJ_BID_DATA); +SWIG_LONG_CONSTANT(STORED_OBJ_ASK_DATA, OTDB::STORED_OBJ_ASK_DATA); +SWIG_LONG_CONSTANT(STORED_OBJ_OFFER_LIST_MARKET, OTDB::STORED_OBJ_OFFER_LIST_MARKET); +SWIG_LONG_CONSTANT(STORED_OBJ_TRADE_DATA_MARKET, OTDB::STORED_OBJ_TRADE_DATA_MARKET); +SWIG_LONG_CONSTANT(STORED_OBJ_TRADE_LIST_MARKET, OTDB::STORED_OBJ_TRADE_LIST_MARKET); +SWIG_LONG_CONSTANT(STORED_OBJ_OFFER_DATA_NYM, OTDB::STORED_OBJ_OFFER_DATA_NYM); +SWIG_LONG_CONSTANT(STORED_OBJ_OFFER_LIST_NYM, OTDB::STORED_OBJ_OFFER_LIST_NYM); +SWIG_LONG_CONSTANT(STORED_OBJ_TRADE_DATA_NYM, OTDB::STORED_OBJ_TRADE_DATA_NYM); +SWIG_LONG_CONSTANT(STORED_OBJ_TRADE_LIST_NYM, OTDB::STORED_OBJ_TRADE_LIST_NYM); +SWIG_LONG_CONSTANT(STORED_OBJ_ERROR, OTDB::STORED_OBJ_ERROR); +/* end cinit subsection */ + + return SUCCESS; +} + +PHP_RINIT_FUNCTION(otapi) +{ +/* rinit section */ + +/* vinit subsection */ +/* end vinit subsection */ + + return SUCCESS; +} + +PHP_MSHUTDOWN_FUNCTION(otapi) +{ +/* shutdown section */ +#ifdef ZTS + ts_free_id(otapi_globals_id); +#endif + return SUCCESS; +} + +PHP_RSHUTDOWN_FUNCTION(otapi) +{ +/* rshutdown section */ + + return SUCCESS; +} + +PHP_MINFO_FUNCTION(otapi) +{ +} +/* end init section */ diff --git a/testwallet/OTAPI_php.h b/testwallet/OTAPI_php.h new file mode 100644 index 000000000..83843c07f --- /dev/null +++ b/testwallet/OTAPI_php.h @@ -0,0 +1,23 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_OTAPI_WRAP_H_ +#define SWIG_OTAPI_WRAP_H_ + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + SwigDirector_OTCallback(zval *self); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); +}; + +#endif diff --git a/testwallet/OTAPI_python.cpp b/testwallet/OTAPI_python.cpp new file mode 100644 index 000000000..5913dec09 --- /dev/null +++ b/testwallet/OTAPI_python.cpp @@ -0,0 +1,29811 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGPYTHON +#define SWIG_DIRECTORS +#define SWIG_PYTHON_DIRECTOR_NO_VTABLE + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + + +/* Python.h has to appear first */ +#include + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* Compatibility macros for Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + +#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) +#define PyInt_Check(x) PyLong_Check(x) +#define PyInt_AsLong(x) PyLong_AsLong(x) +#define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyString_Check(name) PyBytes_Check(name) +#define PyString_FromString(x) PyUnicode_FromString(x) +#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) +#define PyString_AsString(str) PyBytes_AsString(str) +#define PyString_Size(str) PyBytes_Size(str) +#define PyString_InternFromString(key) PyUnicode_InternFromString(key) +#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE +#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) +#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) + +#endif + +#ifndef Py_TYPE +# define Py_TYPE(op) ((op)->ob_type) +#endif + +/* SWIG APIs for compatibility of both Python 2 & 3 */ + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_FromFormat PyUnicode_FromFormat +#else +# define SWIG_Python_str_FromFormat PyString_FromFormat +#endif + + +/* Warning: This function will allocate a new string in Python 3, + * so please call SWIG_Python_str_DelForPy3(x) to free the space. + */ +SWIGINTERN char* +SWIG_Python_str_AsChar(PyObject *str) +{ +#if PY_VERSION_HEX >= 0x03000000 + char *cstr; + char *newstr; + Py_ssize_t len; + str = PyUnicode_AsUTF8String(str); + PyBytes_AsStringAndSize(str, &cstr, &len); + newstr = (char *) malloc(len+1); + memcpy(newstr, cstr, len+1); + Py_XDECREF(str); + return newstr; +#else + return PyString_AsString(str); +#endif +} + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#else +# define SWIG_Python_str_DelForPy3(x) +#endif + + +SWIGINTERN PyObject* +SWIG_Python_str_FromChar(const char *c) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromString(c); +#else + return PyString_FromString(c); +#endif +} + +/* Add PyOS_snprintf for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# define PyOS_snprintf _snprintf +# else +# define PyOS_snprintf snprintf +# endif +#endif + +/* A crude PyString_FromFormat implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 + +#ifndef SWIG_PYBUFFER_SIZE +# define SWIG_PYBUFFER_SIZE 1024 +#endif + +static PyObject * +PyString_FromFormat(const char *fmt, ...) { + va_list ap; + char buf[SWIG_PYBUFFER_SIZE * 2]; + int res; + va_start(ap, fmt); + res = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); +} +#endif + +/* Add PyObject_Del for old Pythons */ +#if PY_VERSION_HEX < 0x01060000 +# define PyObject_Del(op) PyMem_DEL((op)) +#endif +#ifndef PyObject_DEL +# define PyObject_DEL PyObject_Del +#endif + +/* A crude PyExc_StopIteration exception for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# ifndef PyExc_StopIteration +# define PyExc_StopIteration PyExc_RuntimeError +# endif +# ifndef PyObject_GenericGetAttr +# define PyObject_GenericGetAttr 0 +# endif +#endif + +/* Py_NotImplemented is defined in 2.1 and up. */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef Py_NotImplemented +# define Py_NotImplemented PyExc_RuntimeError +# endif +#endif + +/* A crude PyString_AsStringAndSize implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef PyString_AsStringAndSize +# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} +# endif +#endif + +/* PySequence_Size for old Pythons */ +#if PY_VERSION_HEX < 0x02000000 +# ifndef PySequence_Size +# define PySequence_Size PySequence_Length +# endif +#endif + +/* PyBool_FromLong for old Pythons */ +#if PY_VERSION_HEX < 0x02030000 +static +PyObject *PyBool_FromLong(long ok) +{ + PyObject *result = ok ? Py_True : Py_False; + Py_INCREF(result); + return result; +} +#endif + +/* Py_ssize_t for old Pythons */ +/* This code is as recommended by: */ +/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intintargfunc ssizessizeargfunc; +typedef intobjargproc ssizeobjargproc; +typedef intintobjargproc ssizessizeobjargproc; +typedef getreadbufferproc readbufferproc; +typedef getwritebufferproc writebufferproc; +typedef getsegcountproc segcountproc; +typedef getcharbufferproc charbufferproc; +static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) +{ + long result = 0; + PyObject *i = PyNumber_Int(x); + if (i) { + result = PyInt_AsLong(i); + Py_DECREF(i); + } + return result; +} +#endif + +#if PY_VERSION_HEX < 0x02040000 +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef struct { + PyTypeObject type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; + PyBufferProcs as_buffer; + PyObject *name, *slots; +} PyHeapTypeObject; +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef destructor freefunc; +#endif + +#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ + (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ + (PY_MAJOR_VERSION > 3)) +# define SWIGPY_USE_CAPSULE +# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#endif + +#if PY_VERSION_HEX < 0x03020000 +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIME PyObject* +SWIG_Python_ErrorType(int code) { + PyObject* type = 0; + switch(code) { + case SWIG_MemoryError: + type = PyExc_MemoryError; + break; + case SWIG_IOError: + type = PyExc_IOError; + break; + case SWIG_RuntimeError: + type = PyExc_RuntimeError; + break; + case SWIG_IndexError: + type = PyExc_IndexError; + break; + case SWIG_TypeError: + type = PyExc_TypeError; + break; + case SWIG_DivisionByZero: + type = PyExc_ZeroDivisionError; + break; + case SWIG_OverflowError: + type = PyExc_OverflowError; + break; + case SWIG_SyntaxError: + type = PyExc_SyntaxError; + break; + case SWIG_ValueError: + type = PyExc_ValueError; + break; + case SWIG_SystemError: + type = PyExc_SystemError; + break; + case SWIG_AttributeError: + type = PyExc_AttributeError; + break; + default: + type = PyExc_RuntimeError; + } + return type; +} + + +SWIGRUNTIME void +SWIG_Python_AddErrorMsg(const char* mesg) +{ + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + + if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + PyErr_Clear(); + Py_XINCREF(type); + + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + Py_DECREF(value); + } else { + PyErr_SetString(PyExc_RuntimeError, mesg); + } +} + +#if defined(SWIG_PYTHON_NO_THREADS) +# if defined(SWIG_PYTHON_THREADS) +# undef SWIG_PYTHON_THREADS +# endif +#endif +#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ +# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) +# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ +# define SWIG_PYTHON_USE_GIL +# endif +# endif +# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif +# ifdef __cplusplus /* C++ code */ + class SWIG_Python_Thread_Block { + bool status; + PyGILState_STATE state; + public: + void end() { if (status) { PyGILState_Release(state); status = false;} } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} + ~SWIG_Python_Thread_Block() { end(); } + }; + class SWIG_Python_Thread_Allow { + bool status; + PyThreadState *save; + public: + void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} + ~SWIG_Python_Thread_Allow() { end(); } + }; +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block +# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow +# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() +# else /* C code */ +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() +# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() +# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) +# endif +# else /* Old thread way, not implemented, user must provide it */ +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) +# define SWIG_PYTHON_THREAD_END_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# endif +# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) +# define SWIG_PYTHON_THREAD_END_ALLOW +# endif +# endif +#else /* No thread support */ +# define SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# define SWIG_PYTHON_THREAD_END_BLOCK +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# define SWIG_PYTHON_THREAD_END_ALLOW +#endif + +/* ----------------------------------------------------------------------------- + * Python API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_PY_POINTER 4 +#define SWIG_PY_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +#if PY_VERSION_HEX >= 0x03000000 +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) +{ + return PyInstanceMethod_New(func); +} +#else +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) +{ + return NULL; +} +#endif + +#ifdef __cplusplus +} +#endif + + +/* ----------------------------------------------------------------------------- + * pyrun.swg + * + * This file contains the runtime support for Python modules + * and includes code for managing global variables and pointer + * type checking. + * + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) + +#ifdef SWIGPYTHON_BUILTIN +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) +#else +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) +#endif + +#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) + +#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) +#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) +#define swig_owntype int + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Python_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) + +#define SWIG_SetErrorObj SWIG_Python_SetErrorObj +#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg +#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Runtime API implementation */ + +/* Error manipulation */ + +SWIGINTERN void +SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetObject(errtype, obj); + Py_DECREF(obj); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +SWIGINTERN void +SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetString(errtype, (char *) msg); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) + +/* Set a constant value */ + +#if defined(SWIGPYTHON_BUILTIN) + +SWIGINTERN void +SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { + PyObject *s = PyString_InternFromString(key); + PyList_Append(seq, s); + Py_DECREF(s); +} + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { + PyDict_SetItemString(d, (char *)name, obj); + Py_DECREF(obj); + if (public_interface) + SwigPyBuiltin_AddPublicSymbol(public_interface, name); +} + +#else + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { + PyDict_SetItemString(d, (char *)name, obj); + Py_DECREF(obj); +} + +#endif + +/* Append a value to the result obj */ + +SWIGINTERN PyObject* +SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { +#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyList_Check(result)) { + PyObject *o2 = result; + result = PyList_New(1); + PyList_SetItem(result, 0, o2); + } + PyList_Append(result,obj); + Py_DECREF(obj); + } + return result; +#else + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SET_ITEM(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; +#endif +} + +/* Unpack the argument tuple */ + +SWIGINTERN int +SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) +{ + if (!args) { + if (!min && !max) { + return 1; + } else { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", + name, (min == max ? "" : "at least "), (int)min); + return 0; + } + } + if (!PyTuple_Check(args)) { + if (min <= 1 && max >= 1) { + register int i; + objs[0] = args; + for (i = 1; i < max; ++i) { + objs[i] = 0; + } + return 2; + } + PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); + return 0; + } else { + register Py_ssize_t l = PyTuple_GET_SIZE(args); + if (l < min) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), (int)min, (int)l); + return 0; + } else if (l > max) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), (int)max, (int)l); + return 0; + } else { + register int i; + for (i = 0; i < l; ++i) { + objs[i] = PyTuple_GET_ITEM(args, i); + } + for (; l < max; ++l) { + objs[l] = 0; + } + return i + 1; + } + } +} + +/* A functor is a function object with one single object argument */ +#if PY_VERSION_HEX >= 0x02020000 +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); +#else +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); +#endif + +/* + Helper for static pointer initialization for both C and C++ code, for example + static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); +*/ +#ifdef __cplusplus +#define SWIG_STATIC_POINTER(var) var +#else +#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var +#endif + +/* ----------------------------------------------------------------------------- + * Pointer declarations + * ----------------------------------------------------------------------------- */ + +/* Flags for new pointer objects */ +#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) +#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) + +#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) + +#define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) +#define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) + +#ifdef __cplusplus +extern "C" { +#endif + +/* How to access Py_None */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# ifndef SWIG_PYTHON_NO_BUILD_NONE +# ifndef SWIG_PYTHON_BUILD_NONE +# define SWIG_PYTHON_BUILD_NONE +# endif +# endif +#endif + +#ifdef SWIG_PYTHON_BUILD_NONE +# ifdef Py_None +# undef Py_None +# define Py_None SWIG_Py_None() +# endif +SWIGRUNTIMEINLINE PyObject * +_SWIG_Py_None(void) +{ + PyObject *none = Py_BuildValue((char*)""); + Py_DECREF(none); + return none; +} +SWIGRUNTIME PyObject * +SWIG_Py_None(void) +{ + static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); + return none; +} +#endif + +/* The python void return value */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Py_Void(void) +{ + PyObject *none = Py_None; + Py_INCREF(none); + return none; +} + +/* SwigPyClientData */ + +typedef struct { + PyObject *klass; + PyObject *newraw; + PyObject *newargs; + PyObject *destroy; + int delargs; + int implicitconv; + PyTypeObject *pytype; +} SwigPyClientData; + +SWIGRUNTIMEINLINE int +SWIG_Python_CheckImplicit(swig_type_info *ty) +{ + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; + return data ? data->implicitconv : 0; +} + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_ExceptionType(swig_type_info *desc) { + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; + PyObject *klass = data ? data->klass : 0; + return (klass ? klass : PyExc_RuntimeError); +} + + +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) +{ + if (!obj) { + return 0; + } else { + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); + /* the klass element */ + data->klass = obj; + Py_INCREF(data->klass); + /* the newraw method and newargs arguments used to create a new raw instance */ + if (PyClass_Check(obj)) { + data->newraw = 0; + data->newargs = obj; + Py_INCREF(obj); + } else { +#if (PY_VERSION_HEX < 0x02020000) + data->newraw = 0; +#else + data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); +#endif + if (data->newraw) { + Py_INCREF(data->newraw); + data->newargs = PyTuple_New(1); + PyTuple_SetItem(data->newargs, 0, obj); + } else { + data->newargs = obj; + } + Py_INCREF(data->newargs); + } + /* the destroy method, aka as the C++ delete method */ + data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); + if (PyErr_Occurred()) { + PyErr_Clear(); + data->destroy = 0; + } + if (data->destroy) { + int flags; + Py_INCREF(data->destroy); + flags = PyCFunction_GET_FLAGS(data->destroy); +#ifdef METH_O + data->delargs = !(flags & (METH_O)); +#else + data->delargs = 0; +#endif + } else { + data->delargs = 0; + } + data->implicitconv = 0; + data->pytype = 0; + return data; + } +} + +SWIGRUNTIME void +SwigPyClientData_Del(SwigPyClientData *data) { + Py_XDECREF(data->newraw); + Py_XDECREF(data->newargs); + Py_XDECREF(data->destroy); +} + +/* =============== SwigPyObject =====================*/ + +typedef struct { + PyObject_HEAD + void *ptr; + swig_type_info *ty; + int own; + PyObject *next; +#ifdef SWIGPYTHON_BUILTIN + PyObject *dict; +#endif +} SwigPyObject; + +SWIGRUNTIME PyObject * +SwigPyObject_long(SwigPyObject *v) +{ + return PyLong_FromVoidPtr(v->ptr); +} + +SWIGRUNTIME PyObject * +SwigPyObject_format(const char* fmt, SwigPyObject *v) +{ + PyObject *res = NULL; + PyObject *args = PyTuple_New(1); + if (args) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { + PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + if (ofmt) { +#if PY_VERSION_HEX >= 0x03000000 + res = PyUnicode_Format(ofmt,args); +#else + res = PyString_Format(ofmt,args); +#endif + Py_DECREF(ofmt); + } + Py_DECREF(args); + } + } + return res; +} + +SWIGRUNTIME PyObject * +SwigPyObject_oct(SwigPyObject *v) +{ + return SwigPyObject_format("%o",v); +} + +SWIGRUNTIME PyObject * +SwigPyObject_hex(SwigPyObject *v) +{ + return SwigPyObject_format("%x",v); +} + +SWIGRUNTIME PyObject * +#ifdef METH_NOARGS +SwigPyObject_repr(SwigPyObject *v) +#else +SwigPyObject_repr(SwigPyObject *v, PyObject *args) +#endif +{ + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *repr = SWIG_Python_str_FromFormat("", name, (void *)v); + if (v->next) { +# ifdef METH_NOARGS + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); +# else + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); +# endif +# if PY_VERSION_HEX >= 0x03000000 + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; +# else + PyString_ConcatAndDel(&repr,nrep); +# endif + } + return repr; +} + +SWIGRUNTIME int +SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char *str; +#ifdef METH_NOARGS + PyObject *repr = SwigPyObject_repr(v); +#else + PyObject *repr = SwigPyObject_repr(v, NULL); +#endif + if (repr) { + str = SWIG_Python_str_AsChar(repr); + fputs(str, fp); + SWIG_Python_str_DelForPy3(str); + Py_DECREF(repr); + return 0; + } else { + return 1; + } +} + +SWIGRUNTIME PyObject * +SwigPyObject_str(SwigPyObject *v) +{ + char result[SWIG_BUFFER_SIZE]; + return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? + SWIG_Python_str_FromChar(result) : 0; +} + +SWIGRUNTIME int +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +/* Added for Python 3.x, would it also be useful for Python 2.x? */ +SWIGRUNTIME PyObject* +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) +{ + PyObject* res; + if( op != Py_EQ && op != Py_NE ) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); + return res; +} + + +SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); + +#ifdef SWIGPYTHON_BUILTIN +static swig_type_info *SwigPyObject_stype = 0; +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + SwigPyClientData *cd; + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + assert(cd); + assert(cd->pytype); + return cd->pytype; +} +#else +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); + return type; +} +#endif + +SWIGRUNTIMEINLINE int +SwigPyObject_Check(PyObject *op) { +#ifdef SWIGPYTHON_BUILTIN + PyTypeObject *target_tp = SwigPyObject_type(); + if (PyType_IsSubtype(op->ob_type, target_tp)) + return 1; + return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); +#else + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); +#endif +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); + +SWIGRUNTIME void +SwigPyObject_dealloc(PyObject *v) +{ + SwigPyObject *sobj = (SwigPyObject *) v; + PyObject *next = sobj->next; + if (sobj->own == SWIG_POINTER_OWN) { + swig_type_info *ty = sobj->ty; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + PyObject *destroy = data ? data->destroy : 0; + if (destroy) { + /* destroy is always a VARARGS method */ + PyObject *res; + if (data->delargs) { + /* we need to create a temporary object to carry the destroy operation */ + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); + res = SWIG_Python_CallFunctor(destroy, tmp); + Py_DECREF(tmp); + } else { + PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); + PyObject *mself = PyCFunction_GET_SELF(destroy); + res = ((*meth)(mself, v)); + } + Py_XDECREF(res); + } +#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) + else { + const char *name = SWIG_TypePrettyName(ty); + printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); + } +#endif + } + Py_XDECREF(next); + PyObject_DEL(v); +} + +SWIGRUNTIME PyObject* +SwigPyObject_append(PyObject* v, PyObject* next) +{ + SwigPyObject *sobj = (SwigPyObject *) v; +#ifndef METH_O + PyObject *tmp = 0; + if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; + next = tmp; +#endif + if (!SwigPyObject_Check(next)) { + return NULL; + } + sobj->next = next; + Py_INCREF(next); + return SWIG_Py_Void(); +} + +SWIGRUNTIME PyObject* +#ifdef METH_NOARGS +SwigPyObject_next(PyObject* v) +#else +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *) v; + if (sobj->next) { + Py_INCREF(sobj->next); + return sobj->next; + } else { + return SWIG_Py_Void(); + } +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_disown(PyObject *v) +#else +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = 0; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_acquire(PyObject *v) +#else +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = SWIG_POINTER_OWN; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +SwigPyObject_own(PyObject *v, PyObject *args) +{ + PyObject *val = 0; +#if (PY_VERSION_HEX < 0x02020000) + if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) +#else + if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) +#endif + { + return NULL; + } + else + { + SwigPyObject *sobj = (SwigPyObject *)v; + PyObject *obj = PyBool_FromLong(sobj->own); + if (val) { +#ifdef METH_NOARGS + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v); + } else { + SwigPyObject_disown(v); + } +#else + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v,args); + } else { + SwigPyObject_disown(v,args); + } +#endif + } + return obj; + } +} + +#ifdef METH_O +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#else +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#endif + +#if PY_VERSION_HEX < 0x02020000 +SWIGINTERN PyObject * +SwigPyObject_getattr(SwigPyObject *sobj,char *name) +{ + return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); +} +#endif + +SWIGRUNTIME PyTypeObject* +SwigPyObject_TypeOnce(void) { + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + + static PyNumberMethods SwigPyObject_as_number = { + (binaryfunc)0, /*nb_add*/ + (binaryfunc)0, /*nb_subtract*/ + (binaryfunc)0, /*nb_multiply*/ + /* nb_divide removed in Python 3 */ +#if PY_VERSION_HEX < 0x03000000 + (binaryfunc)0, /*nb_divide*/ +#endif + (binaryfunc)0, /*nb_remainder*/ + (binaryfunc)0, /*nb_divmod*/ + (ternaryfunc)0,/*nb_power*/ + (unaryfunc)0, /*nb_negative*/ + (unaryfunc)0, /*nb_positive*/ + (unaryfunc)0, /*nb_absolute*/ + (inquiry)0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ +#if PY_VERSION_HEX < 0x03000000 + 0, /*nb_coerce*/ +#endif + (unaryfunc)SwigPyObject_long, /*nb_int*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_long, /*nb_long*/ +#else + 0, /*nb_reserved*/ +#endif + (unaryfunc)0, /*nb_float*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_oct, /*nb_oct*/ + (unaryfunc)SwigPyObject_hex, /*nb_hex*/ +#endif +#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ +#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ +#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ +#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ + 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ +#endif + }; + + static PyTypeObject swigpyobject_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyObject", /* tp_name */ + sizeof(SwigPyObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyObject_dealloc, /* tp_dealloc */ + (printfunc)SwigPyObject_print, /* tp_print */ +#if PY_VERSION_HEX < 0x02020000 + (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ +#else + (getattrfunc)0, /* tp_getattr */ +#endif + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX >= 0x03000000 + 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ +#else + (cmpfunc)SwigPyObject_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyObject_repr, /* tp_repr */ + &SwigPyObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyObject_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpyobject_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpyobject_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpyobject_type) < 0) + return NULL; +#endif + } + return &swigpyobject_type; +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own) +{ + SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + if (sobj) { + sobj->ptr = ptr; + sobj->ty = ty; + sobj->own = own; + sobj->next = 0; + } + return (PyObject *)sobj; +} + +/* ----------------------------------------------------------------------------- + * Implements a simple Swig Packed type, and use it instead of string + * ----------------------------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + void *pack; + swig_type_info *ty; + size_t size; +} SwigPyPacked; + +SWIGRUNTIME int +SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char result[SWIG_BUFFER_SIZE]; + fputs("pack, v->size, 0, sizeof(result))) { + fputs("at ", fp); + fputs(result, fp); + } + fputs(v->ty->name,fp); + fputs(">", fp); + return 0; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_repr(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + return SWIG_Python_str_FromFormat("", result, v->ty->name); + } else { + return SWIG_Python_str_FromFormat("", v->ty->name); + } +} + +SWIGRUNTIME PyObject * +SwigPyPacked_str(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ + return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); + } else { + return SWIG_Python_str_FromChar(v->ty->name); + } +} + +SWIGRUNTIME int +SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) +{ + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyPacked_Check(PyObject *op) { + return ((op)->ob_type == SwigPyPacked_TypeOnce()) + || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); +} + +SWIGRUNTIME void +SwigPyPacked_dealloc(PyObject *v) +{ + if (SwigPyPacked_Check(v)) { + SwigPyPacked *sobj = (SwigPyPacked *) v; + free(sobj->pack); + } + PyObject_DEL(v); +} + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_TypeOnce(void) { + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyTypeObject swigpypacked_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX>=0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyPacked", /* tp_name */ + sizeof(SwigPyPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ + (printfunc)SwigPyPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX>=0x03000000 + 0, /* tp_reserved in 3.0.1 */ +#else + (cmpfunc)SwigPyPacked_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + swigpypacked_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpypacked_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpypacked_type) < 0) + return NULL; +#endif + } + return &swigpypacked_type; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) +{ + SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + if (sobj) { + void *pack = malloc(size); + if (pack) { + memcpy(pack, ptr, size); + sobj->pack = pack; + sobj->ty = ty; + sobj->size = size; + } else { + PyObject_DEL((PyObject *) sobj); + sobj = 0; + } + } + return (PyObject *) sobj; +} + +SWIGRUNTIME swig_type_info * +SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) +{ + if (SwigPyPacked_Check(obj)) { + SwigPyPacked *sobj = (SwigPyPacked *)obj; + if (sobj->size != size) return 0; + memcpy(ptr, sobj->pack, size); + return sobj->ty; + } else { + return 0; + } +} + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIMEINLINE PyObject * +_SWIG_This(void) +{ + return SWIG_Python_str_FromChar("this"); +} + +static PyObject *swig_this = NULL; + +SWIGRUNTIME PyObject * +SWIG_This(void) +{ + if (swig_this == NULL) + swig_this = _SWIG_This(); + return swig_this; +} + +/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ + +/* TODO: I don't know how to implement the fast getset in Python 3 right now */ +#if PY_VERSION_HEX>=0x03000000 +#define SWIG_PYTHON_SLOW_GETSET_THIS +#endif + +SWIGRUNTIME SwigPyObject * +SWIG_Python_GetSwigThis(PyObject *pyobj) +{ + PyObject *obj; + + if (SwigPyObject_Check(pyobj)) + return (SwigPyObject *) pyobj; + +#ifdef SWIGPYTHON_BUILTIN + (void)obj; +# ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + pyobj = PyWeakref_GET_OBJECT(pyobj); + if (pyobj && SwigPyObject_Check(pyobj)) + return (SwigPyObject*) pyobj; + } +# endif + return NULL; +#else + + obj = 0; + +#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) + if (PyInstance_Check(pyobj)) { + obj = _PyInstance_Lookup(pyobj, SWIG_This()); + } else { + PyObject **dictptr = _PyObject_GetDictPtr(pyobj); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; + } else { +#ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); + return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; + } +#endif + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } + } + } +#else + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } +#endif + if (obj && !SwigPyObject_Check(obj)) { + /* a PyObject is called 'this', try to get the 'real this' + SwigPyObject from it */ + return SWIG_Python_GetSwigThis(obj); + } + return (SwigPyObject *)obj; +#endif +} + +/* Acquire a pointer value */ + +SWIGRUNTIME int +SWIG_Python_AcquirePtr(PyObject *obj, int own) { + if (own == SWIG_POINTER_OWN) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (sobj) { + int oldown = sobj->own; + sobj->own = own; + return oldown; + } + } + return 0; +} + +/* Convert a pointer value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { + int res; + SwigPyObject *sobj; + + if (!obj) + return SWIG_ERROR; + if (obj == Py_None) { + if (ptr) + *ptr = 0; + return SWIG_OK; + } + + res = SWIG_ERROR; + + sobj = SWIG_Python_GetSwigThis(obj); + if (own) + *own = 0; + while (sobj) { + void *vptr = sobj->ptr; + if (ty) { + swig_type_info *to = sobj->ty; + if (to == ty) { + /* no type cast needed */ + if (ptr) *ptr = vptr; + break; + } else { + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) { + sobj = (SwigPyObject *)sobj->next; + } else { + if (ptr) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + break; + } + } + } else { + if (ptr) *ptr = vptr; + break; + } + } + if (sobj) { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + res = SWIG_OK; + } else { + if (flags & SWIG_POINTER_IMPLICIT_CONV) { + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + if (data && !data->implicitconv) { + PyObject *klass = data->klass; + if (klass) { + PyObject *impconv; + data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ + impconv = SWIG_Python_CallFunctor(klass, obj); + data->implicitconv = 0; + if (PyErr_Occurred()) { + PyErr_Clear(); + impconv = 0; + } + if (impconv) { + SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); + if (iobj) { + void *vptr; + res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); + if (SWIG_IsOK(res)) { + if (ptr) { + *ptr = vptr; + /* transfer the ownership to 'ptr' */ + iobj->own = 0; + res = SWIG_AddCast(res); + res = SWIG_AddNewMask(res); + } else { + res = SWIG_AddCast(res); + } + } + } + Py_DECREF(impconv); + } + } + } + } + } + return res; +} + +/* Convert a function ptr value */ + +SWIGRUNTIME int +SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + if (!PyCFunction_Check(obj)) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; + + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) + return SWIG_ERROR; + if (ty) { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; + } + } else { + *ptr = vptr; + } + return SWIG_OK; + } +} + +/* Convert a packed value value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { + swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); + if (!to) return SWIG_ERROR; + if (ty) { + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) return SWIG_ERROR; + } + } + return SWIG_OK; +} + +/* ----------------------------------------------------------------------------- + * Create a new pointer object + * ----------------------------------------------------------------------------- */ + +/* + Create a new instance object, without calling __init__, and set the + 'this' attribute. +*/ + +SWIGRUNTIME PyObject* +SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) +{ +#if (PY_VERSION_HEX >= 0x02020000) + PyObject *inst = 0; + PyObject *newraw = data->newraw; + if (newraw) { + inst = PyObject_Call(newraw, data->newargs, NULL); + if (inst) { +#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + PyDict_SetItem(dict, SWIG_This(), swig_this); + } + } +#else + PyObject *key = SWIG_This(); + PyObject_SetAttr(inst, key, swig_this); +#endif + } + } else { +#if PY_VERSION_HEX >= 0x03000000 + inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); + PyObject_SetAttr(inst, SWIG_This(), swig_this); + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; +#else + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); +#endif + } + return inst; +#else +#if (PY_VERSION_HEX >= 0x02010000) + PyObject *inst; + PyObject *dict = PyDict_New(); + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + return (PyObject *) inst; +#else + PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); + if (inst == NULL) { + return NULL; + } + inst->in_class = (PyClassObject *)data->newargs; + Py_INCREF(inst->in_class); + inst->in_dict = PyDict_New(); + if (inst->in_dict == NULL) { + Py_DECREF(inst); + return NULL; + } +#ifdef Py_TPFLAGS_HAVE_WEAKREFS + inst->in_weakreflist = NULL; +#endif +#ifdef Py_TPFLAGS_GC + PyObject_GC_Init(inst); +#endif + PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); + return (PyObject *) inst; +#endif +#endif +} + +SWIGRUNTIME void +SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) +{ + PyObject *dict; +#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + PyDict_SetItem(dict, SWIG_This(), swig_this); + return; + } +#endif + dict = PyObject_GetAttrString(inst, (char*)"__dict__"); + PyDict_SetItem(dict, SWIG_This(), swig_this); + Py_DECREF(dict); +} + + +SWIGINTERN PyObject * +SWIG_Python_InitShadowInstance(PyObject *args) { + PyObject *obj[2]; + if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) { + return NULL; + } else { + SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); + if (sthis) { + SwigPyObject_append((PyObject*) sthis, obj[1]); + } else { + SWIG_Python_SetSwigThis(obj[0], obj[1]); + } + return SWIG_Py_Void(); + } +} + +/* Create a new pointer object */ + +SWIGRUNTIME PyObject * +SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { + SwigPyClientData *clientdata; + PyObject * robj; + int own; + + if (!ptr) + return SWIG_Py_Void(); + + clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; + own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; + if (clientdata && clientdata->pytype) { + SwigPyObject *newobj; + if (flags & SWIG_BUILTIN_TP_INIT) { + newobj = (SwigPyObject*) self; + if (newobj->ptr) { + PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); + while (newobj->next) + newobj = (SwigPyObject *) newobj->next; + newobj->next = next_self; + newobj = (SwigPyObject *)next_self; + } + } else { + newobj = PyObject_New(SwigPyObject, clientdata->pytype); + } + if (newobj) { + newobj->ptr = ptr; + newobj->ty = type; + newobj->own = own; + newobj->next = 0; +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + return (PyObject*) newobj; + } + return SWIG_Py_Void(); + } + + assert(!(flags & SWIG_BUILTIN_TP_INIT)); + + robj = SwigPyObject_New(ptr, type, own); + if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { + PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); + if (inst) { + Py_DECREF(robj); + robj = inst; + } + } + return robj; +} + +/* Create a new packed object */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { + return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +#ifdef SWIG_LINK_RUNTIME +void *SWIG_ReturnGlobalTypeList(void *); +#endif + +SWIGRUNTIME swig_module_info * +SWIG_Python_GetModule(void) { + static void *type_pointer = (void *)0; + /* first check if module already created */ + if (!type_pointer) { +#ifdef SWIG_LINK_RUNTIME + type_pointer = SWIG_ReturnGlobalTypeList((void *)0); +#else +# ifdef SWIGPY_USE_CAPSULE + type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); +# else + type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); +# endif + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; + } +#endif + } + return (swig_module_info *) type_pointer; +} + +#if PY_MAJOR_VERSION < 2 +/* PyModule_AddObject function was introduced in Python 2.0. The following function + is copied out of Python/modsupport.c in python version 2.3.4 */ +SWIGINTERN int +PyModule_AddObject(PyObject *m, char *name, PyObject *o) +{ + PyObject *dict; + if (!PyModule_Check(m)) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs module as first arg"); + return SWIG_ERROR; + } + if (!o) { + PyErr_SetString(PyExc_TypeError, + "PyModule_AddObject() needs non-NULL value"); + return SWIG_ERROR; + } + + dict = PyModule_GetDict(m); + if (dict == NULL) { + /* Internal error -- modules must have a dict! */ + PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", + PyModule_GetName(m)); + return SWIG_ERROR; + } + if (PyDict_SetItemString(dict, name, o)) + return SWIG_ERROR; + Py_DECREF(o); + return SWIG_OK; +} +#endif + +SWIGRUNTIME void +#ifdef SWIGPY_USE_CAPSULE +SWIG_Python_DestroyModule(PyObject *obj) +#else +SWIG_Python_DestroyModule(void *vptr) +#endif +{ +#ifdef SWIGPY_USE_CAPSULE + swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); +#else + swig_module_info *swig_module = (swig_module_info *) vptr; +#endif + swig_type_info **types = swig_module->types; + size_t i; + for (i =0; i < swig_module->size; ++i) { + swig_type_info *ty = types[i]; + if (ty->owndata) { + SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + if (data) SwigPyClientData_Del(data); + } + } + Py_DECREF(SWIG_This()); + swig_this = NULL; +} + +SWIGRUNTIME void +SWIG_Python_SetModule(swig_module_info *swig_module) { +#if PY_VERSION_HEX >= 0x03000000 + /* Add a dummy module object into sys.modules */ + PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); +#else + static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ + PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); +#endif +#ifdef SWIGPY_USE_CAPSULE + PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#else + PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#endif +} + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + +SWIGRUNTIME swig_type_info * +SWIG_Python_TypeQuery(const char *type) +{ + PyObject *cache = SWIG_Python_TypeCache(); + PyObject *key = SWIG_Python_str_FromChar(type); + PyObject *obj = PyDict_GetItem(cache, key); + swig_type_info *descriptor; + if (obj) { +#ifdef SWIGPY_USE_CAPSULE + descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); +#else + descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); +#endif + } else { + swig_module_info *swig_module = SWIG_Python_GetModule(); + descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); + if (descriptor) { +#ifdef SWIGPY_USE_CAPSULE + obj = PyCapsule_New((void*) descriptor, NULL, NULL); +#else + obj = PyCObject_FromVoidPtr(descriptor, NULL); +#endif + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } + } + Py_DECREF(key); + return descriptor; +} + +/* + For backward compatibility only +*/ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) +#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) + +SWIGRUNTIME int +SWIG_Python_AddErrMesg(const char* mesg, int infront) +{ + if (PyErr_Occurred()) { + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + Py_XINCREF(type); + PyErr_Clear(); + if (infront) { + PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); + } else { + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + } + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + } + return 1; + } else { + return 0; + } +} + +SWIGRUNTIME int +SWIG_Python_ArgFail(int argnum) +{ + if (PyErr_Occurred()) { + /* add information about failing argument */ + char mesg[256]; + PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); + return SWIG_Python_AddErrMesg(mesg, 1); + } else { + return 0; + } +} + +SWIGRUNTIMEINLINE const char * +SwigPyObject_GetDesc(PyObject *self) +{ + SwigPyObject *v = (SwigPyObject *)self; + swig_type_info *ty = v ? v->ty : 0; + return ty ? ty->str : (char*)""; +} + +SWIGRUNTIME void +SWIG_Python_TypeError(const char *type, PyObject *obj) +{ + if (type) { +#if defined(SWIG_COBJECT_TYPES) + if (obj && SwigPyObject_Check(obj)) { + const char *otype = (const char *) SwigPyObject_GetDesc(obj); + if (otype) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", + type, otype); + return; + } + } else +#endif + { + const char *otype = (obj ? obj->ob_type->tp_name : 0); + if (otype) { + PyObject *str = PyObject_Str(obj); + const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + if (cstr) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", + type, otype, cstr); + SWIG_Python_str_DelForPy3(cstr); + } else { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", + type, otype); + } + Py_XDECREF(str); + return; + } + } + PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); + } else { + PyErr_Format(PyExc_TypeError, "unexpected type is received"); + } +} + + +/* Convert a pointer value, signal an exception on a type mismatch */ +SWIGRUNTIME void * +SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { + void *result; + if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { + PyErr_Clear(); +#if SWIG_POINTER_EXCEPTION + if (flags) { + SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); + SWIG_Python_ArgFail(argnum); + } +#endif + } + return result; +} + +SWIGRUNTIME int +SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { + PyTypeObject *tp = obj->ob_type; + PyObject *descr; + PyObject *encoded_name; + descrsetfunc f; + int res; + +#ifdef Py_USING_UNICODE + if (PyString_Check(name)) { + name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); + if (!name) + return -1; + } else if (!PyUnicode_Check(name)) +#else + if (!PyString_Check(name)) +#endif + { + PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); + return -1; + } else { + Py_INCREF(name); + } + + if (!tp->tp_dict) { + if (PyType_Ready(tp) < 0) + goto done; + } + + res = -1; + descr = _PyType_Lookup(tp, name); + f = NULL; + if (descr != NULL) + f = descr->ob_type->tp_descr_set; + if (!f) { + if (PyString_Check(name)) { + encoded_name = name; + Py_INCREF(name); + } else { + encoded_name = PyUnicode_AsUTF8String(name); + } + PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); + Py_DECREF(encoded_name); + } else { + res = f(descr, obj, value); + } + + done: + Py_DECREF(name); + return res; +} + + +#ifdef __cplusplus +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to Python extensions. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_DIRECTOR_PYTHON_HEADER_ +#define SWIG_DIRECTOR_PYTHON_HEADER_ + +#ifdef __cplusplus + +#include +#include +#include +#include +#include + + +/* + Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual + table', and avoid multiple GetAttr calls to retrieve the python + methods. +*/ + +#ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE +#ifndef SWIG_PYTHON_DIRECTOR_VTABLE +#define SWIG_PYTHON_DIRECTOR_VTABLE +#endif +#endif + + + +/* + Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the + Undefined Exception Handler provided by swift +*/ +#ifndef SWIG_DIRECTOR_NO_UEH +#ifndef SWIG_DIRECTOR_UEH +#define SWIG_DIRECTOR_UEH +#endif +#endif + + +/* + Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the + 'Swig' namespace. This could be useful for multi-modules projects. +*/ +#ifdef SWIG_DIRECTOR_STATIC +/* Force anonymous (static) namespace */ +#define Swig +#endif + + +/* + Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the + native C++ RTTI and dynamic_cast<>. But be aware that directors + could stop working when using this option. +*/ +#ifdef SWIG_DIRECTOR_NORTTI +/* + When we don't use the native C++ RTTI, we implement a minimal one + only for Directors. +*/ +# ifndef SWIG_DIRECTOR_RTDIR +# define SWIG_DIRECTOR_RTDIR +#include + +namespace Swig { + class Director; + SWIGINTERN std::map& get_rtdir_map() { + static std::map rtdir_map; + return rtdir_map; + } + + SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { + get_rtdir_map()[vptr] = rtdir; + } + + SWIGINTERNINLINE Director *get_rtdir(void *vptr) { + std::map::const_iterator pos = get_rtdir_map().find(vptr); + Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; + return rtdir; + } +} +# endif /* SWIG_DIRECTOR_RTDIR */ + +# define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) +# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) + +#else + +# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) +# define SWIG_DIRECTOR_RGTR(ARG1, ARG2) + +#endif /* SWIG_DIRECTOR_NORTTI */ + +extern "C" { + struct swig_type_info; +} + +namespace Swig { + + /* memory handler */ + struct GCItem + { + virtual ~GCItem() {} + + virtual int get_own() const + { + return 0; + } + }; + + struct GCItem_var + { + GCItem_var(GCItem *item = 0) : _item(item) + { + } + + GCItem_var& operator=(GCItem *item) + { + GCItem *tmp = _item; + _item = item; + delete tmp; + return *this; + } + + ~GCItem_var() + { + delete _item; + } + + GCItem * operator->() const + { + return _item; + } + + private: + GCItem *_item; + }; + + struct GCItem_Object : GCItem + { + GCItem_Object(int own) : _own(own) + { + } + + virtual ~GCItem_Object() + { + } + + int get_own() const + { + return _own; + } + + private: + int _own; + }; + + template + struct GCItem_T : GCItem + { + GCItem_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCItem_T() + { + delete _ptr; + } + + private: + Type *_ptr; + }; + + template + struct GCArray_T : GCItem + { + GCArray_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCArray_T() + { + delete[] _ptr; + } + + private: + Type *_ptr; + }; + + /* base class for director exceptions */ + class DirectorException { + protected: + std::string swig_msg; + public: + DirectorException(PyObject *error, const char* hdr ="", const char* msg ="") + : swig_msg(hdr) + { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + if (strlen(msg)) { + swig_msg += " "; + swig_msg += msg; + } + if (!PyErr_Occurred()) { + PyErr_SetString(error, getMessage()); + } + SWIG_PYTHON_THREAD_END_BLOCK; + } + + const char *getMessage() const + { + return swig_msg.c_str(); + } + + static void raise(PyObject *error, const char *msg) + { + throw DirectorException(error, msg); + } + + static void raise(const char *msg) + { + raise(PyExc_RuntimeError, msg); + } + }; + + /* unknown exception handler */ + class UnknownExceptionHandler + { +#ifdef SWIG_DIRECTOR_UEH + static void handler() { + try { + throw; + } catch (DirectorException& e) { + std::cerr << "SWIG Director exception caught:" << std::endl + << e.getMessage() << std::endl; + } catch (std::exception& e) { + std::cerr << "std::exception caught: "<< e.what() << std::endl; + } catch (...) { + std::cerr << "Unknown exception caught." << std::endl; + } + + std::cerr << std::endl + << "Python interpreter traceback:" << std::endl; + PyErr_Print(); + std::cerr << std::endl; + + std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl + << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl + << std::endl + << "Exception is being re-thrown, program will like abort/terminate." << std::endl; + throw; + } + + public: + + std::unexpected_handler old; + UnknownExceptionHandler(std::unexpected_handler nh = handler) + { + old = std::set_unexpected(nh); + } + + ~UnknownExceptionHandler() + { + std::set_unexpected(old); + } +#endif + }; + + /* type mismatch in the return value from a python method call */ + class DirectorTypeMismatchException : public Swig::DirectorException { + public: + DirectorTypeMismatchException(PyObject *error, const char* msg="") + : Swig::DirectorException(error, "SWIG director type mismatch", msg) + { + } + + DirectorTypeMismatchException(const char* msg="") + : Swig::DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) + { + } + + static void raise(PyObject *error, const char *msg) + { + throw DirectorTypeMismatchException(error, msg); + } + + static void raise(const char *msg) + { + throw DirectorTypeMismatchException(msg); + } + }; + + /* any python exception that occurs during a director method call */ + class DirectorMethodException : public Swig::DirectorException { + public: + DirectorMethodException(const char* msg = "") + : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorMethodException(msg); + } + }; + + /* attempt to call a pure virtual method via a director method */ + class DirectorPureVirtualException : public Swig::DirectorException + { + public: + DirectorPureVirtualException(const char* msg = "") + : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorPureVirtualException(msg); + } + }; + + +#if defined(SWIG_PYTHON_THREADS) +/* __THREAD__ is the old macro to activate some thread support */ +# if !defined(__THREAD__) +# define __THREAD__ 1 +# endif +#endif + +#ifdef __THREAD__ +# include "pythread.h" + class Guard + { + PyThread_type_lock & mutex_; + + public: + Guard(PyThread_type_lock & mutex) : mutex_(mutex) + { + PyThread_acquire_lock(mutex_, WAIT_LOCK); + } + + ~Guard() + { + PyThread_release_lock(mutex_); + } + }; +# define SWIG_GUARD(mutex) Guard _guard(mutex) +#else +# define SWIG_GUARD(mutex) +#endif + + /* director base class */ + class Director { + private: + /* pointer to the wrapped python object */ + PyObject* swig_self; + /* flag indicating whether the object is owned by python or c++ */ + mutable bool swig_disown_flag; + + /* decrement the reference count of the wrapped python object */ + void swig_decref() const { + if (swig_disown_flag) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + Py_DECREF(swig_self); + SWIG_PYTHON_THREAD_END_BLOCK; + } + } + + public: + /* wrap a python object, optionally taking ownership */ + Director(PyObject* self) : swig_self(self), swig_disown_flag(false) { + swig_incref(); + } + + + /* discard our reference at destruction */ + virtual ~Director() { + swig_decref(); + } + + + /* return a pointer to the wrapped python object */ + PyObject *swig_get_self() const { + return swig_self; + } + + /* acquire ownership of the wrapped python object (the sense of "disown" + * is from python) */ + void swig_disown() const { + if (!swig_disown_flag) { + swig_disown_flag=true; + swig_incref(); + } + } + + /* increase the reference count of the wrapped python object */ + void swig_incref() const { + if (swig_disown_flag) { + Py_INCREF(swig_self); + } + } + + /* methods to implement pseudo protected director members */ + virtual bool swig_get_inner(const char* /* swig_protected_method_name */) const { + return true; + } + + virtual void swig_set_inner(const char* /* swig_protected_method_name */, bool /* swig_val */) const { + } + + /* ownership management */ + private: + typedef std::map swig_ownership_map; + mutable swig_ownership_map swig_owner; +#ifdef __THREAD__ + static PyThread_type_lock swig_mutex_own; +#endif + + public: + template + void swig_acquire_ownership_array(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCArray_T(vptr); + } + } + + template + void swig_acquire_ownership(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_T(vptr); + } + } + + void swig_acquire_ownership_obj(void *vptr, int own) const + { + if (vptr && own) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_Object(own); + } + } + + int swig_release_ownership(void *vptr) const + { + int own = 0; + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_ownership_map::iterator iter = swig_owner.find(vptr); + if (iter != swig_owner.end()) { + own = iter->second->get_own(); + swig_owner.erase(iter); + } + } + return own; + } + + template + static PyObject* swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) + { + SwigPyObject *sobj = (SwigPyObject *)pyobj; + sobj->own = 0; + Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast(sobj->ptr)); + if (d) + d->swig_disown(); + return PyWeakref_NewProxy(pyobj, NULL); + } + + }; + +#ifdef __THREAD__ + PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); +#endif +} + +#endif /* __cplusplus */ + + +#endif + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_OTCallback swig_types[0] +#define SWIGTYPE_p_OTCaller swig_types[1] +#define SWIGTYPE_p_OTDB__Acct swig_types[2] +#define SWIGTYPE_p_OTDB__AddressBook swig_types[3] +#define SWIGTYPE_p_OTDB__AskData swig_types[4] +#define SWIGTYPE_p_OTDB__BidData swig_types[5] +#define SWIGTYPE_p_OTDB__BitcoinAcct swig_types[6] +#define SWIGTYPE_p_OTDB__BitcoinServer swig_types[7] +#define SWIGTYPE_p_OTDB__Blob swig_types[8] +#define SWIGTYPE_p_OTDB__Contact swig_types[9] +#define SWIGTYPE_p_OTDB__ContactAcct swig_types[10] +#define SWIGTYPE_p_OTDB__ContactNym swig_types[11] +#define SWIGTYPE_p_OTDB__Displayable swig_types[12] +#define SWIGTYPE_p_OTDB__LoomServer swig_types[13] +#define SWIGTYPE_p_OTDB__MarketData swig_types[14] +#define SWIGTYPE_p_OTDB__MarketList swig_types[15] +#define SWIGTYPE_p_OTDB__OTDBString swig_types[16] +#define SWIGTYPE_p_OTDB__OfferDataMarket swig_types[17] +#define SWIGTYPE_p_OTDB__OfferDataNym swig_types[18] +#define SWIGTYPE_p_OTDB__OfferListMarket swig_types[19] +#define SWIGTYPE_p_OTDB__OfferListNym swig_types[20] +#define SWIGTYPE_p_OTDB__RippleServer swig_types[21] +#define SWIGTYPE_p_OTDB__Server swig_types[22] +#define SWIGTYPE_p_OTDB__ServerInfo swig_types[23] +#define SWIGTYPE_p_OTDB__Storable swig_types[24] +#define SWIGTYPE_p_OTDB__Storage swig_types[25] +#define SWIGTYPE_p_OTDB__StringMap swig_types[26] +#define SWIGTYPE_p_OTDB__TradeDataMarket swig_types[27] +#define SWIGTYPE_p_OTDB__TradeDataNym swig_types[28] +#define SWIGTYPE_p_OTDB__TradeListMarket swig_types[29] +#define SWIGTYPE_p_OTDB__TradeListNym swig_types[30] +#define SWIGTYPE_p_OTDB__WalletData swig_types[31] +#define SWIGTYPE_p_OTPacker swig_types[32] +#define SWIGTYPE_p_char swig_types[33] +#define SWIGTYPE_p_std__mapT_std__string_std__string_t swig_types[34] +#define SWIGTYPE_p_std__vectorT_unsigned_char_t swig_types[35] +static swig_type_info *swig_types[37]; +static swig_module_info swig_module = {swig_types, 36, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#if (PY_VERSION_HEX <= 0x02000000) +# if !defined(SWIG_PYTHON_CLASSIC) +# error "This python version requires swig to be run with the '-classic' option" +# endif +#endif + +/*----------------------------------------------- + @(target):= _otapi.so + ------------------------------------------------*/ +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_init PyInit__otapi + +#else +# define SWIG_init init_otapi + +#endif +#define SWIG_name "_otapi" + +#define SWIGVERSION 0x020004 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +namespace swig { + class SwigPtr_PyObject { + protected: + PyObject *_obj; + + public: + SwigPtr_PyObject() :_obj(0) + { + } + + SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) + { + Py_XINCREF(_obj); + } + + SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) + { + if (initial_ref) { + Py_XINCREF(_obj); + } + } + + SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) + { + Py_XINCREF(item._obj); + Py_XDECREF(_obj); + _obj = item._obj; + return *this; + } + + ~SwigPtr_PyObject() + { + Py_XDECREF(_obj); + } + + operator PyObject *() const + { + return _obj; + } + + PyObject *operator->() const + { + return _obj; + } + }; +} + + +namespace swig { + struct SwigVar_PyObject : SwigPtr_PyObject { + SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } + + SwigVar_PyObject & operator = (PyObject* obj) + { + Py_XDECREF(_obj); + _obj = obj; + return *this; + } + }; +} + + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) +{ +#if PY_VERSION_HEX>=0x03000000 + if (PyUnicode_Check(obj)) +#else + if (PyString_Check(obj)) +#endif + { + char *cstr; Py_ssize_t len; +#if PY_VERSION_HEX>=0x03000000 + if (!alloc && cptr) { + /* We can't allow converting without allocation, since the internal + representation of string in Python 3 is UCS-2/UCS-4 but we require + a UTF-8 representation. + TODO(bhy) More detailed explanation */ + return SWIG_RuntimeError; + } + obj = PyUnicode_AsUTF8String(obj); + PyBytes_AsStringAndSize(obj, &cstr, &len); + if(alloc) *alloc = SWIG_NEWOBJ; +#else + PyString_AsStringAndSize(obj, &cstr, &len); +#endif + if (cptr) { + if (alloc) { + /* + In python the user should not be able to modify the inner + string representation. To warranty that, if you define + SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string + buffer is always returned. + + The default behavior is just to return the pointer value, + so, be careful. + */ +#if defined(SWIG_PYTHON_SAFE_CSTRINGS) + if (*alloc != SWIG_OLDOBJ) +#else + if (*alloc == SWIG_NEWOBJ) +#endif + { + *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1))); + *alloc = SWIG_NEWOBJ; + } + else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } else { + #if PY_VERSION_HEX>=0x03000000 + assert(0); /* Should never reach here in Python 3 */ + #endif + *cptr = SWIG_Python_str_AsChar(obj); + } + } + if (psize) *psize = len + 1; +#if PY_VERSION_HEX>=0x03000000 + Py_XDECREF(obj); +#endif + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + void* vptr = 0; + if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = (char *) vptr; + if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsPtr_std_string (PyObject * obj, std::string **val) +{ + char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; + if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { + if (buf) { + if (val) *val = new std::string(buf, size - 1); + if (alloc == SWIG_NEWOBJ) delete[] buf; + return SWIG_NEWOBJ; + } else { + if (val) *val = 0; + return SWIG_OLDOBJ; + } + } else { + static int init = 0; + static swig_type_info* descriptor = 0; + if (!init) { + descriptor = SWIG_TypeQuery("std::string" " *"); + init = 1; + } + if (descriptor) { + std::string *vptr; + int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); + if (SWIG_IsOK(res) && val) *val = vptr; + return res; + } + } + return SWIG_ERROR; +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + if (carray) { + if (size > INT_MAX) { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + return pchar_descriptor ? + SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); + } else { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromStringAndSize(carray, static_cast< int >(size)); +#else + return PyString_FromStringAndSize(carray, static_cast< int >(size)); +#endif + } + } else { + return SWIG_Py_Void(); + } +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_std_string (const std::string& s) +{ + return SWIG_FromCharPtrAndSize(s.data(), s.size()); +} + + +SWIGINTERNINLINE PyObject * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +SWIGINTERNINLINE PyObject* + SWIG_From_bool (bool value) +{ + return PyBool_FromLong(value ? 1 : 0); +} + + + + + + #define SWIG_From_long PyInt_FromLong + + +SWIGINTERNINLINE PyObject * +SWIG_From_int (int value) +{ + return SWIG_From_long (value); +} + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double (PyObject *obj, double *val) +{ + int res = SWIG_TypeError; + if (PyFloat_Check(obj)) { + if (val) *val = PyFloat_AsDouble(obj); + return SWIG_OK; + } else if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else if (PyLong_Check(obj)) { + double v = PyLong_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + double d = PyFloat_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = d; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); + } else { + PyErr_Clear(); + } + } + } +#endif + return res; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long (PyObject *obj, long* val) +{ + if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else if (PyLong_Check(obj)) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + long v = PyInt_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int (PyObject * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERNINLINE PyObject* +SWIG_From_unsigned_SS_long (unsigned long value) +{ + return (value > LONG_MAX) ? + PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_size_t (size_t value) +{ + return SWIG_From_unsigned_SS_long (static_cast< unsigned long >(value)); +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) +{ + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else if (PyLong_Check(obj)) { + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERNINLINE int +SWIG_AsVal_size_t (PyObject * obj, size_t *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); + if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); + return res; +} + + +SWIGINTERN int +SWIG_AsVal_bool (PyObject *obj, bool *val) +{ + int r = PyObject_IsTrue(obj); + if (r == -1) + return SWIG_ERROR; + if (val) *val = r ? true : false; + return SWIG_OK; +} + + + using namespace OTDB; + + + +/* --------------------------------------------------- + * C++ director class methods + * --------------------------------------------------- */ + +#include "OTAPI_wrap.h" + +SwigDirector_OTCallback::SwigDirector_OTCallback(PyObject *self): OTCallback(), Swig::Director(self) { + SWIG_DIRECTOR_RGTR((OTCallback *)this, this); +} + + + + +SwigDirector_OTCallback::~SwigDirector_OTCallback() { +} + +std::string SwigDirector_OTCallback::runOne() { + std::string c_result; + if (!swig_get_self()) { + Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call OTCallback.__init__."); + } +#if defined(SWIG_PYTHON_DIRECTOR_VTABLE) + const size_t swig_method_index = 0; + const char * const swig_method_name = "runOne"; + PyObject* method = swig_get_method(swig_method_index, swig_method_name); + swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL); +#else + swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "runOne", NULL); +#endif + if (!result) { + PyObject *error = PyErr_Occurred(); + if (error) { + Swig::DirectorMethodException::raise("Error detected when calling 'OTCallback.runOne'"); + } + } + std::string *swig_optr = 0; + int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr); + if (!SWIG_IsOK(swig_ores) || !swig_optr) { + Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'"); + } + c_result = *swig_optr; + if (SWIG_IsNewObj(swig_ores)) delete swig_optr; + return (std::string) c_result; +} + + +std::string SwigDirector_OTCallback::runTwo() { + std::string c_result; + if (!swig_get_self()) { + Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call OTCallback.__init__."); + } +#if defined(SWIG_PYTHON_DIRECTOR_VTABLE) + const size_t swig_method_index = 1; + const char * const swig_method_name = "runTwo"; + PyObject* method = swig_get_method(swig_method_index, swig_method_name); + swig::SwigVar_PyObject result = PyObject_CallFunction(method, NULL, NULL); +#else + swig::SwigVar_PyObject result = PyObject_CallMethod(swig_get_self(), (char *) "runTwo", NULL); +#endif + if (!result) { + PyObject *error = PyErr_Occurred(); + if (error) { + Swig::DirectorMethodException::raise("Error detected when calling 'OTCallback.runTwo'"); + } + } + std::string *swig_optr = 0; + int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr); + if (!SWIG_IsOK(swig_ores) || !swig_optr) { + Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'"); + } + c_result = *swig_optr; + if (SWIG_IsNewObj(swig_ores)) delete swig_optr; + return (std::string) c_result; +} + + +#ifdef __cplusplus +extern "C" { +#endif +SWIGINTERN PyObject *_wrap_new_OTCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + PyObject *arg1 = (PyObject *) 0 ; + PyObject * obj0 = 0 ; + OTCallback *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:new_OTCallback",&obj0)) SWIG_fail; + arg1 = obj0; + if ( arg1 != Py_None ) { + /* subclassed */ + result = (OTCallback *)new SwigDirector_OTCallback(arg1); + } else { + result = (OTCallback *)new OTCallback(); + } + + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTCallback, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_OTCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OTCallback",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCallback, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCallback" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCallback_runOne(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCallback_runOne",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runOne" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + director = SWIG_DIRECTOR_CAST(arg1); + upcall = (director && (director->swig_get_self()==obj0)); + try { + if (upcall) { + result = (arg1)->OTCallback::runOne(); + } else { + result = (arg1)->runOne(); + } + } catch (Swig::DirectorException&) { + SWIG_fail; + } + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCallback_runTwo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCallback_runTwo",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runTwo" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + director = SWIG_DIRECTOR_CAST(arg1); + upcall = (director && (director->swig_get_self()==obj0)); + try { + if (upcall) { + result = (arg1)->OTCallback::runTwo(); + } else { + result = (arg1)->runTwo(); + } + } catch (Swig::DirectorException&) { + SWIG_fail; + } + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_disown_OTCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:disown_OTCallback",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_OTCallback" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + { + Swig::Director *director = SWIG_DIRECTOR_CAST(arg1); + if (director) director->swig_disown(); + } + + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OTCallback_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTCallback, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_new_OTCaller(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":new_OTCaller")) SWIG_fail; + result = (OTCaller *)new OTCaller(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTCaller, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_OTCaller(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OTCaller",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCaller" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_GetPassword(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCaller_GetPassword",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_GetPassword" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (char *)(arg1)->GetPassword(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_delCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCaller_delCallback",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_delCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->delCallback(); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_setCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OTCaller_setCallback",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_setCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTCaller_setCallback" "', argument " "2"" of type '" "OTCallback *""'"); + } + arg2 = reinterpret_cast< OTCallback * >(argp2); + (arg1)->setCallback(arg2); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_isCallbackSet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCaller_isCallbackSet",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_isCallbackSet" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)(arg1)->isCallbackSet(); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_callOne(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCaller_callOne",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callOne" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callOne(); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTCaller_callTwo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTCaller_callTwo",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callTwo" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callTwo(); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OTCaller_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTCaller, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_OT_API_Set_PasswordCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTCaller *arg1 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Set_PasswordCallback",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OTCaller, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)OT_API_Set_PasswordCallback(*arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Init",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Init" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Init((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadWallet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_LoadWallet",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_LoadWallet((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SwitchWallet(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_SwitchWallet",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SwitchWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SwitchWallet" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetMemlogSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_GetMemlogSize")) SWIG_fail; + result = (int)OT_API_GetMemlogSize(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetMemlogAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetMemlogAtIndex",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetMemlogAtIndex" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetMemlogAtIndex(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_PeekMemlogFront(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_PeekMemlogFront")) SWIG_fail; + result = (char *)OT_API_PeekMemlogFront(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_PeekMemlogBack(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_PeekMemlogBack")) SWIG_fail; + result = (char *)OT_API_PeekMemlogBack(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_PopMemlogFront(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_PopMemlogFront")) SWIG_fail; + result = (int)OT_API_PopMemlogFront(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_PopMemlogBack(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_PopMemlogBack")) SWIG_fail; + result = (int)OT_API_PopMemlogBack(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_CreateNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_CreateNym")) SWIG_fail; + result = (char *)OT_API_CreateNym(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_AddServerContract(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_AddServerContract",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddServerContract((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_AddAssetContract(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_AddAssetContract",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddAssetContract((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetServerCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_GetServerCount")) SWIG_fail; + result = (int)OT_API_GetServerCount(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAssetTypeCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_GetAssetTypeCount")) SWIG_fail; + result = (int)OT_API_GetAssetTypeCount(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_GetAccountCount")) SWIG_fail; + result = (int)OT_API_GetAccountCount(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNymCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_GetNymCount")) SWIG_fail; + result = (int)OT_API_GetNymCount(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetServer_ID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetServer_ID",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetServer_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetServer_ID(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetServer_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetServer_Name",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetServer_Name((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAssetType_ID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAssetType_ID",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAssetType_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAssetType_ID(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAssetType_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAssetType_Name",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_ID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_ID",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAccountWallet_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAccountWallet_ID(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_Name",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_Balance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_Balance",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Balance" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_Type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_Type",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Type" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_AssetTypeID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_AssetTypeID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_AssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_ServerID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_ServerID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_ServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetAccountWallet_NymID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetAccountWallet_NymID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_NymID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_VerifyAccountReceipt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_VerifyAccountReceipt",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_TransactionNumCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_TransactionNumCount",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_ID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetNym_ID",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetNym_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetNym_ID(arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetNym_Name",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Name((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_Stats(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetNym_Stats",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Stats" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_IsNym_RegisteredAtServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_IsNym_RegisteredAtServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_MailCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetNym_MailCount",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_MailContentsByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_MailContentsByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_MailSenderIDByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_MailSenderIDByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_MailServerIDByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_MailServerIDByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Nym_RemoveMailByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Nym_RemoveMailByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Nym_VerifyMailByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Nym_VerifyMailByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_OutmailCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_GetNym_OutmailCount",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_OutmailContentsByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_OutmailContentsByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_OutmailRecipientIDByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_OutmailRecipientIDByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GetNym_OutmailServerIDByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GetNym_OutmailServerIDByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Nym_RemoveOutmailByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Nym_RemoveOutmailByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Nym_VerifyOutmailByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Nym_VerifyOutmailByIndex",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_CanRemoveServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_CanRemoveServer",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_RemoveServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_RemoveServer",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_CanRemoveAssetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_CanRemoveAssetType",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_RemoveAssetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_RemoveAssetType",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_CanRemoveNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_CanRemoveNym",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_RemoveNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_RemoveNym",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_CanRemoveAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Wallet_CanRemoveAccount",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_ImportNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Wallet_ImportNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportNym" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SetNym_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_SetNym_Name",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetNym_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetNym_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SetAccountWallet_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_SetAccountWallet_Name",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SetAssetType_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_SetAssetType_Name",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAssetType_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SetServer_Name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_SetServer_Name",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetServer_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_VerifyAndRetrieveXMLContents(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_VerifyAndRetrieveXMLContents",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_WriteCheque(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:OT_API_WriteCheque",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_WriteCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_WriteCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_WriteCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_WriteCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_WriteCheque" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_WriteCheque" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_WriteCheque" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(obj7, &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_WriteCheque" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_ProposePaymentPlan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int res11 ; + char *buf11 = 0 ; + int alloc11 = 0 ; + int res12 ; + char *buf12 = 0 ; + int alloc12 = 0 ; + int res13 ; + char *buf13 = 0 ; + int alloc13 = 0 ; + int res14 ; + char *buf14 = 0 ; + int alloc14 = 0 ; + int res15 ; + char *buf15 = 0 ; + int alloc15 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + PyObject * obj8 = 0 ; + PyObject * obj9 = 0 ; + PyObject * obj10 = 0 ; + PyObject * obj11 = 0 ; + PyObject * obj12 = 0 ; + PyObject * obj13 = 0 ; + PyObject * obj14 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOOOO:OT_API_ProposePaymentPlan",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13,&obj14)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ProposePaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ProposePaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ProposePaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ProposePaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ProposePaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_ProposePaymentPlan" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_ProposePaymentPlan" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(obj7, &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_ProposePaymentPlan" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(obj8, &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_ProposePaymentPlan" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(obj9, &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_ProposePaymentPlan" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + res11 = SWIG_AsCharPtrAndSize(obj10, &buf11, NULL, &alloc11); + if (!SWIG_IsOK(res11)) { + SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "OT_API_ProposePaymentPlan" "', argument " "11"" of type '" "char const *""'"); + } + arg11 = reinterpret_cast< char * >(buf11); + res12 = SWIG_AsCharPtrAndSize(obj11, &buf12, NULL, &alloc12); + if (!SWIG_IsOK(res12)) { + SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "OT_API_ProposePaymentPlan" "', argument " "12"" of type '" "char const *""'"); + } + arg12 = reinterpret_cast< char * >(buf12); + res13 = SWIG_AsCharPtrAndSize(obj12, &buf13, NULL, &alloc13); + if (!SWIG_IsOK(res13)) { + SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "OT_API_ProposePaymentPlan" "', argument " "13"" of type '" "char const *""'"); + } + arg13 = reinterpret_cast< char * >(buf13); + res14 = SWIG_AsCharPtrAndSize(obj13, &buf14, NULL, &alloc14); + if (!SWIG_IsOK(res14)) { + SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "OT_API_ProposePaymentPlan" "', argument " "14"" of type '" "char const *""'"); + } + arg14 = reinterpret_cast< char * >(buf14); + res15 = SWIG_AsCharPtrAndSize(obj14, &buf15, NULL, &alloc15); + if (!SWIG_IsOK(res15)) { + SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "OT_API_ProposePaymentPlan" "', argument " "15"" of type '" "char const *""'"); + } + arg15 = reinterpret_cast< char * >(buf15); + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_ConfirmPaymentPlan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_ConfirmPaymentPlan",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadUserPubkey(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_LoadUserPubkey",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadUserPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadPubkey(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_LoadPubkey",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadPubkey((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_VerifyUserPrivateKey(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_VerifyUserPrivateKey",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyUserPrivateKey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadPurse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_LoadPurse",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadMint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_LoadMint",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadAssetContract(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_LoadAssetContract",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadServerContract(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_LoadServerContract",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadServerContract((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Mint_IsStillGood(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Mint_IsStillGood",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Mint_IsStillGood" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Mint_IsStillGood" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Mint_IsStillGood" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_IsBasketCurrency(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_IsBasketCurrency",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsBasketCurrency" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Basket_GetMemberCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Basket_GetMemberCount",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Basket_GetMemberType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Basket_GetMemberType",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberType" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Basket_GetMinimumTransferAmount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Basket_GetMinimumTransferAmount",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Basket_GetMemberMinimumTransferAmount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_Basket_GetMemberMinimumTransferAmount",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadAssetAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_LoadAssetAccount",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadInbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_LoadInbox",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadOutbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_LoadOutbox",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_GetCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Ledger_GetCount",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetCount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetCount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_CreateResponse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Ledger_CreateResponse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_GetTransactionByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Ledger_GetTransactionByIndex",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_GetTransactionByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Ledger_GetTransactionByID",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_GetTransactionIDByIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Ledger_GetTransactionIDByIndex",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_AddTransaction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Ledger_AddTransaction",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_CreateResponse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int val6 ; + int ecode6 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:OT_API_Transaction_CreateResponse",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + ecode6 = SWIG_AsVal_int(obj5, &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "6"" of type '" "int""'"); + } + arg6 = static_cast< int >(val6); + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Ledger_FinalizeResponse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Ledger_FinalizeResponse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetType",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetType" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetVoucher(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetVoucher",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetSuccess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetSuccess",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetBalanceAgreementSuccess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetBalanceAgreementSuccess",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetDateSigned(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetDateSigned",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetAmount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetAmount",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetAmount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetAmount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetAmount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Pending_GetNote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Pending_GetNote",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Pending_GetNote" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Pending_GetNote" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Pending_GetNote" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Pending_GetNote" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetSenderUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetSenderUserID",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetSenderAcctID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetSenderAcctID",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetRecipientUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetRecipientUserID",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetRecipientAcctID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetRecipientAcctID",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Transaction_GetDisplayReferenceToNum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Transaction_GetDisplayReferenceToNum",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_CreatePurse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_CreatePurse",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_CreatePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_CreatePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_CreatePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_SavePurse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_SavePurse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SavePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SavePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SavePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_SavePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Purse_GetTotalValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Purse_GetTotalValue",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Purse_Count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Purse_Count",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Count" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Count" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Count" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Purse_Peek(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Purse_Peek",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Peek" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Peek" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Peek" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Peek" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Purse_Pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Purse_Pop",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Pop" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Pop" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Pop" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Pop" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Purse_Push(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Purse_Push",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Push" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Push" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Push" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Push" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Purse_Push" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Wallet_ImportPurse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Wallet_ImportPurse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_exchangePurse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_exchangePurse",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_ChangeOwner(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_Token_ChangeOwner",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_ChangeOwner" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_ChangeOwner" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_ChangeOwner" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Token_ChangeOwner" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Token_ChangeOwner" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Token_GetID",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetDenomination(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Token_GetDenomination",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetDenomination" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetDenomination" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetDenomination" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetSeries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Token_GetSeries",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetSeries" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetSeries" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetSeries" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetValidFrom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Token_GetValidFrom",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidFrom" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidFrom" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidFrom" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetValidTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_Token_GetValidTo",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidTo" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidTo" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidTo" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetAssetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Token_GetAssetID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetAssetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Token_GetServerID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Token_GetServerID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_checkServerID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_checkServerID",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkServerID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_createUserAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_createUserAccount",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_deleteUserAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_deleteUserAccount",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_deleteAssetAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_deleteAssetAccount",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_deleteAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_checkUser(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_checkUser",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkUser" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkUser" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_checkUser" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_sendUserMessage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_sendUserMessage",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_sendUserMessage" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_sendUserMessage" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_sendUserMessage" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_sendUserMessage" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_sendUserMessage" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getRequest(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_getRequest",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getRequest" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getRequest" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getRequest((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getTransactionNumber(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_getTransactionNumber",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getTransactionNumber" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getTransactionNumber" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_issueAssetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_issueAssetType",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueAssetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueAssetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getContract(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getContract",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getContract" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getContract" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getMint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getMint",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMint" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_createAssetAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_createAssetAccount",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_createAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getAccount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getAccount",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GenerateBasketCreation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_GenerateBasketCreation",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketCreation" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketCreation" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_AddBasketCreationItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_AddBasketCreationItem",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketCreationItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketCreationItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketCreationItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketCreationItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_issueBasket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_issueBasket",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_GenerateBasketExchange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_GenerateBasketExchange",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketExchange" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketExchange" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_GenerateBasketExchange" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_GenerateBasketExchange" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_GenerateBasketExchange" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_AddBasketExchangeItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_AddBasketExchangeItem",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_exchangeBasket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_exchangeBasket",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangeBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangeBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangeBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangeBasket" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_exchangeBasket" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_notarizeWithdrawal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_notarizeWithdrawal",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeWithdrawal" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeWithdrawal" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeWithdrawal" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeWithdrawal" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_notarizeDeposit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_notarizeDeposit",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeDeposit" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeDeposit" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeDeposit" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeDeposit" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_notarizeTransfer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:OT_API_notarizeTransfer",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeTransfer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeTransfer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeTransfer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeTransfer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_notarizeTransfer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_notarizeTransfer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getInbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getInbox",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getOutbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getOutbox",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getNymbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_getNymbox",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_LoadNymbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_LoadNymbox",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_processInbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_processInbox",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_processInbox" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_processNymbox(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_processNymbox",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processNymbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_withdrawVoucher(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:OT_API_withdrawVoucher",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_withdrawVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_withdrawVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_withdrawVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_withdrawVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_withdrawVoucher" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_withdrawVoucher" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_depositCheque(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_depositCheque",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_depositCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_depositPaymentPlan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_depositPaymentPlan",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_issueMarketOffer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int val11 ; + int ecode11 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + PyObject * obj8 = 0 ; + PyObject * obj9 = 0 ; + PyObject * obj10 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO:OT_API_issueMarketOffer",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_issueMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_issueMarketOffer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_issueMarketOffer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_issueMarketOffer" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(obj7, &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_issueMarketOffer" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(obj8, &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_issueMarketOffer" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(obj9, &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_issueMarketOffer" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + ecode11 = SWIG_AsVal_int(obj10, &val11); + if (!SWIG_IsOK(ecode11)) { + SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "OT_API_issueMarketOffer" "', argument " "11"" of type '" "int""'"); + } + arg11 = static_cast< int >(val11); + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getMarketList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_getMarketList",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketList" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketList" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getMarketOffers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_getMarketOffers",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketOffers" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_getMarketOffers" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getMarketRecentTrades(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:OT_API_getMarketRecentTrades",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketRecentTrades" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketRecentTrades" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketRecentTrades" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_getNym_MarketOffers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OT_API_getNym_MarketOffers",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNym_MarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNym_MarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_cancelMarketOffer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_cancelMarketOffer",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_cancelPaymentPlan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_cancelPaymentPlan",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_Py_Void(); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_PopMessageBuffer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_PopMessageBuffer")) SWIG_fail; + result = (char *)OT_API_PopMessageBuffer(); + resultobj = SWIG_FromCharPtr((const char *)result); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_FlushMessageBuffer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_FlushMessageBuffer")) SWIG_fail; + OT_API_FlushMessageBuffer(); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetCommand",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetCommand" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetSuccess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetSuccess",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetDepth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetDepth",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetDepth" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetDepth((char const *)arg1); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetTransactionSuccess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Message_GetTransactionSuccess",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetBalanceAgreementSuccess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:OT_API_Message_GetBalanceAgreementSuccess",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetLedger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetLedger",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetLedger" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetNewAssetTypeID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetNewAssetTypeID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetNewIssuerAcctID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetNewIssuerAcctID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewIssuerAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_Message_GetNewAcctID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + PyObject * obj0 = 0 ; + char *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OT_API_Message_GetNewAcctID",&obj0)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + resultobj = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_ConnectServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:OT_API_ConnectServer",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConnectServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConnectServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConnectServer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConnectServer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConnectServer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + resultobj = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OT_API_ProcessSockets(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int result; + + if (!PyArg_ParseTuple(args,(char *)":OT_API_ProcessSockets")) SWIG_fail; + result = (int)OT_API_ProcessSockets(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_Storable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Storable",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storable" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storable_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storable_Create",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storable_Create" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storable_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storable_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Storable_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Storable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Storable, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_Storage_GetPacker__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTPacker *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_GetPacker",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_GetPacker" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTPacker *)(arg1)->GetPacker(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_GetPacker__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTPacker *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Storage_GetPacker",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTPacker *)(arg1)->GetPacker(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_GetPacker(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[3]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_GetPacker__SWIG_1(self, args); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_Storage_GetPacker__SWIG_0(self, args); + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_GetPacker'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::GetPacker(OTDB::PackType)\n" + " OTDB::Storage::GetPacker()\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:Storage_Init",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj6, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Storage_Init",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_Init",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_Init",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_Init",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_Init",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init__SWIG_6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:Storage_Init",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (bool)(arg1)->Init(); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Init(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[8]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 7) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_6(self, args); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_5(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_4(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_3(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_2(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_1(self, args); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_0(self, args); + } + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_Init'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string)\n" + " OTDB::Storage::Init(std::string)\n" + " OTDB::Storage::Init()\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_Exists__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_Exists",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Exists__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_Exists",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Exists__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_Exists",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Exists__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_Exists",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Exists(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_Exists'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::Exists(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Exists(std::string,std::string,std::string)\n" + " OTDB::Storage::Exists(std::string,std::string)\n" + " OTDB::Storage::Exists(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_delete_Storage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Storage",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storage" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Storage_StoreString",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_StoreString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_StoreString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_StoreString",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[7]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 6) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_3(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_2(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_1(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_0(self, args); + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_StoreString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_QueryString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_QueryString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_QueryString",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_QueryString",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_QueryString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string,std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_StorePlainString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Storage_StorePlainString",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StorePlainString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_StorePlainString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StorePlainString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_StorePlainString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StorePlainString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_StorePlainString",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StorePlainString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[7]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 6) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_3(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_2(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_1(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_0(self, args); + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_StorePlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryPlainString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_QueryPlainString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryPlainString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_QueryPlainString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryPlainString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_QueryPlainString",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryPlainString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_QueryPlainString",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryPlainString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_QueryPlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryPlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string,std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Storage_StoreObject",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_StoreObject",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreObject__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_StoreObject",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreObject__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_StoreObject",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_StoreObject(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[7]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 6) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_3(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_2(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_1(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_0(self, args); + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_StoreObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:Storage_QueryObject",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_QueryObject",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryObject__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_QueryObject",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryObject__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_QueryObject",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_QueryObject(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[7]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 6) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_3(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_2(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_1(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_0(self, args); + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_QueryObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_EraseValueByKey__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:Storage_EraseValueByKey",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_EraseValueByKey__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Storage_EraseValueByKey",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_EraseValueByKey__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Storage_EraseValueByKey",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_EraseValueByKey__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_EraseValueByKey",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_EraseValueByKey(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Storage_EraseValueByKey'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_Storage_CreateObject(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_CreateObject",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_CreateObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_CreateObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_Create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Storage *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Storage_Create",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storage_Create" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Storage_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::StorageType result; + + if (!PyArg_ParseTuple(args,(char *)"O:Storage_GetType",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetType" "', argument " "1"" of type '" "OTDB::Storage const *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Storage_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Storage, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:InitDefaultStorage",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj6, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj7, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "8"" of type '" "std::string""'"); + } + arg8 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:InitDefaultStorage",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj6, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:InitDefaultStorage",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj5, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:InitDefaultStorage",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:InitDefaultStorage",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:InitDefaultStorage",&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage__SWIG_6(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:InitDefaultStorage",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_InitDefaultStorage(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[9]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 8) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_InitDefaultStorage__SWIG_6(self, args); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_5(self, args); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_4(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_3(self, args); + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_2(self, args); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_1(self, args); + } + } + } + } + } + } + } + } + if (argc == 8) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[7], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_0(self, args); + } + } + } + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'InitDefaultStorage'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_GetDefaultStorage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storage *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)":GetDefaultStorage")) SWIG_fail; + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_CreateStorageContext__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Storage *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:CreateStorageContext",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CreateStorageContext" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_CreateStorageContext__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StorageType arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Storage *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:CreateStorageContext",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_CreateStorageContext(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[3]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 2) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_1(self, args); + } + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_0(self, args); + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'CreateStorageContext'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::CreateStorageContext(OTDB::StorageType,OTDB::PackType)\n" + " OTDB::CreateStorageContext(OTDB::StorageType)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_CreateObject(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:CreateObject",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Exists__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:Exists",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Exists__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:Exists",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Exists__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Exists",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Exists__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:Exists",&obj0)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Exists(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[5]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_3(self, args); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_2(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_1(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_0(self, args); + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'Exists'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Exists(std::string,std::string,std::string,std::string)\n" + " OTDB::Exists(std::string,std::string,std::string)\n" + " OTDB::Exists(std::string,std::string)\n" + " OTDB::Exists(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_StoreString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:StoreString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:StoreString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:StoreString",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:StoreString",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'StoreString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StoreString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_QueryString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:QueryString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:QueryString",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OO:QueryString",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + PyObject * obj0 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"O:QueryString",&obj0)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[5]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_3(self, args); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_2(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_1(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_0(self, args); + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'QueryString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryString(std::string,std::string,std::string,std::string)\n" + " OTDB::QueryString(std::string,std::string,std::string)\n" + " OTDB::QueryString(std::string,std::string)\n" + " OTDB::QueryString(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_StorePlainString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:StorePlainString",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StorePlainString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:StorePlainString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StorePlainString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:StorePlainString",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StorePlainString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:StorePlainString",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StorePlainString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'StorePlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StorePlainString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_QueryPlainString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:QueryPlainString",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryPlainString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:QueryPlainString",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryPlainString__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OO:QueryPlainString",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryPlainString__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + PyObject * obj0 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"O:QueryPlainString",&obj0)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryPlainString(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[5]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_3(self, args); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_2(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_1(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_0(self, args); + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'QueryPlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryPlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::QueryPlainString(std::string,std::string,std::string)\n" + " OTDB::QueryPlainString(std::string,std::string)\n" + " OTDB::QueryPlainString(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_StoreObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:StoreObject",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:StoreObject",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreObject__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:StoreObject",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreObject__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:StoreObject",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StoreObject(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'StoreObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_QueryObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:QueryObject",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj4, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:QueryObject",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryObject__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:QueryObject",&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryObject__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Storable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:QueryObject",&obj0,&obj1)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_QueryObject(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[6]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 5) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_3(self, args); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_2(self, args); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_1(self, args); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_0(self, args); + } + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'QueryObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_EraseValueByKey__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:EraseValueByKey",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj3, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_EraseValueByKey__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:EraseValueByKey",&obj0,&obj1,&obj2)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_EraseValueByKey__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + std::string arg2 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:EraseValueByKey",&obj0,&obj1)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_EraseValueByKey__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + std::string arg1 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:EraseValueByKey",&obj0)) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(obj0, &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_EraseValueByKey(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[5]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = args ? (int)PyObject_Length(args) : 0; + for (ii = 0; (ii < 4) && (ii < argc); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_3(self, args); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_2(self, args); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_1(self, args); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_0(self, args); + } + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'EraseValueByKey'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::EraseValueByKey(std::string,std::string,std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string,std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string)\n"); + return 0; +} + + +SWIGINTERN PyObject *_wrap_delete_OTDBString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OTDBString",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OTDBString, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTDBString" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTDBString_m_string_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OTDBString_m_string_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_set" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->m_string = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTDBString_m_string_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTDBString_m_string_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_get" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + result = (std::string *) & ((arg1)->m_string); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OTDBString_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::OTDBString *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OTDBString_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OTDBString_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__OTDBString, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_Blob(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Blob",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Blob, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Blob" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Blob_m_memBuffer_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Blob_m_memBuffer_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_set" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + { + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__vectorT_unsigned_char_t, 0 | 0); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } else { + std::vector< unsigned char > * temp = reinterpret_cast< std::vector< unsigned char > * >(argp2); + arg2 = *temp; + if (SWIG_IsNewObj(res2)) delete temp; + } + } + if (arg1) (arg1)->m_memBuffer = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Blob_m_memBuffer_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::vector< unsigned char > result; + + if (!PyArg_ParseTuple(args,(char *)"O:Blob_m_memBuffer_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_get" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + result = ((arg1)->m_memBuffer); + resultobj = SWIG_NewPointerObj((new std::vector< unsigned char >(static_cast< const std::vector< unsigned char >& >(result))), SWIGTYPE_p_std__vectorT_unsigned_char_t, SWIG_POINTER_OWN | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Blob_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Blob *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Blob_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Blob_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Blob, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_StringMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_StringMap",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__StringMap, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_StringMap" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StringMap_the_map_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:StringMap_the_map_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_set" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_the_map_set" "', argument " "2"" of type '" "std::map< std::string,std::string > *""'"); + } + arg2 = reinterpret_cast< std::map< std::string,std::string > * >(argp2); + if (arg1) (arg1)->the_map = *arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StringMap_the_map_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::map< std::string,std::string > *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:StringMap_the_map_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_get" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StringMap_SetValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int res3 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:StringMap_SetValue",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_SetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + { + std::string *ptr = (std::string *)0; + res3 = SWIG_AsPtr_std_string(obj2, &ptr); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + arg3 = ptr; + } + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StringMap_GetValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + std::string result; + + if (!PyArg_ParseTuple(args,(char *)"OO:StringMap_GetValue",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_GetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + result = (arg1)->GetValue((std::string const &)*arg2); + resultobj = SWIG_From_std_string(static_cast< std::string >(result)); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_StringMap_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::StringMap *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:StringMap_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *StringMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__StringMap, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_Displayable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Displayable",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Displayable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Displayable" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Displayable_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Displayable_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_set" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Displayable_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Displayable_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_get" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Displayable_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Displayable *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Displayable_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Displayable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Displayable, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_MarketData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_MarketData",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketData" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_market_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_market_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->market_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_market_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_market_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->market_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_asset_type_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_asset_type_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_asset_type_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_asset_type_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_currency_type_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_currency_type_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_currency_type_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_currency_type_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_total_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_total_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_total_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_total_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_number_bids_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_number_bids_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_bids = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_number_bids_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_number_bids_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_bids); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_number_asks_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_number_asks_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_asks = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_number_asks_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_number_asks_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_asks); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_last_sale_price_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_last_sale_price_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->last_sale_price = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_last_sale_price_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_last_sale_price_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->last_sale_price); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_current_bid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_current_bid_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_bid = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_current_bid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_current_bid_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_bid); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_current_ask_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_current_ask_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_ask = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_current_ask_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_current_ask_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_ask); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_trades_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_volume_trades_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_trades = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_trades_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_volume_trades_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_trades); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_volume_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_volume_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_currency_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_volume_currency_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_currency = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_volume_currency_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_volume_currency_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_currency); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_recent_highest_bid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_recent_highest_bid_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_highest_bid = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_recent_highest_bid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_recent_highest_bid_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_highest_bid); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_recent_lowest_ask_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketData_recent_lowest_ask_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_lowest_ask = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_recent_lowest_ask_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_recent_lowest_ask_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_lowest_ask); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketData_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::MarketData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketData_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *MarketData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__MarketData, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_MarketList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_MarketList",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketList, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketList" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketList_GetMarketDataCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketList_GetMarketDataCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketDataCount" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + result = (arg1)->GetMarketDataCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketList_GetMarketData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::MarketData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketList_GetMarketData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_GetMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketList_RemoveMarketData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketList_RemoveMarketData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_RemoveMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_RemoveMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveMarketData(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketList_AddMarketData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:MarketList_AddMarketData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_AddMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__MarketData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + arg2 = reinterpret_cast< OTDB::MarketData * >(argp2); + result = (bool)(arg1)->AddMarketData(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_MarketList_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::MarketList *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:MarketList_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *MarketList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__MarketList, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_OfferDataMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OfferDataMarket",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataMarket" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataMarket_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataMarket_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_price_per_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataMarket_price_per_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_price_per_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_price_per_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_available_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataMarket_available_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_available_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_available_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_minimum_increment_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataMarket_minimum_increment_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_minimum_increment_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_minimum_increment_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataMarket_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::OfferDataMarket *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataMarket_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OfferDataMarket_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__OfferDataMarket, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_BidData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_BidData",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BidData" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BidData_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BidData_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_price_per_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BidData_price_per_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_price_per_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_price_per_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_available_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BidData_available_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_available_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_available_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_minimum_increment_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BidData_minimum_increment_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_minimum_increment_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_minimum_increment_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BidData_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::BidData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BidData_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *BidData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__BidData, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_AskData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_AskData",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AskData" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AskData_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AskData_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_price_per_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AskData_price_per_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_price_per_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_price_per_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_available_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AskData_available_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_available_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_available_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_minimum_increment_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AskData_minimum_increment_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_minimum_increment_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_minimum_increment_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AskData_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::AskData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AskData_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *AskData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__AskData, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_OfferListMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OfferListMarket",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListMarket" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_GetBidDataCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferListMarket_GetBidDataCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetBidDataCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_GetBidData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::BidData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_GetBidData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_RemoveBidData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_RemoveBidData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBidData(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_AddBidData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_AddBidData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__BidData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + arg2 = reinterpret_cast< OTDB::BidData * >(argp2); + result = (bool)(arg1)->AddBidData(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_GetAskDataCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferListMarket_GetAskDataCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetAskDataCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_GetAskData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::AskData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_GetAskData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_RemoveAskData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_RemoveAskData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveAskData(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_AddAskData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListMarket_AddAskData",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__AskData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + arg2 = reinterpret_cast< OTDB::AskData * >(argp2); + result = (bool)(arg1)->AddAskData(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListMarket_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::OfferListMarket *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferListMarket_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OfferListMarket_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__OfferListMarket, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_TradeDataMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_TradeDataMarket",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataMarket_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataMarket_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_date_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataMarket_date_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_date_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_date_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->date); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_price_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataMarket_price_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_price_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_price_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_amount_sold_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataMarket_amount_sold_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_amount_sold_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_amount_sold_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataMarket_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataMarket_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *TradeDataMarket_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__TradeDataMarket, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_TradeListMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_TradeListMarket",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListMarket_GetTradeDataMarketCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeListMarket_GetTradeDataMarketCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarketCount" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + result = (arg1)->GetTradeDataMarketCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListMarket_GetTradeDataMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListMarket_GetTradeDataMarket",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListMarket_RemoveTradeDataMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListMarket_RemoveTradeDataMarket",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListMarket_AddTradeDataMarket(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListMarket_AddTradeDataMarket",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__TradeDataMarket, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataMarket * >(argp2); + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListMarket_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::TradeListMarket *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeListMarket_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *TradeListMarket_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__TradeListMarket, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_OfferDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OfferDataNym",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataNym" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_valid_from_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_valid_from_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_from = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_valid_from_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_valid_from_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_from); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_valid_to_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_valid_to_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_to = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_valid_to_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_valid_to_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_to); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_asset_type_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_asset_type_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_asset_type_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_asset_type_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_asset_acct_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_asset_acct_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_acct_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_asset_acct_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_asset_acct_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_acct_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_currency_type_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_currency_type_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_currency_type_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_currency_type_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_currency_acct_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_currency_acct_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_acct_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_currency_acct_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_currency_acct_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_acct_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_selling_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_selling_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + ecode2 = SWIG_AsVal_bool(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferDataNym_selling_set" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->selling = arg2; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_selling_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_selling_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (bool) ((arg1)->selling); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_price_per_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_price_per_scale_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_price_per_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_price_per_scale_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_total_assets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_total_assets_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_total_assets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_total_assets_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_finished_so_far_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_finished_so_far_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->finished_so_far = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_finished_so_far_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_finished_so_far_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->finished_so_far); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_minimum_increment_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_minimum_increment_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_minimum_increment_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_minimum_increment_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_stop_sign_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_stop_sign_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_sign = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_stop_sign_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_stop_sign_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_sign); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_stop_price_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferDataNym_stop_price_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_price = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_stop_price_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_stop_price_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_price); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferDataNym_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::OfferDataNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferDataNym_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OfferDataNym_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__OfferDataNym, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_OfferListNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_OfferListNym",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListNym_GetOfferDataNymCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferListNym_GetOfferDataNymCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNymCount" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + result = (arg1)->GetOfferDataNymCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListNym_GetOfferDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::OfferDataNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListNym_GetOfferDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListNym_RemoveOfferDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListNym_RemoveOfferDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListNym_AddOfferDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:OfferListNym_AddOfferDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__OfferDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::OfferDataNym * >(argp2); + result = (bool)(arg1)->AddOfferDataNym(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_OfferListNym_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::OfferListNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:OfferListNym_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *OfferListNym_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__OfferListNym, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_TradeDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_TradeDataNym",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataNym" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_transaction_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_transaction_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_transaction_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_transaction_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_completed_count_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_completed_count_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->completed_count = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_completed_count_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_completed_count_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->completed_count); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_date_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_date_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_date_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_date_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->date); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_price_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_price_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_price_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_price_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->price); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_amount_sold_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeDataNym_amount_sold_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_amount_sold_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_amount_sold_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeDataNym_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::TradeDataNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeDataNym_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *TradeDataNym_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__TradeDataNym, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_TradeListNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_TradeListNym",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListNym_GetTradeDataNymCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeListNym_GetTradeDataNymCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNymCount" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + result = (arg1)->GetTradeDataNymCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListNym_GetTradeDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::TradeDataNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListNym_GetTradeDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListNym_RemoveTradeDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListNym_RemoveTradeDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListNym_AddTradeDataNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:TradeListNym_AddTradeDataNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__TradeDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataNym * >(argp2); + result = (bool)(arg1)->AddTradeDataNym(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_TradeListNym_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::TradeListNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:TradeListNym_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *TradeListNym_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__TradeListNym, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_Acct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Acct",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Acct" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Acct_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Acct_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_acct_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Acct_acct_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_acct_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Acct_acct_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Acct_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Acct_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Acct_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Acct *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Acct_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Acct_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Acct, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_BitcoinAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_BitcoinAcct",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinAcct" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinAcct_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinAcct_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_acct_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinAcct_acct_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_acct_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinAcct_acct_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinAcct_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinAcct_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_bitcoin_acct_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinAcct_bitcoin_acct_name_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_acct_name = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_bitcoin_acct_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinAcct_bitcoin_acct_name_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_acct_name); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinAcct_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinAcct_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *BitcoinAcct_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__BitcoinAcct, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_ServerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_ServerInfo",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ServerInfo" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ServerInfo_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ServerInfo_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ServerInfo_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ServerInfo_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ServerInfo_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ServerInfo_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ServerInfo_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::ServerInfo *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ServerInfo_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *ServerInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__ServerInfo, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_Server(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Server",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Server" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Server_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Server_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Server_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_host_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Server_server_host_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_host_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_server_host_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_host); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_port_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Server_server_port_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_server_port_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_server_port_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_port); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Server_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Server *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Server_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Server, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Server_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Server, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_BitcoinServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_BitcoinServer",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinServer" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_host_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_server_host_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_host_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_server_host_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_port_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_server_port_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_server_port_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_server_port_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_bitcoin_username_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_bitcoin_username_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_username = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_bitcoin_username_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_bitcoin_username_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_username); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_bitcoin_password_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:BitcoinServer_bitcoin_password_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_password = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_bitcoin_password_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_bitcoin_password_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_password); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_BitcoinServer_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::BitcoinServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:BitcoinServer_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *BitcoinServer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__BitcoinServer, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_RippleServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_RippleServer",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RippleServer" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_host_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_server_host_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_host_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_server_host_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_port_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_server_port_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_server_port_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_server_port_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_ripple_username_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_ripple_username_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_username = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_ripple_username_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_ripple_username_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_username); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_ripple_password_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_ripple_password_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_password = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_ripple_password_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_ripple_password_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_password); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_namefield_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_namefield_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_namefield_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_namefield_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_passfield_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:RippleServer_passfield_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->passfield_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_passfield_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_passfield_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->passfield_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_RippleServer_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::RippleServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:RippleServer_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *RippleServer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__RippleServer, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_LoomServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_LoomServer",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LoomServer" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_host_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_server_host_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_host_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_server_host_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_port_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_server_port_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_server_port_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_server_port_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_loom_username_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_loom_username_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->loom_username = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_loom_username_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_loom_username_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->loom_username); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_namefield_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:LoomServer_namefield_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_namefield_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_namefield_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_LoomServer_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::LoomServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:LoomServer_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *LoomServer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__LoomServer, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_ContactNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_ContactNym",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactNym" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_nym_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_nym_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_nym_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_nym_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_nym_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_nym_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_nym_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_nym_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_public_key_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_public_key_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_public_key_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_public_key_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->public_key); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_memo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_memo_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_memo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_memo_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->memo); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_GetServerInfoCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_GetServerInfoCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfoCount" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (arg1)->GetServerInfoCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_GetServerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::ServerInfo *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_GetServerInfo",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_GetServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_RemoveServerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_RemoveServerInfo",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_RemoveServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_RemoveServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveServerInfo(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_AddServerInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactNym_AddServerInfo",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_AddServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__ServerInfo, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + arg2 = reinterpret_cast< OTDB::ServerInfo * >(argp2); + result = (bool)(arg1)->AddServerInfo(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactNym_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::ContactNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactNym_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *ContactNym_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__ContactNym, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_WalletData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_WalletData",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_WalletData" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetBitcoinServerCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:WalletData_GetBitcoinServerCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinServerCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetBitcoinServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::BitcoinServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_GetBitcoinServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_RemoveBitcoinServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_RemoveBitcoinServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_AddBitcoinServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_AddBitcoinServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__BitcoinServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinServer * >(argp2); + result = (bool)(arg1)->AddBitcoinServer(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetBitcoinAcctCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:WalletData_GetBitcoinAcctCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcctCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinAcctCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetBitcoinAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_GetBitcoinAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_RemoveBitcoinAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_RemoveBitcoinAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_AddBitcoinAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_AddBitcoinAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__BitcoinAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinAcct * >(argp2); + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetRippleServerCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:WalletData_GetRippleServerCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetRippleServerCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetRippleServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::RippleServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_GetRippleServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_RemoveRippleServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_RemoveRippleServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveRippleServer(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_AddRippleServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_AddRippleServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__RippleServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + arg2 = reinterpret_cast< OTDB::RippleServer * >(argp2); + result = (bool)(arg1)->AddRippleServer(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetLoomServerCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:WalletData_GetLoomServerCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetLoomServerCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_GetLoomServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::LoomServer *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_GetLoomServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_RemoveLoomServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_RemoveLoomServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveLoomServer(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_AddLoomServer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:WalletData_AddLoomServer",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__LoomServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + arg2 = reinterpret_cast< OTDB::LoomServer * >(argp2); + result = (bool)(arg1)->AddLoomServer(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_WalletData_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::WalletData *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:WalletData_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *WalletData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__WalletData, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_ContactAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_ContactAcct",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactAcct" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_server_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_server_type_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_server_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_server_type_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_type); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_server_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_server_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_server_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_server_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_asset_type_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_asset_type_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_asset_type_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_asset_type_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_acct_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_acct_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_acct_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_acct_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_nym_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_nym_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_nym_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_nym_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_memo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_memo_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_memo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_memo_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->memo); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_public_key_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:ContactAcct_public_key_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_public_key_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_public_key_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->public_key); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_ContactAcct_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::ContactAcct *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:ContactAcct_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *ContactAcct_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__ContactAcct, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_Contact(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_Contact",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Contact" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_gui_label_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_gui_label_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_gui_label_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_gui_label_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_contact_id_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_contact_id_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->contact_id = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_contact_id_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_contact_id_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->contact_id); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_email_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_email_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->email = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_email_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_email_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->email); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_memo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_memo_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_memo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_memo_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->memo); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_public_key_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_public_key_set",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(obj1, &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + resultobj = SWIG_Py_Void(); + if (SWIG_IsNewObj(res2)) delete arg2; + return resultobj; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_public_key_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + std::string *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_public_key_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->public_key); + resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_GetContactNymCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_GetContactNymCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNymCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactNymCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_GetContactNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::ContactNym *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_GetContactNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_RemoveContactNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_RemoveContactNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactNym(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_AddContactNym(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_AddContactNym",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__ContactNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactNym * >(argp2); + result = (bool)(arg1)->AddContactNym(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_GetContactAcctCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_GetContactAcctCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcctCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactAcctCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_GetContactAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::ContactAcct *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_GetContactAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_RemoveContactAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_RemoveContactAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactAcct(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_AddContactAcct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:Contact_AddContactAcct",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__ContactAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactAcct * >(argp2); + result = (bool)(arg1)->AddContactAcct(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_Contact_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::Contact *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:Contact_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *Contact_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__Contact, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_delete_AddressBook(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_AddressBook",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AddressBook, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AddressBook" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + delete arg1; + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AddressBook_GetContactCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + size_t result; + + if (!PyArg_ParseTuple(args,(char *)"O:AddressBook_GetContactCount",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContactCount" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + result = (arg1)->GetContactCount(); + resultobj = SWIG_From_size_t(static_cast< size_t >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AddressBook_GetContact(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + OTDB::Contact *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:AddressBook_GetContact",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_GetContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AddressBook_RemoveContact(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:AddressBook_RemoveContact",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_RemoveContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_RemoveContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContact(arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AddressBook_AddContact(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + bool result; + + if (!PyArg_ParseTuple(args,(char *)"OO:AddressBook_AddContact",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_AddContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_OTDB__Contact, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + arg2 = reinterpret_cast< OTDB::Contact * >(argp2); + result = (bool)(arg1)->AddContact(*arg2); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_AddressBook_ot_dynamic_cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + OTDB::AddressBook *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:AddressBook_ot_dynamic_cast",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *AddressBook_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_OTDB__AddressBook, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +static PyMethodDef SwigMethods[] = { + { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, + { (char *)"new_OTCallback", _wrap_new_OTCallback, METH_VARARGS, NULL}, + { (char *)"delete_OTCallback", _wrap_delete_OTCallback, METH_VARARGS, NULL}, + { (char *)"OTCallback_runOne", _wrap_OTCallback_runOne, METH_VARARGS, NULL}, + { (char *)"OTCallback_runTwo", _wrap_OTCallback_runTwo, METH_VARARGS, NULL}, + { (char *)"disown_OTCallback", _wrap_disown_OTCallback, METH_VARARGS, NULL}, + { (char *)"OTCallback_swigregister", OTCallback_swigregister, METH_VARARGS, NULL}, + { (char *)"new_OTCaller", _wrap_new_OTCaller, METH_VARARGS, NULL}, + { (char *)"delete_OTCaller", _wrap_delete_OTCaller, METH_VARARGS, NULL}, + { (char *)"OTCaller_GetPassword", _wrap_OTCaller_GetPassword, METH_VARARGS, NULL}, + { (char *)"OTCaller_delCallback", _wrap_OTCaller_delCallback, METH_VARARGS, NULL}, + { (char *)"OTCaller_setCallback", _wrap_OTCaller_setCallback, METH_VARARGS, NULL}, + { (char *)"OTCaller_isCallbackSet", _wrap_OTCaller_isCallbackSet, METH_VARARGS, NULL}, + { (char *)"OTCaller_callOne", _wrap_OTCaller_callOne, METH_VARARGS, NULL}, + { (char *)"OTCaller_callTwo", _wrap_OTCaller_callTwo, METH_VARARGS, NULL}, + { (char *)"OTCaller_swigregister", OTCaller_swigregister, METH_VARARGS, NULL}, + { (char *)"OT_API_Set_PasswordCallback", _wrap_OT_API_Set_PasswordCallback, METH_VARARGS, NULL}, + { (char *)"OT_API_Init", _wrap_OT_API_Init, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadWallet", _wrap_OT_API_LoadWallet, METH_VARARGS, NULL}, + { (char *)"OT_API_SwitchWallet", _wrap_OT_API_SwitchWallet, METH_VARARGS, NULL}, + { (char *)"OT_API_GetMemlogSize", _wrap_OT_API_GetMemlogSize, METH_VARARGS, NULL}, + { (char *)"OT_API_GetMemlogAtIndex", _wrap_OT_API_GetMemlogAtIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_PeekMemlogFront", _wrap_OT_API_PeekMemlogFront, METH_VARARGS, NULL}, + { (char *)"OT_API_PeekMemlogBack", _wrap_OT_API_PeekMemlogBack, METH_VARARGS, NULL}, + { (char *)"OT_API_PopMemlogFront", _wrap_OT_API_PopMemlogFront, METH_VARARGS, NULL}, + { (char *)"OT_API_PopMemlogBack", _wrap_OT_API_PopMemlogBack, METH_VARARGS, NULL}, + { (char *)"OT_API_CreateNym", _wrap_OT_API_CreateNym, METH_VARARGS, NULL}, + { (char *)"OT_API_AddServerContract", _wrap_OT_API_AddServerContract, METH_VARARGS, NULL}, + { (char *)"OT_API_AddAssetContract", _wrap_OT_API_AddAssetContract, METH_VARARGS, NULL}, + { (char *)"OT_API_GetServerCount", _wrap_OT_API_GetServerCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAssetTypeCount", _wrap_OT_API_GetAssetTypeCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountCount", _wrap_OT_API_GetAccountCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNymCount", _wrap_OT_API_GetNymCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetServer_ID", _wrap_OT_API_GetServer_ID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetServer_Name", _wrap_OT_API_GetServer_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAssetType_ID", _wrap_OT_API_GetAssetType_ID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAssetType_Name", _wrap_OT_API_GetAssetType_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_ID", _wrap_OT_API_GetAccountWallet_ID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_Name", _wrap_OT_API_GetAccountWallet_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_Balance", _wrap_OT_API_GetAccountWallet_Balance, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_Type", _wrap_OT_API_GetAccountWallet_Type, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_AssetTypeID", _wrap_OT_API_GetAccountWallet_AssetTypeID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_ServerID", _wrap_OT_API_GetAccountWallet_ServerID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetAccountWallet_NymID", _wrap_OT_API_GetAccountWallet_NymID, METH_VARARGS, NULL}, + { (char *)"OT_API_VerifyAccountReceipt", _wrap_OT_API_VerifyAccountReceipt, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_TransactionNumCount", _wrap_OT_API_GetNym_TransactionNumCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_ID", _wrap_OT_API_GetNym_ID, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_Name", _wrap_OT_API_GetNym_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_Stats", _wrap_OT_API_GetNym_Stats, METH_VARARGS, NULL}, + { (char *)"OT_API_IsNym_RegisteredAtServer", _wrap_OT_API_IsNym_RegisteredAtServer, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_MailCount", _wrap_OT_API_GetNym_MailCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_MailContentsByIndex", _wrap_OT_API_GetNym_MailContentsByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_MailSenderIDByIndex", _wrap_OT_API_GetNym_MailSenderIDByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_MailServerIDByIndex", _wrap_OT_API_GetNym_MailServerIDByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Nym_RemoveMailByIndex", _wrap_OT_API_Nym_RemoveMailByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Nym_VerifyMailByIndex", _wrap_OT_API_Nym_VerifyMailByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_OutmailCount", _wrap_OT_API_GetNym_OutmailCount, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_OutmailContentsByIndex", _wrap_OT_API_GetNym_OutmailContentsByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_OutmailRecipientIDByIndex", _wrap_OT_API_GetNym_OutmailRecipientIDByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_GetNym_OutmailServerIDByIndex", _wrap_OT_API_GetNym_OutmailServerIDByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Nym_RemoveOutmailByIndex", _wrap_OT_API_Nym_RemoveOutmailByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Nym_VerifyOutmailByIndex", _wrap_OT_API_Nym_VerifyOutmailByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_CanRemoveServer", _wrap_OT_API_Wallet_CanRemoveServer, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_RemoveServer", _wrap_OT_API_Wallet_RemoveServer, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_CanRemoveAssetType", _wrap_OT_API_Wallet_CanRemoveAssetType, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_RemoveAssetType", _wrap_OT_API_Wallet_RemoveAssetType, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_CanRemoveNym", _wrap_OT_API_Wallet_CanRemoveNym, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_RemoveNym", _wrap_OT_API_Wallet_RemoveNym, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_CanRemoveAccount", _wrap_OT_API_Wallet_CanRemoveAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_ImportNym", _wrap_OT_API_Wallet_ImportNym, METH_VARARGS, NULL}, + { (char *)"OT_API_SetNym_Name", _wrap_OT_API_SetNym_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_SetAccountWallet_Name", _wrap_OT_API_SetAccountWallet_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_SetAssetType_Name", _wrap_OT_API_SetAssetType_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_SetServer_Name", _wrap_OT_API_SetServer_Name, METH_VARARGS, NULL}, + { (char *)"OT_API_VerifyAndRetrieveXMLContents", _wrap_OT_API_VerifyAndRetrieveXMLContents, METH_VARARGS, NULL}, + { (char *)"OT_API_WriteCheque", _wrap_OT_API_WriteCheque, METH_VARARGS, NULL}, + { (char *)"OT_API_ProposePaymentPlan", _wrap_OT_API_ProposePaymentPlan, METH_VARARGS, NULL}, + { (char *)"OT_API_ConfirmPaymentPlan", _wrap_OT_API_ConfirmPaymentPlan, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadUserPubkey", _wrap_OT_API_LoadUserPubkey, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadPubkey", _wrap_OT_API_LoadPubkey, METH_VARARGS, NULL}, + { (char *)"OT_API_VerifyUserPrivateKey", _wrap_OT_API_VerifyUserPrivateKey, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadPurse", _wrap_OT_API_LoadPurse, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadMint", _wrap_OT_API_LoadMint, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadAssetContract", _wrap_OT_API_LoadAssetContract, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadServerContract", _wrap_OT_API_LoadServerContract, METH_VARARGS, NULL}, + { (char *)"OT_API_Mint_IsStillGood", _wrap_OT_API_Mint_IsStillGood, METH_VARARGS, NULL}, + { (char *)"OT_API_IsBasketCurrency", _wrap_OT_API_IsBasketCurrency, METH_VARARGS, NULL}, + { (char *)"OT_API_Basket_GetMemberCount", _wrap_OT_API_Basket_GetMemberCount, METH_VARARGS, NULL}, + { (char *)"OT_API_Basket_GetMemberType", _wrap_OT_API_Basket_GetMemberType, METH_VARARGS, NULL}, + { (char *)"OT_API_Basket_GetMinimumTransferAmount", _wrap_OT_API_Basket_GetMinimumTransferAmount, METH_VARARGS, NULL}, + { (char *)"OT_API_Basket_GetMemberMinimumTransferAmount", _wrap_OT_API_Basket_GetMemberMinimumTransferAmount, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadAssetAccount", _wrap_OT_API_LoadAssetAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadInbox", _wrap_OT_API_LoadInbox, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadOutbox", _wrap_OT_API_LoadOutbox, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_GetCount", _wrap_OT_API_Ledger_GetCount, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_CreateResponse", _wrap_OT_API_Ledger_CreateResponse, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_GetTransactionByIndex", _wrap_OT_API_Ledger_GetTransactionByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_GetTransactionByID", _wrap_OT_API_Ledger_GetTransactionByID, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_GetTransactionIDByIndex", _wrap_OT_API_Ledger_GetTransactionIDByIndex, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_AddTransaction", _wrap_OT_API_Ledger_AddTransaction, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_CreateResponse", _wrap_OT_API_Transaction_CreateResponse, METH_VARARGS, NULL}, + { (char *)"OT_API_Ledger_FinalizeResponse", _wrap_OT_API_Ledger_FinalizeResponse, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetType", _wrap_OT_API_Transaction_GetType, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetVoucher", _wrap_OT_API_Transaction_GetVoucher, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetSuccess", _wrap_OT_API_Transaction_GetSuccess, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetBalanceAgreementSuccess", _wrap_OT_API_Transaction_GetBalanceAgreementSuccess, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetDateSigned", _wrap_OT_API_Transaction_GetDateSigned, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetAmount", _wrap_OT_API_Transaction_GetAmount, METH_VARARGS, NULL}, + { (char *)"OT_API_Pending_GetNote", _wrap_OT_API_Pending_GetNote, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetSenderUserID", _wrap_OT_API_Transaction_GetSenderUserID, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetSenderAcctID", _wrap_OT_API_Transaction_GetSenderAcctID, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetRecipientUserID", _wrap_OT_API_Transaction_GetRecipientUserID, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetRecipientAcctID", _wrap_OT_API_Transaction_GetRecipientAcctID, METH_VARARGS, NULL}, + { (char *)"OT_API_Transaction_GetDisplayReferenceToNum", _wrap_OT_API_Transaction_GetDisplayReferenceToNum, METH_VARARGS, NULL}, + { (char *)"OT_API_CreatePurse", _wrap_OT_API_CreatePurse, METH_VARARGS, NULL}, + { (char *)"OT_API_SavePurse", _wrap_OT_API_SavePurse, METH_VARARGS, NULL}, + { (char *)"OT_API_Purse_GetTotalValue", _wrap_OT_API_Purse_GetTotalValue, METH_VARARGS, NULL}, + { (char *)"OT_API_Purse_Count", _wrap_OT_API_Purse_Count, METH_VARARGS, NULL}, + { (char *)"OT_API_Purse_Peek", _wrap_OT_API_Purse_Peek, METH_VARARGS, NULL}, + { (char *)"OT_API_Purse_Pop", _wrap_OT_API_Purse_Pop, METH_VARARGS, NULL}, + { (char *)"OT_API_Purse_Push", _wrap_OT_API_Purse_Push, METH_VARARGS, NULL}, + { (char *)"OT_API_Wallet_ImportPurse", _wrap_OT_API_Wallet_ImportPurse, METH_VARARGS, NULL}, + { (char *)"OT_API_exchangePurse", _wrap_OT_API_exchangePurse, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_ChangeOwner", _wrap_OT_API_Token_ChangeOwner, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetID", _wrap_OT_API_Token_GetID, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetDenomination", _wrap_OT_API_Token_GetDenomination, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetSeries", _wrap_OT_API_Token_GetSeries, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetValidFrom", _wrap_OT_API_Token_GetValidFrom, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetValidTo", _wrap_OT_API_Token_GetValidTo, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetAssetID", _wrap_OT_API_Token_GetAssetID, METH_VARARGS, NULL}, + { (char *)"OT_API_Token_GetServerID", _wrap_OT_API_Token_GetServerID, METH_VARARGS, NULL}, + { (char *)"OT_API_checkServerID", _wrap_OT_API_checkServerID, METH_VARARGS, NULL}, + { (char *)"OT_API_createUserAccount", _wrap_OT_API_createUserAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_deleteUserAccount", _wrap_OT_API_deleteUserAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_deleteAssetAccount", _wrap_OT_API_deleteAssetAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_checkUser", _wrap_OT_API_checkUser, METH_VARARGS, NULL}, + { (char *)"OT_API_sendUserMessage", _wrap_OT_API_sendUserMessage, METH_VARARGS, NULL}, + { (char *)"OT_API_getRequest", _wrap_OT_API_getRequest, METH_VARARGS, NULL}, + { (char *)"OT_API_getTransactionNumber", _wrap_OT_API_getTransactionNumber, METH_VARARGS, NULL}, + { (char *)"OT_API_issueAssetType", _wrap_OT_API_issueAssetType, METH_VARARGS, NULL}, + { (char *)"OT_API_getContract", _wrap_OT_API_getContract, METH_VARARGS, NULL}, + { (char *)"OT_API_getMint", _wrap_OT_API_getMint, METH_VARARGS, NULL}, + { (char *)"OT_API_createAssetAccount", _wrap_OT_API_createAssetAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_getAccount", _wrap_OT_API_getAccount, METH_VARARGS, NULL}, + { (char *)"OT_API_GenerateBasketCreation", _wrap_OT_API_GenerateBasketCreation, METH_VARARGS, NULL}, + { (char *)"OT_API_AddBasketCreationItem", _wrap_OT_API_AddBasketCreationItem, METH_VARARGS, NULL}, + { (char *)"OT_API_issueBasket", _wrap_OT_API_issueBasket, METH_VARARGS, NULL}, + { (char *)"OT_API_GenerateBasketExchange", _wrap_OT_API_GenerateBasketExchange, METH_VARARGS, NULL}, + { (char *)"OT_API_AddBasketExchangeItem", _wrap_OT_API_AddBasketExchangeItem, METH_VARARGS, NULL}, + { (char *)"OT_API_exchangeBasket", _wrap_OT_API_exchangeBasket, METH_VARARGS, NULL}, + { (char *)"OT_API_notarizeWithdrawal", _wrap_OT_API_notarizeWithdrawal, METH_VARARGS, NULL}, + { (char *)"OT_API_notarizeDeposit", _wrap_OT_API_notarizeDeposit, METH_VARARGS, NULL}, + { (char *)"OT_API_notarizeTransfer", _wrap_OT_API_notarizeTransfer, METH_VARARGS, NULL}, + { (char *)"OT_API_getInbox", _wrap_OT_API_getInbox, METH_VARARGS, NULL}, + { (char *)"OT_API_getOutbox", _wrap_OT_API_getOutbox, METH_VARARGS, NULL}, + { (char *)"OT_API_getNymbox", _wrap_OT_API_getNymbox, METH_VARARGS, NULL}, + { (char *)"OT_API_LoadNymbox", _wrap_OT_API_LoadNymbox, METH_VARARGS, NULL}, + { (char *)"OT_API_processInbox", _wrap_OT_API_processInbox, METH_VARARGS, NULL}, + { (char *)"OT_API_processNymbox", _wrap_OT_API_processNymbox, METH_VARARGS, NULL}, + { (char *)"OT_API_withdrawVoucher", _wrap_OT_API_withdrawVoucher, METH_VARARGS, NULL}, + { (char *)"OT_API_depositCheque", _wrap_OT_API_depositCheque, METH_VARARGS, NULL}, + { (char *)"OT_API_depositPaymentPlan", _wrap_OT_API_depositPaymentPlan, METH_VARARGS, NULL}, + { (char *)"OT_API_issueMarketOffer", _wrap_OT_API_issueMarketOffer, METH_VARARGS, NULL}, + { (char *)"OT_API_getMarketList", _wrap_OT_API_getMarketList, METH_VARARGS, NULL}, + { (char *)"OT_API_getMarketOffers", _wrap_OT_API_getMarketOffers, METH_VARARGS, NULL}, + { (char *)"OT_API_getMarketRecentTrades", _wrap_OT_API_getMarketRecentTrades, METH_VARARGS, NULL}, + { (char *)"OT_API_getNym_MarketOffers", _wrap_OT_API_getNym_MarketOffers, METH_VARARGS, NULL}, + { (char *)"OT_API_cancelMarketOffer", _wrap_OT_API_cancelMarketOffer, METH_VARARGS, NULL}, + { (char *)"OT_API_cancelPaymentPlan", _wrap_OT_API_cancelPaymentPlan, METH_VARARGS, NULL}, + { (char *)"OT_API_PopMessageBuffer", _wrap_OT_API_PopMessageBuffer, METH_VARARGS, NULL}, + { (char *)"OT_API_FlushMessageBuffer", _wrap_OT_API_FlushMessageBuffer, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetCommand", _wrap_OT_API_Message_GetCommand, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetSuccess", _wrap_OT_API_Message_GetSuccess, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetDepth", _wrap_OT_API_Message_GetDepth, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetTransactionSuccess", _wrap_OT_API_Message_GetTransactionSuccess, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetBalanceAgreementSuccess", _wrap_OT_API_Message_GetBalanceAgreementSuccess, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetLedger", _wrap_OT_API_Message_GetLedger, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetNewAssetTypeID", _wrap_OT_API_Message_GetNewAssetTypeID, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetNewIssuerAcctID", _wrap_OT_API_Message_GetNewIssuerAcctID, METH_VARARGS, NULL}, + { (char *)"OT_API_Message_GetNewAcctID", _wrap_OT_API_Message_GetNewAcctID, METH_VARARGS, NULL}, + { (char *)"OT_API_ConnectServer", _wrap_OT_API_ConnectServer, METH_VARARGS, NULL}, + { (char *)"OT_API_ProcessSockets", _wrap_OT_API_ProcessSockets, METH_VARARGS, NULL}, + { (char *)"delete_Storable", _wrap_delete_Storable, METH_VARARGS, NULL}, + { (char *)"Storable_Create", _wrap_Storable_Create, METH_VARARGS, NULL}, + { (char *)"Storable_ot_dynamic_cast", _wrap_Storable_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Storable_swigregister", Storable_swigregister, METH_VARARGS, NULL}, + { (char *)"Storage_GetPacker", _wrap_Storage_GetPacker, METH_VARARGS, NULL}, + { (char *)"Storage_Init", _wrap_Storage_Init, METH_VARARGS, NULL}, + { (char *)"Storage_Exists", _wrap_Storage_Exists, METH_VARARGS, NULL}, + { (char *)"delete_Storage", _wrap_delete_Storage, METH_VARARGS, NULL}, + { (char *)"Storage_StoreString", _wrap_Storage_StoreString, METH_VARARGS, NULL}, + { (char *)"Storage_QueryString", _wrap_Storage_QueryString, METH_VARARGS, NULL}, + { (char *)"Storage_StorePlainString", _wrap_Storage_StorePlainString, METH_VARARGS, NULL}, + { (char *)"Storage_QueryPlainString", _wrap_Storage_QueryPlainString, METH_VARARGS, NULL}, + { (char *)"Storage_StoreObject", _wrap_Storage_StoreObject, METH_VARARGS, NULL}, + { (char *)"Storage_QueryObject", _wrap_Storage_QueryObject, METH_VARARGS, NULL}, + { (char *)"Storage_EraseValueByKey", _wrap_Storage_EraseValueByKey, METH_VARARGS, NULL}, + { (char *)"Storage_CreateObject", _wrap_Storage_CreateObject, METH_VARARGS, NULL}, + { (char *)"Storage_Create", _wrap_Storage_Create, METH_VARARGS, NULL}, + { (char *)"Storage_GetType", _wrap_Storage_GetType, METH_VARARGS, NULL}, + { (char *)"Storage_swigregister", Storage_swigregister, METH_VARARGS, NULL}, + { (char *)"InitDefaultStorage", _wrap_InitDefaultStorage, METH_VARARGS, NULL}, + { (char *)"GetDefaultStorage", _wrap_GetDefaultStorage, METH_VARARGS, NULL}, + { (char *)"CreateStorageContext", _wrap_CreateStorageContext, METH_VARARGS, NULL}, + { (char *)"CreateObject", _wrap_CreateObject, METH_VARARGS, NULL}, + { (char *)"Exists", _wrap_Exists, METH_VARARGS, NULL}, + { (char *)"StoreString", _wrap_StoreString, METH_VARARGS, NULL}, + { (char *)"QueryString", _wrap_QueryString, METH_VARARGS, NULL}, + { (char *)"StorePlainString", _wrap_StorePlainString, METH_VARARGS, NULL}, + { (char *)"QueryPlainString", _wrap_QueryPlainString, METH_VARARGS, NULL}, + { (char *)"StoreObject", _wrap_StoreObject, METH_VARARGS, NULL}, + { (char *)"QueryObject", _wrap_QueryObject, METH_VARARGS, NULL}, + { (char *)"EraseValueByKey", _wrap_EraseValueByKey, METH_VARARGS, NULL}, + { (char *)"delete_OTDBString", _wrap_delete_OTDBString, METH_VARARGS, NULL}, + { (char *)"OTDBString_m_string_set", _wrap_OTDBString_m_string_set, METH_VARARGS, NULL}, + { (char *)"OTDBString_m_string_get", _wrap_OTDBString_m_string_get, METH_VARARGS, NULL}, + { (char *)"OTDBString_ot_dynamic_cast", _wrap_OTDBString_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"OTDBString_swigregister", OTDBString_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_Blob", _wrap_delete_Blob, METH_VARARGS, NULL}, + { (char *)"Blob_m_memBuffer_set", _wrap_Blob_m_memBuffer_set, METH_VARARGS, NULL}, + { (char *)"Blob_m_memBuffer_get", _wrap_Blob_m_memBuffer_get, METH_VARARGS, NULL}, + { (char *)"Blob_ot_dynamic_cast", _wrap_Blob_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Blob_swigregister", Blob_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_StringMap", _wrap_delete_StringMap, METH_VARARGS, NULL}, + { (char *)"StringMap_the_map_set", _wrap_StringMap_the_map_set, METH_VARARGS, NULL}, + { (char *)"StringMap_the_map_get", _wrap_StringMap_the_map_get, METH_VARARGS, NULL}, + { (char *)"StringMap_SetValue", _wrap_StringMap_SetValue, METH_VARARGS, NULL}, + { (char *)"StringMap_GetValue", _wrap_StringMap_GetValue, METH_VARARGS, NULL}, + { (char *)"StringMap_ot_dynamic_cast", _wrap_StringMap_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"StringMap_swigregister", StringMap_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_Displayable", _wrap_delete_Displayable, METH_VARARGS, NULL}, + { (char *)"Displayable_gui_label_set", _wrap_Displayable_gui_label_set, METH_VARARGS, NULL}, + { (char *)"Displayable_gui_label_get", _wrap_Displayable_gui_label_get, METH_VARARGS, NULL}, + { (char *)"Displayable_ot_dynamic_cast", _wrap_Displayable_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Displayable_swigregister", Displayable_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_MarketData", _wrap_delete_MarketData, METH_VARARGS, NULL}, + { (char *)"MarketData_gui_label_set", _wrap_MarketData_gui_label_set, METH_VARARGS, NULL}, + { (char *)"MarketData_gui_label_get", _wrap_MarketData_gui_label_get, METH_VARARGS, NULL}, + { (char *)"MarketData_server_id_set", _wrap_MarketData_server_id_set, METH_VARARGS, NULL}, + { (char *)"MarketData_server_id_get", _wrap_MarketData_server_id_get, METH_VARARGS, NULL}, + { (char *)"MarketData_market_id_set", _wrap_MarketData_market_id_set, METH_VARARGS, NULL}, + { (char *)"MarketData_market_id_get", _wrap_MarketData_market_id_get, METH_VARARGS, NULL}, + { (char *)"MarketData_asset_type_id_set", _wrap_MarketData_asset_type_id_set, METH_VARARGS, NULL}, + { (char *)"MarketData_asset_type_id_get", _wrap_MarketData_asset_type_id_get, METH_VARARGS, NULL}, + { (char *)"MarketData_currency_type_id_set", _wrap_MarketData_currency_type_id_set, METH_VARARGS, NULL}, + { (char *)"MarketData_currency_type_id_get", _wrap_MarketData_currency_type_id_get, METH_VARARGS, NULL}, + { (char *)"MarketData_scale_set", _wrap_MarketData_scale_set, METH_VARARGS, NULL}, + { (char *)"MarketData_scale_get", _wrap_MarketData_scale_get, METH_VARARGS, NULL}, + { (char *)"MarketData_total_assets_set", _wrap_MarketData_total_assets_set, METH_VARARGS, NULL}, + { (char *)"MarketData_total_assets_get", _wrap_MarketData_total_assets_get, METH_VARARGS, NULL}, + { (char *)"MarketData_number_bids_set", _wrap_MarketData_number_bids_set, METH_VARARGS, NULL}, + { (char *)"MarketData_number_bids_get", _wrap_MarketData_number_bids_get, METH_VARARGS, NULL}, + { (char *)"MarketData_number_asks_set", _wrap_MarketData_number_asks_set, METH_VARARGS, NULL}, + { (char *)"MarketData_number_asks_get", _wrap_MarketData_number_asks_get, METH_VARARGS, NULL}, + { (char *)"MarketData_last_sale_price_set", _wrap_MarketData_last_sale_price_set, METH_VARARGS, NULL}, + { (char *)"MarketData_last_sale_price_get", _wrap_MarketData_last_sale_price_get, METH_VARARGS, NULL}, + { (char *)"MarketData_current_bid_set", _wrap_MarketData_current_bid_set, METH_VARARGS, NULL}, + { (char *)"MarketData_current_bid_get", _wrap_MarketData_current_bid_get, METH_VARARGS, NULL}, + { (char *)"MarketData_current_ask_set", _wrap_MarketData_current_ask_set, METH_VARARGS, NULL}, + { (char *)"MarketData_current_ask_get", _wrap_MarketData_current_ask_get, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_trades_set", _wrap_MarketData_volume_trades_set, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_trades_get", _wrap_MarketData_volume_trades_get, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_assets_set", _wrap_MarketData_volume_assets_set, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_assets_get", _wrap_MarketData_volume_assets_get, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_currency_set", _wrap_MarketData_volume_currency_set, METH_VARARGS, NULL}, + { (char *)"MarketData_volume_currency_get", _wrap_MarketData_volume_currency_get, METH_VARARGS, NULL}, + { (char *)"MarketData_recent_highest_bid_set", _wrap_MarketData_recent_highest_bid_set, METH_VARARGS, NULL}, + { (char *)"MarketData_recent_highest_bid_get", _wrap_MarketData_recent_highest_bid_get, METH_VARARGS, NULL}, + { (char *)"MarketData_recent_lowest_ask_set", _wrap_MarketData_recent_lowest_ask_set, METH_VARARGS, NULL}, + { (char *)"MarketData_recent_lowest_ask_get", _wrap_MarketData_recent_lowest_ask_get, METH_VARARGS, NULL}, + { (char *)"MarketData_ot_dynamic_cast", _wrap_MarketData_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"MarketData_swigregister", MarketData_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_MarketList", _wrap_delete_MarketList, METH_VARARGS, NULL}, + { (char *)"MarketList_GetMarketDataCount", _wrap_MarketList_GetMarketDataCount, METH_VARARGS, NULL}, + { (char *)"MarketList_GetMarketData", _wrap_MarketList_GetMarketData, METH_VARARGS, NULL}, + { (char *)"MarketList_RemoveMarketData", _wrap_MarketList_RemoveMarketData, METH_VARARGS, NULL}, + { (char *)"MarketList_AddMarketData", _wrap_MarketList_AddMarketData, METH_VARARGS, NULL}, + { (char *)"MarketList_ot_dynamic_cast", _wrap_MarketList_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"MarketList_swigregister", MarketList_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_OfferDataMarket", _wrap_delete_OfferDataMarket, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_gui_label_set", _wrap_OfferDataMarket_gui_label_set, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_gui_label_get", _wrap_OfferDataMarket_gui_label_get, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_transaction_id_set", _wrap_OfferDataMarket_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_transaction_id_get", _wrap_OfferDataMarket_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_price_per_scale_set", _wrap_OfferDataMarket_price_per_scale_set, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_price_per_scale_get", _wrap_OfferDataMarket_price_per_scale_get, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_available_assets_set", _wrap_OfferDataMarket_available_assets_set, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_available_assets_get", _wrap_OfferDataMarket_available_assets_get, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_minimum_increment_set", _wrap_OfferDataMarket_minimum_increment_set, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_minimum_increment_get", _wrap_OfferDataMarket_minimum_increment_get, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_ot_dynamic_cast", _wrap_OfferDataMarket_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"OfferDataMarket_swigregister", OfferDataMarket_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_BidData", _wrap_delete_BidData, METH_VARARGS, NULL}, + { (char *)"BidData_gui_label_set", _wrap_BidData_gui_label_set, METH_VARARGS, NULL}, + { (char *)"BidData_gui_label_get", _wrap_BidData_gui_label_get, METH_VARARGS, NULL}, + { (char *)"BidData_transaction_id_set", _wrap_BidData_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"BidData_transaction_id_get", _wrap_BidData_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"BidData_price_per_scale_set", _wrap_BidData_price_per_scale_set, METH_VARARGS, NULL}, + { (char *)"BidData_price_per_scale_get", _wrap_BidData_price_per_scale_get, METH_VARARGS, NULL}, + { (char *)"BidData_available_assets_set", _wrap_BidData_available_assets_set, METH_VARARGS, NULL}, + { (char *)"BidData_available_assets_get", _wrap_BidData_available_assets_get, METH_VARARGS, NULL}, + { (char *)"BidData_minimum_increment_set", _wrap_BidData_minimum_increment_set, METH_VARARGS, NULL}, + { (char *)"BidData_minimum_increment_get", _wrap_BidData_minimum_increment_get, METH_VARARGS, NULL}, + { (char *)"BidData_ot_dynamic_cast", _wrap_BidData_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"BidData_swigregister", BidData_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_AskData", _wrap_delete_AskData, METH_VARARGS, NULL}, + { (char *)"AskData_gui_label_set", _wrap_AskData_gui_label_set, METH_VARARGS, NULL}, + { (char *)"AskData_gui_label_get", _wrap_AskData_gui_label_get, METH_VARARGS, NULL}, + { (char *)"AskData_transaction_id_set", _wrap_AskData_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"AskData_transaction_id_get", _wrap_AskData_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"AskData_price_per_scale_set", _wrap_AskData_price_per_scale_set, METH_VARARGS, NULL}, + { (char *)"AskData_price_per_scale_get", _wrap_AskData_price_per_scale_get, METH_VARARGS, NULL}, + { (char *)"AskData_available_assets_set", _wrap_AskData_available_assets_set, METH_VARARGS, NULL}, + { (char *)"AskData_available_assets_get", _wrap_AskData_available_assets_get, METH_VARARGS, NULL}, + { (char *)"AskData_minimum_increment_set", _wrap_AskData_minimum_increment_set, METH_VARARGS, NULL}, + { (char *)"AskData_minimum_increment_get", _wrap_AskData_minimum_increment_get, METH_VARARGS, NULL}, + { (char *)"AskData_ot_dynamic_cast", _wrap_AskData_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"AskData_swigregister", AskData_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_OfferListMarket", _wrap_delete_OfferListMarket, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_GetBidDataCount", _wrap_OfferListMarket_GetBidDataCount, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_GetBidData", _wrap_OfferListMarket_GetBidData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_RemoveBidData", _wrap_OfferListMarket_RemoveBidData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_AddBidData", _wrap_OfferListMarket_AddBidData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_GetAskDataCount", _wrap_OfferListMarket_GetAskDataCount, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_GetAskData", _wrap_OfferListMarket_GetAskData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_RemoveAskData", _wrap_OfferListMarket_RemoveAskData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_AddAskData", _wrap_OfferListMarket_AddAskData, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_ot_dynamic_cast", _wrap_OfferListMarket_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"OfferListMarket_swigregister", OfferListMarket_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_TradeDataMarket", _wrap_delete_TradeDataMarket, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_gui_label_set", _wrap_TradeDataMarket_gui_label_set, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_gui_label_get", _wrap_TradeDataMarket_gui_label_get, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_transaction_id_set", _wrap_TradeDataMarket_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_transaction_id_get", _wrap_TradeDataMarket_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_date_set", _wrap_TradeDataMarket_date_set, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_date_get", _wrap_TradeDataMarket_date_get, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_price_set", _wrap_TradeDataMarket_price_set, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_price_get", _wrap_TradeDataMarket_price_get, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_amount_sold_set", _wrap_TradeDataMarket_amount_sold_set, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_amount_sold_get", _wrap_TradeDataMarket_amount_sold_get, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_ot_dynamic_cast", _wrap_TradeDataMarket_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"TradeDataMarket_swigregister", TradeDataMarket_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_TradeListMarket", _wrap_delete_TradeListMarket, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_GetTradeDataMarketCount", _wrap_TradeListMarket_GetTradeDataMarketCount, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_GetTradeDataMarket", _wrap_TradeListMarket_GetTradeDataMarket, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_RemoveTradeDataMarket", _wrap_TradeListMarket_RemoveTradeDataMarket, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_AddTradeDataMarket", _wrap_TradeListMarket_AddTradeDataMarket, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_ot_dynamic_cast", _wrap_TradeListMarket_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"TradeListMarket_swigregister", TradeListMarket_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_OfferDataNym", _wrap_delete_OfferDataNym, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_gui_label_set", _wrap_OfferDataNym_gui_label_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_gui_label_get", _wrap_OfferDataNym_gui_label_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_valid_from_set", _wrap_OfferDataNym_valid_from_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_valid_from_get", _wrap_OfferDataNym_valid_from_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_valid_to_set", _wrap_OfferDataNym_valid_to_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_valid_to_get", _wrap_OfferDataNym_valid_to_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_server_id_set", _wrap_OfferDataNym_server_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_server_id_get", _wrap_OfferDataNym_server_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_asset_type_id_set", _wrap_OfferDataNym_asset_type_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_asset_type_id_get", _wrap_OfferDataNym_asset_type_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_asset_acct_id_set", _wrap_OfferDataNym_asset_acct_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_asset_acct_id_get", _wrap_OfferDataNym_asset_acct_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_currency_type_id_set", _wrap_OfferDataNym_currency_type_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_currency_type_id_get", _wrap_OfferDataNym_currency_type_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_currency_acct_id_set", _wrap_OfferDataNym_currency_acct_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_currency_acct_id_get", _wrap_OfferDataNym_currency_acct_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_selling_set", _wrap_OfferDataNym_selling_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_selling_get", _wrap_OfferDataNym_selling_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_scale_set", _wrap_OfferDataNym_scale_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_scale_get", _wrap_OfferDataNym_scale_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_price_per_scale_set", _wrap_OfferDataNym_price_per_scale_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_price_per_scale_get", _wrap_OfferDataNym_price_per_scale_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_transaction_id_set", _wrap_OfferDataNym_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_transaction_id_get", _wrap_OfferDataNym_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_total_assets_set", _wrap_OfferDataNym_total_assets_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_total_assets_get", _wrap_OfferDataNym_total_assets_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_finished_so_far_set", _wrap_OfferDataNym_finished_so_far_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_finished_so_far_get", _wrap_OfferDataNym_finished_so_far_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_minimum_increment_set", _wrap_OfferDataNym_minimum_increment_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_minimum_increment_get", _wrap_OfferDataNym_minimum_increment_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_stop_sign_set", _wrap_OfferDataNym_stop_sign_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_stop_sign_get", _wrap_OfferDataNym_stop_sign_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_stop_price_set", _wrap_OfferDataNym_stop_price_set, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_stop_price_get", _wrap_OfferDataNym_stop_price_get, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_ot_dynamic_cast", _wrap_OfferDataNym_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"OfferDataNym_swigregister", OfferDataNym_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_OfferListNym", _wrap_delete_OfferListNym, METH_VARARGS, NULL}, + { (char *)"OfferListNym_GetOfferDataNymCount", _wrap_OfferListNym_GetOfferDataNymCount, METH_VARARGS, NULL}, + { (char *)"OfferListNym_GetOfferDataNym", _wrap_OfferListNym_GetOfferDataNym, METH_VARARGS, NULL}, + { (char *)"OfferListNym_RemoveOfferDataNym", _wrap_OfferListNym_RemoveOfferDataNym, METH_VARARGS, NULL}, + { (char *)"OfferListNym_AddOfferDataNym", _wrap_OfferListNym_AddOfferDataNym, METH_VARARGS, NULL}, + { (char *)"OfferListNym_ot_dynamic_cast", _wrap_OfferListNym_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"OfferListNym_swigregister", OfferListNym_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_TradeDataNym", _wrap_delete_TradeDataNym, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_gui_label_set", _wrap_TradeDataNym_gui_label_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_gui_label_get", _wrap_TradeDataNym_gui_label_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_transaction_id_set", _wrap_TradeDataNym_transaction_id_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_transaction_id_get", _wrap_TradeDataNym_transaction_id_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_completed_count_set", _wrap_TradeDataNym_completed_count_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_completed_count_get", _wrap_TradeDataNym_completed_count_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_date_set", _wrap_TradeDataNym_date_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_date_get", _wrap_TradeDataNym_date_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_price_set", _wrap_TradeDataNym_price_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_price_get", _wrap_TradeDataNym_price_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_amount_sold_set", _wrap_TradeDataNym_amount_sold_set, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_amount_sold_get", _wrap_TradeDataNym_amount_sold_get, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_ot_dynamic_cast", _wrap_TradeDataNym_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"TradeDataNym_swigregister", TradeDataNym_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_TradeListNym", _wrap_delete_TradeListNym, METH_VARARGS, NULL}, + { (char *)"TradeListNym_GetTradeDataNymCount", _wrap_TradeListNym_GetTradeDataNymCount, METH_VARARGS, NULL}, + { (char *)"TradeListNym_GetTradeDataNym", _wrap_TradeListNym_GetTradeDataNym, METH_VARARGS, NULL}, + { (char *)"TradeListNym_RemoveTradeDataNym", _wrap_TradeListNym_RemoveTradeDataNym, METH_VARARGS, NULL}, + { (char *)"TradeListNym_AddTradeDataNym", _wrap_TradeListNym_AddTradeDataNym, METH_VARARGS, NULL}, + { (char *)"TradeListNym_ot_dynamic_cast", _wrap_TradeListNym_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"TradeListNym_swigregister", TradeListNym_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_Acct", _wrap_delete_Acct, METH_VARARGS, NULL}, + { (char *)"Acct_gui_label_set", _wrap_Acct_gui_label_set, METH_VARARGS, NULL}, + { (char *)"Acct_gui_label_get", _wrap_Acct_gui_label_get, METH_VARARGS, NULL}, + { (char *)"Acct_acct_id_set", _wrap_Acct_acct_id_set, METH_VARARGS, NULL}, + { (char *)"Acct_acct_id_get", _wrap_Acct_acct_id_get, METH_VARARGS, NULL}, + { (char *)"Acct_server_id_set", _wrap_Acct_server_id_set, METH_VARARGS, NULL}, + { (char *)"Acct_server_id_get", _wrap_Acct_server_id_get, METH_VARARGS, NULL}, + { (char *)"Acct_ot_dynamic_cast", _wrap_Acct_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Acct_swigregister", Acct_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_BitcoinAcct", _wrap_delete_BitcoinAcct, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_gui_label_set", _wrap_BitcoinAcct_gui_label_set, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_gui_label_get", _wrap_BitcoinAcct_gui_label_get, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_acct_id_set", _wrap_BitcoinAcct_acct_id_set, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_acct_id_get", _wrap_BitcoinAcct_acct_id_get, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_server_id_set", _wrap_BitcoinAcct_server_id_set, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_server_id_get", _wrap_BitcoinAcct_server_id_get, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_bitcoin_acct_name_set", _wrap_BitcoinAcct_bitcoin_acct_name_set, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_bitcoin_acct_name_get", _wrap_BitcoinAcct_bitcoin_acct_name_get, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_ot_dynamic_cast", _wrap_BitcoinAcct_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"BitcoinAcct_swigregister", BitcoinAcct_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_ServerInfo", _wrap_delete_ServerInfo, METH_VARARGS, NULL}, + { (char *)"ServerInfo_gui_label_set", _wrap_ServerInfo_gui_label_set, METH_VARARGS, NULL}, + { (char *)"ServerInfo_gui_label_get", _wrap_ServerInfo_gui_label_get, METH_VARARGS, NULL}, + { (char *)"ServerInfo_server_id_set", _wrap_ServerInfo_server_id_set, METH_VARARGS, NULL}, + { (char *)"ServerInfo_server_id_get", _wrap_ServerInfo_server_id_get, METH_VARARGS, NULL}, + { (char *)"ServerInfo_server_type_set", _wrap_ServerInfo_server_type_set, METH_VARARGS, NULL}, + { (char *)"ServerInfo_server_type_get", _wrap_ServerInfo_server_type_get, METH_VARARGS, NULL}, + { (char *)"ServerInfo_ot_dynamic_cast", _wrap_ServerInfo_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"ServerInfo_swigregister", ServerInfo_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_Server", _wrap_delete_Server, METH_VARARGS, NULL}, + { (char *)"Server_gui_label_set", _wrap_Server_gui_label_set, METH_VARARGS, NULL}, + { (char *)"Server_gui_label_get", _wrap_Server_gui_label_get, METH_VARARGS, NULL}, + { (char *)"Server_server_id_set", _wrap_Server_server_id_set, METH_VARARGS, NULL}, + { (char *)"Server_server_id_get", _wrap_Server_server_id_get, METH_VARARGS, NULL}, + { (char *)"Server_server_type_set", _wrap_Server_server_type_set, METH_VARARGS, NULL}, + { (char *)"Server_server_type_get", _wrap_Server_server_type_get, METH_VARARGS, NULL}, + { (char *)"Server_server_host_set", _wrap_Server_server_host_set, METH_VARARGS, NULL}, + { (char *)"Server_server_host_get", _wrap_Server_server_host_get, METH_VARARGS, NULL}, + { (char *)"Server_server_port_set", _wrap_Server_server_port_set, METH_VARARGS, NULL}, + { (char *)"Server_server_port_get", _wrap_Server_server_port_get, METH_VARARGS, NULL}, + { (char *)"Server_ot_dynamic_cast", _wrap_Server_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Server_swigregister", Server_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_BitcoinServer", _wrap_delete_BitcoinServer, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_gui_label_set", _wrap_BitcoinServer_gui_label_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_gui_label_get", _wrap_BitcoinServer_gui_label_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_id_set", _wrap_BitcoinServer_server_id_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_id_get", _wrap_BitcoinServer_server_id_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_type_set", _wrap_BitcoinServer_server_type_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_type_get", _wrap_BitcoinServer_server_type_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_host_set", _wrap_BitcoinServer_server_host_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_host_get", _wrap_BitcoinServer_server_host_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_port_set", _wrap_BitcoinServer_server_port_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_server_port_get", _wrap_BitcoinServer_server_port_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_bitcoin_username_set", _wrap_BitcoinServer_bitcoin_username_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_bitcoin_username_get", _wrap_BitcoinServer_bitcoin_username_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_bitcoin_password_set", _wrap_BitcoinServer_bitcoin_password_set, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_bitcoin_password_get", _wrap_BitcoinServer_bitcoin_password_get, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_ot_dynamic_cast", _wrap_BitcoinServer_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"BitcoinServer_swigregister", BitcoinServer_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_RippleServer", _wrap_delete_RippleServer, METH_VARARGS, NULL}, + { (char *)"RippleServer_gui_label_set", _wrap_RippleServer_gui_label_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_gui_label_get", _wrap_RippleServer_gui_label_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_id_set", _wrap_RippleServer_server_id_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_id_get", _wrap_RippleServer_server_id_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_type_set", _wrap_RippleServer_server_type_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_type_get", _wrap_RippleServer_server_type_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_host_set", _wrap_RippleServer_server_host_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_host_get", _wrap_RippleServer_server_host_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_port_set", _wrap_RippleServer_server_port_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_server_port_get", _wrap_RippleServer_server_port_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_ripple_username_set", _wrap_RippleServer_ripple_username_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_ripple_username_get", _wrap_RippleServer_ripple_username_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_ripple_password_set", _wrap_RippleServer_ripple_password_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_ripple_password_get", _wrap_RippleServer_ripple_password_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_namefield_id_set", _wrap_RippleServer_namefield_id_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_namefield_id_get", _wrap_RippleServer_namefield_id_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_passfield_id_set", _wrap_RippleServer_passfield_id_set, METH_VARARGS, NULL}, + { (char *)"RippleServer_passfield_id_get", _wrap_RippleServer_passfield_id_get, METH_VARARGS, NULL}, + { (char *)"RippleServer_ot_dynamic_cast", _wrap_RippleServer_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"RippleServer_swigregister", RippleServer_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_LoomServer", _wrap_delete_LoomServer, METH_VARARGS, NULL}, + { (char *)"LoomServer_gui_label_set", _wrap_LoomServer_gui_label_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_gui_label_get", _wrap_LoomServer_gui_label_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_id_set", _wrap_LoomServer_server_id_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_id_get", _wrap_LoomServer_server_id_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_type_set", _wrap_LoomServer_server_type_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_type_get", _wrap_LoomServer_server_type_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_host_set", _wrap_LoomServer_server_host_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_host_get", _wrap_LoomServer_server_host_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_port_set", _wrap_LoomServer_server_port_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_server_port_get", _wrap_LoomServer_server_port_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_loom_username_set", _wrap_LoomServer_loom_username_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_loom_username_get", _wrap_LoomServer_loom_username_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_namefield_id_set", _wrap_LoomServer_namefield_id_set, METH_VARARGS, NULL}, + { (char *)"LoomServer_namefield_id_get", _wrap_LoomServer_namefield_id_get, METH_VARARGS, NULL}, + { (char *)"LoomServer_ot_dynamic_cast", _wrap_LoomServer_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"LoomServer_swigregister", LoomServer_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_ContactNym", _wrap_delete_ContactNym, METH_VARARGS, NULL}, + { (char *)"ContactNym_gui_label_set", _wrap_ContactNym_gui_label_set, METH_VARARGS, NULL}, + { (char *)"ContactNym_gui_label_get", _wrap_ContactNym_gui_label_get, METH_VARARGS, NULL}, + { (char *)"ContactNym_nym_type_set", _wrap_ContactNym_nym_type_set, METH_VARARGS, NULL}, + { (char *)"ContactNym_nym_type_get", _wrap_ContactNym_nym_type_get, METH_VARARGS, NULL}, + { (char *)"ContactNym_nym_id_set", _wrap_ContactNym_nym_id_set, METH_VARARGS, NULL}, + { (char *)"ContactNym_nym_id_get", _wrap_ContactNym_nym_id_get, METH_VARARGS, NULL}, + { (char *)"ContactNym_public_key_set", _wrap_ContactNym_public_key_set, METH_VARARGS, NULL}, + { (char *)"ContactNym_public_key_get", _wrap_ContactNym_public_key_get, METH_VARARGS, NULL}, + { (char *)"ContactNym_memo_set", _wrap_ContactNym_memo_set, METH_VARARGS, NULL}, + { (char *)"ContactNym_memo_get", _wrap_ContactNym_memo_get, METH_VARARGS, NULL}, + { (char *)"ContactNym_GetServerInfoCount", _wrap_ContactNym_GetServerInfoCount, METH_VARARGS, NULL}, + { (char *)"ContactNym_GetServerInfo", _wrap_ContactNym_GetServerInfo, METH_VARARGS, NULL}, + { (char *)"ContactNym_RemoveServerInfo", _wrap_ContactNym_RemoveServerInfo, METH_VARARGS, NULL}, + { (char *)"ContactNym_AddServerInfo", _wrap_ContactNym_AddServerInfo, METH_VARARGS, NULL}, + { (char *)"ContactNym_ot_dynamic_cast", _wrap_ContactNym_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"ContactNym_swigregister", ContactNym_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_WalletData", _wrap_delete_WalletData, METH_VARARGS, NULL}, + { (char *)"WalletData_GetBitcoinServerCount", _wrap_WalletData_GetBitcoinServerCount, METH_VARARGS, NULL}, + { (char *)"WalletData_GetBitcoinServer", _wrap_WalletData_GetBitcoinServer, METH_VARARGS, NULL}, + { (char *)"WalletData_RemoveBitcoinServer", _wrap_WalletData_RemoveBitcoinServer, METH_VARARGS, NULL}, + { (char *)"WalletData_AddBitcoinServer", _wrap_WalletData_AddBitcoinServer, METH_VARARGS, NULL}, + { (char *)"WalletData_GetBitcoinAcctCount", _wrap_WalletData_GetBitcoinAcctCount, METH_VARARGS, NULL}, + { (char *)"WalletData_GetBitcoinAcct", _wrap_WalletData_GetBitcoinAcct, METH_VARARGS, NULL}, + { (char *)"WalletData_RemoveBitcoinAcct", _wrap_WalletData_RemoveBitcoinAcct, METH_VARARGS, NULL}, + { (char *)"WalletData_AddBitcoinAcct", _wrap_WalletData_AddBitcoinAcct, METH_VARARGS, NULL}, + { (char *)"WalletData_GetRippleServerCount", _wrap_WalletData_GetRippleServerCount, METH_VARARGS, NULL}, + { (char *)"WalletData_GetRippleServer", _wrap_WalletData_GetRippleServer, METH_VARARGS, NULL}, + { (char *)"WalletData_RemoveRippleServer", _wrap_WalletData_RemoveRippleServer, METH_VARARGS, NULL}, + { (char *)"WalletData_AddRippleServer", _wrap_WalletData_AddRippleServer, METH_VARARGS, NULL}, + { (char *)"WalletData_GetLoomServerCount", _wrap_WalletData_GetLoomServerCount, METH_VARARGS, NULL}, + { (char *)"WalletData_GetLoomServer", _wrap_WalletData_GetLoomServer, METH_VARARGS, NULL}, + { (char *)"WalletData_RemoveLoomServer", _wrap_WalletData_RemoveLoomServer, METH_VARARGS, NULL}, + { (char *)"WalletData_AddLoomServer", _wrap_WalletData_AddLoomServer, METH_VARARGS, NULL}, + { (char *)"WalletData_ot_dynamic_cast", _wrap_WalletData_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"WalletData_swigregister", WalletData_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_ContactAcct", _wrap_delete_ContactAcct, METH_VARARGS, NULL}, + { (char *)"ContactAcct_gui_label_set", _wrap_ContactAcct_gui_label_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_gui_label_get", _wrap_ContactAcct_gui_label_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_server_type_set", _wrap_ContactAcct_server_type_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_server_type_get", _wrap_ContactAcct_server_type_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_server_id_set", _wrap_ContactAcct_server_id_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_server_id_get", _wrap_ContactAcct_server_id_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_asset_type_id_set", _wrap_ContactAcct_asset_type_id_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_asset_type_id_get", _wrap_ContactAcct_asset_type_id_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_acct_id_set", _wrap_ContactAcct_acct_id_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_acct_id_get", _wrap_ContactAcct_acct_id_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_nym_id_set", _wrap_ContactAcct_nym_id_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_nym_id_get", _wrap_ContactAcct_nym_id_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_memo_set", _wrap_ContactAcct_memo_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_memo_get", _wrap_ContactAcct_memo_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_public_key_set", _wrap_ContactAcct_public_key_set, METH_VARARGS, NULL}, + { (char *)"ContactAcct_public_key_get", _wrap_ContactAcct_public_key_get, METH_VARARGS, NULL}, + { (char *)"ContactAcct_ot_dynamic_cast", _wrap_ContactAcct_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"ContactAcct_swigregister", ContactAcct_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_Contact", _wrap_delete_Contact, METH_VARARGS, NULL}, + { (char *)"Contact_gui_label_set", _wrap_Contact_gui_label_set, METH_VARARGS, NULL}, + { (char *)"Contact_gui_label_get", _wrap_Contact_gui_label_get, METH_VARARGS, NULL}, + { (char *)"Contact_contact_id_set", _wrap_Contact_contact_id_set, METH_VARARGS, NULL}, + { (char *)"Contact_contact_id_get", _wrap_Contact_contact_id_get, METH_VARARGS, NULL}, + { (char *)"Contact_email_set", _wrap_Contact_email_set, METH_VARARGS, NULL}, + { (char *)"Contact_email_get", _wrap_Contact_email_get, METH_VARARGS, NULL}, + { (char *)"Contact_memo_set", _wrap_Contact_memo_set, METH_VARARGS, NULL}, + { (char *)"Contact_memo_get", _wrap_Contact_memo_get, METH_VARARGS, NULL}, + { (char *)"Contact_public_key_set", _wrap_Contact_public_key_set, METH_VARARGS, NULL}, + { (char *)"Contact_public_key_get", _wrap_Contact_public_key_get, METH_VARARGS, NULL}, + { (char *)"Contact_GetContactNymCount", _wrap_Contact_GetContactNymCount, METH_VARARGS, NULL}, + { (char *)"Contact_GetContactNym", _wrap_Contact_GetContactNym, METH_VARARGS, NULL}, + { (char *)"Contact_RemoveContactNym", _wrap_Contact_RemoveContactNym, METH_VARARGS, NULL}, + { (char *)"Contact_AddContactNym", _wrap_Contact_AddContactNym, METH_VARARGS, NULL}, + { (char *)"Contact_GetContactAcctCount", _wrap_Contact_GetContactAcctCount, METH_VARARGS, NULL}, + { (char *)"Contact_GetContactAcct", _wrap_Contact_GetContactAcct, METH_VARARGS, NULL}, + { (char *)"Contact_RemoveContactAcct", _wrap_Contact_RemoveContactAcct, METH_VARARGS, NULL}, + { (char *)"Contact_AddContactAcct", _wrap_Contact_AddContactAcct, METH_VARARGS, NULL}, + { (char *)"Contact_ot_dynamic_cast", _wrap_Contact_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"Contact_swigregister", Contact_swigregister, METH_VARARGS, NULL}, + { (char *)"delete_AddressBook", _wrap_delete_AddressBook, METH_VARARGS, NULL}, + { (char *)"AddressBook_GetContactCount", _wrap_AddressBook_GetContactCount, METH_VARARGS, NULL}, + { (char *)"AddressBook_GetContact", _wrap_AddressBook_GetContact, METH_VARARGS, NULL}, + { (char *)"AddressBook_RemoveContact", _wrap_AddressBook_RemoveContact, METH_VARARGS, NULL}, + { (char *)"AddressBook_AddContact", _wrap_AddressBook_AddContact, METH_VARARGS, NULL}, + { (char *)"AddressBook_ot_dynamic_cast", _wrap_AddressBook_ot_dynamic_cast, METH_VARARGS, NULL}, + { (char *)"AddressBook_swigregister", AddressBook_swigregister, METH_VARARGS, NULL}, + { NULL, NULL, 0, NULL } +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Acct(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__MarketListTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::MarketList *) x)); +} +static void *_p_OTDB__OfferListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListNym *) x)); +} +static void *_p_OTDB__TradeListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListNym *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__StringMapTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::StringMap *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__TradeListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListMarket *) x)); +} +static void *_p_OTDB__OfferListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListMarket *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__DisplayableTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Displayable *) x)); +} +static void *_p_OTDB__WalletDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::WalletData *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BlobTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Blob *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__OTDBStringTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OTDBString *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__AddressBookTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::AddressBook *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static swig_type_info _swigt__p_OTCallback = {"_p_OTCallback", "OTCallback *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTCaller = {"_p_OTCaller", "OTCaller *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Acct = {"_p_OTDB__Acct", "OTDB::Acct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AddressBook = {"_p_OTDB__AddressBook", "OTDB::AddressBook *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AskData = {"_p_OTDB__AskData", "OTDB::AskData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BidData = {"_p_OTDB__BidData", "OTDB::BidData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinAcct = {"_p_OTDB__BitcoinAcct", "OTDB::BitcoinAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinServer = {"_p_OTDB__BitcoinServer", "OTDB::BitcoinServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Blob = {"_p_OTDB__Blob", "OTDB::Blob *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Contact = {"_p_OTDB__Contact", "OTDB::Contact *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactAcct = {"_p_OTDB__ContactAcct", "OTDB::ContactAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactNym = {"_p_OTDB__ContactNym", "OTDB::ContactNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Displayable = {"_p_OTDB__Displayable", "OTDB::Displayable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__LoomServer = {"_p_OTDB__LoomServer", "OTDB::LoomServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketData = {"_p_OTDB__MarketData", "OTDB::MarketData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketList = {"_p_OTDB__MarketList", "OTDB::MarketList *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OTDBString = {"_p_OTDB__OTDBString", "OTDB::OTDBString *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataMarket = {"_p_OTDB__OfferDataMarket", "OTDB::OfferDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataNym = {"_p_OTDB__OfferDataNym", "OTDB::OfferDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListMarket = {"_p_OTDB__OfferListMarket", "OTDB::OfferListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListNym = {"_p_OTDB__OfferListNym", "OTDB::OfferListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__RippleServer = {"_p_OTDB__RippleServer", "OTDB::RippleServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Server = {"_p_OTDB__Server", "OTDB::Server *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ServerInfo = {"_p_OTDB__ServerInfo", "OTDB::ServerInfo *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storable = {"_p_OTDB__Storable", "OTDB::Storable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storage = {"_p_OTDB__Storage", "OTDB::Storage *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__StringMap = {"_p_OTDB__StringMap", "OTDB::StringMap *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataMarket = {"_p_OTDB__TradeDataMarket", "OTDB::TradeDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataNym = {"_p_OTDB__TradeDataNym", "OTDB::TradeDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListMarket = {"_p_OTDB__TradeListMarket", "OTDB::TradeListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListNym = {"_p_OTDB__TradeListNym", "OTDB::TradeListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__WalletData = {"_p_OTDB__WalletData", "OTDB::WalletData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTPacker = {"_p_OTPacker", "OTPacker *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__mapT_std__string_std__string_t = {"_p_std__mapT_std__string_std__string_t", "std::map< std::string,std::string > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_unsigned_char_t = {"_p_std__vectorT_unsigned_char_t", "std::vector< unsigned char > *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_OTCallback, + &_swigt__p_OTCaller, + &_swigt__p_OTDB__Acct, + &_swigt__p_OTDB__AddressBook, + &_swigt__p_OTDB__AskData, + &_swigt__p_OTDB__BidData, + &_swigt__p_OTDB__BitcoinAcct, + &_swigt__p_OTDB__BitcoinServer, + &_swigt__p_OTDB__Blob, + &_swigt__p_OTDB__Contact, + &_swigt__p_OTDB__ContactAcct, + &_swigt__p_OTDB__ContactNym, + &_swigt__p_OTDB__Displayable, + &_swigt__p_OTDB__LoomServer, + &_swigt__p_OTDB__MarketData, + &_swigt__p_OTDB__MarketList, + &_swigt__p_OTDB__OTDBString, + &_swigt__p_OTDB__OfferDataMarket, + &_swigt__p_OTDB__OfferDataNym, + &_swigt__p_OTDB__OfferListMarket, + &_swigt__p_OTDB__OfferListNym, + &_swigt__p_OTDB__RippleServer, + &_swigt__p_OTDB__Server, + &_swigt__p_OTDB__ServerInfo, + &_swigt__p_OTDB__Storable, + &_swigt__p_OTDB__Storage, + &_swigt__p_OTDB__StringMap, + &_swigt__p_OTDB__TradeDataMarket, + &_swigt__p_OTDB__TradeDataNym, + &_swigt__p_OTDB__TradeListMarket, + &_swigt__p_OTDB__TradeListNym, + &_swigt__p_OTDB__WalletData, + &_swigt__p_OTPacker, + &_swigt__p_char, + &_swigt__p_std__mapT_std__string_std__string_t, + &_swigt__p_std__vectorT_unsigned_char_t, +}; + +static swig_cast_info _swigc__p_OTCallback[] = { {&_swigt__p_OTCallback, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCaller[] = { {&_swigt__p_OTCaller, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Acct[] = { {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Acct, 0, 0}, {&_swigt__p_OTDB__Acct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AddressBook[] = { {&_swigt__p_OTDB__AddressBook, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AskData[] = { {&_swigt__p_OTDB__AskData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BidData[] = { {&_swigt__p_OTDB__BidData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinAcct[] = { {&_swigt__p_OTDB__BitcoinAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinServer[] = { {&_swigt__p_OTDB__BitcoinServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Blob[] = { {&_swigt__p_OTDB__Blob, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Contact[] = { {&_swigt__p_OTDB__Contact, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactAcct[] = { {&_swigt__p_OTDB__ContactAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactNym[] = { {&_swigt__p_OTDB__ContactNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Displayable[] = { {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Displayable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Displayable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__LoomServer[] = { {&_swigt__p_OTDB__LoomServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketData[] = { {&_swigt__p_OTDB__MarketData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketList[] = { {&_swigt__p_OTDB__MarketList, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OTDBString[] = { {&_swigt__p_OTDB__OTDBString, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataMarket[] = { {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__OfferDataMarket, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, 0, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__OfferDataMarket, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataNym[] = { {&_swigt__p_OTDB__OfferDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListMarket[] = { {&_swigt__p_OTDB__OfferListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListNym[] = { {&_swigt__p_OTDB__OfferListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__RippleServer[] = { {&_swigt__p_OTDB__RippleServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Server[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__Server, 0, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Server, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ServerInfo[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__ServerInfo, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storable[] = { {&_swigt__p_OTDB__MarketList, _p_OTDB__MarketListTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListNym, _p_OTDB__OfferListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListNym, _p_OTDB__TradeListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Blob, _p_OTDB__BlobTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__StringMap, _p_OTDB__StringMapTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListMarket, _p_OTDB__OfferListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListMarket, _p_OTDB__TradeListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Displayable, _p_OTDB__DisplayableTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__WalletData, _p_OTDB__WalletDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Storable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OTDBString, _p_OTDB__OTDBStringTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AddressBook, _p_OTDB__AddressBookTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Storable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storage[] = { {&_swigt__p_OTDB__Storage, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__StringMap[] = { {&_swigt__p_OTDB__StringMap, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataMarket[] = { {&_swigt__p_OTDB__TradeDataMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataNym[] = { {&_swigt__p_OTDB__TradeDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListMarket[] = { {&_swigt__p_OTDB__TradeListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListNym[] = { {&_swigt__p_OTDB__TradeListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__WalletData[] = { {&_swigt__p_OTDB__WalletData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTPacker[] = { {&_swigt__p_OTPacker, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t[] = { {&_swigt__p_std__mapT_std__string_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_unsigned_char_t[] = { {&_swigt__p_std__vectorT_unsigned_char_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_OTCallback, + _swigc__p_OTCaller, + _swigc__p_OTDB__Acct, + _swigc__p_OTDB__AddressBook, + _swigc__p_OTDB__AskData, + _swigc__p_OTDB__BidData, + _swigc__p_OTDB__BitcoinAcct, + _swigc__p_OTDB__BitcoinServer, + _swigc__p_OTDB__Blob, + _swigc__p_OTDB__Contact, + _swigc__p_OTDB__ContactAcct, + _swigc__p_OTDB__ContactNym, + _swigc__p_OTDB__Displayable, + _swigc__p_OTDB__LoomServer, + _swigc__p_OTDB__MarketData, + _swigc__p_OTDB__MarketList, + _swigc__p_OTDB__OTDBString, + _swigc__p_OTDB__OfferDataMarket, + _swigc__p_OTDB__OfferDataNym, + _swigc__p_OTDB__OfferListMarket, + _swigc__p_OTDB__OfferListNym, + _swigc__p_OTDB__RippleServer, + _swigc__p_OTDB__Server, + _swigc__p_OTDB__ServerInfo, + _swigc__p_OTDB__Storable, + _swigc__p_OTDB__Storage, + _swigc__p_OTDB__StringMap, + _swigc__p_OTDB__TradeDataMarket, + _swigc__p_OTDB__TradeDataNym, + _swigc__p_OTDB__TradeListMarket, + _swigc__p_OTDB__TradeListNym, + _swigc__p_OTDB__WalletData, + _swigc__p_OTPacker, + _swigc__p_char, + _swigc__p_std__mapT_std__string_std__string_t, + _swigc__p_std__vectorT_unsigned_char_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_const_info swig_const_table[] = { +{0, 0, 0, 0.0, 0, 0}}; + +#ifdef __cplusplus +} +#endif +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + /* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + + /* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + + typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; + } swig_globalvar; + + typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; + } swig_varlinkobject; + + SWIGINTERN PyObject * + swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString(""); +#else + return PyString_FromString(""); +#endif + } + + SWIGINTERN PyObject * + swig_varlink_str(swig_varlinkobject *v) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; + } + + SWIGINTERN int + swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { + char *tmp; + PyObject *str = swig_varlink_str(v); + fprintf(fp,"Swig global variables "); + fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(str); + return 0; + } + + SWIGINTERN void + swig_varlink_dealloc(swig_varlinkobject *v) { + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } + } + + SWIGINTERN PyObject * + swig_varlink_getattr(swig_varlinkobject *v, char *n) { + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; + } + + SWIGINTERN int + swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_SetString(PyExc_NameError,"Unknown C global variable"); + } + return res; + } + + SWIGINTERN PyTypeObject* + swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { + /* PyObject header changed in Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ + (printfunc) swig_varlink_print, /* tp_print */ + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version */ +#endif +#ifdef COUNT_ALLOCS + 0,0,0,0 /* tp_alloc -> tp_next */ +#endif + }; + varlink_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + varlink_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&varlink_type) < 0) + return NULL; +#endif + } + return &varlink_type; + } + + /* Create a variable linking object for use later */ + SWIGINTERN PyObject * + SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); + } + + SWIGINTERN void + SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + strncpy(gv->name,name,size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; + } + + SWIGINTERN PyObject * + SWIG_globals(void) { + static PyObject *_SWIG_globals = 0; + if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); + return _SWIG_globals; + } + + /* ----------------------------------------------------------------------------- + * constants/methods manipulation + * ----------------------------------------------------------------------------- */ + + /* Install Constants */ + SWIGINTERN void + SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { + PyObject *obj = 0; + size_t i; + for (i = 0; constants[i].type; ++i) { + switch(constants[i].type) { + case SWIG_PY_POINTER: + obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + break; + case SWIG_PY_BINARY: + obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); + break; + default: + obj = 0; + break; + } + if (obj) { + PyDict_SetItemString(d, constants[i].name, obj); + Py_DECREF(obj); + } + } + } + + /* -----------------------------------------------------------------------------*/ + /* Fix SwigMethods to carry the callback ptrs when needed */ + /* -----------------------------------------------------------------------------*/ + + SWIGINTERN void + SWIG_Python_FixMethods(PyMethodDef *methods, + swig_const_info *const_table, + swig_type_info **types, + swig_type_info **types_initial) { + size_t i; + for (i = 0; methods[i].ml_name; ++i) { + const char *c = methods[i].ml_doc; + if (c && (c = strstr(c, "swig_ptr: "))) { + int j; + swig_const_info *ci = 0; + const char *name = c + 10; + for (j = 0; const_table[j].type; ++j) { + if (strncmp(const_table[j].name, name, + strlen(const_table[j].name)) == 0) { + ci = &(const_table[j]); + break; + } + } + if (ci) { + void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; + if (ptr) { + size_t shift = (ci->ptype) - types; + swig_type_info *ty = types_initial[shift]; + size_t ldoc = (c - methods[i].ml_doc); + size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; + strncpy(buff, methods[i].ml_doc, ldoc); + buff += ldoc; + strncpy(buff, "swig_ptr: ", 10); + buff += 10; + SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); + methods[i].ml_doc = ndoc; + } + } + } + } + } + } + +#ifdef __cplusplus +} +#endif + +/* -----------------------------------------------------------------------------* + * Partial Init method + * -----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" +#endif + +SWIGEXPORT +#if PY_VERSION_HEX >= 0x03000000 +PyObject* +#else +void +#endif +SWIG_init(void) { + PyObject *m, *d, *md; +#if PY_VERSION_HEX >= 0x03000000 + static struct PyModuleDef SWIG_module = { +# if PY_VERSION_HEX >= 0x03020000 + PyModuleDef_HEAD_INIT, +# else + { + PyObject_HEAD_INIT(NULL) + NULL, /* m_init */ + 0, /* m_index */ + NULL, /* m_copy */ + }, +# endif + (char *) SWIG_name, + NULL, + -1, + SwigMethods, + NULL, + NULL, + NULL, + NULL + }; +#endif + +#if defined(SWIGPYTHON_BUILTIN) + static SwigPyClientData SwigPyObject_clientdata = { + 0, 0, 0, 0, 0, 0, 0 + }; + static PyGetSetDef this_getset_def = { + (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL + }; + static SwigPyGetSet thisown_getset_closure = { + (PyCFunction) SwigPyObject_own, + (PyCFunction) SwigPyObject_own + }; + static PyGetSetDef thisown_getset_def = { + (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure + }; + PyObject *metatype_args; + PyTypeObject *builtin_pytype; + int builtin_base_count; + swig_type_info *builtin_basetype; + PyObject *tuple; + PyGetSetDescrObject *static_getset; + PyTypeObject *metatype; + SwigPyClientData *cd; + PyObject *public_interface, *public_symbol; + PyObject *this_descr; + PyObject *thisown_descr; + int i; + + (void)builtin_pytype; + (void)builtin_base_count; + (void)builtin_basetype; + (void)tuple; + (void)static_getset; + + /* metatype is used to implement static member variables. */ + metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type); + assert(metatype_args); + metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL); + assert(metatype); + Py_DECREF(metatype_args); + metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro; + assert(PyType_Ready(metatype) >= 0); +#endif + + /* Fix SwigMethods to carry the callback ptrs when needed */ + SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + +#if PY_VERSION_HEX >= 0x03000000 + m = PyModule_Create(&SWIG_module); +#else + m = Py_InitModule((char *) SWIG_name, SwigMethods); +#endif + md = d = PyModule_GetDict(m); + + SWIG_InitializeModule(0); + +#ifdef SWIGPYTHON_BUILTIN + SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + if (!cd) { + SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; + SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce(); + } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) { + PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); +# if PY_VERSION_HEX >= 0x03000000 + return NULL; +# else + return; +# endif + } + + /* All objects have a 'this' attribute */ + this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); + (void)this_descr; + + /* All objects have a 'thisown' attribute */ + thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); + (void)thisown_descr; + + public_interface = PyList_New(0); + public_symbol = 0; + (void)public_symbol; + + PyDict_SetItemString(md, "__all__", public_interface); + Py_DECREF(public_interface); + for (i = 0; SwigMethods[i].ml_name != NULL; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); + for (i = 0; swig_const_table[i].name != 0; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); +#endif + + SWIG_InstallConstants(d,swig_const_table); + + SWIG_Python_SetConstant(d, "PACK_MESSAGE_PACK",SWIG_From_int(static_cast< int >(OTDB::PACK_MESSAGE_PACK))); + SWIG_Python_SetConstant(d, "PACK_PROTOCOL_BUFFERS",SWIG_From_int(static_cast< int >(OTDB::PACK_PROTOCOL_BUFFERS))); + SWIG_Python_SetConstant(d, "PACK_TYPE_ERROR",SWIG_From_int(static_cast< int >(OTDB::PACK_TYPE_ERROR))); + SWIG_Python_SetConstant(d, "STORE_FILESYSTEM",SWIG_From_int(static_cast< int >(OTDB::STORE_FILESYSTEM))); + SWIG_Python_SetConstant(d, "STORE_TYPE_SUBCLASS",SWIG_From_int(static_cast< int >(OTDB::STORE_TYPE_SUBCLASS))); + SWIG_Python_SetConstant(d, "STORED_OBJ_STRING",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING))); + SWIG_Python_SetConstant(d, "STORED_OBJ_BLOB",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BLOB))); + SWIG_Python_SetConstant(d, "STORED_OBJ_STRING_MAP",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING_MAP))); + SWIG_Python_SetConstant(d, "STORED_OBJ_WALLET_DATA",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_WALLET_DATA))); + SWIG_Python_SetConstant(d, "STORED_OBJ_BITCOIN_ACCT",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_ACCT))); + SWIG_Python_SetConstant(d, "STORED_OBJ_BITCOIN_SERVER",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_SERVER))); + SWIG_Python_SetConstant(d, "STORED_OBJ_RIPPLE_SERVER",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_RIPPLE_SERVER))); + SWIG_Python_SetConstant(d, "STORED_OBJ_LOOM_SERVER",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_LOOM_SERVER))); + SWIG_Python_SetConstant(d, "STORED_OBJ_SERVER_INFO",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_SERVER_INFO))); + SWIG_Python_SetConstant(d, "STORED_OBJ_CONTACT_NYM",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_NYM))); + SWIG_Python_SetConstant(d, "STORED_OBJ_CONTACT_ACCT",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_ACCT))); + SWIG_Python_SetConstant(d, "STORED_OBJ_CONTACT",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT))); + SWIG_Python_SetConstant(d, "STORED_OBJ_ADDRESS_BOOK",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ADDRESS_BOOK))); + SWIG_Python_SetConstant(d, "STORED_OBJ_MARKET_DATA",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_DATA))); + SWIG_Python_SetConstant(d, "STORED_OBJ_MARKET_LIST",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_LIST))); + SWIG_Python_SetConstant(d, "STORED_OBJ_BID_DATA",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BID_DATA))); + SWIG_Python_SetConstant(d, "STORED_OBJ_ASK_DATA",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ASK_DATA))); + SWIG_Python_SetConstant(d, "STORED_OBJ_OFFER_LIST_MARKET",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_MARKET))); + SWIG_Python_SetConstant(d, "STORED_OBJ_TRADE_DATA_MARKET",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_MARKET))); + SWIG_Python_SetConstant(d, "STORED_OBJ_TRADE_LIST_MARKET",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_MARKET))); + SWIG_Python_SetConstant(d, "STORED_OBJ_OFFER_DATA_NYM",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_DATA_NYM))); + SWIG_Python_SetConstant(d, "STORED_OBJ_OFFER_LIST_NYM",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_NYM))); + SWIG_Python_SetConstant(d, "STORED_OBJ_TRADE_DATA_NYM",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_NYM))); + SWIG_Python_SetConstant(d, "STORED_OBJ_TRADE_LIST_NYM",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_NYM))); + SWIG_Python_SetConstant(d, "STORED_OBJ_ERROR",SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ERROR))); +#if PY_VERSION_HEX >= 0x03000000 + return m; +#else + return; +#endif +} + diff --git a/testwallet/OTAPI_python.h b/testwallet/OTAPI_python.h new file mode 100644 index 000000000..72ae0c98f --- /dev/null +++ b/testwallet/OTAPI_python.h @@ -0,0 +1,64 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_otapi_WRAP_H_ +#define SWIG_otapi_WRAP_H_ + +#include +#include + + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + SwigDirector_OTCallback(PyObject *self); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); + + +/* Internal Director utilities */ +public: + bool swig_get_inner(const char* swig_protected_method_name) const { + std::map::const_iterator iv = swig_inner.find(swig_protected_method_name); + return (iv != swig_inner.end() ? iv->second : false); + } + + void swig_set_inner(const char* swig_protected_method_name, bool val) const + { swig_inner[swig_protected_method_name] = val;} + +private: + mutable std::map swig_inner; + + +#if defined(SWIG_PYTHON_DIRECTOR_VTABLE) +/* VTable implementation */ + PyObject *swig_get_method(size_t method_index, const char *method_name) const { + PyObject *method = vtable[method_index]; + if (!method) { + swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name); + method = PyObject_GetAttr(swig_get_self(), name); + if (!method) { + std::string msg = "Method in class OTCallback doesn't exist, undefined "; + msg += method_name; + Swig::DirectorMethodException::raise(msg.c_str()); + } + vtable[method_index] = method; + }; + return method; + } +private: + mutable swig::SwigVar_PyObject vtable[2]; +#endif + +}; + + +#endif diff --git a/testwallet/OTAPI_ruby.cpp b/testwallet/OTAPI_ruby.cpp new file mode 100644 index 000000000..ed8542a8e --- /dev/null +++ b/testwallet/OTAPI_ruby.cpp @@ -0,0 +1,27700 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGRUBY +#define SWIG_DIRECTORS + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +#include + +/* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which + * breaks using rb_intern as an lvalue, as SWIG does. We work around this + * issue for now by disabling this. + * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 + */ +#ifdef rb_intern +# undef rb_intern +#endif + +/* Remove global macros defined in Ruby's win32.h */ +#ifdef write +# undef write +#endif +#ifdef read +# undef read +#endif +#ifdef bind +# undef bind +#endif +#ifdef close +# undef close +#endif +#ifdef connect +# undef connect +#endif + + +/* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ +#ifndef NUM2LL +#define NUM2LL(x) NUM2LONG((x)) +#endif +#ifndef LL2NUM +#define LL2NUM(x) INT2NUM((long) (x)) +#endif +#ifndef ULL2NUM +#define ULL2NUM(x) UINT2NUM((unsigned long) (x)) +#endif + +/* Ruby 1.7 doesn't (yet) define NUM2ULL() */ +#ifndef NUM2ULL +#ifdef HAVE_LONG_LONG +#define NUM2ULL(x) rb_num2ull((x)) +#else +#define NUM2ULL(x) NUM2ULONG(x) +#endif +#endif + +/* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ +/* Define these for older versions so we can just write code the new way */ +#ifndef RSTRING_LEN +# define RSTRING_LEN(x) RSTRING(x)->len +#endif +#ifndef RSTRING_PTR +# define RSTRING_PTR(x) RSTRING(x)->ptr +#endif +#ifndef RSTRING_END +# define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) +#endif +#ifndef RARRAY_LEN +# define RARRAY_LEN(x) RARRAY(x)->len +#endif +#ifndef RARRAY_PTR +# define RARRAY_PTR(x) RARRAY(x)->ptr +#endif +#ifndef RFLOAT_VALUE +# define RFLOAT_VALUE(x) RFLOAT(x)->value +#endif +#ifndef DOUBLE2NUM +# define DOUBLE2NUM(x) rb_float_new(x) +#endif +#ifndef RHASH_TBL +# define RHASH_TBL(x) (RHASH(x)->tbl) +#endif +#ifndef RHASH_ITER_LEV +# define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) +#endif +#ifndef RHASH_IFNONE +# define RHASH_IFNONE(x) (RHASH(x)->ifnone) +#endif +#ifndef RHASH_SIZE +# define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) +#endif +#ifndef RHASH_EMPTY_P +# define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) +#endif +#ifndef RSTRUCT_LEN +# define RSTRUCT_LEN(x) RSTRUCT(x)->len +#endif +#ifndef RSTRUCT_PTR +# define RSTRUCT_PTR(x) RSTRUCT(x)->ptr +#endif + + + +/* + * Need to be very careful about how these macros are defined, especially + * when compiling C++ code or C code with an ANSI C compiler. + * + * VALUEFUNC(f) is a macro used to typecast a C function that implements + * a Ruby method so that it can be passed as an argument to API functions + * like rb_define_method() and rb_define_singleton_method(). + * + * VOIDFUNC(f) is a macro used to typecast a C function that implements + * either the "mark" or "free" stuff for a Ruby Data object, so that it + * can be passed as an argument to API functions like Data_Wrap_Struct() + * and Data_Make_Struct(). + */ + +#ifdef __cplusplus +# ifndef RUBY_METHOD_FUNC /* These definitions should work for Ruby 1.4.6 */ +# define PROTECTFUNC(f) ((VALUE (*)()) f) +# define VALUEFUNC(f) ((VALUE (*)()) f) +# define VOIDFUNC(f) ((void (*)()) f) +# else +# ifndef ANYARGS /* These definitions should work for Ruby 1.6 */ +# define PROTECTFUNC(f) ((VALUE (*)()) f) +# define VALUEFUNC(f) ((VALUE (*)()) f) +# define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) +# else /* These definitions should work for Ruby 1.7+ */ +# define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) +# define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) +# define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) +# endif +# endif +#else +# define VALUEFUNC(f) (f) +# define VOIDFUNC(f) (f) +#endif + +/* Don't use for expressions have side effect */ +#ifndef RB_STRING_VALUE +#define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) +#endif +#ifndef StringValue +#define StringValue(s) RB_STRING_VALUE(s) +#endif +#ifndef StringValuePtr +#define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) +#endif +#ifndef StringValueLen +#define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) +#endif +#ifndef SafeStringValue +#define SafeStringValue(v) do {\ + StringValue(v);\ + rb_check_safe_str(v);\ +} while (0) +#endif + +#ifndef HAVE_RB_DEFINE_ALLOC_FUNC +#define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) +#define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") +#endif + +static VALUE _mSWIG = Qnil; + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + + +/* Define some additional error types */ +#define SWIG_ObjectPreviouslyDeletedError -100 + + +/* Define custom exceptions for errors that do not map to existing Ruby + exceptions. Note this only works for C++ since a global cannot be + initialized by a function in C. For C, fallback to rb_eRuntimeError.*/ + +SWIGINTERN VALUE +getNullReferenceError(void) { + static int init = 0; + static VALUE rb_eNullReferenceError ; + if (!init) { + init = 1; + rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError); + } + return rb_eNullReferenceError; +} + +SWIGINTERN VALUE +getObjectPreviouslyDeletedError(void) { + static int init = 0; + static VALUE rb_eObjectPreviouslyDeleted ; + if (!init) { + init = 1; + rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError); + } + return rb_eObjectPreviouslyDeleted; +} + + +SWIGINTERN VALUE +SWIG_Ruby_ErrorType(int SWIG_code) { + VALUE type; + switch (SWIG_code) { + case SWIG_MemoryError: + type = rb_eNoMemError; + break; + case SWIG_IOError: + type = rb_eIOError; + break; + case SWIG_RuntimeError: + type = rb_eRuntimeError; + break; + case SWIG_IndexError: + type = rb_eIndexError; + break; + case SWIG_TypeError: + type = rb_eTypeError; + break; + case SWIG_DivisionByZero: + type = rb_eZeroDivError; + break; + case SWIG_OverflowError: + type = rb_eRangeError; + break; + case SWIG_SyntaxError: + type = rb_eSyntaxError; + break; + case SWIG_ValueError: + type = rb_eArgError; + break; + case SWIG_SystemError: + type = rb_eFatal; + break; + case SWIG_AttributeError: + type = rb_eRuntimeError; + break; + case SWIG_NullReferenceError: + type = getNullReferenceError(); + break; + case SWIG_ObjectPreviouslyDeletedError: + type = getObjectPreviouslyDeletedError(); + break; + case SWIG_UnknownError: + type = rb_eRuntimeError; + break; + default: + type = rb_eRuntimeError; + } + return type; +} + + +/* This function is called when a user inputs a wrong argument to + a method. + */ +SWIGINTERN +const char* Ruby_Format_TypeError( const char* msg, + const char* type, + const char* name, + const int argn, + VALUE input ) +{ + char buf[128]; + VALUE str; + VALUE asStr; + if ( msg && *msg ) + { + str = rb_str_new2(msg); + } + else + { + str = rb_str_new(NULL, 0); + } + + str = rb_str_cat2( str, "Expected argument " ); + sprintf( buf, "%d of type ", argn-1 ); + str = rb_str_cat2( str, buf ); + str = rb_str_cat2( str, type ); + str = rb_str_cat2( str, ", but got " ); + str = rb_str_cat2( str, rb_obj_classname(input) ); + str = rb_str_cat2( str, " " ); + asStr = rb_inspect(input); + if ( RSTRING_LEN(asStr) > 30 ) + { + str = rb_str_cat( str, StringValuePtr(asStr), 30 ); + str = rb_str_cat2( str, "..." ); + } + else + { + str = rb_str_append( str, asStr ); + } + + if ( name ) + { + str = rb_str_cat2( str, "\n\tin SWIG method '" ); + str = rb_str_cat2( str, name ); + str = rb_str_cat2( str, "'" ); + } + + return StringValuePtr( str ); +} + +/* This function is called when an overloaded method fails */ +SWIGINTERN +void Ruby_Format_OverloadedError( + const int argc, + const int maxargs, + const char* method, + const char* prototypes + ) +{ + const char* msg = "Wrong # of arguments"; + if ( argc <= maxargs ) msg = "Wrong arguments"; + rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n" + "Possible C/C++ prototypes are:\n%s", + msg, method, prototypes); +} + +/* ----------------------------------------------------------------------------- + * rubytracking.swg + * + * This file contains support for tracking mappings from + * Ruby objects to C++ objects. This functionality is needed + * to implement mark functions for Ruby's mark and sweep + * garbage collector. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Ruby 1.8 actually assumes the first case. */ +#if SIZEOF_VOIDP == SIZEOF_LONG +# define SWIG2NUM(v) LONG2NUM((unsigned long)v) +# define NUM2SWIG(x) (unsigned long)NUM2LONG(x) +#elif SIZEOF_VOIDP == SIZEOF_LONG_LONG +# define SWIG2NUM(v) LL2NUM((unsigned long long)v) +# define NUM2SWIG(x) (unsigned long long)NUM2LL(x) +#else +# error sizeof(void*) is not the same as long or long long +#endif + + +/* Global Ruby hash table to store Trackings from C/C++ + structs to Ruby Objects. +*/ +static VALUE swig_ruby_trackings = Qnil; + +/* Global variable that stores a reference to the ruby + hash table delete function. */ +static ID swig_ruby_hash_delete; + +/* Setup a Ruby hash table to store Trackings */ +SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { + /* Create a ruby hash table to store Trackings from C++ + objects to Ruby objects. */ + + /* Try to see if some other .so has already created a + tracking hash table, which we keep hidden in an instance var + in the SWIG module. + This is done to allow multiple DSOs to share the same + tracking table. + */ + ID trackings_id = rb_intern( "@__trackings__" ); + VALUE verbose = rb_gv_get("VERBOSE"); + rb_gv_set("VERBOSE", Qfalse); + swig_ruby_trackings = rb_ivar_get( _mSWIG, trackings_id ); + rb_gv_set("VERBOSE", verbose); + + /* No, it hasn't. Create one ourselves */ + if ( swig_ruby_trackings == Qnil ) + { + swig_ruby_trackings = rb_hash_new(); + rb_ivar_set( _mSWIG, trackings_id, swig_ruby_trackings ); + } + + /* Now store a reference to the hash table delete function + so that we only have to look it up once.*/ + swig_ruby_hash_delete = rb_intern("delete"); +} + +/* Get a Ruby number to reference a pointer */ +SWIGRUNTIME VALUE SWIG_RubyPtrToReference(void* ptr) { + /* We cast the pointer to an unsigned long + and then store a reference to it using + a Ruby number object. */ + + /* Convert the pointer to a Ruby number */ + return SWIG2NUM(ptr); +} + +/* Get a Ruby number to reference an object */ +SWIGRUNTIME VALUE SWIG_RubyObjectToReference(VALUE object) { + /* We cast the object to an unsigned long + and then store a reference to it using + a Ruby number object. */ + + /* Convert the Object to a Ruby number */ + return SWIG2NUM(object); +} + +/* Get a Ruby object from a previously stored reference */ +SWIGRUNTIME VALUE SWIG_RubyReferenceToObject(VALUE reference) { + /* The provided Ruby number object is a reference + to the Ruby object we want.*/ + + /* Convert the Ruby number to a Ruby object */ + return NUM2SWIG(reference); +} + +/* Add a Tracking from a C/C++ struct to a Ruby object */ +SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) { + /* In a Ruby hash table we store the pointer and + the associated Ruby object. The trick here is + that we cannot store the Ruby object directly - if + we do then it cannot be garbage collected. So + instead we typecast it as a unsigned long and + convert it to a Ruby number object.*/ + + /* Get a reference to the pointer as a Ruby number */ + VALUE key = SWIG_RubyPtrToReference(ptr); + + /* Get a reference to the Ruby object as a Ruby number */ + VALUE value = SWIG_RubyObjectToReference(object); + + /* Store the mapping to the global hash table. */ + rb_hash_aset(swig_ruby_trackings, key, value); +} + +/* Get the Ruby object that owns the specified C/C++ struct */ +SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) { + /* Get a reference to the pointer as a Ruby number */ + VALUE key = SWIG_RubyPtrToReference(ptr); + + /* Now lookup the value stored in the global hash table */ + VALUE value = rb_hash_aref(swig_ruby_trackings, key); + + if (value == Qnil) { + /* No object exists - return nil. */ + return Qnil; + } + else { + /* Convert this value to Ruby object */ + return SWIG_RubyReferenceToObject(value); + } +} + +/* Remove a Tracking from a C/C++ struct to a Ruby object. It + is very important to remove objects once they are destroyed + since the same memory address may be reused later to create + a new object. */ +SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) { + /* Get a reference to the pointer as a Ruby number */ + VALUE key = SWIG_RubyPtrToReference(ptr); + + /* Delete the object from the hash table by calling Ruby's + do this we need to call the Hash.delete method.*/ + rb_funcall(swig_ruby_trackings, swig_ruby_hash_delete, 1, key); +} + +/* This is a helper method that unlinks a Ruby object from its + underlying C++ object. This is needed if the lifetime of the + Ruby object is longer than the C++ object */ +SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { + VALUE object = SWIG_RubyInstanceFor(ptr); + + if (object != Qnil) { + DATA_PTR(object) = 0; + } +} + + +#ifdef __cplusplus +} +#endif + +/* ----------------------------------------------------------------------------- + * Ruby API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +SWIGINTERN VALUE +SWIG_Ruby_AppendOutput(VALUE target, VALUE o) { + if (NIL_P(target)) { + target = o; + } else { + if (TYPE(target) != T_ARRAY) { + VALUE o2 = target; + target = rb_ary_new(); + rb_ary_push(target, o2); + } + rb_ary_push(target, o); + } + return target; +} + +/* For ruby1.8.4 and earlier. */ +#ifndef RUBY_INIT_STACK + RUBY_EXTERN void Init_stack(VALUE* addr); +# define RUBY_INIT_STACK \ + VALUE variable_in_this_stack_frame; \ + Init_stack(&variable_in_this_stack_frame); +#endif + + +#ifdef __cplusplus +} +#endif + + +/* ----------------------------------------------------------------------------- + * rubyrun.swg + * + * This file contains the runtime support for Ruby modules + * and includes code for managing global variables and pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 + +/* for raw pointers */ +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own) +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags) +#define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) +#define swig_owntype ruby_owntype + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Ruby_ErrorType(code) +#define SWIG_Error(code, msg) rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg) +#define SWIG_fail goto fail + + +/* Ruby-specific SWIG API */ + +#define SWIG_InitRuntime() SWIG_Ruby_InitRuntime() +#define SWIG_define_class(ty) SWIG_Ruby_define_class(ty) +#define SWIG_NewClassInstance(value, ty) SWIG_Ruby_NewClassInstance(value, ty) +#define SWIG_MangleStr(value) SWIG_Ruby_MangleStr(value) +#define SWIG_CheckConvert(value, ty) SWIG_Ruby_CheckConvert(value, ty) + +#include "assert.h" + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + VALUE klass; + VALUE mImpl; + void (*mark)(void *); + void (*destroy)(void *); + int trackObjects; +} swig_class; + + +/* Global pointer used to keep some internal SWIG stuff */ +static VALUE _cSWIG_Pointer = Qnil; +static VALUE swig_runtime_data_type_pointer = Qnil; + +/* Global IDs used to keep some internal SWIG stuff */ +static ID swig_arity_id = 0; +static ID swig_call_id = 0; + +/* + If your swig extension is to be run within an embedded ruby and has + director callbacks, you should set -DRUBY_EMBEDDED during compilation. + This will reset ruby's stack frame on each entry point from the main + program the first time a virtual director function is invoked (in a + non-recursive way). + If this is not done, you run the risk of Ruby trashing the stack. +*/ + +#ifdef RUBY_EMBEDDED + +# define SWIG_INIT_STACK \ + if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \ + ++swig_virtual_calls; +# define SWIG_RELEASE_STACK --swig_virtual_calls; +# define Ruby_DirectorTypeMismatchException(x) \ + rb_raise( rb_eTypeError, "%s", x ); return c_result; + + static unsigned int swig_virtual_calls = 0; + +#else /* normal non-embedded extension */ + +# define SWIG_INIT_STACK +# define SWIG_RELEASE_STACK +# define Ruby_DirectorTypeMismatchException(x) \ + throw Swig::DirectorTypeMismatchException( x ); + +#endif /* RUBY_EMBEDDED */ + + +SWIGRUNTIME VALUE +getExceptionClass(void) { + static int init = 0; + static VALUE rubyExceptionClass ; + if (!init) { + init = 1; + rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception")); + } + return rubyExceptionClass; +} + +/* This code checks to see if the Ruby object being raised as part + of an exception inherits from the Ruby class Exception. If so, + the object is simply returned. If not, then a new Ruby exception + object is created and that will be returned to Ruby.*/ +SWIGRUNTIME VALUE +SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) { + VALUE exceptionClass = getExceptionClass(); + if (rb_obj_is_kind_of(obj, exceptionClass)) { + return obj; + } else { + return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj)); + } +} + +/* Initialize Ruby runtime support */ +SWIGRUNTIME void +SWIG_Ruby_InitRuntime(void) +{ + if (_mSWIG == Qnil) { + _mSWIG = rb_define_module("SWIG"); + swig_call_id = rb_intern("call"); + swig_arity_id = rb_intern("arity"); + } +} + +/* Define Ruby class for C type */ +SWIGRUNTIME void +SWIG_Ruby_define_class(swig_type_info *type) +{ + VALUE klass; + char *klass_name = (char *) malloc(4 + strlen(type->name) + 1); + sprintf(klass_name, "TYPE%s", type->name); + if (NIL_P(_cSWIG_Pointer)) { + _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject); + rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new"); + } + klass = rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer); + free((void *) klass_name); +} + +/* Create a new pointer object */ +SWIGRUNTIME VALUE +SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags) +{ + int own = flags & SWIG_POINTER_OWN; + int track; + char *klass_name; + swig_class *sklass; + VALUE klass; + VALUE obj; + + if (!ptr) + return Qnil; + + if (type->clientdata) { + sklass = (swig_class *) type->clientdata; + + /* Are we tracking this class and have we already returned this Ruby object? */ + track = sklass->trackObjects; + if (track) { + obj = SWIG_RubyInstanceFor(ptr); + + /* Check the object's type and make sure it has the correct type. + It might not in cases where methods do things like + downcast methods. */ + if (obj != Qnil) { + VALUE value = rb_iv_get(obj, "@__swigtype__"); + char* type_name = RSTRING_PTR(value); + + if (strcmp(type->name, type_name) == 0) { + return obj; + } + } + } + + /* Create a new Ruby object */ + obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), + ( own ? VOIDFUNC(sklass->destroy) : + (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 ) + ), ptr); + + /* If tracking is on for this class then track this object. */ + if (track) { + SWIG_RubyAddTracking(ptr, obj); + } + } else { + klass_name = (char *) malloc(4 + strlen(type->name) + 1); + sprintf(klass_name, "TYPE%s", type->name); + klass = rb_const_get(_mSWIG, rb_intern(klass_name)); + free((void *) klass_name); + obj = Data_Wrap_Struct(klass, 0, 0, ptr); + } + rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); + + return obj; +} + +/* Create a new class instance (always owned) */ +SWIGRUNTIME VALUE +SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type) +{ + VALUE obj; + swig_class *sklass = (swig_class *) type->clientdata; + obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0); + rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); + return obj; +} + +/* Get type mangle from class name */ +SWIGRUNTIMEINLINE char * +SWIG_Ruby_MangleStr(VALUE obj) +{ + VALUE stype = rb_iv_get(obj, "@__swigtype__"); + return StringValuePtr(stype); +} + +/* Acquire a pointer value */ +typedef void (*ruby_owntype)(void*); + +SWIGRUNTIME ruby_owntype +SWIG_Ruby_AcquirePtr(VALUE obj, ruby_owntype own) { + if (obj) { + ruby_owntype oldown = RDATA(obj)->dfree; + RDATA(obj)->dfree = own; + return oldown; + } else { + return 0; + } +} + +/* Convert a pointer value */ +SWIGRUNTIME int +SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, ruby_owntype *own) +{ + char *c; + swig_cast_info *tc; + void *vptr = 0; + + /* Grab the pointer */ + if (NIL_P(obj)) { + *ptr = 0; + return SWIG_OK; + } else { + if (TYPE(obj) != T_DATA) { + return SWIG_ERROR; + } + Data_Get_Struct(obj, void, vptr); + } + + if (own) *own = RDATA(obj)->dfree; + + /* Check to see if the input object is giving up ownership + of the underlying C struct or C++ object. If so then we + need to reset the destructor since the Ruby object no + longer owns the underlying C++ object.*/ + if (flags & SWIG_POINTER_DISOWN) { + /* Is tracking on for this class? */ + int track = 0; + if (ty && ty->clientdata) { + swig_class *sklass = (swig_class *) ty->clientdata; + track = sklass->trackObjects; + } + + if (track) { + /* We are tracking objects for this class. Thus we change the destructor + * to SWIG_RubyRemoveTracking. This allows us to + * remove the mapping from the C++ to Ruby object + * when the Ruby object is garbage collected. If we don't + * do this, then it is possible we will return a reference + * to a Ruby object that no longer exists thereby crashing Ruby. */ + RDATA(obj)->dfree = SWIG_RubyRemoveTracking; + } else { + RDATA(obj)->dfree = 0; + } + } + + /* Do type-checking if type info was provided */ + if (ty) { + if (ty->clientdata) { + if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) { + if (vptr == 0) { + /* The object has already been deleted */ + return SWIG_ObjectPreviouslyDeletedError; + } + *ptr = vptr; + return SWIG_OK; + } + } + if ((c = SWIG_MangleStr(obj)) == NULL) { + return SWIG_ERROR; + } + tc = SWIG_TypeCheck(c, ty); + if (!tc) { + return SWIG_ERROR; + } else { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc, vptr, &newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } + } else { + *ptr = vptr; + } + + return SWIG_OK; +} + +/* Check convert */ +SWIGRUNTIMEINLINE int +SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty) +{ + char *c = SWIG_MangleStr(obj); + if (!c) return 0; + return SWIG_TypeCheck(c,ty) != 0; +} + +SWIGRUNTIME VALUE +SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; + *(r++) = '_'; + r = SWIG_PackData(r, ptr, sz); + strcpy(r, type->name); + return rb_str_new2(result); +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c; + + if (TYPE(obj) != T_STRING) goto type_error; + c = StringValuePtr(obj); + /* Pointer values must start with leading underscore */ + if (*c != '_') goto type_error; + c++; + c = SWIG_UnpackData(c, ptr, sz); + if (ty) { + tc = SWIG_TypeCheck(c, ty); + if (!tc) goto type_error; + } + return SWIG_OK; + + type_error: + return SWIG_ERROR; +} + +SWIGRUNTIME swig_module_info * +SWIG_Ruby_GetModule(void) +{ + VALUE pointer; + swig_module_info *ret = 0; + VALUE verbose = rb_gv_get("VERBOSE"); + + /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */ + rb_gv_set("VERBOSE", Qfalse); + + /* first check if pointer already created */ + pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); + if (pointer != Qnil) { + Data_Get_Struct(pointer, swig_module_info, ret); + } + + /* reinstate warnings */ + rb_gv_set("VERBOSE", verbose); + return ret; +} + +SWIGRUNTIME void +SWIG_Ruby_SetModule(swig_module_info *pointer) +{ + /* register a new class */ + VALUE cl = rb_define_class("swig_runtime_data", rb_cObject); + /* create and store the structure pointer to a global variable */ + swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer); + rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer); +} + +/* This function can be used to check whether a proc or method or similarly + callable function has been passed. Usually used in a %typecheck, like: + + %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) { + $result = SWIG_Ruby_isCallable( $input ); + } + */ +SWIGINTERN +int SWIG_Ruby_isCallable( VALUE proc ) +{ + if ( rb_respond_to( proc, swig_call_id ) == Qtrue ) + return 1; + return 0; +} + +/* This function can be used to check the arity (number of arguments) + a proc or method can take. Usually used in a %typecheck. + Valid arities will be that equal to minimal or those < 0 + which indicate a variable number of parameters at the end. + */ +SWIGINTERN +int SWIG_Ruby_arity( VALUE proc, int minimal ) +{ + if ( rb_respond_to( proc, swig_arity_id ) == Qtrue ) + { + VALUE num = rb_funcall( proc, swig_arity_id, 0 ); + int arity = NUM2INT(num); + if ( arity < 0 && (arity+1) < -minimal ) return 1; + if ( arity == minimal ) return 1; + return 1; + } + return 0; +} + + +#ifdef __cplusplus +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + +/* ----------------------------------------------------------------------------- + * director.swg + * + * This file contains support for director classes that proxy + * method calls from C++ to Ruby extensions. + * ----------------------------------------------------------------------------- */ + +/* + Use -DSWIG_DIRECTOR_NOUEH if you prefer to avoid the use of the + Undefined Exception Handler provided by swift +*/ +#ifndef SWIG_DIRECTOR_NOUEH +#ifndef SWIG_DIRECTOR_UEH +#define SWIG_DIRECTOR_UEH +#endif +#endif + +#ifdef __cplusplus + +#include +#include +#include + +# define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) + +namespace Swig { + /* memory handler */ + struct GCItem + { + virtual ~GCItem() + { + } + + virtual ruby_owntype get_own() const + { + return 0; + } + }; + + struct GCItem_var + { + GCItem_var(GCItem *item = 0) : _item(item) + { + } + + GCItem_var& operator=(GCItem *item) + { + GCItem *tmp = _item; + _item = item; + delete tmp; + return *this; + } + + ~GCItem_var() + { + delete _item; + } + + GCItem * operator->() const + { + return _item; + } + + private: + GCItem *_item; + }; + + + template + struct GCItem_T : GCItem + { + GCItem_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCItem_T() + { + delete _ptr; + } + + private: + Type *_ptr; + }; + + struct GCItem_Object : GCItem + { + GCItem_Object(ruby_owntype own) : _own(own) + { + } + + virtual ~GCItem_Object() + { + } + + ruby_owntype get_own() const + { + return _own; + } + + private: + ruby_owntype _own; + }; + + + template + struct GCArray_T : GCItem + { + GCArray_T(Type *ptr) : _ptr(ptr) + { + } + + virtual ~GCArray_T() + { + delete[] _ptr; + } + + private: + Type *_ptr; + }; + + + /* body args */ + struct body_args { + VALUE recv; + ID id; + int argc; + VALUE *argv; + }; + + /* Base class for director exceptions */ + class DirectorException { + protected: + VALUE swig_error; + std::string swig_msg; + protected: + DirectorException(VALUE error) + : swig_error(error) + { + } + + DirectorException(VALUE error, const char* hdr, const char* msg ="") + : swig_error(error), swig_msg(hdr) { + if (strlen(msg)) { + swig_msg += " "; + swig_msg += msg; + } + if (swig_msg.size()) { + VALUE str = rb_str_new(swig_msg.data(), swig_msg.size()); + swig_error = rb_exc_new3(error, str); + } else { + swig_error = error; + } + } + public: + VALUE getType() const { + return CLASS_OF(swig_error); + } + VALUE getError() const { + return swig_error; + } + const std::string& getMessage() const + { + return swig_msg; + } + + virtual ~DirectorException() {} + }; + + /* unknown exception handler */ + + class UnknownExceptionHandler + { +#ifdef SWIG_DIRECTOR_UEH + static void handler() { + try { + throw; + } catch (DirectorException& e) { + std::cerr << "SWIG Director exception caught:" << std::endl + << e.getMessage() << std::endl; + } catch (std::exception& e) { + std::cerr << "std::exception caught: "<< e.what() << std::endl; + } catch (...) { + std::cerr << "Unknown exception caught." << std::endl; + } + std::cerr << std::endl + << "Ruby interpreter traceback:" << std::endl; + std::cerr << std::endl; + std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl + << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl + << std::endl + << "Exception is being re-thrown, program will like abort/terminate." << std::endl; + throw; + } + + public: + std::unexpected_handler old; + UnknownExceptionHandler(std::unexpected_handler nh = handler) + { + old = std::set_unexpected(nh); + } + + ~UnknownExceptionHandler() + { + std::set_unexpected(old); + } +#endif + }; + + + /* Type mismatch in the return value from a Ruby method call */ + class DirectorTypeMismatchException : public Swig::DirectorException { + public: + DirectorTypeMismatchException(VALUE error, const char *msg="") + : Swig::DirectorException(error, "SWIG director type mismatch", msg) + { + } + + DirectorTypeMismatchException(const char *msg="") + : Swig::DirectorException(rb_eTypeError, "SWIG director type mismatch", msg) + { + } + + static void raise(VALUE error, const char *msg) { + throw DirectorTypeMismatchException(error, msg); + } + + static void raise(const char *msg) { + throw DirectorTypeMismatchException(msg); + } + }; + + /* Any Ruby exception that occurs during a director method call */ + class DirectorMethodException : public Swig::DirectorException { + public: + DirectorMethodException(VALUE error) + : Swig::DirectorException(error) { + } + + DirectorMethodException(const char* msg = "") + : Swig::DirectorException(rb_eRuntimeError, "SWIG director method error.", msg) { + } + + static void raise(VALUE error) + { + throw DirectorMethodException(error); + } + }; + + /* Attempted to call a pure virtual method via a director method */ + class DirectorPureVirtualException : public Swig::DirectorException + { + public: + DirectorPureVirtualException(const char* msg = "") + : DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg) + { + } + + static void raise(const char *msg) + { + throw DirectorPureVirtualException(msg); + } + }; + + /* Simple thread abstraction for pthreads on win32 */ +#ifdef __THREAD__ +# define __PTHREAD__ +# if defined(_WIN32) || defined(__WIN32__) +# define pthread_mutex_lock EnterCriticalSection +# define pthread_mutex_unlock LeaveCriticalSection +# define pthread_mutex_t CRITICAL_SECTION +# define SWIG_MUTEX_INIT(var) var +# else +# include +# define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER +# endif +#endif + +#ifdef __PTHREAD__ + struct Guard + { + pthread_mutex_t *_mutex; + + Guard(pthread_mutex_t &mutex) : _mutex(&mutex) + { + pthread_mutex_lock(_mutex); + } + + ~Guard() + { + pthread_mutex_unlock(_mutex); + } + }; +# define SWIG_GUARD(mutex) Guard _guard(mutex) +#else +# define SWIG_GUARD(mutex) +#endif + + /* director base class */ + class Director { + private: + /* pointer to the wrapped Ruby object */ + VALUE swig_self; + /* flag indicating whether the object is owned by Ruby or c++ */ + mutable bool swig_disown_flag; + + public: + /* wrap a Ruby object, optionally taking ownership */ + Director(VALUE self) : swig_self(self), swig_disown_flag(false) { + } + + /* discard our reference at destruction */ + virtual ~Director() { + } + + /* return a pointer to the wrapped Ruby object */ + VALUE swig_get_self() const { + return swig_self; + } + + /* acquire ownership of the wrapped Ruby object (the sense of "disown" + * is from Ruby) */ + void swig_disown() const { + if (!swig_disown_flag) { + swig_disown_flag = true; + } + } + + /* ownership management */ + private: + typedef std::map swig_ownership_map; + mutable swig_ownership_map swig_owner; +#ifdef __PTHREAD__ + static pthread_mutex_t swig_mutex_own; +#endif + + public: + template + void swig_acquire_ownership_array(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCArray_T(vptr); + } + } + + template + void swig_acquire_ownership(Type *vptr) const + { + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_T(vptr); + } + } + + void swig_acquire_ownership_obj(void *vptr, ruby_owntype own) const + { + if (vptr && own) { + SWIG_GUARD(swig_mutex_own); + swig_owner[vptr] = new GCItem_Object(own); + } + } + + ruby_owntype swig_release_ownership(void *vptr) const + { + ruby_owntype own = 0; + if (vptr) { + SWIG_GUARD(swig_mutex_own); + swig_ownership_map::iterator iter = swig_owner.find(vptr); + if (iter != swig_owner.end()) { + own = iter->second->get_own(); + swig_owner.erase(iter); + } + } + return own; + } + }; +} + +#endif /* __cplusplus */ + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_OTCallback swig_types[0] +#define SWIGTYPE_p_OTCaller swig_types[1] +#define SWIGTYPE_p_OTDB__Acct swig_types[2] +#define SWIGTYPE_p_OTDB__AddressBook swig_types[3] +#define SWIGTYPE_p_OTDB__AskData swig_types[4] +#define SWIGTYPE_p_OTDB__BidData swig_types[5] +#define SWIGTYPE_p_OTDB__BitcoinAcct swig_types[6] +#define SWIGTYPE_p_OTDB__BitcoinServer swig_types[7] +#define SWIGTYPE_p_OTDB__Blob swig_types[8] +#define SWIGTYPE_p_OTDB__Contact swig_types[9] +#define SWIGTYPE_p_OTDB__ContactAcct swig_types[10] +#define SWIGTYPE_p_OTDB__ContactNym swig_types[11] +#define SWIGTYPE_p_OTDB__Displayable swig_types[12] +#define SWIGTYPE_p_OTDB__LoomServer swig_types[13] +#define SWIGTYPE_p_OTDB__MarketData swig_types[14] +#define SWIGTYPE_p_OTDB__MarketList swig_types[15] +#define SWIGTYPE_p_OTDB__OTDBString swig_types[16] +#define SWIGTYPE_p_OTDB__OfferDataMarket swig_types[17] +#define SWIGTYPE_p_OTDB__OfferDataNym swig_types[18] +#define SWIGTYPE_p_OTDB__OfferListMarket swig_types[19] +#define SWIGTYPE_p_OTDB__OfferListNym swig_types[20] +#define SWIGTYPE_p_OTDB__RippleServer swig_types[21] +#define SWIGTYPE_p_OTDB__Server swig_types[22] +#define SWIGTYPE_p_OTDB__ServerInfo swig_types[23] +#define SWIGTYPE_p_OTDB__Storable swig_types[24] +#define SWIGTYPE_p_OTDB__Storage swig_types[25] +#define SWIGTYPE_p_OTDB__StringMap swig_types[26] +#define SWIGTYPE_p_OTDB__TradeDataMarket swig_types[27] +#define SWIGTYPE_p_OTDB__TradeDataNym swig_types[28] +#define SWIGTYPE_p_OTDB__TradeListMarket swig_types[29] +#define SWIGTYPE_p_OTDB__TradeListNym swig_types[30] +#define SWIGTYPE_p_OTDB__WalletData swig_types[31] +#define SWIGTYPE_p_OTPacker swig_types[32] +#define SWIGTYPE_p_char swig_types[33] +#define SWIGTYPE_p_std__mapT_std__string_std__string_t swig_types[34] +#define SWIGTYPE_p_std__vectorT_unsigned_char_t swig_types[35] +static swig_type_info *swig_types[37]; +static swig_module_info swig_module = {swig_types, 36, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#define SWIG_init Init_otapi +#define SWIG_name "Otapi" + +static VALUE mOtapi; + +#define SWIG_RUBY_THREAD_BEGIN_BLOCK +#define SWIG_RUBY_THREAD_END_BLOCK + + +#define SWIGVERSION 0x020004 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +// Ruby 1.9 changed the file name of this header +#ifdef HAVE_RUBY_IO_H +#include "ruby/io.h" +#else +#include "rubyio.h" +#endif + +#ifdef __cplusplus +} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef HAVE_SYS_TIME_H +# include +struct timeval rb_time_timeval(VALUE); +#endif +#ifdef __cplusplus +} +#endif + + +SWIGINTERN swig_type_info* +SWIG_pchar_descriptor(void) +{ + static int init = 0; + static swig_type_info* info = 0; + if (!init) { + info = SWIG_TypeQuery("_p_char"); + init = 1; + } + return info; +} + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc) +{ + if (TYPE(obj) == T_STRING) { + #if defined(StringValuePtr) + char *cstr = StringValuePtr(obj); + #else + char *cstr = STR2CSTR(obj); + #endif + size_t size = RSTRING_LEN(obj) + 1; + if (cptr) { + if (alloc) { + if (*alloc == SWIG_NEWOBJ) { + *cptr = reinterpret_cast< char* >(memcpy((new char[size]), cstr, sizeof(char)*(size))); + } else { + *cptr = cstr; + *alloc = SWIG_OLDOBJ; + } + } + } + if (psize) *psize = size; + return SWIG_OK; + } else { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + if (pchar_descriptor) { + void* vptr = 0; + if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { + if (cptr) *cptr = (char *)vptr; + if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsPtr_std_string (VALUE obj, std::string **val) +{ + char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; + if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { + if (buf) { + if (val) *val = new std::string(buf, size - 1); + if (alloc == SWIG_NEWOBJ) delete[] buf; + return SWIG_NEWOBJ; + } else { + if (val) *val = 0; + return SWIG_OLDOBJ; + } + } else { + static int init = 0; + static swig_type_info* descriptor = 0; + if (!init) { + descriptor = SWIG_TypeQuery("std::string" " *"); + init = 1; + } + if (descriptor) { + std::string *vptr; + int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); + if (SWIG_IsOK(res) && val) *val = vptr; + return res; + } + } + return SWIG_ERROR; +} + + +SWIGINTERNINLINE VALUE +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + if (carray) { + if (size > LONG_MAX) { + swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); + return pchar_descriptor ? + SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : Qnil; + } else { + return rb_str_new(carray, static_cast< long >(size)); + } + } else { + return Qnil; + } +} + + +SWIGINTERNINLINE VALUE +SWIG_From_std_string (const std::string& s) +{ + return SWIG_FromCharPtrAndSize(s.data(), s.size()); +} + + +SWIGINTERNINLINE VALUE +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + +SWIGINTERNINLINE VALUE +SWIG_From_bool (bool value) +{ + return value ? Qtrue : Qfalse; +} + + + + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + + #define SWIG_From_long LONG2NUM + + +SWIGINTERNINLINE VALUE +SWIG_From_int (int value) +{ + return SWIG_From_long (value); +} + + +SWIGINTERN VALUE +SWIG_ruby_failed(void) +{ + return Qnil; +} + + +/*@SWIG:/opt/local/share/swig/2.0.4/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ +SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE *args) +{ + VALUE obj = args[0]; + VALUE type = TYPE(obj); + long *res = (long *)(args[1]); + *res = type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj); + return obj; +} +/*@SWIG@*/ + +SWIGINTERN int +SWIG_AsVal_long (VALUE obj, long* val) +{ + VALUE type = TYPE(obj); + if ((type == T_FIXNUM) || (type == T_BIGNUM)) { + long v; + VALUE a[2]; + a[0] = obj; + a[1] = (VALUE)(&v); + if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (val) *val = v; + return SWIG_OK; + } + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int (VALUE obj, int *val) +{ + long v; + int res = SWIG_AsVal_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERNINLINE VALUE +SWIG_From_unsigned_SS_long (unsigned long value) +{ + return ULONG2NUM(value); +} + + +SWIGINTERNINLINE VALUE +SWIG_From_size_t (size_t value) +{ + return SWIG_From_unsigned_SS_long (static_cast< unsigned long >(value)); +} + + +/*@SWIG:/opt/local/share/swig/2.0.4/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ +SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE *args) +{ + VALUE obj = args[0]; + VALUE type = TYPE(obj); + unsigned long *res = (unsigned long *)(args[1]); + *res = type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj); + return obj; +} +/*@SWIG@*/ + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long (VALUE obj, unsigned long *val) +{ + VALUE type = TYPE(obj); + if ((type == T_FIXNUM) || (type == T_BIGNUM)) { + unsigned long v; + VALUE a[2]; + a[0] = obj; + a[1] = (VALUE)(&v); + if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { + if (val) *val = v; + return SWIG_OK; + } + } + return SWIG_TypeError; +} + + +SWIGINTERNINLINE int +SWIG_AsVal_size_t (VALUE obj, size_t *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); + if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); + return res; +} + + +SWIGINTERN int +SWIG_AsVal_bool (VALUE obj, bool *val) +{ + if (obj == Qtrue) { + if (val) *val = true; + return SWIG_OK; + } else if (obj == Qfalse) { + if (val) *val = false; + return SWIG_OK; + } else { + int res = 0; + if (SWIG_AsVal_int (obj, &res) == SWIG_OK) { + if (val) *val = res ? true : false; + return SWIG_OK; + } + } + return SWIG_TypeError; +} + + + using namespace OTDB; + +/* --------------------------------------------------- + * C++ director class helpers + * --------------------------------------------------- */ + + + +/* --------------------------------------------------- + * C++ director class methods + * --------------------------------------------------- */ + +#include "OTAPI_wrap.h" + +SwigDirector_OTCallback::SwigDirector_OTCallback(VALUE self): OTCallback(), Swig::Director(self) { + +} + + + +SwigDirector_OTCallback::~SwigDirector_OTCallback() { +} + +std::string SwigDirector_OTCallback::runOne() { + std::string c_result ; + VALUE result; + + result = rb_funcall(swig_get_self(), rb_intern("runOne"), 0, NULL); + std::string *swig_optr = 0; + int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr); + if (!SWIG_IsOK(swig_ores) || !swig_optr) { + Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'"); + } + c_result = *swig_optr; + if (SWIG_IsNewObj(swig_ores)) delete swig_optr; + return (std::string) c_result; +} + + +std::string SwigDirector_OTCallback::runTwo() { + std::string c_result ; + VALUE result; + + result = rb_funcall(swig_get_self(), rb_intern("runTwo"), 0, NULL); + std::string *swig_optr = 0; + int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr); + if (!SWIG_IsOK(swig_ores) || !swig_optr) { + Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'"); + } + c_result = *swig_optr; + if (SWIG_IsNewObj(swig_ores)) delete swig_optr; + return (std::string) c_result; +} + + +swig_class SwigClassOTCallback; + +#ifdef HAVE_RB_DEFINE_ALLOC_FUNC +SWIGINTERN VALUE +_wrap_OTCallback_allocate(VALUE self) { +#else + SWIGINTERN VALUE + _wrap_OTCallback_allocate(int argc, VALUE *argv, VALUE self) { +#endif + + + VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_OTCallback); +#ifndef HAVE_RB_DEFINE_ALLOC_FUNC + rb_obj_call_init(vresult, argc, argv); +#endif + return vresult; + } + + +SWIGINTERN VALUE +_wrap_new_OTCallback(int argc, VALUE *argv, VALUE self) { + VALUE arg1 = (VALUE) 0 ; + const char *classname SWIGUNUSED = "Otapi::OTCallback"; + OTCallback *result = 0 ; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + arg1 = self; + if ( strcmp(rb_obj_classname(self), classname) != 0 ) { + /* subclassed */ + result = (OTCallback *)new SwigDirector_OTCallback(arg1); + } else { + result = (OTCallback *)new OTCallback(); + } + + DATA_PTR(self) = result; + return self; +fail: + return Qnil; +} + + +SWIGINTERN void +free_OTCallback(OTCallback *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OTCallback_runOne(int argc, VALUE *argv, VALUE self) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCallback *","runOne", 1, self )); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + director = dynamic_cast(arg1); + upcall = (director && (director->swig_get_self() == self)); + try { + if (upcall) { + result = (arg1)->OTCallback::runOne(); + } else { + result = (arg1)->runOne(); + } + } catch (Swig::DirectorException& e) { + rb_exc_raise(e.getError()); + SWIG_fail; + } + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCallback_runTwo(int argc, VALUE *argv, VALUE self) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + Swig::Director *director = 0; + bool upcall = false; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCallback *","runTwo", 1, self )); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + director = dynamic_cast(arg1); + upcall = (director && (director->swig_get_self() == self)); + try { + if (upcall) { + result = (arg1)->OTCallback::runTwo(); + } else { + result = (arg1)->runTwo(); + } + } catch (Swig::DirectorException& e) { + rb_exc_raise(e.getError()); + SWIG_fail; + } + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_disown_OTCallback(int argc, VALUE *argv, VALUE self) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCallback *","disown_OTCallback", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + { + Swig::Director *director = SWIG_DIRECTOR_CAST(arg1); + if (director) director->swig_disown(); + } + + return Qnil; +fail: + return Qnil; +} + + +swig_class SwigClassOTCaller; + +#ifdef HAVE_RB_DEFINE_ALLOC_FUNC +SWIGINTERN VALUE +_wrap_OTCaller_allocate(VALUE self) { +#else + SWIGINTERN VALUE + _wrap_OTCaller_allocate(int argc, VALUE *argv, VALUE self) { +#endif + + + VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_OTCaller); +#ifndef HAVE_RB_DEFINE_ALLOC_FUNC + rb_obj_call_init(vresult, argc, argv); +#endif + return vresult; + } + + +SWIGINTERN VALUE +_wrap_new_OTCaller(int argc, VALUE *argv, VALUE self) { + const char *classname SWIGUNUSED = "Otapi::OTCaller"; + OTCaller *result = 0 ; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (OTCaller *)new OTCaller(); + DATA_PTR(self) = result; + return self; +fail: + return Qnil; +} + + +SWIGINTERN void +free_OTCaller(OTCaller *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OTCaller_GetPassword(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","GetPassword", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (char *)(arg1)->GetPassword(); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCaller_delCallback(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","delCallback", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->delCallback(); + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCaller_setCallback(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","setCallback", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTCallback *","setCallback", 2, argv[0] )); + } + arg2 = reinterpret_cast< OTCallback * >(argp2); + (arg1)->setCallback(arg2); + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCaller_isCallbackSet(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","isCallbackSet", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)(arg1)->isCallbackSet(); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCaller_callOne(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","callOne", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callOne(); + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTCaller_callTwo(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller *","callTwo", 1, self )); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callTwo(); + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Set_PasswordCallback(int argc, VALUE *argv, VALUE self) { + OTCaller *arg1 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_OTCaller, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTCaller &","OT_API_Set_PasswordCallback", 1, argv[0] )); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTCaller &","OT_API_Set_PasswordCallback", 1, argv[0])); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)OT_API_Set_PasswordCallback(*arg1); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Init(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Init", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Init((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadWallet(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadWallet", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_LoadWallet((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SwitchWallet(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SwitchWallet", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SwitchWallet", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetMemlogSize(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_GetMemlogSize(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetMemlogAtIndex(int argc, VALUE *argv, VALUE self) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","OT_API_GetMemlogAtIndex", 1, argv[0] )); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetMemlogAtIndex(arg1); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_PeekMemlogFront(int argc, VALUE *argv, VALUE self) { + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (char *)OT_API_PeekMemlogFront(); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_PeekMemlogBack(int argc, VALUE *argv, VALUE self) { + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (char *)OT_API_PeekMemlogBack(); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_PopMemlogFront(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_PopMemlogFront(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_PopMemlogBack(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_PopMemlogBack(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_CreateNym(int argc, VALUE *argv, VALUE self) { + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (char *)OT_API_CreateNym(); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_AddServerContract(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_AddServerContract", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddServerContract((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_AddAssetContract(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_AddAssetContract", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddAssetContract((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetServerCount(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_GetServerCount(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAssetTypeCount(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_GetAssetTypeCount(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountCount(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_GetAccountCount(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNymCount(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_GetNymCount(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetServer_ID(int argc, VALUE *argv, VALUE self) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","OT_API_GetServer_ID", 1, argv[0] )); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetServer_ID(arg1); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetServer_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetServer_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetServer_Name((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAssetType_ID(int argc, VALUE *argv, VALUE self) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","OT_API_GetAssetType_ID", 1, argv[0] )); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAssetType_ID(arg1); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAssetType_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAssetType_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_ID(int argc, VALUE *argv, VALUE self) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","OT_API_GetAccountWallet_ID", 1, argv[0] )); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAccountWallet_ID(arg1); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_Balance(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_Balance", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_Type(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_Type", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_AssetTypeID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_AssetTypeID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_ServerID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_ServerID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetAccountWallet_NymID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetAccountWallet_NymID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_VerifyAccountReceipt(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyAccountReceipt", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyAccountReceipt", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyAccountReceipt", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_TransactionNumCount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_TransactionNumCount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_TransactionNumCount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_ID(int argc, VALUE *argv, VALUE self) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","OT_API_GetNym_ID", 1, argv[0] )); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetNym_ID(arg1); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Name((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_Stats(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_Stats", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_IsNym_RegisteredAtServer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_IsNym_RegisteredAtServer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_IsNym_RegisteredAtServer", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_MailCount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_MailCount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_MailContentsByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_MailContentsByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_MailContentsByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_MailSenderIDByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_MailSenderIDByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_MailSenderIDByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_MailServerIDByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_MailServerIDByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_MailServerIDByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Nym_RemoveMailByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Nym_RemoveMailByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Nym_RemoveMailByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Nym_VerifyMailByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Nym_VerifyMailByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Nym_VerifyMailByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_OutmailCount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_OutmailCount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_OutmailContentsByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_OutmailContentsByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_OutmailContentsByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_OutmailRecipientIDByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_OutmailRecipientIDByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_OutmailRecipientIDByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GetNym_OutmailServerIDByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GetNym_OutmailServerIDByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_GetNym_OutmailServerIDByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Nym_RemoveOutmailByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Nym_RemoveOutmailByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Nym_RemoveOutmailByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Nym_VerifyOutmailByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Nym_VerifyOutmailByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Nym_VerifyOutmailByIndex", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_CanRemoveServer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_CanRemoveServer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_RemoveServer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_RemoveServer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_CanRemoveAssetType(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_CanRemoveAssetType", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_RemoveAssetType(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_RemoveAssetType", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_CanRemoveNym(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_CanRemoveNym", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_RemoveNym(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_RemoveNym", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_CanRemoveAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_CanRemoveAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_ImportNym(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportNym", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportNym", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SetNym_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SetNym_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SetNym_Name", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_SetNym_Name", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SetAccountWallet_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SetAccountWallet_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SetAccountWallet_Name", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_SetAccountWallet_Name", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SetAssetType_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SetAssetType_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SetAssetType_Name", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SetServer_Name(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SetServer_Name", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SetServer_Name", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_VerifyAndRetrieveXMLContents(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyAndRetrieveXMLContents", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyAndRetrieveXMLContents", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_WriteCheque(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 8) || (argc > 8)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 8)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 6, argv[5] )); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(argv[6], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 7, argv[6] )); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(argv[7], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "char const *","OT_API_WriteCheque", 8, argv[7] )); + } + arg8 = reinterpret_cast< char * >(buf8); + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_ProposePaymentPlan(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int res11 ; + char *buf11 = 0 ; + int alloc11 = 0 ; + int res12 ; + char *buf12 = 0 ; + int alloc12 = 0 ; + int res13 ; + char *buf13 = 0 ; + int alloc13 = 0 ; + int res14 ; + char *buf14 = 0 ; + int alloc14 = 0 ; + int res15 ; + char *buf15 = 0 ; + int alloc15 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 15) || (argc > 15)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 15)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 6, argv[5] )); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(argv[6], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 7, argv[6] )); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(argv[7], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 8, argv[7] )); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(argv[8], &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 9, argv[8] )); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(argv[9], &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 10, argv[9] )); + } + arg10 = reinterpret_cast< char * >(buf10); + res11 = SWIG_AsCharPtrAndSize(argv[10], &buf11, NULL, &alloc11); + if (!SWIG_IsOK(res11)) { + SWIG_exception_fail(SWIG_ArgError(res11), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 11, argv[10] )); + } + arg11 = reinterpret_cast< char * >(buf11); + res12 = SWIG_AsCharPtrAndSize(argv[11], &buf12, NULL, &alloc12); + if (!SWIG_IsOK(res12)) { + SWIG_exception_fail(SWIG_ArgError(res12), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 12, argv[11] )); + } + arg12 = reinterpret_cast< char * >(buf12); + res13 = SWIG_AsCharPtrAndSize(argv[12], &buf13, NULL, &alloc13); + if (!SWIG_IsOK(res13)) { + SWIG_exception_fail(SWIG_ArgError(res13), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 13, argv[12] )); + } + arg13 = reinterpret_cast< char * >(buf13); + res14 = SWIG_AsCharPtrAndSize(argv[13], &buf14, NULL, &alloc14); + if (!SWIG_IsOK(res14)) { + SWIG_exception_fail(SWIG_ArgError(res14), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 14, argv[13] )); + } + arg14 = reinterpret_cast< char * >(buf14); + res15 = SWIG_AsCharPtrAndSize(argv[14], &buf15, NULL, &alloc15); + if (!SWIG_IsOK(res15)) { + SWIG_exception_fail(SWIG_ArgError(res15), Ruby_Format_TypeError( "", "char const *","OT_API_ProposePaymentPlan", 15, argv[14] )); + } + arg15 = reinterpret_cast< char * >(buf15); + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_ConfirmPaymentPlan(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_ConfirmPaymentPlan", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_ConfirmPaymentPlan", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_ConfirmPaymentPlan", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_ConfirmPaymentPlan", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_ConfirmPaymentPlan", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadUserPubkey(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadUserPubkey", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadPubkey(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadPubkey", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadPubkey((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_VerifyUserPrivateKey(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_VerifyUserPrivateKey", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadPurse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadPurse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadPurse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_LoadPurse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadMint(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadMint", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadMint", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadAssetContract(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadAssetContract", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadServerContract(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadServerContract", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadServerContract((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Mint_IsStillGood(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Mint_IsStillGood", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Mint_IsStillGood", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Mint_IsStillGood", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_IsBasketCurrency(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_IsBasketCurrency", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Basket_GetMemberCount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Basket_GetMemberCount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Basket_GetMemberType(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Basket_GetMemberType", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Basket_GetMemberType", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Basket_GetMinimumTransferAmount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Basket_GetMinimumTransferAmount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Basket_GetMemberMinimumTransferAmount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Basket_GetMemberMinimumTransferAmount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","OT_API_Basket_GetMemberMinimumTransferAmount", 2, argv[1] )); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadAssetAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadAssetAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadAssetAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_LoadAssetAccount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadInbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadInbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadInbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_LoadInbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadOutbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadOutbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadOutbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_LoadOutbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_GetCount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetCount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetCount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetCount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetCount", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_CreateResponse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_CreateResponse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_CreateResponse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_CreateResponse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_CreateResponse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_GetTransactionByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByIndex", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByIndex", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByIndex", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(argv[4], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "int","OT_API_Ledger_GetTransactionByIndex", 5, argv[4] )); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_GetTransactionByID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByID", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionByID", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_GetTransactionIDByIndex(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionIDByIndex", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionIDByIndex", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionIDByIndex", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_GetTransactionIDByIndex", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(argv[4], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "int","OT_API_Ledger_GetTransactionIDByIndex", 5, argv[4] )); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_AddTransaction(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_AddTransaction", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_AddTransaction", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_AddTransaction", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_AddTransaction", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_AddTransaction", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_CreateResponse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int val6 ; + int ecode6 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 6) || (argc > 6)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_CreateResponse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_CreateResponse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_CreateResponse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_CreateResponse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_CreateResponse", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + ecode6 = SWIG_AsVal_int(argv[5], &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), Ruby_Format_TypeError( "", "int","OT_API_Transaction_CreateResponse", 6, argv[5] )); + } + arg6 = static_cast< int >(val6); + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Ledger_FinalizeResponse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_FinalizeResponse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_FinalizeResponse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_FinalizeResponse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Ledger_FinalizeResponse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetType(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetType", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetType", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetType", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetType", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetVoucher(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetVoucher", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetVoucher", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetVoucher", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetVoucher", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetSuccess(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSuccess", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSuccess", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSuccess", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSuccess", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetBalanceAgreementSuccess(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetBalanceAgreementSuccess", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetBalanceAgreementSuccess", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetBalanceAgreementSuccess", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetBalanceAgreementSuccess", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetDateSigned(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDateSigned", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDateSigned", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDateSigned", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDateSigned", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetAmount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetAmount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetAmount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetAmount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetAmount", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Pending_GetNote(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Pending_GetNote", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Pending_GetNote", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Pending_GetNote", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Pending_GetNote", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetSenderUserID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderUserID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderUserID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderUserID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderUserID", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetSenderAcctID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderAcctID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderAcctID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderAcctID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetSenderAcctID", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetRecipientUserID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientUserID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientUserID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientUserID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientUserID", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetRecipientAcctID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientAcctID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientAcctID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientAcctID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetRecipientAcctID", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Transaction_GetDisplayReferenceToNum(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDisplayReferenceToNum", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDisplayReferenceToNum", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDisplayReferenceToNum", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Transaction_GetDisplayReferenceToNum", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_CreatePurse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_CreatePurse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_CreatePurse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_CreatePurse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_SavePurse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_SavePurse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_SavePurse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_SavePurse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_SavePurse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Purse_GetTotalValue(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_GetTotalValue", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_GetTotalValue", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_GetTotalValue", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Purse_Count(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Count", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Count", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Count", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Purse_Peek(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Peek", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Peek", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Peek", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Peek", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Purse_Pop(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Pop", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Pop", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Pop", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Pop", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Purse_Push(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Push", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Push", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Push", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Push", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_Purse_Push", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Wallet_ImportPurse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportPurse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportPurse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportPurse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Wallet_ImportPurse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_exchangePurse(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_exchangePurse", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_exchangePurse", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_exchangePurse", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_exchangePurse", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_ChangeOwner(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_ChangeOwner", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_ChangeOwner", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_ChangeOwner", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Token_ChangeOwner", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_Token_ChangeOwner", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetID", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetDenomination(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetDenomination", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetDenomination", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetDenomination", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetSeries(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetSeries", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetSeries", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetSeries", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetValidFrom(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidFrom", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidFrom", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidFrom", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetValidTo(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidTo", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidTo", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetValidTo", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetAssetID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetAssetID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Token_GetServerID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Token_GetServerID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_checkServerID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_checkServerID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_checkServerID", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_createUserAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_createUserAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_createUserAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_deleteUserAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_deleteUserAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_deleteUserAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_deleteAssetAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_deleteAssetAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_deleteAssetAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_deleteAssetAccount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_checkUser(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_checkUser", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_checkUser", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_checkUser", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_sendUserMessage(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_sendUserMessage", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_sendUserMessage", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_sendUserMessage", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_sendUserMessage", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_sendUserMessage", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getRequest(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getRequest", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getRequest", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getRequest((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getTransactionNumber(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getTransactionNumber", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getTransactionNumber", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_issueAssetType(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_issueAssetType", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_issueAssetType", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_issueAssetType", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getContract(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getContract", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getContract", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getContract", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getMint(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getMint", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getMint", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getMint", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_createAssetAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_createAssetAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_createAssetAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_createAssetAccount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getAccount(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getAccount", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getAccount", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getAccount", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GenerateBasketCreation(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketCreation", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketCreation", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_AddBasketCreationItem(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketCreationItem", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketCreationItem", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketCreationItem", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketCreationItem", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_issueBasket(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_issueBasket", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_issueBasket", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_issueBasket", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_GenerateBasketExchange(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketExchange", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketExchange", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketExchange", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_GenerateBasketExchange", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(argv[4], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "int","OT_API_GenerateBasketExchange", 5, argv[4] )); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_AddBasketExchangeItem(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketExchangeItem", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketExchangeItem", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketExchangeItem", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketExchangeItem", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_AddBasketExchangeItem", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_exchangeBasket(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_exchangeBasket", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_exchangeBasket", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_exchangeBasket", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_exchangeBasket", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int(argv[4], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), Ruby_Format_TypeError( "", "int","OT_API_exchangeBasket", 5, argv[4] )); + } + arg5 = static_cast< int >(val5); + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_notarizeWithdrawal(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeWithdrawal", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeWithdrawal", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeWithdrawal", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeWithdrawal", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_notarizeDeposit(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeDeposit", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeDeposit", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeDeposit", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeDeposit", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_notarizeTransfer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + + if ((argc < 6) || (argc > 6)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","OT_API_notarizeTransfer", 6, argv[5] )); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getInbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getInbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getInbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getInbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getOutbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getOutbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getOutbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getOutbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getNymbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getNymbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getNymbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_LoadNymbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_LoadNymbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_LoadNymbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_processInbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_processInbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_processInbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_processInbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_processInbox", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_processNymbox(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_processNymbox", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_processNymbox", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_processNymbox", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_withdrawVoucher(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + + if ((argc < 6) || (argc > 6)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","OT_API_withdrawVoucher", 6, argv[5] )); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_depositCheque(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_depositCheque", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_depositCheque", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_depositCheque", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_depositCheque", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_depositPaymentPlan(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_depositPaymentPlan", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_depositPaymentPlan", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_depositPaymentPlan", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_issueMarketOffer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int val11 ; + int ecode11 = 0 ; + + if ((argc < 11) || (argc > 11)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 11)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(argv[5], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 6, argv[5] )); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(argv[6], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 7, argv[6] )); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(argv[7], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 8, argv[7] )); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(argv[8], &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 9, argv[8] )); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(argv[9], &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), Ruby_Format_TypeError( "", "char const *","OT_API_issueMarketOffer", 10, argv[9] )); + } + arg10 = reinterpret_cast< char * >(buf10); + ecode11 = SWIG_AsVal_int(argv[10], &val11); + if (!SWIG_IsOK(ecode11)) { + SWIG_exception_fail(SWIG_ArgError(ecode11), Ruby_Format_TypeError( "", "int","OT_API_issueMarketOffer", 11, argv[10] )); + } + arg11 = static_cast< int >(val11); + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getMarketList(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketList", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketList", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getMarketOffers(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketOffers", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketOffers", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketOffers", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketOffers", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getMarketRecentTrades(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketRecentTrades", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketRecentTrades", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_getMarketRecentTrades", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_getNym_MarketOffers(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_getNym_MarketOffers", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_getNym_MarketOffers", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_cancelMarketOffer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_cancelMarketOffer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_cancelMarketOffer", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_cancelMarketOffer", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_cancelMarketOffer", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_cancelPaymentPlan(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_cancelPaymentPlan", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_cancelPaymentPlan", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_cancelPaymentPlan", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_cancelPaymentPlan", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_PopMessageBuffer(int argc, VALUE *argv, VALUE self) { + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (char *)OT_API_PopMessageBuffer(); + vresult = SWIG_FromCharPtr((const char *)result); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_FlushMessageBuffer(int argc, VALUE *argv, VALUE self) { + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + OT_API_FlushMessageBuffer(); + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetCommand(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetCommand", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetSuccess(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetSuccess", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetDepth(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetDepth", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetDepth((char const *)arg1); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetTransactionSuccess(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetTransactionSuccess", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetTransactionSuccess", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetTransactionSuccess", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetTransactionSuccess", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetBalanceAgreementSuccess(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetBalanceAgreementSuccess", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetBalanceAgreementSuccess", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetBalanceAgreementSuccess", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetBalanceAgreementSuccess", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetLedger(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetLedger", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetNewAssetTypeID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetNewAssetTypeID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetNewIssuerAcctID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetNewIssuerAcctID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_Message_GetNewAcctID(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_Message_GetNewAcctID", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + vresult = SWIG_FromCharPtr((const char *)result); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_ConnectServer(int argc, VALUE *argv, VALUE self) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","OT_API_ConnectServer", 1, argv[0] )); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(argv[1], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","OT_API_ConnectServer", 2, argv[1] )); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(argv[2], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "char const *","OT_API_ConnectServer", 3, argv[2] )); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(argv[3], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "char const *","OT_API_ConnectServer", 4, argv[3] )); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(argv[4], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), Ruby_Format_TypeError( "", "char const *","OT_API_ConnectServer", 5, argv[4] )); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + vresult = SWIG_From_int(static_cast< int >(result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return vresult; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OT_API_ProcessSockets(int argc, VALUE *argv, VALUE self) { + int result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (int)OT_API_ProcessSockets(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassStorable; + +SWIGINTERN void +free_OTDB_Storable(OTDB::Storable *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Storable_Create(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::Storable::Create", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::Storable::Create", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storable_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Storable::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassStorage; + +SWIGINTERN VALUE +_wrap_Storage_GetPacker__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTPacker *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","GetPacker", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","GetPacker", 2, argv[0] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTPacker *)(arg1)->GetPacker(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_GetPacker__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTPacker *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","GetPacker", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTPacker *)(arg1)->GetPacker(); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_GetPacker(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[3]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 3) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_GetPacker__SWIG_1(nargs, args, self); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_Storage_GetPacker__SWIG_0(nargs, args, self); + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 3, "Storage.GetPacker", + " OTPacker * Storage.GetPacker(OTDB::PackType ePackType)\n" + " OTPacker * Storage.GetPacker()\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 6) || (argc > 6)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 7, argv[5] )); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_4(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_5(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Init", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Init__SWIG_6(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Init", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (bool)(arg1)->Init(); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_Init(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[8]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 8) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_6(nargs, args, self); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_5(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_4(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_3(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_2(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_1(nargs, args, self); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 8, "Storage.Init", + " bool Storage.Init(std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr, std::string fiveStr, std::string sixStr)\n" + " bool Storage.Init(std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr, std::string fiveStr)\n" + " bool Storage.Init(std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr)\n" + " bool Storage.Init(std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.Init(std::string oneStr, std::string twoStr)\n" + " bool Storage.Init(std::string oneStr)\n" + " bool Storage.Init()\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Exists__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Exists", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Exists__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Exists", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Exists__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Exists", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Exists__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","Exists", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","Exists", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_Exists(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[6]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 6) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 6, "Storage.Exists", + " bool Storage.Exists(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.Exists(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Storage.Exists(std::string strFolder, std::string oneStr)\n" + " bool Storage.Exists(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN void +free_OTDB_Storage(OTDB::Storage *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Storage_StoreString__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreString__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreString__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreString__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_StoreString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[7]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 7) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_3(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_2(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_1(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 7, "Storage.StoreString", + " bool Storage.StoreString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.StoreString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Storage.StoreString(std::string strContents, std::string strFolder, std::string oneStr)\n" + " bool Storage.StoreString(std::string strContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryString__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryString__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryString__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryString__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_QueryString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[6]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 6) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 6, "Storage.QueryString", + " std::string Storage.QueryString(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " std::string Storage.QueryString(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " std::string Storage.QueryString(std::string strFolder, std::string oneStr)\n" + " std::string Storage.QueryString(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StorePlainString__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StorePlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StorePlainString__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StorePlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StorePlainString__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StorePlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StorePlainString__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StorePlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StorePlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_StorePlainString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[7]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 7) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_3(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_2(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_1(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 7, "Storage.StorePlainString", + " bool Storage.StorePlainString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.StorePlainString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Storage.StorePlainString(std::string strContents, std::string strFolder, std::string oneStr)\n" + " bool Storage.StorePlainString(std::string strContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryPlainString__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryPlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryPlainString__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryPlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryPlainString__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryPlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryPlainString__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryPlainString", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryPlainString", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_QueryPlainString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[6]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 6) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 6, "Storage.QueryPlainString", + " std::string Storage.QueryPlainString(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " std::string Storage.QueryPlainString(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " std::string Storage.QueryPlainString(std::string strFolder, std::string oneStr)\n" + " std::string Storage.QueryPlainString(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreObject__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::Storable &","StoreObject", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","StoreObject", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreObject__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::Storable &","StoreObject", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","StoreObject", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreObject__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::Storable &","StoreObject", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","StoreObject", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_StoreObject__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","StoreObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::Storable &","StoreObject", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","StoreObject", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","StoreObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_StoreObject(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[7]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 7) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_3(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_2(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_1(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 7, "Storage.StoreObject", + " bool Storage.StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Storage.StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr)\n" + " bool Storage.StoreObject(OTDB::Storable &theContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryObject__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","QueryObject", 2, argv[0] )); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 6, argv[4] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryObject__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","QueryObject", 2, argv[0] )); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryObject__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","QueryObject", 2, argv[0] )); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_QueryObject__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","QueryObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","QueryObject", 2, argv[0] )); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","QueryObject", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_QueryObject(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[7]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 7) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_3(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_2(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_1(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 7, "QueryObject.new", + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_EraseValueByKey__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","EraseValueByKey", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 5, argv[3] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_EraseValueByKey__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","EraseValueByKey", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 4, argv[2] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_EraseValueByKey__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","EraseValueByKey", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 3, argv[1] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_EraseValueByKey__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","EraseValueByKey", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","EraseValueByKey", 2, argv[0] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Storage_EraseValueByKey(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[6]; + int ii; + + argc = nargs + 1; + argv[0] = self; + if (argc > 6) SWIG_fail; + for (ii = 1; (ii < argc); ++ii) { + argv[ii] = args[ii-1]; + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 6, "Storage.EraseValueByKey", + " bool Storage.EraseValueByKey(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Storage.EraseValueByKey(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Storage.EraseValueByKey(std::string strFolder, std::string oneStr)\n" + " bool Storage.EraseValueByKey(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_CreateObject(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage *","CreateObject", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","CreateObject", 2, argv[0] )); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_Create(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storage *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::Storage::Create", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::Storage::Create", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Storage_GetType(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::StorageType result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storage const *","GetType", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + vresult = SWIG_From_int(static_cast< int >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 8) || (argc > 8)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 8)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 6, argv[5] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 7, argv[6] )); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[7], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 8, argv[7] )); + } + arg8 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 7) || (argc > 7)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 7)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 6, argv[5] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 7, argv[6] )); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 6) || (argc > 6)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 6)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 6, argv[5] )); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_4(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_5(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::InitDefaultStorage", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_InitDefaultStorage__SWIG_6(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::InitDefaultStorage", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::InitDefaultStorage", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_InitDefaultStorage(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[8]; + int ii; + + argc = nargs; + if (argc > 8) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_InitDefaultStorage__SWIG_6(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_5(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_4(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_3(nargs, args, self); + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_2(nargs, args, self); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_1(nargs, args, self); + } + } + } + } + } + } + } + } + if (argc == 8) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[7], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_0(nargs, args, self); + } + } + } + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 8, "InitDefaultStorage", + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr, std::string fiveStr, std::string sixStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr, std::string fiveStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr, std::string twoStr, std::string threeStr, std::string fourStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr, std::string twoStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType, std::string oneStr)\n" + " bool InitDefaultStorage(OTDB::StorageType eStoreType, OTDB::PackType ePackType)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_GetDefaultStorage(int argc, VALUE *argv, VALUE self) { + OTDB::Storage *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_CreateStorageContext__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storage *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::CreateStorageContext", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int(argv[1], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "OTDB::PackType","OTDB::CreateStorageContext", 2, argv[1] )); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_CreateStorageContext__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::StorageType arg1 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storage *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StorageType","OTDB::CreateStorageContext", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StorageType >(val1); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_CreateStorageContext(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[2]; + int ii; + + argc = nargs; + if (argc > 2) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 1) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_1(nargs, args, self); + } + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_0(nargs, args, self); + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 2, "CreateStorageContext.new", + " CreateStorageContext.new(OTDB::StorageType eStoreType, OTDB::PackType ePackType)\n" + " CreateStorageContext.new(OTDB::StorageType eStoreType)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_CreateObject(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::CreateObject", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Exists__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Exists__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Exists__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Exists__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::Exists", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_Exists(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[4]; + int ii; + + argc = nargs; + if (argc > 4) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_3(nargs, args, self); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_2(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_1(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_0(nargs, args, self); + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 4, "Exists", + " bool Exists(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool Exists(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool Exists(std::string strFolder, std::string oneStr)\n" + " bool Exists(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreString__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreString__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreString__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreString__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_StoreString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[5]; + int ii; + + argc = nargs; + if (argc > 5) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 5, "StoreString", + " bool StoreString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool StoreString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool StoreString(std::string strContents, std::string strFolder, std::string oneStr)\n" + " bool StoreString(std::string strContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryString__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryString__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryString__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryString__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_QueryString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[4]; + int ii; + + argc = nargs; + if (argc > 4) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_3(nargs, args, self); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_2(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_1(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_0(nargs, args, self); + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 4, "QueryString", + " std::string QueryString(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " std::string QueryString(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " std::string QueryString(std::string strFolder, std::string oneStr)\n" + " std::string QueryString(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StorePlainString__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StorePlainString__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StorePlainString__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StorePlainString__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StorePlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_StorePlainString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[5]; + int ii; + + argc = nargs; + if (argc > 5) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 5, "StorePlainString", + " bool StorePlainString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool StorePlainString(std::string strContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool StorePlainString(std::string strContents, std::string strFolder, std::string oneStr)\n" + " bool StorePlainString(std::string strContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryPlainString__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryPlainString__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryPlainString__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryPlainString__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryPlainString", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_QueryPlainString(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[4]; + int ii; + + argc = nargs; + if (argc > 4) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_3(nargs, args, self); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_2(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_1(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_0(nargs, args, self); + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 4, "QueryPlainString", + " std::string QueryPlainString(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " std::string QueryPlainString(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " std::string QueryPlainString(std::string strFolder, std::string oneStr)\n" + " std::string QueryPlainString(std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreObject__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0] )); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0])); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreObject__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0] )); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0])); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreObject__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0] )); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0])); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StoreObject__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0] )); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Storable &","OTDB::StoreObject", 1, argv[0])); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::StoreObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_StoreObject(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[5]; + int ii; + + argc = nargs; + if (argc > 5) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 5, "StoreObject", + " bool StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool StoreObject(OTDB::Storable &theContents, std::string strFolder, std::string oneStr)\n" + " bool StoreObject(OTDB::Storable &theContents, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryObject__SWIG_0(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 5) || (argc > 5)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 5)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::QueryObject", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 5, argv[4] )); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryObject__SWIG_1(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::QueryObject", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryObject__SWIG_2(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::QueryObject", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_QueryObject__SWIG_3(int argc, VALUE *argv, VALUE self) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + ecode1 = SWIG_AsVal_int(argv[0], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "OTDB::StoredObjectType","OTDB::QueryObject", 1, argv[0] )); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::QueryObject", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_QueryObject(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[5]; + int ii; + + argc = nargs; + if (argc > 5) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_3(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_2(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_1(nargs, args, self); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_0(nargs, args, self); + } + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 5, "QueryObject.new", + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr, std::string twoStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder, std::string oneStr)\n" + " QueryObject.new(OTDB::StoredObjectType theObjectType, std::string strFolder)\n"); + + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_EraseValueByKey__SWIG_0(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 4) || (argc > 4)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 4, argv[3] )); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_EraseValueByKey__SWIG_1(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 3) || (argc > 3)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 3, argv[2] )); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_EraseValueByKey__SWIG_2(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + std::string arg2 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 2, argv[1] )); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_EraseValueByKey__SWIG_3(int argc, VALUE *argv, VALUE self) { + std::string arg1 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), Ruby_Format_TypeError( "", "std::string","OTDB::EraseValueByKey", 1, argv[0] )); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE _wrap_EraseValueByKey(int nargs, VALUE *args, VALUE self) { + int argc; + VALUE argv[4]; + int ii; + + argc = nargs; + if (argc > 4) SWIG_fail; + for (ii = 0; (ii < argc); ++ii) { + argv[ii] = args[ii]; + } + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_3(nargs, args, self); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_2(nargs, args, self); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_1(nargs, args, self); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_0(nargs, args, self); + } + } + } + } + } + +fail: + Ruby_Format_OverloadedError( argc, 4, "EraseValueByKey", + " bool EraseValueByKey(std::string strFolder, std::string oneStr, std::string twoStr, std::string threeStr)\n" + " bool EraseValueByKey(std::string strFolder, std::string oneStr, std::string twoStr)\n" + " bool EraseValueByKey(std::string strFolder, std::string oneStr)\n" + " bool EraseValueByKey(std::string strFolder)\n"); + + return Qnil; +} + + +swig_class SwigClassOTDBString; + +SWIGINTERN void +free_OTDB_OTDBString(OTDB::OTDBString *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OTDBString_m_string_set(int argc, VALUE *argv, VALUE self) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OTDBString *","m_string", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","m_string", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","m_string", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->m_string = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTDBString_m_string_get(int argc, VALUE *argv, VALUE self) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OTDBString *","m_string", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + result = (std::string *) & ((arg1)->m_string); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OTDBString_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OTDBString *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::OTDBString::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassBlob; + +SWIGINTERN void +free_OTDB_Blob(OTDB::Blob *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Blob_m_memBuffer_set(int argc, VALUE *argv, VALUE self) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 ; + int res2 = 0 ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Blob *","m_memBuffer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + { + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_unsigned_char_t, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< unsigned char >","m_memBuffer", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< unsigned char >","m_memBuffer", 2, argv[0])); + } else { + arg2 = *(reinterpret_cast< std::vector< unsigned char > * >(argp2)); + } + } + if (arg1) (arg1)->m_memBuffer = arg2; + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Blob_m_memBuffer_get(int argc, VALUE *argv, VALUE self) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::vector< unsigned char > result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Blob *","m_memBuffer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + result = ((arg1)->m_memBuffer); + vresult = SWIG_NewPointerObj((new std::vector< unsigned char >(static_cast< const std::vector< unsigned char >& >(result))), SWIGTYPE_p_std__vectorT_unsigned_char_t, SWIG_POINTER_OWN | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Blob_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Blob *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Blob::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassStringMap; + +SWIGINTERN void +free_OTDB_StringMap(OTDB::StringMap *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_StringMap_the_map_set(int argc, VALUE *argv, VALUE self) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::StringMap *","the_map", 1, self )); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,std::string > *","the_map", 2, argv[0] )); + } + arg2 = reinterpret_cast< std::map< std::string,std::string > * >(argp2); + if (arg1) (arg1)->the_map = *arg2; + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StringMap_the_map_get(int argc, VALUE *argv, VALUE self) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::map< std::string,std::string > *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::StringMap *","the_map", 1, self )); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StringMap_SetValue(int argc, VALUE *argv, VALUE self) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int res3 = SWIG_OLDOBJ ; + + if ((argc < 2) || (argc > 2)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::StringMap *","SetValue", 1, self )); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","SetValue", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","SetValue", 2, argv[0])); + } + arg2 = ptr; + } + { + std::string *ptr = (std::string *)0; + res3 = SWIG_AsPtr_std_string(argv[1], &ptr); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::string const &","SetValue", 3, argv[1] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","SetValue", 3, argv[1])); + } + arg3 = ptr; + } + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StringMap_GetValue(int argc, VALUE *argv, VALUE self) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + std::string result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::StringMap *","GetValue", 1, self )); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","GetValue", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","GetValue", 2, argv[0])); + } + arg2 = ptr; + } + result = (arg1)->GetValue((std::string const &)*arg2); + vresult = SWIG_From_std_string(static_cast< std::string >(result)); + if (SWIG_IsNewObj(res2)) delete arg2; + return vresult; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_StringMap_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::StringMap *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::StringMap::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassDisplayable; + +SWIGINTERN void +free_OTDB_Displayable(OTDB::Displayable *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Displayable_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Displayable *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Displayable_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Displayable *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Displayable_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Displayable *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Displayable::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassMarketData; + +SWIGINTERN void +free_OTDB_MarketData(OTDB::MarketData *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_MarketData_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_market_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","market_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","market_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","market_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->market_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_market_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","market_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->market_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_asset_type_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","asset_type_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","asset_type_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_asset_type_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_currency_type_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","currency_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","currency_type_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","currency_type_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_currency_type_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","currency_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_total_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","total_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","total_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","total_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_total_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","total_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_number_bids_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","number_bids", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","number_bids", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","number_bids", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_bids = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_number_bids_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","number_bids", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_bids); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_number_asks_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","number_asks", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","number_asks", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","number_asks", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_asks = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_number_asks_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","number_asks", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_asks); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_last_sale_price_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","last_sale_price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","last_sale_price", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","last_sale_price", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->last_sale_price = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_last_sale_price_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","last_sale_price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->last_sale_price); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_current_bid_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","current_bid", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","current_bid", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","current_bid", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_bid = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_current_bid_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","current_bid", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_bid); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_current_ask_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","current_ask", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","current_ask", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","current_ask", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_ask = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_current_ask_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","current_ask", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_ask); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_trades_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_trades", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","volume_trades", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","volume_trades", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_trades = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_trades_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_trades", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_trades); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","volume_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","volume_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_currency_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_currency", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","volume_currency", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","volume_currency", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_currency = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_volume_currency_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","volume_currency", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_currency); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_recent_highest_bid_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","recent_highest_bid", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","recent_highest_bid", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","recent_highest_bid", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_highest_bid = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_recent_highest_bid_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","recent_highest_bid", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_highest_bid); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_recent_lowest_ask_set(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","recent_lowest_ask", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","recent_lowest_ask", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","recent_lowest_ask", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_lowest_ask = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_recent_lowest_ask_get(int argc, VALUE *argv, VALUE self) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketData *","recent_lowest_ask", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_lowest_ask); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketData_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::MarketData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::MarketData::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassMarketList; + +SWIGINTERN void +free_OTDB_MarketList(OTDB::MarketList *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_MarketList_GetMarketDataCount(int argc, VALUE *argv, VALUE self) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketList *","GetMarketDataCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + result = (arg1)->GetMarketDataCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketList_GetMarketData(int argc, VALUE *argv, VALUE self) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::MarketData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketList *","GetMarketData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetMarketData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketList_RemoveMarketData(int argc, VALUE *argv, VALUE self) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketList *","RemoveMarketData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveMarketData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveMarketData(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketList_AddMarketData(int argc, VALUE *argv, VALUE self) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::MarketList *","AddMarketData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__MarketData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::MarketData &","AddMarketData", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::MarketData &","AddMarketData", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::MarketData * >(argp2); + result = (bool)(arg1)->AddMarketData(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_MarketList_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::MarketList *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::MarketList::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassOfferDataMarket; + +SWIGINTERN void +free_OTDB_OfferDataMarket(OTDB::OfferDataMarket *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OfferDataMarket_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_price_per_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price_per_scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price_per_scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_price_per_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_available_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","available_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","available_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_available_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_minimum_increment_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","minimum_increment", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","minimum_increment", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_minimum_increment_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataMarket *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataMarket_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferDataMarket *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::OfferDataMarket::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassBidData; + +SWIGINTERN void +free_OTDB_BidData(OTDB::BidData *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_BidData_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_price_per_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price_per_scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price_per_scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_price_per_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_available_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","available_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","available_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_available_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_minimum_increment_set(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","minimum_increment", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","minimum_increment", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_minimum_increment_get(int argc, VALUE *argv, VALUE self) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BidData *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BidData_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BidData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::BidData::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassAskData; + +SWIGINTERN void +free_OTDB_AskData(OTDB::AskData *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_AskData_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_price_per_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price_per_scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price_per_scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_price_per_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_available_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","available_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","available_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_available_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","available_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_minimum_increment_set(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","minimum_increment", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","minimum_increment", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_minimum_increment_get(int argc, VALUE *argv, VALUE self) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AskData *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AskData_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::AskData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::AskData::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassOfferListMarket; + +SWIGINTERN void +free_OTDB_OfferListMarket(OTDB::OfferListMarket *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OfferListMarket_GetBidDataCount(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","GetBidDataCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetBidDataCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_GetBidData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BidData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","GetBidData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetBidData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_RemoveBidData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","RemoveBidData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveBidData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBidData(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_AddBidData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","AddBidData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__BidData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::BidData &","AddBidData", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::BidData &","AddBidData", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::BidData * >(argp2); + result = (bool)(arg1)->AddBidData(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_GetAskDataCount(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","GetAskDataCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetAskDataCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_GetAskData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::AskData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","GetAskData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetAskData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_RemoveAskData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","RemoveAskData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveAskData", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveAskData(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_AddAskData(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListMarket *","AddAskData", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__AskData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::AskData &","AddAskData", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::AskData &","AddAskData", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::AskData * >(argp2); + result = (bool)(arg1)->AddAskData(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListMarket_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferListMarket *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::OfferListMarket::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassTradeDataMarket; + +SWIGINTERN void +free_OTDB_TradeDataMarket(OTDB::TradeDataMarket *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_TradeDataMarket_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_date_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","date", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","date", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","date", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_date_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","date", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->date); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_price_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_price_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_amount_sold_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","amount_sold", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","amount_sold", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","amount_sold", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_amount_sold_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket *","amount_sold", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataMarket_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::TradeDataMarket::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassTradeListMarket; + +SWIGINTERN void +free_OTDB_TradeListMarket(OTDB::TradeListMarket *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_TradeListMarket_GetTradeDataMarketCount(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListMarket *","GetTradeDataMarketCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + result = (arg1)->GetTradeDataMarketCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListMarket_GetTradeDataMarket(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListMarket *","GetTradeDataMarket", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetTradeDataMarket", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListMarket_RemoveTradeDataMarket(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListMarket *","RemoveTradeDataMarket", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveTradeDataMarket", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListMarket_AddTradeDataMarket(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListMarket *","AddTradeDataMarket", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__TradeDataMarket, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::TradeDataMarket &","AddTradeDataMarket", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::TradeDataMarket &","AddTradeDataMarket", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::TradeDataMarket * >(argp2); + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListMarket_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeListMarket *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::TradeListMarket::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassOfferDataNym; + +SWIGINTERN void +free_OTDB_OfferDataNym(OTDB::OfferDataNym *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OfferDataNym_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_valid_from_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","valid_from", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","valid_from", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","valid_from", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_from = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_valid_from_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","valid_from", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_from); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_valid_to_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","valid_to", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","valid_to", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","valid_to", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_to = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_valid_to_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","valid_to", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_to); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_asset_type_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","asset_type_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","asset_type_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_asset_type_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_asset_acct_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","asset_acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","asset_acct_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","asset_acct_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_acct_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_asset_acct_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","asset_acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_acct_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_currency_type_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","currency_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","currency_type_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","currency_type_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_currency_type_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","currency_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_currency_acct_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","currency_acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","currency_acct_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","currency_acct_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_acct_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_currency_acct_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","currency_acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_acct_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_selling_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","selling", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + ecode2 = SWIG_AsVal_bool(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","selling", 2, argv[0] )); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->selling = arg2; + return Qnil; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_selling_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","selling", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (bool) ((arg1)->selling); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_price_per_scale_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price_per_scale", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price_per_scale", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_price_per_scale_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","price_per_scale", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_total_assets_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","total_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","total_assets", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","total_assets", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_total_assets_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","total_assets", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_finished_so_far_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","finished_so_far", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","finished_so_far", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","finished_so_far", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->finished_so_far = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_finished_so_far_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","finished_so_far", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->finished_so_far); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_minimum_increment_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","minimum_increment", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","minimum_increment", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_minimum_increment_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","minimum_increment", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_stop_sign_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","stop_sign", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","stop_sign", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","stop_sign", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_sign = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_stop_sign_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","stop_sign", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_sign); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_stop_price_set(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","stop_price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","stop_price", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","stop_price", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_price = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_stop_price_get(int argc, VALUE *argv, VALUE self) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferDataNym *","stop_price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_price); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferDataNym_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferDataNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::OfferDataNym::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassOfferListNym; + +SWIGINTERN void +free_OTDB_OfferListNym(OTDB::OfferListNym *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_OfferListNym_GetOfferDataNymCount(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListNym *","GetOfferDataNymCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + result = (arg1)->GetOfferDataNymCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListNym_GetOfferDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::OfferDataNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListNym *","GetOfferDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetOfferDataNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListNym_RemoveOfferDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListNym *","RemoveOfferDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveOfferDataNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListNym_AddOfferDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::OfferListNym *","AddOfferDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__OfferDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::OfferDataNym &","AddOfferDataNym", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::OfferDataNym &","AddOfferDataNym", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::OfferDataNym * >(argp2); + result = (bool)(arg1)->AddOfferDataNym(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_OfferListNym_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferListNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::OfferListNym::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassTradeDataNym; + +SWIGINTERN void +free_OTDB_TradeDataNym(OTDB::TradeDataNym *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_TradeDataNym_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_transaction_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","transaction_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","transaction_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_transaction_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","transaction_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_completed_count_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","completed_count", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","completed_count", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","completed_count", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->completed_count = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_completed_count_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","completed_count", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->completed_count); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_date_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","date", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","date", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","date", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_date_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","date", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->date); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_price_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","price", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","price", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_price_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","price", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->price); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_amount_sold_set(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","amount_sold", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","amount_sold", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","amount_sold", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_amount_sold_get(int argc, VALUE *argv, VALUE self) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeDataNym *","amount_sold", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeDataNym_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeDataNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::TradeDataNym::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassTradeListNym; + +SWIGINTERN void +free_OTDB_TradeListNym(OTDB::TradeListNym *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_TradeListNym_GetTradeDataNymCount(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListNym *","GetTradeDataNymCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + result = (arg1)->GetTradeDataNymCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListNym_GetTradeDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::TradeDataNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListNym *","GetTradeDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetTradeDataNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListNym_RemoveTradeDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListNym *","RemoveTradeDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveTradeDataNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListNym_AddTradeDataNym(int argc, VALUE *argv, VALUE self) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::TradeListNym *","AddTradeDataNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__TradeDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::TradeDataNym &","AddTradeDataNym", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::TradeDataNym &","AddTradeDataNym", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::TradeDataNym * >(argp2); + result = (bool)(arg1)->AddTradeDataNym(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_TradeListNym_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeListNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::TradeListNym::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassAcct; + +SWIGINTERN void +free_OTDB_Acct(OTDB::Acct *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Acct_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_acct_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","acct_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","acct_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_acct_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Acct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Acct_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Acct *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Acct::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassBitcoinAcct; + +SWIGINTERN void +free_OTDB_BitcoinAcct(OTDB::BitcoinAcct *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_BitcoinAcct_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_acct_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","acct_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","acct_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_acct_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_bitcoin_acct_name_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","bitcoin_acct_name", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","bitcoin_acct_name", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","bitcoin_acct_name", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_acct_name = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_bitcoin_acct_name_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct *","bitcoin_acct_name", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_acct_name); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinAcct_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::BitcoinAcct::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassServerInfo; + +SWIGINTERN void +free_OTDB_ServerInfo(OTDB::ServerInfo *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_ServerInfo_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ServerInfo *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ServerInfo_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ServerInfo *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::ServerInfo::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassServer; + +SWIGINTERN void +free_OTDB_Server(OTDB::Server *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Server_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_host_set(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_host", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_host", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_host_get(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_host); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_port_set(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_port", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_port", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_server_port_get(int argc, VALUE *argv, VALUE self) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Server *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_port); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Server_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Server *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Server::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Server, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassBitcoinServer; + +SWIGINTERN void +free_OTDB_BitcoinServer(OTDB::BitcoinServer *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_BitcoinServer_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_host_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_host", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_host", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_host_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_port_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_port", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_port", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_server_port_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_bitcoin_username_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","bitcoin_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","bitcoin_username", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","bitcoin_username", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_username = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_bitcoin_username_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","bitcoin_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_username); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_bitcoin_password_set(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","bitcoin_password", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","bitcoin_password", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","bitcoin_password", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_password = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_bitcoin_password_get(int argc, VALUE *argv, VALUE self) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::BitcoinServer *","bitcoin_password", 1, self )); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_password); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_BitcoinServer_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BitcoinServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::BitcoinServer::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassRippleServer; + +SWIGINTERN void +free_OTDB_RippleServer(OTDB::RippleServer *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_RippleServer_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_host_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_host", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_host", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_host_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_port_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_port", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_port", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_server_port_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_ripple_username_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","ripple_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ripple_username", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ripple_username", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_username = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_ripple_username_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","ripple_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_username); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_ripple_password_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","ripple_password", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ripple_password", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ripple_password", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_password = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_ripple_password_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","ripple_password", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_password); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_namefield_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","namefield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","namefield_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","namefield_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_namefield_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","namefield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_passfield_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","passfield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","passfield_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","passfield_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->passfield_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_passfield_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::RippleServer *","passfield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->passfield_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_RippleServer_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::RippleServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::RippleServer::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassLoomServer; + +SWIGINTERN void +free_OTDB_LoomServer(OTDB::LoomServer *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_LoomServer_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_host_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_host", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_host", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_host_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_host", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_port_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_port", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_port", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_server_port_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","server_port", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_loom_username_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","loom_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","loom_username", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","loom_username", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->loom_username = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_loom_username_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","loom_username", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->loom_username); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_namefield_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","namefield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","namefield_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","namefield_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_namefield_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::LoomServer *","namefield_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_LoomServer_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::LoomServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::LoomServer::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassContactNym; + +SWIGINTERN void +free_OTDB_ContactNym(OTDB::ContactNym *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_ContactNym_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_nym_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","nym_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","nym_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","nym_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_nym_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","nym_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_nym_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","nym_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","nym_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","nym_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_nym_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","nym_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_public_key_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","public_key", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","public_key", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_public_key_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->public_key); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_memo_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","memo", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","memo", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_memo_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->memo); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_GetServerInfoCount(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","GetServerInfoCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (arg1)->GetServerInfoCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_GetServerInfo(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ServerInfo *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","GetServerInfo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetServerInfo", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_RemoveServerInfo(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","RemoveServerInfo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveServerInfo", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveServerInfo(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_AddServerInfo(int argc, VALUE *argv, VALUE self) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactNym *","AddServerInfo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__ServerInfo, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::ServerInfo &","AddServerInfo", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::ServerInfo &","AddServerInfo", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::ServerInfo * >(argp2); + result = (bool)(arg1)->AddServerInfo(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactNym_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ContactNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::ContactNym::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassWalletData; + +SWIGINTERN void +free_OTDB_WalletData(OTDB::WalletData *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_WalletData_GetBitcoinServerCount(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetBitcoinServerCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinServerCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetBitcoinServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BitcoinServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetBitcoinServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetBitcoinServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_RemoveBitcoinServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","RemoveBitcoinServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveBitcoinServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_AddBitcoinServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","AddBitcoinServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__BitcoinServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::BitcoinServer &","AddBitcoinServer", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::BitcoinServer &","AddBitcoinServer", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::BitcoinServer * >(argp2); + result = (bool)(arg1)->AddBitcoinServer(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetBitcoinAcctCount(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetBitcoinAcctCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinAcctCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetBitcoinAcct(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetBitcoinAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetBitcoinAcct", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_RemoveBitcoinAcct(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","RemoveBitcoinAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveBitcoinAcct", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_AddBitcoinAcct(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","AddBitcoinAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__BitcoinAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::BitcoinAcct &","AddBitcoinAcct", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::BitcoinAcct &","AddBitcoinAcct", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::BitcoinAcct * >(argp2); + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetRippleServerCount(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetRippleServerCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetRippleServerCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetRippleServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::RippleServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetRippleServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetRippleServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_RemoveRippleServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","RemoveRippleServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveRippleServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveRippleServer(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_AddRippleServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","AddRippleServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__RippleServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::RippleServer &","AddRippleServer", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::RippleServer &","AddRippleServer", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::RippleServer * >(argp2); + result = (bool)(arg1)->AddRippleServer(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetLoomServerCount(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetLoomServerCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetLoomServerCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_GetLoomServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::LoomServer *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","GetLoomServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetLoomServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_RemoveLoomServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","RemoveLoomServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveLoomServer", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveLoomServer(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_AddLoomServer(int argc, VALUE *argv, VALUE self) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::WalletData *","AddLoomServer", 1, self )); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__LoomServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::LoomServer &","AddLoomServer", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::LoomServer &","AddLoomServer", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::LoomServer * >(argp2); + result = (bool)(arg1)->AddLoomServer(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_WalletData_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::WalletData *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::WalletData::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassContactAcct; + +SWIGINTERN void +free_OTDB_ContactAcct(OTDB::ContactAcct *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_ContactAcct_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_server_type_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_type", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_type", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_server_type_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","server_type", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_type); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_server_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","server_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","server_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_server_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","server_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_asset_type_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","asset_type_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","asset_type_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_asset_type_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","asset_type_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_acct_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","acct_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","acct_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_acct_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","acct_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_nym_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","nym_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","nym_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","nym_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_nym_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","nym_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_memo_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","memo", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","memo", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_memo_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->memo); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_public_key_set(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","public_key", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","public_key", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_public_key_get(int argc, VALUE *argv, VALUE self) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::ContactAcct *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->public_key); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_ContactAcct_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ContactAcct *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::ContactAcct::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassContact; + +SWIGINTERN void +free_OTDB_Contact(OTDB::Contact *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_Contact_gui_label_set(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","gui_label", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","gui_label", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_gui_label_get(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","gui_label", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_contact_id_set(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","contact_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","contact_id", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","contact_id", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->contact_id = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_contact_id_get(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","contact_id", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->contact_id); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_email_set(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","email", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","email", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","email", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->email = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_email_get(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","email", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->email); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_memo_set(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","memo", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","memo", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_memo_get(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","memo", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->memo); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_public_key_set(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string(argv[0], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","public_key", 2, argv[0] )); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","public_key", 2, argv[0])); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_public_key_get(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","public_key", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->public_key); + vresult = SWIG_From_std_string(static_cast< std::string >(*result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_GetContactNymCount(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","GetContactNymCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactNymCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_GetContactNym(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ContactNym *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","GetContactNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetContactNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_RemoveContactNym(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","RemoveContactNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveContactNym", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactNym(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_AddContactNym(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","AddContactNym", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__ContactNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::ContactNym &","AddContactNym", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::ContactNym &","AddContactNym", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::ContactNym * >(argp2); + result = (bool)(arg1)->AddContactNym(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_GetContactAcctCount(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","GetContactAcctCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactAcctCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_GetContactAcct(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ContactAcct *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","GetContactAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetContactAcct", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_RemoveContactAcct(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","RemoveContactAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveContactAcct", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactAcct(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_AddContactAcct(int argc, VALUE *argv, VALUE self) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Contact *","AddContactAcct", 1, self )); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__ContactAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::ContactAcct &","AddContactAcct", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::ContactAcct &","AddContactAcct", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::ContactAcct * >(argp2); + result = (bool)(arg1)->AddContactAcct(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_Contact_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Contact *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::Contact::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +swig_class SwigClassAddressBook; + +SWIGINTERN void +free_OTDB_AddressBook(OTDB::AddressBook *arg1) { + delete arg1; +} + +SWIGINTERN VALUE +_wrap_AddressBook_GetContactCount(int argc, VALUE *argv, VALUE self) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + VALUE vresult = Qnil; + + if ((argc < 0) || (argc > 0)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AddressBook *","GetContactCount", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + result = (arg1)->GetContactCount(); + vresult = SWIG_From_size_t(static_cast< size_t >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AddressBook_GetContact(int argc, VALUE *argv, VALUE self) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::Contact *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AddressBook *","GetContact", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","GetContact", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AddressBook_RemoveContact(int argc, VALUE *argv, VALUE self) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AddressBook *","RemoveContact", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t(argv[0], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","RemoveContact", 2, argv[0] )); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContact(arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AddressBook_AddContact(int argc, VALUE *argv, VALUE self) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::AddressBook *","AddContact", 1, self )); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_OTDB__Contact, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "OTDB::Contact &","AddContact", 2, argv[0] )); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "OTDB::Contact &","AddContact", 2, argv[0])); + } + arg2 = reinterpret_cast< OTDB::Contact * >(argp2); + result = (bool)(arg1)->AddContact(*arg2); + vresult = SWIG_From_bool(static_cast< bool >(result)); + return vresult; +fail: + return Qnil; +} + + +SWIGINTERN VALUE +_wrap_AddressBook_ot_dynamic_cast(int argc, VALUE *argv, VALUE self) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::AddressBook *result = 0 ; + VALUE vresult = Qnil; + + if ((argc < 1) || (argc > 1)) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; + } + res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "OTDB::Storable *","OTDB::AddressBook::ot_dynamic_cast", 1, argv[0] )); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + return vresult; +fail: + return Qnil; +} + + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Acct(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__MarketListTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::MarketList *) x)); +} +static void *_p_OTDB__OfferListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListNym *) x)); +} +static void *_p_OTDB__TradeListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListNym *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__StringMapTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::StringMap *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__TradeListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListMarket *) x)); +} +static void *_p_OTDB__OfferListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListMarket *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__DisplayableTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Displayable *) x)); +} +static void *_p_OTDB__WalletDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::WalletData *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BlobTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Blob *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__OTDBStringTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OTDBString *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__AddressBookTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::AddressBook *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static swig_type_info _swigt__p_OTCallback = {"_p_OTCallback", "OTCallback *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTCaller = {"_p_OTCaller", "OTCaller *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Acct = {"_p_OTDB__Acct", "OTDB::Acct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AddressBook = {"_p_OTDB__AddressBook", "OTDB::AddressBook *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__AskData = {"_p_OTDB__AskData", "OTDB::AskData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BidData = {"_p_OTDB__BidData", "OTDB::BidData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinAcct = {"_p_OTDB__BitcoinAcct", "OTDB::BitcoinAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinServer = {"_p_OTDB__BitcoinServer", "OTDB::BitcoinServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Blob = {"_p_OTDB__Blob", "OTDB::Blob *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Contact = {"_p_OTDB__Contact", "OTDB::Contact *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactAcct = {"_p_OTDB__ContactAcct", "OTDB::ContactAcct *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ContactNym = {"_p_OTDB__ContactNym", "OTDB::ContactNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Displayable = {"_p_OTDB__Displayable", "OTDB::Displayable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__LoomServer = {"_p_OTDB__LoomServer", "OTDB::LoomServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketData = {"_p_OTDB__MarketData", "OTDB::MarketData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__MarketList = {"_p_OTDB__MarketList", "OTDB::MarketList *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OTDBString = {"_p_OTDB__OTDBString", "OTDB::OTDBString *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataMarket = {"_p_OTDB__OfferDataMarket", "OTDB::OfferDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataNym = {"_p_OTDB__OfferDataNym", "OTDB::OfferDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListMarket = {"_p_OTDB__OfferListMarket", "OTDB::OfferListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__OfferListNym = {"_p_OTDB__OfferListNym", "OTDB::OfferListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__RippleServer = {"_p_OTDB__RippleServer", "OTDB::RippleServer *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Server = {"_p_OTDB__Server", "OTDB::Server *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__ServerInfo = {"_p_OTDB__ServerInfo", "OTDB::ServerInfo *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storable = {"_p_OTDB__Storable", "OTDB::Storable *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__Storage = {"_p_OTDB__Storage", "OTDB::Storage *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__StringMap = {"_p_OTDB__StringMap", "OTDB::StringMap *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataMarket = {"_p_OTDB__TradeDataMarket", "OTDB::TradeDataMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataNym = {"_p_OTDB__TradeDataNym", "OTDB::TradeDataNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListMarket = {"_p_OTDB__TradeListMarket", "OTDB::TradeListMarket *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__TradeListNym = {"_p_OTDB__TradeListNym", "OTDB::TradeListNym *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTDB__WalletData = {"_p_OTDB__WalletData", "OTDB::WalletData *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_OTPacker = {"_p_OTPacker", "OTPacker *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__mapT_std__string_std__string_t = {"_p_std__mapT_std__string_std__string_t", "std::map< std::string,std::string > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_unsigned_char_t = {"_p_std__vectorT_unsigned_char_t", "std::vector< unsigned char > *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_OTCallback, + &_swigt__p_OTCaller, + &_swigt__p_OTDB__Acct, + &_swigt__p_OTDB__AddressBook, + &_swigt__p_OTDB__AskData, + &_swigt__p_OTDB__BidData, + &_swigt__p_OTDB__BitcoinAcct, + &_swigt__p_OTDB__BitcoinServer, + &_swigt__p_OTDB__Blob, + &_swigt__p_OTDB__Contact, + &_swigt__p_OTDB__ContactAcct, + &_swigt__p_OTDB__ContactNym, + &_swigt__p_OTDB__Displayable, + &_swigt__p_OTDB__LoomServer, + &_swigt__p_OTDB__MarketData, + &_swigt__p_OTDB__MarketList, + &_swigt__p_OTDB__OTDBString, + &_swigt__p_OTDB__OfferDataMarket, + &_swigt__p_OTDB__OfferDataNym, + &_swigt__p_OTDB__OfferListMarket, + &_swigt__p_OTDB__OfferListNym, + &_swigt__p_OTDB__RippleServer, + &_swigt__p_OTDB__Server, + &_swigt__p_OTDB__ServerInfo, + &_swigt__p_OTDB__Storable, + &_swigt__p_OTDB__Storage, + &_swigt__p_OTDB__StringMap, + &_swigt__p_OTDB__TradeDataMarket, + &_swigt__p_OTDB__TradeDataNym, + &_swigt__p_OTDB__TradeListMarket, + &_swigt__p_OTDB__TradeListNym, + &_swigt__p_OTDB__WalletData, + &_swigt__p_OTPacker, + &_swigt__p_char, + &_swigt__p_std__mapT_std__string_std__string_t, + &_swigt__p_std__vectorT_unsigned_char_t, +}; + +static swig_cast_info _swigc__p_OTCallback[] = { {&_swigt__p_OTCallback, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCaller[] = { {&_swigt__p_OTCaller, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Acct[] = { {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Acct, 0, 0}, {&_swigt__p_OTDB__Acct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AddressBook[] = { {&_swigt__p_OTDB__AddressBook, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AskData[] = { {&_swigt__p_OTDB__AskData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BidData[] = { {&_swigt__p_OTDB__BidData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinAcct[] = { {&_swigt__p_OTDB__BitcoinAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinServer[] = { {&_swigt__p_OTDB__BitcoinServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Blob[] = { {&_swigt__p_OTDB__Blob, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Contact[] = { {&_swigt__p_OTDB__Contact, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactAcct[] = { {&_swigt__p_OTDB__ContactAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactNym[] = { {&_swigt__p_OTDB__ContactNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Displayable[] = { {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Displayable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Displayable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__LoomServer[] = { {&_swigt__p_OTDB__LoomServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketData[] = { {&_swigt__p_OTDB__MarketData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketList[] = { {&_swigt__p_OTDB__MarketList, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OTDBString[] = { {&_swigt__p_OTDB__OTDBString, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataMarket[] = { {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__OfferDataMarket, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, 0, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__OfferDataMarket, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataNym[] = { {&_swigt__p_OTDB__OfferDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListMarket[] = { {&_swigt__p_OTDB__OfferListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListNym[] = { {&_swigt__p_OTDB__OfferListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__RippleServer[] = { {&_swigt__p_OTDB__RippleServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Server[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__Server, 0, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Server, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ServerInfo[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__ServerInfo, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storable[] = { {&_swigt__p_OTDB__MarketList, _p_OTDB__MarketListTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListNym, _p_OTDB__OfferListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListNym, _p_OTDB__TradeListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Blob, _p_OTDB__BlobTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__StringMap, _p_OTDB__StringMapTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListMarket, _p_OTDB__OfferListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListMarket, _p_OTDB__TradeListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Displayable, _p_OTDB__DisplayableTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__WalletData, _p_OTDB__WalletDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Storable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OTDBString, _p_OTDB__OTDBStringTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AddressBook, _p_OTDB__AddressBookTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Storable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storage[] = { {&_swigt__p_OTDB__Storage, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__StringMap[] = { {&_swigt__p_OTDB__StringMap, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataMarket[] = { {&_swigt__p_OTDB__TradeDataMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataNym[] = { {&_swigt__p_OTDB__TradeDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListMarket[] = { {&_swigt__p_OTDB__TradeListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListNym[] = { {&_swigt__p_OTDB__TradeListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__WalletData[] = { {&_swigt__p_OTDB__WalletData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTPacker[] = { {&_swigt__p_OTPacker, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t[] = { {&_swigt__p_std__mapT_std__string_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_unsigned_char_t[] = { {&_swigt__p_std__vectorT_unsigned_char_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_OTCallback, + _swigc__p_OTCaller, + _swigc__p_OTDB__Acct, + _swigc__p_OTDB__AddressBook, + _swigc__p_OTDB__AskData, + _swigc__p_OTDB__BidData, + _swigc__p_OTDB__BitcoinAcct, + _swigc__p_OTDB__BitcoinServer, + _swigc__p_OTDB__Blob, + _swigc__p_OTDB__Contact, + _swigc__p_OTDB__ContactAcct, + _swigc__p_OTDB__ContactNym, + _swigc__p_OTDB__Displayable, + _swigc__p_OTDB__LoomServer, + _swigc__p_OTDB__MarketData, + _swigc__p_OTDB__MarketList, + _swigc__p_OTDB__OTDBString, + _swigc__p_OTDB__OfferDataMarket, + _swigc__p_OTDB__OfferDataNym, + _swigc__p_OTDB__OfferListMarket, + _swigc__p_OTDB__OfferListNym, + _swigc__p_OTDB__RippleServer, + _swigc__p_OTDB__Server, + _swigc__p_OTDB__ServerInfo, + _swigc__p_OTDB__Storable, + _swigc__p_OTDB__Storage, + _swigc__p_OTDB__StringMap, + _swigc__p_OTDB__TradeDataMarket, + _swigc__p_OTDB__TradeDataNym, + _swigc__p_OTDB__TradeListMarket, + _swigc__p_OTDB__TradeListNym, + _swigc__p_OTDB__WalletData, + _swigc__p_OTPacker, + _swigc__p_char, + _swigc__p_std__mapT_std__string_std__string_t, + _swigc__p_std__vectorT_unsigned_char_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ /* c-mode */ +#endif +} +#endif + +/* + +*/ +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT void Init_otapi(void) { + size_t i; + + SWIG_InitRuntime(); + mOtapi = rb_define_module("Otapi"); + + SWIG_InitializeModule(0); + for (i = 0; i < swig_module.size; i++) { + SWIG_define_class(swig_module.types[i]); + } + + SWIG_RubyInitializeTrackings(); + rb_define_module_function(mOtapi, "disown_OTCallback", VALUEFUNC(_wrap_disown_OTCallback), -1); + + SwigClassOTCallback.klass = rb_define_class_under(mOtapi, "OTCallback", rb_cObject); + SWIG_TypeClientData(SWIGTYPE_p_OTCallback, (void *) &SwigClassOTCallback); + rb_define_alloc_func(SwigClassOTCallback.klass, _wrap_OTCallback_allocate); + rb_define_method(SwigClassOTCallback.klass, "initialize", VALUEFUNC(_wrap_new_OTCallback), -1); + rb_define_method(SwigClassOTCallback.klass, "runOne", VALUEFUNC(_wrap_OTCallback_runOne), -1); + rb_define_method(SwigClassOTCallback.klass, "runTwo", VALUEFUNC(_wrap_OTCallback_runTwo), -1); + SwigClassOTCallback.mark = 0; + SwigClassOTCallback.destroy = (void (*)(void *)) free_OTCallback; + SwigClassOTCallback.trackObjects = 0; + + SwigClassOTCaller.klass = rb_define_class_under(mOtapi, "OTCaller", rb_cObject); + SWIG_TypeClientData(SWIGTYPE_p_OTCaller, (void *) &SwigClassOTCaller); + rb_define_alloc_func(SwigClassOTCaller.klass, _wrap_OTCaller_allocate); + rb_define_method(SwigClassOTCaller.klass, "initialize", VALUEFUNC(_wrap_new_OTCaller), -1); + rb_define_method(SwigClassOTCaller.klass, "GetPassword", VALUEFUNC(_wrap_OTCaller_GetPassword), -1); + rb_define_method(SwigClassOTCaller.klass, "delCallback", VALUEFUNC(_wrap_OTCaller_delCallback), -1); + rb_define_method(SwigClassOTCaller.klass, "setCallback", VALUEFUNC(_wrap_OTCaller_setCallback), -1); + rb_define_method(SwigClassOTCaller.klass, "isCallbackSet", VALUEFUNC(_wrap_OTCaller_isCallbackSet), -1); + rb_define_method(SwigClassOTCaller.klass, "callOne", VALUEFUNC(_wrap_OTCaller_callOne), -1); + rb_define_method(SwigClassOTCaller.klass, "callTwo", VALUEFUNC(_wrap_OTCaller_callTwo), -1); + SwigClassOTCaller.mark = 0; + SwigClassOTCaller.destroy = (void (*)(void *)) free_OTCaller; + SwigClassOTCaller.trackObjects = 0; + rb_define_module_function(mOtapi, "OT_API_Set_PasswordCallback", VALUEFUNC(_wrap_OT_API_Set_PasswordCallback), -1); + rb_define_module_function(mOtapi, "OT_API_Init", VALUEFUNC(_wrap_OT_API_Init), -1); + rb_define_module_function(mOtapi, "OT_API_LoadWallet", VALUEFUNC(_wrap_OT_API_LoadWallet), -1); + rb_define_module_function(mOtapi, "OT_API_SwitchWallet", VALUEFUNC(_wrap_OT_API_SwitchWallet), -1); + rb_define_module_function(mOtapi, "OT_API_GetMemlogSize", VALUEFUNC(_wrap_OT_API_GetMemlogSize), -1); + rb_define_module_function(mOtapi, "OT_API_GetMemlogAtIndex", VALUEFUNC(_wrap_OT_API_GetMemlogAtIndex), -1); + rb_define_module_function(mOtapi, "OT_API_PeekMemlogFront", VALUEFUNC(_wrap_OT_API_PeekMemlogFront), -1); + rb_define_module_function(mOtapi, "OT_API_PeekMemlogBack", VALUEFUNC(_wrap_OT_API_PeekMemlogBack), -1); + rb_define_module_function(mOtapi, "OT_API_PopMemlogFront", VALUEFUNC(_wrap_OT_API_PopMemlogFront), -1); + rb_define_module_function(mOtapi, "OT_API_PopMemlogBack", VALUEFUNC(_wrap_OT_API_PopMemlogBack), -1); + rb_define_module_function(mOtapi, "OT_API_CreateNym", VALUEFUNC(_wrap_OT_API_CreateNym), -1); + rb_define_module_function(mOtapi, "OT_API_AddServerContract", VALUEFUNC(_wrap_OT_API_AddServerContract), -1); + rb_define_module_function(mOtapi, "OT_API_AddAssetContract", VALUEFUNC(_wrap_OT_API_AddAssetContract), -1); + rb_define_module_function(mOtapi, "OT_API_GetServerCount", VALUEFUNC(_wrap_OT_API_GetServerCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetAssetTypeCount", VALUEFUNC(_wrap_OT_API_GetAssetTypeCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountCount", VALUEFUNC(_wrap_OT_API_GetAccountCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetNymCount", VALUEFUNC(_wrap_OT_API_GetNymCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetServer_ID", VALUEFUNC(_wrap_OT_API_GetServer_ID), -1); + rb_define_module_function(mOtapi, "OT_API_GetServer_Name", VALUEFUNC(_wrap_OT_API_GetServer_Name), -1); + rb_define_module_function(mOtapi, "OT_API_GetAssetType_ID", VALUEFUNC(_wrap_OT_API_GetAssetType_ID), -1); + rb_define_module_function(mOtapi, "OT_API_GetAssetType_Name", VALUEFUNC(_wrap_OT_API_GetAssetType_Name), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_ID", VALUEFUNC(_wrap_OT_API_GetAccountWallet_ID), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_Name", VALUEFUNC(_wrap_OT_API_GetAccountWallet_Name), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_Balance", VALUEFUNC(_wrap_OT_API_GetAccountWallet_Balance), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_Type", VALUEFUNC(_wrap_OT_API_GetAccountWallet_Type), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_AssetTypeID", VALUEFUNC(_wrap_OT_API_GetAccountWallet_AssetTypeID), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_ServerID", VALUEFUNC(_wrap_OT_API_GetAccountWallet_ServerID), -1); + rb_define_module_function(mOtapi, "OT_API_GetAccountWallet_NymID", VALUEFUNC(_wrap_OT_API_GetAccountWallet_NymID), -1); + rb_define_module_function(mOtapi, "OT_API_VerifyAccountReceipt", VALUEFUNC(_wrap_OT_API_VerifyAccountReceipt), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_TransactionNumCount", VALUEFUNC(_wrap_OT_API_GetNym_TransactionNumCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_ID", VALUEFUNC(_wrap_OT_API_GetNym_ID), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_Name", VALUEFUNC(_wrap_OT_API_GetNym_Name), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_Stats", VALUEFUNC(_wrap_OT_API_GetNym_Stats), -1); + rb_define_module_function(mOtapi, "OT_API_IsNym_RegisteredAtServer", VALUEFUNC(_wrap_OT_API_IsNym_RegisteredAtServer), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_MailCount", VALUEFUNC(_wrap_OT_API_GetNym_MailCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_MailContentsByIndex", VALUEFUNC(_wrap_OT_API_GetNym_MailContentsByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_MailSenderIDByIndex", VALUEFUNC(_wrap_OT_API_GetNym_MailSenderIDByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_MailServerIDByIndex", VALUEFUNC(_wrap_OT_API_GetNym_MailServerIDByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Nym_RemoveMailByIndex", VALUEFUNC(_wrap_OT_API_Nym_RemoveMailByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Nym_VerifyMailByIndex", VALUEFUNC(_wrap_OT_API_Nym_VerifyMailByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_OutmailCount", VALUEFUNC(_wrap_OT_API_GetNym_OutmailCount), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_OutmailContentsByIndex", VALUEFUNC(_wrap_OT_API_GetNym_OutmailContentsByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_OutmailRecipientIDByIndex", VALUEFUNC(_wrap_OT_API_GetNym_OutmailRecipientIDByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_GetNym_OutmailServerIDByIndex", VALUEFUNC(_wrap_OT_API_GetNym_OutmailServerIDByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Nym_RemoveOutmailByIndex", VALUEFUNC(_wrap_OT_API_Nym_RemoveOutmailByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Nym_VerifyOutmailByIndex", VALUEFUNC(_wrap_OT_API_Nym_VerifyOutmailByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_CanRemoveServer", VALUEFUNC(_wrap_OT_API_Wallet_CanRemoveServer), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_RemoveServer", VALUEFUNC(_wrap_OT_API_Wallet_RemoveServer), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_CanRemoveAssetType", VALUEFUNC(_wrap_OT_API_Wallet_CanRemoveAssetType), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_RemoveAssetType", VALUEFUNC(_wrap_OT_API_Wallet_RemoveAssetType), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_CanRemoveNym", VALUEFUNC(_wrap_OT_API_Wallet_CanRemoveNym), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_RemoveNym", VALUEFUNC(_wrap_OT_API_Wallet_RemoveNym), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_CanRemoveAccount", VALUEFUNC(_wrap_OT_API_Wallet_CanRemoveAccount), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_ImportNym", VALUEFUNC(_wrap_OT_API_Wallet_ImportNym), -1); + rb_define_module_function(mOtapi, "OT_API_SetNym_Name", VALUEFUNC(_wrap_OT_API_SetNym_Name), -1); + rb_define_module_function(mOtapi, "OT_API_SetAccountWallet_Name", VALUEFUNC(_wrap_OT_API_SetAccountWallet_Name), -1); + rb_define_module_function(mOtapi, "OT_API_SetAssetType_Name", VALUEFUNC(_wrap_OT_API_SetAssetType_Name), -1); + rb_define_module_function(mOtapi, "OT_API_SetServer_Name", VALUEFUNC(_wrap_OT_API_SetServer_Name), -1); + rb_define_module_function(mOtapi, "OT_API_VerifyAndRetrieveXMLContents", VALUEFUNC(_wrap_OT_API_VerifyAndRetrieveXMLContents), -1); + rb_define_module_function(mOtapi, "OT_API_WriteCheque", VALUEFUNC(_wrap_OT_API_WriteCheque), -1); + rb_define_module_function(mOtapi, "OT_API_ProposePaymentPlan", VALUEFUNC(_wrap_OT_API_ProposePaymentPlan), -1); + rb_define_module_function(mOtapi, "OT_API_ConfirmPaymentPlan", VALUEFUNC(_wrap_OT_API_ConfirmPaymentPlan), -1); + rb_define_module_function(mOtapi, "OT_API_LoadUserPubkey", VALUEFUNC(_wrap_OT_API_LoadUserPubkey), -1); + rb_define_module_function(mOtapi, "OT_API_LoadPubkey", VALUEFUNC(_wrap_OT_API_LoadPubkey), -1); + rb_define_module_function(mOtapi, "OT_API_VerifyUserPrivateKey", VALUEFUNC(_wrap_OT_API_VerifyUserPrivateKey), -1); + rb_define_module_function(mOtapi, "OT_API_LoadPurse", VALUEFUNC(_wrap_OT_API_LoadPurse), -1); + rb_define_module_function(mOtapi, "OT_API_LoadMint", VALUEFUNC(_wrap_OT_API_LoadMint), -1); + rb_define_module_function(mOtapi, "OT_API_LoadAssetContract", VALUEFUNC(_wrap_OT_API_LoadAssetContract), -1); + rb_define_module_function(mOtapi, "OT_API_LoadServerContract", VALUEFUNC(_wrap_OT_API_LoadServerContract), -1); + rb_define_module_function(mOtapi, "OT_API_Mint_IsStillGood", VALUEFUNC(_wrap_OT_API_Mint_IsStillGood), -1); + rb_define_module_function(mOtapi, "OT_API_IsBasketCurrency", VALUEFUNC(_wrap_OT_API_IsBasketCurrency), -1); + rb_define_module_function(mOtapi, "OT_API_Basket_GetMemberCount", VALUEFUNC(_wrap_OT_API_Basket_GetMemberCount), -1); + rb_define_module_function(mOtapi, "OT_API_Basket_GetMemberType", VALUEFUNC(_wrap_OT_API_Basket_GetMemberType), -1); + rb_define_module_function(mOtapi, "OT_API_Basket_GetMinimumTransferAmount", VALUEFUNC(_wrap_OT_API_Basket_GetMinimumTransferAmount), -1); + rb_define_module_function(mOtapi, "OT_API_Basket_GetMemberMinimumTransferAmount", VALUEFUNC(_wrap_OT_API_Basket_GetMemberMinimumTransferAmount), -1); + rb_define_module_function(mOtapi, "OT_API_LoadAssetAccount", VALUEFUNC(_wrap_OT_API_LoadAssetAccount), -1); + rb_define_module_function(mOtapi, "OT_API_LoadInbox", VALUEFUNC(_wrap_OT_API_LoadInbox), -1); + rb_define_module_function(mOtapi, "OT_API_LoadOutbox", VALUEFUNC(_wrap_OT_API_LoadOutbox), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_GetCount", VALUEFUNC(_wrap_OT_API_Ledger_GetCount), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_CreateResponse", VALUEFUNC(_wrap_OT_API_Ledger_CreateResponse), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_GetTransactionByIndex", VALUEFUNC(_wrap_OT_API_Ledger_GetTransactionByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_GetTransactionByID", VALUEFUNC(_wrap_OT_API_Ledger_GetTransactionByID), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_GetTransactionIDByIndex", VALUEFUNC(_wrap_OT_API_Ledger_GetTransactionIDByIndex), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_AddTransaction", VALUEFUNC(_wrap_OT_API_Ledger_AddTransaction), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_CreateResponse", VALUEFUNC(_wrap_OT_API_Transaction_CreateResponse), -1); + rb_define_module_function(mOtapi, "OT_API_Ledger_FinalizeResponse", VALUEFUNC(_wrap_OT_API_Ledger_FinalizeResponse), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetType", VALUEFUNC(_wrap_OT_API_Transaction_GetType), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetVoucher", VALUEFUNC(_wrap_OT_API_Transaction_GetVoucher), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetSuccess", VALUEFUNC(_wrap_OT_API_Transaction_GetSuccess), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetBalanceAgreementSuccess", VALUEFUNC(_wrap_OT_API_Transaction_GetBalanceAgreementSuccess), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetDateSigned", VALUEFUNC(_wrap_OT_API_Transaction_GetDateSigned), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetAmount", VALUEFUNC(_wrap_OT_API_Transaction_GetAmount), -1); + rb_define_module_function(mOtapi, "OT_API_Pending_GetNote", VALUEFUNC(_wrap_OT_API_Pending_GetNote), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetSenderUserID", VALUEFUNC(_wrap_OT_API_Transaction_GetSenderUserID), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetSenderAcctID", VALUEFUNC(_wrap_OT_API_Transaction_GetSenderAcctID), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetRecipientUserID", VALUEFUNC(_wrap_OT_API_Transaction_GetRecipientUserID), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetRecipientAcctID", VALUEFUNC(_wrap_OT_API_Transaction_GetRecipientAcctID), -1); + rb_define_module_function(mOtapi, "OT_API_Transaction_GetDisplayReferenceToNum", VALUEFUNC(_wrap_OT_API_Transaction_GetDisplayReferenceToNum), -1); + rb_define_module_function(mOtapi, "OT_API_CreatePurse", VALUEFUNC(_wrap_OT_API_CreatePurse), -1); + rb_define_module_function(mOtapi, "OT_API_SavePurse", VALUEFUNC(_wrap_OT_API_SavePurse), -1); + rb_define_module_function(mOtapi, "OT_API_Purse_GetTotalValue", VALUEFUNC(_wrap_OT_API_Purse_GetTotalValue), -1); + rb_define_module_function(mOtapi, "OT_API_Purse_Count", VALUEFUNC(_wrap_OT_API_Purse_Count), -1); + rb_define_module_function(mOtapi, "OT_API_Purse_Peek", VALUEFUNC(_wrap_OT_API_Purse_Peek), -1); + rb_define_module_function(mOtapi, "OT_API_Purse_Pop", VALUEFUNC(_wrap_OT_API_Purse_Pop), -1); + rb_define_module_function(mOtapi, "OT_API_Purse_Push", VALUEFUNC(_wrap_OT_API_Purse_Push), -1); + rb_define_module_function(mOtapi, "OT_API_Wallet_ImportPurse", VALUEFUNC(_wrap_OT_API_Wallet_ImportPurse), -1); + rb_define_module_function(mOtapi, "OT_API_exchangePurse", VALUEFUNC(_wrap_OT_API_exchangePurse), -1); + rb_define_module_function(mOtapi, "OT_API_Token_ChangeOwner", VALUEFUNC(_wrap_OT_API_Token_ChangeOwner), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetID", VALUEFUNC(_wrap_OT_API_Token_GetID), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetDenomination", VALUEFUNC(_wrap_OT_API_Token_GetDenomination), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetSeries", VALUEFUNC(_wrap_OT_API_Token_GetSeries), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetValidFrom", VALUEFUNC(_wrap_OT_API_Token_GetValidFrom), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetValidTo", VALUEFUNC(_wrap_OT_API_Token_GetValidTo), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetAssetID", VALUEFUNC(_wrap_OT_API_Token_GetAssetID), -1); + rb_define_module_function(mOtapi, "OT_API_Token_GetServerID", VALUEFUNC(_wrap_OT_API_Token_GetServerID), -1); + rb_define_module_function(mOtapi, "OT_API_checkServerID", VALUEFUNC(_wrap_OT_API_checkServerID), -1); + rb_define_module_function(mOtapi, "OT_API_createUserAccount", VALUEFUNC(_wrap_OT_API_createUserAccount), -1); + rb_define_module_function(mOtapi, "OT_API_deleteUserAccount", VALUEFUNC(_wrap_OT_API_deleteUserAccount), -1); + rb_define_module_function(mOtapi, "OT_API_deleteAssetAccount", VALUEFUNC(_wrap_OT_API_deleteAssetAccount), -1); + rb_define_module_function(mOtapi, "OT_API_checkUser", VALUEFUNC(_wrap_OT_API_checkUser), -1); + rb_define_module_function(mOtapi, "OT_API_sendUserMessage", VALUEFUNC(_wrap_OT_API_sendUserMessage), -1); + rb_define_module_function(mOtapi, "OT_API_getRequest", VALUEFUNC(_wrap_OT_API_getRequest), -1); + rb_define_module_function(mOtapi, "OT_API_getTransactionNumber", VALUEFUNC(_wrap_OT_API_getTransactionNumber), -1); + rb_define_module_function(mOtapi, "OT_API_issueAssetType", VALUEFUNC(_wrap_OT_API_issueAssetType), -1); + rb_define_module_function(mOtapi, "OT_API_getContract", VALUEFUNC(_wrap_OT_API_getContract), -1); + rb_define_module_function(mOtapi, "OT_API_getMint", VALUEFUNC(_wrap_OT_API_getMint), -1); + rb_define_module_function(mOtapi, "OT_API_createAssetAccount", VALUEFUNC(_wrap_OT_API_createAssetAccount), -1); + rb_define_module_function(mOtapi, "OT_API_getAccount", VALUEFUNC(_wrap_OT_API_getAccount), -1); + rb_define_module_function(mOtapi, "OT_API_GenerateBasketCreation", VALUEFUNC(_wrap_OT_API_GenerateBasketCreation), -1); + rb_define_module_function(mOtapi, "OT_API_AddBasketCreationItem", VALUEFUNC(_wrap_OT_API_AddBasketCreationItem), -1); + rb_define_module_function(mOtapi, "OT_API_issueBasket", VALUEFUNC(_wrap_OT_API_issueBasket), -1); + rb_define_module_function(mOtapi, "OT_API_GenerateBasketExchange", VALUEFUNC(_wrap_OT_API_GenerateBasketExchange), -1); + rb_define_module_function(mOtapi, "OT_API_AddBasketExchangeItem", VALUEFUNC(_wrap_OT_API_AddBasketExchangeItem), -1); + rb_define_module_function(mOtapi, "OT_API_exchangeBasket", VALUEFUNC(_wrap_OT_API_exchangeBasket), -1); + rb_define_module_function(mOtapi, "OT_API_notarizeWithdrawal", VALUEFUNC(_wrap_OT_API_notarizeWithdrawal), -1); + rb_define_module_function(mOtapi, "OT_API_notarizeDeposit", VALUEFUNC(_wrap_OT_API_notarizeDeposit), -1); + rb_define_module_function(mOtapi, "OT_API_notarizeTransfer", VALUEFUNC(_wrap_OT_API_notarizeTransfer), -1); + rb_define_module_function(mOtapi, "OT_API_getInbox", VALUEFUNC(_wrap_OT_API_getInbox), -1); + rb_define_module_function(mOtapi, "OT_API_getOutbox", VALUEFUNC(_wrap_OT_API_getOutbox), -1); + rb_define_module_function(mOtapi, "OT_API_getNymbox", VALUEFUNC(_wrap_OT_API_getNymbox), -1); + rb_define_module_function(mOtapi, "OT_API_LoadNymbox", VALUEFUNC(_wrap_OT_API_LoadNymbox), -1); + rb_define_module_function(mOtapi, "OT_API_processInbox", VALUEFUNC(_wrap_OT_API_processInbox), -1); + rb_define_module_function(mOtapi, "OT_API_processNymbox", VALUEFUNC(_wrap_OT_API_processNymbox), -1); + rb_define_module_function(mOtapi, "OT_API_withdrawVoucher", VALUEFUNC(_wrap_OT_API_withdrawVoucher), -1); + rb_define_module_function(mOtapi, "OT_API_depositCheque", VALUEFUNC(_wrap_OT_API_depositCheque), -1); + rb_define_module_function(mOtapi, "OT_API_depositPaymentPlan", VALUEFUNC(_wrap_OT_API_depositPaymentPlan), -1); + rb_define_module_function(mOtapi, "OT_API_issueMarketOffer", VALUEFUNC(_wrap_OT_API_issueMarketOffer), -1); + rb_define_module_function(mOtapi, "OT_API_getMarketList", VALUEFUNC(_wrap_OT_API_getMarketList), -1); + rb_define_module_function(mOtapi, "OT_API_getMarketOffers", VALUEFUNC(_wrap_OT_API_getMarketOffers), -1); + rb_define_module_function(mOtapi, "OT_API_getMarketRecentTrades", VALUEFUNC(_wrap_OT_API_getMarketRecentTrades), -1); + rb_define_module_function(mOtapi, "OT_API_getNym_MarketOffers", VALUEFUNC(_wrap_OT_API_getNym_MarketOffers), -1); + rb_define_module_function(mOtapi, "OT_API_cancelMarketOffer", VALUEFUNC(_wrap_OT_API_cancelMarketOffer), -1); + rb_define_module_function(mOtapi, "OT_API_cancelPaymentPlan", VALUEFUNC(_wrap_OT_API_cancelPaymentPlan), -1); + rb_define_module_function(mOtapi, "OT_API_PopMessageBuffer", VALUEFUNC(_wrap_OT_API_PopMessageBuffer), -1); + rb_define_module_function(mOtapi, "OT_API_FlushMessageBuffer", VALUEFUNC(_wrap_OT_API_FlushMessageBuffer), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetCommand", VALUEFUNC(_wrap_OT_API_Message_GetCommand), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetSuccess", VALUEFUNC(_wrap_OT_API_Message_GetSuccess), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetDepth", VALUEFUNC(_wrap_OT_API_Message_GetDepth), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetTransactionSuccess", VALUEFUNC(_wrap_OT_API_Message_GetTransactionSuccess), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetBalanceAgreementSuccess", VALUEFUNC(_wrap_OT_API_Message_GetBalanceAgreementSuccess), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetLedger", VALUEFUNC(_wrap_OT_API_Message_GetLedger), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetNewAssetTypeID", VALUEFUNC(_wrap_OT_API_Message_GetNewAssetTypeID), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetNewIssuerAcctID", VALUEFUNC(_wrap_OT_API_Message_GetNewIssuerAcctID), -1); + rb_define_module_function(mOtapi, "OT_API_Message_GetNewAcctID", VALUEFUNC(_wrap_OT_API_Message_GetNewAcctID), -1); + rb_define_module_function(mOtapi, "OT_API_ConnectServer", VALUEFUNC(_wrap_OT_API_ConnectServer), -1); + rb_define_module_function(mOtapi, "OT_API_ProcessSockets", VALUEFUNC(_wrap_OT_API_ProcessSockets), -1); + rb_define_const(mOtapi, "PACK_MESSAGE_PACK", SWIG_From_int(static_cast< int >(OTDB::PACK_MESSAGE_PACK))); + rb_define_const(mOtapi, "PACK_PROTOCOL_BUFFERS", SWIG_From_int(static_cast< int >(OTDB::PACK_PROTOCOL_BUFFERS))); + rb_define_const(mOtapi, "PACK_TYPE_ERROR", SWIG_From_int(static_cast< int >(OTDB::PACK_TYPE_ERROR))); + rb_define_const(mOtapi, "STORE_FILESYSTEM", SWIG_From_int(static_cast< int >(OTDB::STORE_FILESYSTEM))); + rb_define_const(mOtapi, "STORE_TYPE_SUBCLASS", SWIG_From_int(static_cast< int >(OTDB::STORE_TYPE_SUBCLASS))); + rb_define_const(mOtapi, "STORED_OBJ_STRING", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING))); + rb_define_const(mOtapi, "STORED_OBJ_BLOB", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BLOB))); + rb_define_const(mOtapi, "STORED_OBJ_STRING_MAP", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING_MAP))); + rb_define_const(mOtapi, "STORED_OBJ_WALLET_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_WALLET_DATA))); + rb_define_const(mOtapi, "STORED_OBJ_BITCOIN_ACCT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_ACCT))); + rb_define_const(mOtapi, "STORED_OBJ_BITCOIN_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_SERVER))); + rb_define_const(mOtapi, "STORED_OBJ_RIPPLE_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_RIPPLE_SERVER))); + rb_define_const(mOtapi, "STORED_OBJ_LOOM_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_LOOM_SERVER))); + rb_define_const(mOtapi, "STORED_OBJ_SERVER_INFO", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_SERVER_INFO))); + rb_define_const(mOtapi, "STORED_OBJ_CONTACT_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_NYM))); + rb_define_const(mOtapi, "STORED_OBJ_CONTACT_ACCT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_ACCT))); + rb_define_const(mOtapi, "STORED_OBJ_CONTACT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT))); + rb_define_const(mOtapi, "STORED_OBJ_ADDRESS_BOOK", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ADDRESS_BOOK))); + rb_define_const(mOtapi, "STORED_OBJ_MARKET_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_DATA))); + rb_define_const(mOtapi, "STORED_OBJ_MARKET_LIST", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_LIST))); + rb_define_const(mOtapi, "STORED_OBJ_BID_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BID_DATA))); + rb_define_const(mOtapi, "STORED_OBJ_ASK_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ASK_DATA))); + rb_define_const(mOtapi, "STORED_OBJ_OFFER_LIST_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_MARKET))); + rb_define_const(mOtapi, "STORED_OBJ_TRADE_DATA_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_MARKET))); + rb_define_const(mOtapi, "STORED_OBJ_TRADE_LIST_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_MARKET))); + rb_define_const(mOtapi, "STORED_OBJ_OFFER_DATA_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_DATA_NYM))); + rb_define_const(mOtapi, "STORED_OBJ_OFFER_LIST_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_NYM))); + rb_define_const(mOtapi, "STORED_OBJ_TRADE_DATA_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_NYM))); + rb_define_const(mOtapi, "STORED_OBJ_TRADE_LIST_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_NYM))); + rb_define_const(mOtapi, "STORED_OBJ_ERROR", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ERROR))); + + SwigClassStorable.klass = rb_define_class_under(mOtapi, "Storable", rb_cObject); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storable, (void *) &SwigClassStorable); + rb_undef_alloc_func(SwigClassStorable.klass); + rb_define_singleton_method(SwigClassStorable.klass, "Create", VALUEFUNC(_wrap_Storable_Create), -1); + rb_define_singleton_method(SwigClassStorable.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Storable_ot_dynamic_cast), -1); + SwigClassStorable.mark = 0; + SwigClassStorable.destroy = (void (*)(void *)) free_OTDB_Storable; + SwigClassStorable.trackObjects = 0; + + SwigClassStorage.klass = rb_define_class_under(mOtapi, "Storage", rb_cObject); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Storage, (void *) &SwigClassStorage); + rb_undef_alloc_func(SwigClassStorage.klass); + rb_define_method(SwigClassStorage.klass, "GetPacker", VALUEFUNC(_wrap_Storage_GetPacker), -1); + rb_define_method(SwigClassStorage.klass, "Init", VALUEFUNC(_wrap_Storage_Init), -1); + rb_define_method(SwigClassStorage.klass, "Exists", VALUEFUNC(_wrap_Storage_Exists), -1); + rb_define_method(SwigClassStorage.klass, "StoreString", VALUEFUNC(_wrap_Storage_StoreString), -1); + rb_define_method(SwigClassStorage.klass, "QueryString", VALUEFUNC(_wrap_Storage_QueryString), -1); + rb_define_method(SwigClassStorage.klass, "StorePlainString", VALUEFUNC(_wrap_Storage_StorePlainString), -1); + rb_define_method(SwigClassStorage.klass, "QueryPlainString", VALUEFUNC(_wrap_Storage_QueryPlainString), -1); + rb_define_method(SwigClassStorage.klass, "StoreObject", VALUEFUNC(_wrap_Storage_StoreObject), -1); + rb_define_method(SwigClassStorage.klass, "QueryObject", VALUEFUNC(_wrap_Storage_QueryObject), -1); + rb_define_method(SwigClassStorage.klass, "EraseValueByKey", VALUEFUNC(_wrap_Storage_EraseValueByKey), -1); + rb_define_method(SwigClassStorage.klass, "CreateObject", VALUEFUNC(_wrap_Storage_CreateObject), -1); + rb_define_singleton_method(SwigClassStorage.klass, "Create", VALUEFUNC(_wrap_Storage_Create), -1); + rb_define_method(SwigClassStorage.klass, "GetType", VALUEFUNC(_wrap_Storage_GetType), -1); + SwigClassStorage.mark = 0; + SwigClassStorage.destroy = (void (*)(void *)) free_OTDB_Storage; + SwigClassStorage.trackObjects = 0; + rb_define_module_function(mOtapi, "InitDefaultStorage", VALUEFUNC(_wrap_InitDefaultStorage), -1); + rb_define_module_function(mOtapi, "GetDefaultStorage", VALUEFUNC(_wrap_GetDefaultStorage), -1); + rb_define_module_function(mOtapi, "CreateStorageContext", VALUEFUNC(_wrap_CreateStorageContext), -1); + rb_define_module_function(mOtapi, "CreateObject", VALUEFUNC(_wrap_CreateObject), -1); + rb_define_module_function(mOtapi, "Exists", VALUEFUNC(_wrap_Exists), -1); + rb_define_module_function(mOtapi, "StoreString", VALUEFUNC(_wrap_StoreString), -1); + rb_define_module_function(mOtapi, "QueryString", VALUEFUNC(_wrap_QueryString), -1); + rb_define_module_function(mOtapi, "StorePlainString", VALUEFUNC(_wrap_StorePlainString), -1); + rb_define_module_function(mOtapi, "QueryPlainString", VALUEFUNC(_wrap_QueryPlainString), -1); + rb_define_module_function(mOtapi, "StoreObject", VALUEFUNC(_wrap_StoreObject), -1); + rb_define_module_function(mOtapi, "QueryObject", VALUEFUNC(_wrap_QueryObject), -1); + rb_define_module_function(mOtapi, "EraseValueByKey", VALUEFUNC(_wrap_EraseValueByKey), -1); + + SwigClassOTDBString.klass = rb_define_class_under(mOtapi, "OTDBString", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OTDBString, (void *) &SwigClassOTDBString); + rb_undef_alloc_func(SwigClassOTDBString.klass); + rb_define_method(SwigClassOTDBString.klass, "m_string=", VALUEFUNC(_wrap_OTDBString_m_string_set), -1); + rb_define_method(SwigClassOTDBString.klass, "m_string", VALUEFUNC(_wrap_OTDBString_m_string_get), -1); + rb_define_singleton_method(SwigClassOTDBString.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_OTDBString_ot_dynamic_cast), -1); + SwigClassOTDBString.mark = 0; + SwigClassOTDBString.destroy = (void (*)(void *)) free_OTDB_OTDBString; + SwigClassOTDBString.trackObjects = 0; + + SwigClassBlob.klass = rb_define_class_under(mOtapi, "Blob", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Blob, (void *) &SwigClassBlob); + rb_undef_alloc_func(SwigClassBlob.klass); + rb_define_method(SwigClassBlob.klass, "m_memBuffer=", VALUEFUNC(_wrap_Blob_m_memBuffer_set), -1); + rb_define_method(SwigClassBlob.klass, "m_memBuffer", VALUEFUNC(_wrap_Blob_m_memBuffer_get), -1); + rb_define_singleton_method(SwigClassBlob.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Blob_ot_dynamic_cast), -1); + SwigClassBlob.mark = 0; + SwigClassBlob.destroy = (void (*)(void *)) free_OTDB_Blob; + SwigClassBlob.trackObjects = 0; + + SwigClassStringMap.klass = rb_define_class_under(mOtapi, "StringMap", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__StringMap, (void *) &SwigClassStringMap); + rb_undef_alloc_func(SwigClassStringMap.klass); + rb_define_method(SwigClassStringMap.klass, "the_map=", VALUEFUNC(_wrap_StringMap_the_map_set), -1); + rb_define_method(SwigClassStringMap.klass, "the_map", VALUEFUNC(_wrap_StringMap_the_map_get), -1); + rb_define_method(SwigClassStringMap.klass, "SetValue", VALUEFUNC(_wrap_StringMap_SetValue), -1); + rb_define_method(SwigClassStringMap.klass, "GetValue", VALUEFUNC(_wrap_StringMap_GetValue), -1); + rb_define_singleton_method(SwigClassStringMap.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_StringMap_ot_dynamic_cast), -1); + SwigClassStringMap.mark = 0; + SwigClassStringMap.destroy = (void (*)(void *)) free_OTDB_StringMap; + SwigClassStringMap.trackObjects = 0; + + SwigClassDisplayable.klass = rb_define_class_under(mOtapi, "Displayable", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Displayable, (void *) &SwigClassDisplayable); + rb_undef_alloc_func(SwigClassDisplayable.klass); + rb_define_method(SwigClassDisplayable.klass, "gui_label=", VALUEFUNC(_wrap_Displayable_gui_label_set), -1); + rb_define_method(SwigClassDisplayable.klass, "gui_label", VALUEFUNC(_wrap_Displayable_gui_label_get), -1); + rb_define_singleton_method(SwigClassDisplayable.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Displayable_ot_dynamic_cast), -1); + SwigClassDisplayable.mark = 0; + SwigClassDisplayable.destroy = (void (*)(void *)) free_OTDB_Displayable; + SwigClassDisplayable.trackObjects = 0; + + SwigClassMarketData.klass = rb_define_class_under(mOtapi, "MarketData", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketData, (void *) &SwigClassMarketData); + rb_undef_alloc_func(SwigClassMarketData.klass); + rb_define_method(SwigClassMarketData.klass, "gui_label=", VALUEFUNC(_wrap_MarketData_gui_label_set), -1); + rb_define_method(SwigClassMarketData.klass, "gui_label", VALUEFUNC(_wrap_MarketData_gui_label_get), -1); + rb_define_method(SwigClassMarketData.klass, "server_id=", VALUEFUNC(_wrap_MarketData_server_id_set), -1); + rb_define_method(SwigClassMarketData.klass, "server_id", VALUEFUNC(_wrap_MarketData_server_id_get), -1); + rb_define_method(SwigClassMarketData.klass, "market_id=", VALUEFUNC(_wrap_MarketData_market_id_set), -1); + rb_define_method(SwigClassMarketData.klass, "market_id", VALUEFUNC(_wrap_MarketData_market_id_get), -1); + rb_define_method(SwigClassMarketData.klass, "asset_type_id=", VALUEFUNC(_wrap_MarketData_asset_type_id_set), -1); + rb_define_method(SwigClassMarketData.klass, "asset_type_id", VALUEFUNC(_wrap_MarketData_asset_type_id_get), -1); + rb_define_method(SwigClassMarketData.klass, "currency_type_id=", VALUEFUNC(_wrap_MarketData_currency_type_id_set), -1); + rb_define_method(SwigClassMarketData.klass, "currency_type_id", VALUEFUNC(_wrap_MarketData_currency_type_id_get), -1); + rb_define_method(SwigClassMarketData.klass, "scale=", VALUEFUNC(_wrap_MarketData_scale_set), -1); + rb_define_method(SwigClassMarketData.klass, "scale", VALUEFUNC(_wrap_MarketData_scale_get), -1); + rb_define_method(SwigClassMarketData.klass, "total_assets=", VALUEFUNC(_wrap_MarketData_total_assets_set), -1); + rb_define_method(SwigClassMarketData.klass, "total_assets", VALUEFUNC(_wrap_MarketData_total_assets_get), -1); + rb_define_method(SwigClassMarketData.klass, "number_bids=", VALUEFUNC(_wrap_MarketData_number_bids_set), -1); + rb_define_method(SwigClassMarketData.klass, "number_bids", VALUEFUNC(_wrap_MarketData_number_bids_get), -1); + rb_define_method(SwigClassMarketData.klass, "number_asks=", VALUEFUNC(_wrap_MarketData_number_asks_set), -1); + rb_define_method(SwigClassMarketData.klass, "number_asks", VALUEFUNC(_wrap_MarketData_number_asks_get), -1); + rb_define_method(SwigClassMarketData.klass, "last_sale_price=", VALUEFUNC(_wrap_MarketData_last_sale_price_set), -1); + rb_define_method(SwigClassMarketData.klass, "last_sale_price", VALUEFUNC(_wrap_MarketData_last_sale_price_get), -1); + rb_define_method(SwigClassMarketData.klass, "current_bid=", VALUEFUNC(_wrap_MarketData_current_bid_set), -1); + rb_define_method(SwigClassMarketData.klass, "current_bid", VALUEFUNC(_wrap_MarketData_current_bid_get), -1); + rb_define_method(SwigClassMarketData.klass, "current_ask=", VALUEFUNC(_wrap_MarketData_current_ask_set), -1); + rb_define_method(SwigClassMarketData.klass, "current_ask", VALUEFUNC(_wrap_MarketData_current_ask_get), -1); + rb_define_method(SwigClassMarketData.klass, "volume_trades=", VALUEFUNC(_wrap_MarketData_volume_trades_set), -1); + rb_define_method(SwigClassMarketData.klass, "volume_trades", VALUEFUNC(_wrap_MarketData_volume_trades_get), -1); + rb_define_method(SwigClassMarketData.klass, "volume_assets=", VALUEFUNC(_wrap_MarketData_volume_assets_set), -1); + rb_define_method(SwigClassMarketData.klass, "volume_assets", VALUEFUNC(_wrap_MarketData_volume_assets_get), -1); + rb_define_method(SwigClassMarketData.klass, "volume_currency=", VALUEFUNC(_wrap_MarketData_volume_currency_set), -1); + rb_define_method(SwigClassMarketData.klass, "volume_currency", VALUEFUNC(_wrap_MarketData_volume_currency_get), -1); + rb_define_method(SwigClassMarketData.klass, "recent_highest_bid=", VALUEFUNC(_wrap_MarketData_recent_highest_bid_set), -1); + rb_define_method(SwigClassMarketData.klass, "recent_highest_bid", VALUEFUNC(_wrap_MarketData_recent_highest_bid_get), -1); + rb_define_method(SwigClassMarketData.klass, "recent_lowest_ask=", VALUEFUNC(_wrap_MarketData_recent_lowest_ask_set), -1); + rb_define_method(SwigClassMarketData.klass, "recent_lowest_ask", VALUEFUNC(_wrap_MarketData_recent_lowest_ask_get), -1); + rb_define_singleton_method(SwigClassMarketData.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_MarketData_ot_dynamic_cast), -1); + SwigClassMarketData.mark = 0; + SwigClassMarketData.destroy = (void (*)(void *)) free_OTDB_MarketData; + SwigClassMarketData.trackObjects = 0; + + SwigClassMarketList.klass = rb_define_class_under(mOtapi, "MarketList", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__MarketList, (void *) &SwigClassMarketList); + rb_undef_alloc_func(SwigClassMarketList.klass); + rb_define_method(SwigClassMarketList.klass, "GetMarketDataCount", VALUEFUNC(_wrap_MarketList_GetMarketDataCount), -1); + rb_define_method(SwigClassMarketList.klass, "GetMarketData", VALUEFUNC(_wrap_MarketList_GetMarketData), -1); + rb_define_method(SwigClassMarketList.klass, "RemoveMarketData", VALUEFUNC(_wrap_MarketList_RemoveMarketData), -1); + rb_define_method(SwigClassMarketList.klass, "AddMarketData", VALUEFUNC(_wrap_MarketList_AddMarketData), -1); + rb_define_singleton_method(SwigClassMarketList.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_MarketList_ot_dynamic_cast), -1); + SwigClassMarketList.mark = 0; + SwigClassMarketList.destroy = (void (*)(void *)) free_OTDB_MarketList; + SwigClassMarketList.trackObjects = 0; + + SwigClassOfferDataMarket.klass = rb_define_class_under(mOtapi, "OfferDataMarket", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataMarket, (void *) &SwigClassOfferDataMarket); + rb_undef_alloc_func(SwigClassOfferDataMarket.klass); + rb_define_method(SwigClassOfferDataMarket.klass, "gui_label=", VALUEFUNC(_wrap_OfferDataMarket_gui_label_set), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "gui_label", VALUEFUNC(_wrap_OfferDataMarket_gui_label_get), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "transaction_id=", VALUEFUNC(_wrap_OfferDataMarket_transaction_id_set), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "transaction_id", VALUEFUNC(_wrap_OfferDataMarket_transaction_id_get), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "price_per_scale=", VALUEFUNC(_wrap_OfferDataMarket_price_per_scale_set), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "price_per_scale", VALUEFUNC(_wrap_OfferDataMarket_price_per_scale_get), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "available_assets=", VALUEFUNC(_wrap_OfferDataMarket_available_assets_set), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "available_assets", VALUEFUNC(_wrap_OfferDataMarket_available_assets_get), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "minimum_increment=", VALUEFUNC(_wrap_OfferDataMarket_minimum_increment_set), -1); + rb_define_method(SwigClassOfferDataMarket.klass, "minimum_increment", VALUEFUNC(_wrap_OfferDataMarket_minimum_increment_get), -1); + rb_define_singleton_method(SwigClassOfferDataMarket.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_OfferDataMarket_ot_dynamic_cast), -1); + SwigClassOfferDataMarket.mark = 0; + SwigClassOfferDataMarket.destroy = (void (*)(void *)) free_OTDB_OfferDataMarket; + SwigClassOfferDataMarket.trackObjects = 0; + + SwigClassBidData.klass = rb_define_class_under(mOtapi, "BidData", ((swig_class *) SWIGTYPE_p_OTDB__OfferDataMarket->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BidData, (void *) &SwigClassBidData); + rb_undef_alloc_func(SwigClassBidData.klass); + rb_define_method(SwigClassBidData.klass, "gui_label=", VALUEFUNC(_wrap_BidData_gui_label_set), -1); + rb_define_method(SwigClassBidData.klass, "gui_label", VALUEFUNC(_wrap_BidData_gui_label_get), -1); + rb_define_method(SwigClassBidData.klass, "transaction_id=", VALUEFUNC(_wrap_BidData_transaction_id_set), -1); + rb_define_method(SwigClassBidData.klass, "transaction_id", VALUEFUNC(_wrap_BidData_transaction_id_get), -1); + rb_define_method(SwigClassBidData.klass, "price_per_scale=", VALUEFUNC(_wrap_BidData_price_per_scale_set), -1); + rb_define_method(SwigClassBidData.klass, "price_per_scale", VALUEFUNC(_wrap_BidData_price_per_scale_get), -1); + rb_define_method(SwigClassBidData.klass, "available_assets=", VALUEFUNC(_wrap_BidData_available_assets_set), -1); + rb_define_method(SwigClassBidData.klass, "available_assets", VALUEFUNC(_wrap_BidData_available_assets_get), -1); + rb_define_method(SwigClassBidData.klass, "minimum_increment=", VALUEFUNC(_wrap_BidData_minimum_increment_set), -1); + rb_define_method(SwigClassBidData.klass, "minimum_increment", VALUEFUNC(_wrap_BidData_minimum_increment_get), -1); + rb_define_singleton_method(SwigClassBidData.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_BidData_ot_dynamic_cast), -1); + SwigClassBidData.mark = 0; + SwigClassBidData.destroy = (void (*)(void *)) free_OTDB_BidData; + SwigClassBidData.trackObjects = 0; + + SwigClassAskData.klass = rb_define_class_under(mOtapi, "AskData", ((swig_class *) SWIGTYPE_p_OTDB__OfferDataMarket->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__AskData, (void *) &SwigClassAskData); + rb_undef_alloc_func(SwigClassAskData.klass); + rb_define_method(SwigClassAskData.klass, "gui_label=", VALUEFUNC(_wrap_AskData_gui_label_set), -1); + rb_define_method(SwigClassAskData.klass, "gui_label", VALUEFUNC(_wrap_AskData_gui_label_get), -1); + rb_define_method(SwigClassAskData.klass, "transaction_id=", VALUEFUNC(_wrap_AskData_transaction_id_set), -1); + rb_define_method(SwigClassAskData.klass, "transaction_id", VALUEFUNC(_wrap_AskData_transaction_id_get), -1); + rb_define_method(SwigClassAskData.klass, "price_per_scale=", VALUEFUNC(_wrap_AskData_price_per_scale_set), -1); + rb_define_method(SwigClassAskData.klass, "price_per_scale", VALUEFUNC(_wrap_AskData_price_per_scale_get), -1); + rb_define_method(SwigClassAskData.klass, "available_assets=", VALUEFUNC(_wrap_AskData_available_assets_set), -1); + rb_define_method(SwigClassAskData.klass, "available_assets", VALUEFUNC(_wrap_AskData_available_assets_get), -1); + rb_define_method(SwigClassAskData.klass, "minimum_increment=", VALUEFUNC(_wrap_AskData_minimum_increment_set), -1); + rb_define_method(SwigClassAskData.klass, "minimum_increment", VALUEFUNC(_wrap_AskData_minimum_increment_get), -1); + rb_define_singleton_method(SwigClassAskData.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_AskData_ot_dynamic_cast), -1); + SwigClassAskData.mark = 0; + SwigClassAskData.destroy = (void (*)(void *)) free_OTDB_AskData; + SwigClassAskData.trackObjects = 0; + + SwigClassOfferListMarket.klass = rb_define_class_under(mOtapi, "OfferListMarket", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListMarket, (void *) &SwigClassOfferListMarket); + rb_undef_alloc_func(SwigClassOfferListMarket.klass); + rb_define_method(SwigClassOfferListMarket.klass, "GetBidDataCount", VALUEFUNC(_wrap_OfferListMarket_GetBidDataCount), -1); + rb_define_method(SwigClassOfferListMarket.klass, "GetBidData", VALUEFUNC(_wrap_OfferListMarket_GetBidData), -1); + rb_define_method(SwigClassOfferListMarket.klass, "RemoveBidData", VALUEFUNC(_wrap_OfferListMarket_RemoveBidData), -1); + rb_define_method(SwigClassOfferListMarket.klass, "AddBidData", VALUEFUNC(_wrap_OfferListMarket_AddBidData), -1); + rb_define_method(SwigClassOfferListMarket.klass, "GetAskDataCount", VALUEFUNC(_wrap_OfferListMarket_GetAskDataCount), -1); + rb_define_method(SwigClassOfferListMarket.klass, "GetAskData", VALUEFUNC(_wrap_OfferListMarket_GetAskData), -1); + rb_define_method(SwigClassOfferListMarket.klass, "RemoveAskData", VALUEFUNC(_wrap_OfferListMarket_RemoveAskData), -1); + rb_define_method(SwigClassOfferListMarket.klass, "AddAskData", VALUEFUNC(_wrap_OfferListMarket_AddAskData), -1); + rb_define_singleton_method(SwigClassOfferListMarket.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_OfferListMarket_ot_dynamic_cast), -1); + SwigClassOfferListMarket.mark = 0; + SwigClassOfferListMarket.destroy = (void (*)(void *)) free_OTDB_OfferListMarket; + SwigClassOfferListMarket.trackObjects = 0; + + SwigClassTradeDataMarket.klass = rb_define_class_under(mOtapi, "TradeDataMarket", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataMarket, (void *) &SwigClassTradeDataMarket); + rb_undef_alloc_func(SwigClassTradeDataMarket.klass); + rb_define_method(SwigClassTradeDataMarket.klass, "gui_label=", VALUEFUNC(_wrap_TradeDataMarket_gui_label_set), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "gui_label", VALUEFUNC(_wrap_TradeDataMarket_gui_label_get), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "transaction_id=", VALUEFUNC(_wrap_TradeDataMarket_transaction_id_set), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "transaction_id", VALUEFUNC(_wrap_TradeDataMarket_transaction_id_get), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "date=", VALUEFUNC(_wrap_TradeDataMarket_date_set), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "date", VALUEFUNC(_wrap_TradeDataMarket_date_get), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "price=", VALUEFUNC(_wrap_TradeDataMarket_price_set), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "price", VALUEFUNC(_wrap_TradeDataMarket_price_get), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "amount_sold=", VALUEFUNC(_wrap_TradeDataMarket_amount_sold_set), -1); + rb_define_method(SwigClassTradeDataMarket.klass, "amount_sold", VALUEFUNC(_wrap_TradeDataMarket_amount_sold_get), -1); + rb_define_singleton_method(SwigClassTradeDataMarket.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_TradeDataMarket_ot_dynamic_cast), -1); + SwigClassTradeDataMarket.mark = 0; + SwigClassTradeDataMarket.destroy = (void (*)(void *)) free_OTDB_TradeDataMarket; + SwigClassTradeDataMarket.trackObjects = 0; + + SwigClassTradeListMarket.klass = rb_define_class_under(mOtapi, "TradeListMarket", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListMarket, (void *) &SwigClassTradeListMarket); + rb_undef_alloc_func(SwigClassTradeListMarket.klass); + rb_define_method(SwigClassTradeListMarket.klass, "GetTradeDataMarketCount", VALUEFUNC(_wrap_TradeListMarket_GetTradeDataMarketCount), -1); + rb_define_method(SwigClassTradeListMarket.klass, "GetTradeDataMarket", VALUEFUNC(_wrap_TradeListMarket_GetTradeDataMarket), -1); + rb_define_method(SwigClassTradeListMarket.klass, "RemoveTradeDataMarket", VALUEFUNC(_wrap_TradeListMarket_RemoveTradeDataMarket), -1); + rb_define_method(SwigClassTradeListMarket.klass, "AddTradeDataMarket", VALUEFUNC(_wrap_TradeListMarket_AddTradeDataMarket), -1); + rb_define_singleton_method(SwigClassTradeListMarket.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_TradeListMarket_ot_dynamic_cast), -1); + SwigClassTradeListMarket.mark = 0; + SwigClassTradeListMarket.destroy = (void (*)(void *)) free_OTDB_TradeListMarket; + SwigClassTradeListMarket.trackObjects = 0; + + SwigClassOfferDataNym.klass = rb_define_class_under(mOtapi, "OfferDataNym", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferDataNym, (void *) &SwigClassOfferDataNym); + rb_undef_alloc_func(SwigClassOfferDataNym.klass); + rb_define_method(SwigClassOfferDataNym.klass, "gui_label=", VALUEFUNC(_wrap_OfferDataNym_gui_label_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "gui_label", VALUEFUNC(_wrap_OfferDataNym_gui_label_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "valid_from=", VALUEFUNC(_wrap_OfferDataNym_valid_from_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "valid_from", VALUEFUNC(_wrap_OfferDataNym_valid_from_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "valid_to=", VALUEFUNC(_wrap_OfferDataNym_valid_to_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "valid_to", VALUEFUNC(_wrap_OfferDataNym_valid_to_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "server_id=", VALUEFUNC(_wrap_OfferDataNym_server_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "server_id", VALUEFUNC(_wrap_OfferDataNym_server_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "asset_type_id=", VALUEFUNC(_wrap_OfferDataNym_asset_type_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "asset_type_id", VALUEFUNC(_wrap_OfferDataNym_asset_type_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "asset_acct_id=", VALUEFUNC(_wrap_OfferDataNym_asset_acct_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "asset_acct_id", VALUEFUNC(_wrap_OfferDataNym_asset_acct_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "currency_type_id=", VALUEFUNC(_wrap_OfferDataNym_currency_type_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "currency_type_id", VALUEFUNC(_wrap_OfferDataNym_currency_type_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "currency_acct_id=", VALUEFUNC(_wrap_OfferDataNym_currency_acct_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "currency_acct_id", VALUEFUNC(_wrap_OfferDataNym_currency_acct_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "selling=", VALUEFUNC(_wrap_OfferDataNym_selling_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "selling", VALUEFUNC(_wrap_OfferDataNym_selling_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "scale=", VALUEFUNC(_wrap_OfferDataNym_scale_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "scale", VALUEFUNC(_wrap_OfferDataNym_scale_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "price_per_scale=", VALUEFUNC(_wrap_OfferDataNym_price_per_scale_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "price_per_scale", VALUEFUNC(_wrap_OfferDataNym_price_per_scale_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "transaction_id=", VALUEFUNC(_wrap_OfferDataNym_transaction_id_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "transaction_id", VALUEFUNC(_wrap_OfferDataNym_transaction_id_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "total_assets=", VALUEFUNC(_wrap_OfferDataNym_total_assets_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "total_assets", VALUEFUNC(_wrap_OfferDataNym_total_assets_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "finished_so_far=", VALUEFUNC(_wrap_OfferDataNym_finished_so_far_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "finished_so_far", VALUEFUNC(_wrap_OfferDataNym_finished_so_far_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "minimum_increment=", VALUEFUNC(_wrap_OfferDataNym_minimum_increment_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "minimum_increment", VALUEFUNC(_wrap_OfferDataNym_minimum_increment_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "stop_sign=", VALUEFUNC(_wrap_OfferDataNym_stop_sign_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "stop_sign", VALUEFUNC(_wrap_OfferDataNym_stop_sign_get), -1); + rb_define_method(SwigClassOfferDataNym.klass, "stop_price=", VALUEFUNC(_wrap_OfferDataNym_stop_price_set), -1); + rb_define_method(SwigClassOfferDataNym.klass, "stop_price", VALUEFUNC(_wrap_OfferDataNym_stop_price_get), -1); + rb_define_singleton_method(SwigClassOfferDataNym.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_OfferDataNym_ot_dynamic_cast), -1); + SwigClassOfferDataNym.mark = 0; + SwigClassOfferDataNym.destroy = (void (*)(void *)) free_OTDB_OfferDataNym; + SwigClassOfferDataNym.trackObjects = 0; + + SwigClassOfferListNym.klass = rb_define_class_under(mOtapi, "OfferListNym", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__OfferListNym, (void *) &SwigClassOfferListNym); + rb_undef_alloc_func(SwigClassOfferListNym.klass); + rb_define_method(SwigClassOfferListNym.klass, "GetOfferDataNymCount", VALUEFUNC(_wrap_OfferListNym_GetOfferDataNymCount), -1); + rb_define_method(SwigClassOfferListNym.klass, "GetOfferDataNym", VALUEFUNC(_wrap_OfferListNym_GetOfferDataNym), -1); + rb_define_method(SwigClassOfferListNym.klass, "RemoveOfferDataNym", VALUEFUNC(_wrap_OfferListNym_RemoveOfferDataNym), -1); + rb_define_method(SwigClassOfferListNym.klass, "AddOfferDataNym", VALUEFUNC(_wrap_OfferListNym_AddOfferDataNym), -1); + rb_define_singleton_method(SwigClassOfferListNym.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_OfferListNym_ot_dynamic_cast), -1); + SwigClassOfferListNym.mark = 0; + SwigClassOfferListNym.destroy = (void (*)(void *)) free_OTDB_OfferListNym; + SwigClassOfferListNym.trackObjects = 0; + + SwigClassTradeDataNym.klass = rb_define_class_under(mOtapi, "TradeDataNym", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeDataNym, (void *) &SwigClassTradeDataNym); + rb_undef_alloc_func(SwigClassTradeDataNym.klass); + rb_define_method(SwigClassTradeDataNym.klass, "gui_label=", VALUEFUNC(_wrap_TradeDataNym_gui_label_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "gui_label", VALUEFUNC(_wrap_TradeDataNym_gui_label_get), -1); + rb_define_method(SwigClassTradeDataNym.klass, "transaction_id=", VALUEFUNC(_wrap_TradeDataNym_transaction_id_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "transaction_id", VALUEFUNC(_wrap_TradeDataNym_transaction_id_get), -1); + rb_define_method(SwigClassTradeDataNym.klass, "completed_count=", VALUEFUNC(_wrap_TradeDataNym_completed_count_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "completed_count", VALUEFUNC(_wrap_TradeDataNym_completed_count_get), -1); + rb_define_method(SwigClassTradeDataNym.klass, "date=", VALUEFUNC(_wrap_TradeDataNym_date_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "date", VALUEFUNC(_wrap_TradeDataNym_date_get), -1); + rb_define_method(SwigClassTradeDataNym.klass, "price=", VALUEFUNC(_wrap_TradeDataNym_price_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "price", VALUEFUNC(_wrap_TradeDataNym_price_get), -1); + rb_define_method(SwigClassTradeDataNym.klass, "amount_sold=", VALUEFUNC(_wrap_TradeDataNym_amount_sold_set), -1); + rb_define_method(SwigClassTradeDataNym.klass, "amount_sold", VALUEFUNC(_wrap_TradeDataNym_amount_sold_get), -1); + rb_define_singleton_method(SwigClassTradeDataNym.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_TradeDataNym_ot_dynamic_cast), -1); + SwigClassTradeDataNym.mark = 0; + SwigClassTradeDataNym.destroy = (void (*)(void *)) free_OTDB_TradeDataNym; + SwigClassTradeDataNym.trackObjects = 0; + + SwigClassTradeListNym.klass = rb_define_class_under(mOtapi, "TradeListNym", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__TradeListNym, (void *) &SwigClassTradeListNym); + rb_undef_alloc_func(SwigClassTradeListNym.klass); + rb_define_method(SwigClassTradeListNym.klass, "GetTradeDataNymCount", VALUEFUNC(_wrap_TradeListNym_GetTradeDataNymCount), -1); + rb_define_method(SwigClassTradeListNym.klass, "GetTradeDataNym", VALUEFUNC(_wrap_TradeListNym_GetTradeDataNym), -1); + rb_define_method(SwigClassTradeListNym.klass, "RemoveTradeDataNym", VALUEFUNC(_wrap_TradeListNym_RemoveTradeDataNym), -1); + rb_define_method(SwigClassTradeListNym.klass, "AddTradeDataNym", VALUEFUNC(_wrap_TradeListNym_AddTradeDataNym), -1); + rb_define_singleton_method(SwigClassTradeListNym.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_TradeListNym_ot_dynamic_cast), -1); + SwigClassTradeListNym.mark = 0; + SwigClassTradeListNym.destroy = (void (*)(void *)) free_OTDB_TradeListNym; + SwigClassTradeListNym.trackObjects = 0; + + SwigClassAcct.klass = rb_define_class_under(mOtapi, "Acct", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Acct, (void *) &SwigClassAcct); + rb_undef_alloc_func(SwigClassAcct.klass); + rb_define_method(SwigClassAcct.klass, "gui_label=", VALUEFUNC(_wrap_Acct_gui_label_set), -1); + rb_define_method(SwigClassAcct.klass, "gui_label", VALUEFUNC(_wrap_Acct_gui_label_get), -1); + rb_define_method(SwigClassAcct.klass, "acct_id=", VALUEFUNC(_wrap_Acct_acct_id_set), -1); + rb_define_method(SwigClassAcct.klass, "acct_id", VALUEFUNC(_wrap_Acct_acct_id_get), -1); + rb_define_method(SwigClassAcct.klass, "server_id=", VALUEFUNC(_wrap_Acct_server_id_set), -1); + rb_define_method(SwigClassAcct.klass, "server_id", VALUEFUNC(_wrap_Acct_server_id_get), -1); + rb_define_singleton_method(SwigClassAcct.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Acct_ot_dynamic_cast), -1); + SwigClassAcct.mark = 0; + SwigClassAcct.destroy = (void (*)(void *)) free_OTDB_Acct; + SwigClassAcct.trackObjects = 0; + + SwigClassBitcoinAcct.klass = rb_define_class_under(mOtapi, "BitcoinAcct", ((swig_class *) SWIGTYPE_p_OTDB__Acct->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinAcct, (void *) &SwigClassBitcoinAcct); + rb_undef_alloc_func(SwigClassBitcoinAcct.klass); + rb_define_method(SwigClassBitcoinAcct.klass, "gui_label=", VALUEFUNC(_wrap_BitcoinAcct_gui_label_set), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "gui_label", VALUEFUNC(_wrap_BitcoinAcct_gui_label_get), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "acct_id=", VALUEFUNC(_wrap_BitcoinAcct_acct_id_set), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "acct_id", VALUEFUNC(_wrap_BitcoinAcct_acct_id_get), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "server_id=", VALUEFUNC(_wrap_BitcoinAcct_server_id_set), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "server_id", VALUEFUNC(_wrap_BitcoinAcct_server_id_get), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "bitcoin_acct_name=", VALUEFUNC(_wrap_BitcoinAcct_bitcoin_acct_name_set), -1); + rb_define_method(SwigClassBitcoinAcct.klass, "bitcoin_acct_name", VALUEFUNC(_wrap_BitcoinAcct_bitcoin_acct_name_get), -1); + rb_define_singleton_method(SwigClassBitcoinAcct.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_BitcoinAcct_ot_dynamic_cast), -1); + SwigClassBitcoinAcct.mark = 0; + SwigClassBitcoinAcct.destroy = (void (*)(void *)) free_OTDB_BitcoinAcct; + SwigClassBitcoinAcct.trackObjects = 0; + + SwigClassServerInfo.klass = rb_define_class_under(mOtapi, "ServerInfo", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ServerInfo, (void *) &SwigClassServerInfo); + rb_undef_alloc_func(SwigClassServerInfo.klass); + rb_define_method(SwigClassServerInfo.klass, "gui_label=", VALUEFUNC(_wrap_ServerInfo_gui_label_set), -1); + rb_define_method(SwigClassServerInfo.klass, "gui_label", VALUEFUNC(_wrap_ServerInfo_gui_label_get), -1); + rb_define_method(SwigClassServerInfo.klass, "server_id=", VALUEFUNC(_wrap_ServerInfo_server_id_set), -1); + rb_define_method(SwigClassServerInfo.klass, "server_id", VALUEFUNC(_wrap_ServerInfo_server_id_get), -1); + rb_define_method(SwigClassServerInfo.klass, "server_type=", VALUEFUNC(_wrap_ServerInfo_server_type_set), -1); + rb_define_method(SwigClassServerInfo.klass, "server_type", VALUEFUNC(_wrap_ServerInfo_server_type_get), -1); + rb_define_singleton_method(SwigClassServerInfo.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_ServerInfo_ot_dynamic_cast), -1); + SwigClassServerInfo.mark = 0; + SwigClassServerInfo.destroy = (void (*)(void *)) free_OTDB_ServerInfo; + SwigClassServerInfo.trackObjects = 0; + + SwigClassServer.klass = rb_define_class_under(mOtapi, "Server", ((swig_class *) SWIGTYPE_p_OTDB__ServerInfo->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Server, (void *) &SwigClassServer); + rb_undef_alloc_func(SwigClassServer.klass); + rb_define_method(SwigClassServer.klass, "gui_label=", VALUEFUNC(_wrap_Server_gui_label_set), -1); + rb_define_method(SwigClassServer.klass, "gui_label", VALUEFUNC(_wrap_Server_gui_label_get), -1); + rb_define_method(SwigClassServer.klass, "server_id=", VALUEFUNC(_wrap_Server_server_id_set), -1); + rb_define_method(SwigClassServer.klass, "server_id", VALUEFUNC(_wrap_Server_server_id_get), -1); + rb_define_method(SwigClassServer.klass, "server_type=", VALUEFUNC(_wrap_Server_server_type_set), -1); + rb_define_method(SwigClassServer.klass, "server_type", VALUEFUNC(_wrap_Server_server_type_get), -1); + rb_define_method(SwigClassServer.klass, "server_host=", VALUEFUNC(_wrap_Server_server_host_set), -1); + rb_define_method(SwigClassServer.klass, "server_host", VALUEFUNC(_wrap_Server_server_host_get), -1); + rb_define_method(SwigClassServer.klass, "server_port=", VALUEFUNC(_wrap_Server_server_port_set), -1); + rb_define_method(SwigClassServer.klass, "server_port", VALUEFUNC(_wrap_Server_server_port_get), -1); + rb_define_singleton_method(SwigClassServer.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Server_ot_dynamic_cast), -1); + SwigClassServer.mark = 0; + SwigClassServer.destroy = (void (*)(void *)) free_OTDB_Server; + SwigClassServer.trackObjects = 0; + + SwigClassBitcoinServer.klass = rb_define_class_under(mOtapi, "BitcoinServer", ((swig_class *) SWIGTYPE_p_OTDB__Server->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__BitcoinServer, (void *) &SwigClassBitcoinServer); + rb_undef_alloc_func(SwigClassBitcoinServer.klass); + rb_define_method(SwigClassBitcoinServer.klass, "gui_label=", VALUEFUNC(_wrap_BitcoinServer_gui_label_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "gui_label", VALUEFUNC(_wrap_BitcoinServer_gui_label_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_id=", VALUEFUNC(_wrap_BitcoinServer_server_id_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_id", VALUEFUNC(_wrap_BitcoinServer_server_id_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_type=", VALUEFUNC(_wrap_BitcoinServer_server_type_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_type", VALUEFUNC(_wrap_BitcoinServer_server_type_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_host=", VALUEFUNC(_wrap_BitcoinServer_server_host_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_host", VALUEFUNC(_wrap_BitcoinServer_server_host_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_port=", VALUEFUNC(_wrap_BitcoinServer_server_port_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "server_port", VALUEFUNC(_wrap_BitcoinServer_server_port_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "bitcoin_username=", VALUEFUNC(_wrap_BitcoinServer_bitcoin_username_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "bitcoin_username", VALUEFUNC(_wrap_BitcoinServer_bitcoin_username_get), -1); + rb_define_method(SwigClassBitcoinServer.klass, "bitcoin_password=", VALUEFUNC(_wrap_BitcoinServer_bitcoin_password_set), -1); + rb_define_method(SwigClassBitcoinServer.klass, "bitcoin_password", VALUEFUNC(_wrap_BitcoinServer_bitcoin_password_get), -1); + rb_define_singleton_method(SwigClassBitcoinServer.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_BitcoinServer_ot_dynamic_cast), -1); + SwigClassBitcoinServer.mark = 0; + SwigClassBitcoinServer.destroy = (void (*)(void *)) free_OTDB_BitcoinServer; + SwigClassBitcoinServer.trackObjects = 0; + + SwigClassRippleServer.klass = rb_define_class_under(mOtapi, "RippleServer", ((swig_class *) SWIGTYPE_p_OTDB__Server->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__RippleServer, (void *) &SwigClassRippleServer); + rb_undef_alloc_func(SwigClassRippleServer.klass); + rb_define_method(SwigClassRippleServer.klass, "gui_label=", VALUEFUNC(_wrap_RippleServer_gui_label_set), -1); + rb_define_method(SwigClassRippleServer.klass, "gui_label", VALUEFUNC(_wrap_RippleServer_gui_label_get), -1); + rb_define_method(SwigClassRippleServer.klass, "server_id=", VALUEFUNC(_wrap_RippleServer_server_id_set), -1); + rb_define_method(SwigClassRippleServer.klass, "server_id", VALUEFUNC(_wrap_RippleServer_server_id_get), -1); + rb_define_method(SwigClassRippleServer.klass, "server_type=", VALUEFUNC(_wrap_RippleServer_server_type_set), -1); + rb_define_method(SwigClassRippleServer.klass, "server_type", VALUEFUNC(_wrap_RippleServer_server_type_get), -1); + rb_define_method(SwigClassRippleServer.klass, "server_host=", VALUEFUNC(_wrap_RippleServer_server_host_set), -1); + rb_define_method(SwigClassRippleServer.klass, "server_host", VALUEFUNC(_wrap_RippleServer_server_host_get), -1); + rb_define_method(SwigClassRippleServer.klass, "server_port=", VALUEFUNC(_wrap_RippleServer_server_port_set), -1); + rb_define_method(SwigClassRippleServer.klass, "server_port", VALUEFUNC(_wrap_RippleServer_server_port_get), -1); + rb_define_method(SwigClassRippleServer.klass, "ripple_username=", VALUEFUNC(_wrap_RippleServer_ripple_username_set), -1); + rb_define_method(SwigClassRippleServer.klass, "ripple_username", VALUEFUNC(_wrap_RippleServer_ripple_username_get), -1); + rb_define_method(SwigClassRippleServer.klass, "ripple_password=", VALUEFUNC(_wrap_RippleServer_ripple_password_set), -1); + rb_define_method(SwigClassRippleServer.klass, "ripple_password", VALUEFUNC(_wrap_RippleServer_ripple_password_get), -1); + rb_define_method(SwigClassRippleServer.klass, "namefield_id=", VALUEFUNC(_wrap_RippleServer_namefield_id_set), -1); + rb_define_method(SwigClassRippleServer.klass, "namefield_id", VALUEFUNC(_wrap_RippleServer_namefield_id_get), -1); + rb_define_method(SwigClassRippleServer.klass, "passfield_id=", VALUEFUNC(_wrap_RippleServer_passfield_id_set), -1); + rb_define_method(SwigClassRippleServer.klass, "passfield_id", VALUEFUNC(_wrap_RippleServer_passfield_id_get), -1); + rb_define_singleton_method(SwigClassRippleServer.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_RippleServer_ot_dynamic_cast), -1); + SwigClassRippleServer.mark = 0; + SwigClassRippleServer.destroy = (void (*)(void *)) free_OTDB_RippleServer; + SwigClassRippleServer.trackObjects = 0; + + SwigClassLoomServer.klass = rb_define_class_under(mOtapi, "LoomServer", ((swig_class *) SWIGTYPE_p_OTDB__Server->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__LoomServer, (void *) &SwigClassLoomServer); + rb_undef_alloc_func(SwigClassLoomServer.klass); + rb_define_method(SwigClassLoomServer.klass, "gui_label=", VALUEFUNC(_wrap_LoomServer_gui_label_set), -1); + rb_define_method(SwigClassLoomServer.klass, "gui_label", VALUEFUNC(_wrap_LoomServer_gui_label_get), -1); + rb_define_method(SwigClassLoomServer.klass, "server_id=", VALUEFUNC(_wrap_LoomServer_server_id_set), -1); + rb_define_method(SwigClassLoomServer.klass, "server_id", VALUEFUNC(_wrap_LoomServer_server_id_get), -1); + rb_define_method(SwigClassLoomServer.klass, "server_type=", VALUEFUNC(_wrap_LoomServer_server_type_set), -1); + rb_define_method(SwigClassLoomServer.klass, "server_type", VALUEFUNC(_wrap_LoomServer_server_type_get), -1); + rb_define_method(SwigClassLoomServer.klass, "server_host=", VALUEFUNC(_wrap_LoomServer_server_host_set), -1); + rb_define_method(SwigClassLoomServer.klass, "server_host", VALUEFUNC(_wrap_LoomServer_server_host_get), -1); + rb_define_method(SwigClassLoomServer.klass, "server_port=", VALUEFUNC(_wrap_LoomServer_server_port_set), -1); + rb_define_method(SwigClassLoomServer.klass, "server_port", VALUEFUNC(_wrap_LoomServer_server_port_get), -1); + rb_define_method(SwigClassLoomServer.klass, "loom_username=", VALUEFUNC(_wrap_LoomServer_loom_username_set), -1); + rb_define_method(SwigClassLoomServer.klass, "loom_username", VALUEFUNC(_wrap_LoomServer_loom_username_get), -1); + rb_define_method(SwigClassLoomServer.klass, "namefield_id=", VALUEFUNC(_wrap_LoomServer_namefield_id_set), -1); + rb_define_method(SwigClassLoomServer.klass, "namefield_id", VALUEFUNC(_wrap_LoomServer_namefield_id_get), -1); + rb_define_singleton_method(SwigClassLoomServer.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_LoomServer_ot_dynamic_cast), -1); + SwigClassLoomServer.mark = 0; + SwigClassLoomServer.destroy = (void (*)(void *)) free_OTDB_LoomServer; + SwigClassLoomServer.trackObjects = 0; + + SwigClassContactNym.klass = rb_define_class_under(mOtapi, "ContactNym", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactNym, (void *) &SwigClassContactNym); + rb_undef_alloc_func(SwigClassContactNym.klass); + rb_define_method(SwigClassContactNym.klass, "gui_label=", VALUEFUNC(_wrap_ContactNym_gui_label_set), -1); + rb_define_method(SwigClassContactNym.klass, "gui_label", VALUEFUNC(_wrap_ContactNym_gui_label_get), -1); + rb_define_method(SwigClassContactNym.klass, "nym_type=", VALUEFUNC(_wrap_ContactNym_nym_type_set), -1); + rb_define_method(SwigClassContactNym.klass, "nym_type", VALUEFUNC(_wrap_ContactNym_nym_type_get), -1); + rb_define_method(SwigClassContactNym.klass, "nym_id=", VALUEFUNC(_wrap_ContactNym_nym_id_set), -1); + rb_define_method(SwigClassContactNym.klass, "nym_id", VALUEFUNC(_wrap_ContactNym_nym_id_get), -1); + rb_define_method(SwigClassContactNym.klass, "public_key=", VALUEFUNC(_wrap_ContactNym_public_key_set), -1); + rb_define_method(SwigClassContactNym.klass, "public_key", VALUEFUNC(_wrap_ContactNym_public_key_get), -1); + rb_define_method(SwigClassContactNym.klass, "memo=", VALUEFUNC(_wrap_ContactNym_memo_set), -1); + rb_define_method(SwigClassContactNym.klass, "memo", VALUEFUNC(_wrap_ContactNym_memo_get), -1); + rb_define_method(SwigClassContactNym.klass, "GetServerInfoCount", VALUEFUNC(_wrap_ContactNym_GetServerInfoCount), -1); + rb_define_method(SwigClassContactNym.klass, "GetServerInfo", VALUEFUNC(_wrap_ContactNym_GetServerInfo), -1); + rb_define_method(SwigClassContactNym.klass, "RemoveServerInfo", VALUEFUNC(_wrap_ContactNym_RemoveServerInfo), -1); + rb_define_method(SwigClassContactNym.klass, "AddServerInfo", VALUEFUNC(_wrap_ContactNym_AddServerInfo), -1); + rb_define_singleton_method(SwigClassContactNym.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_ContactNym_ot_dynamic_cast), -1); + SwigClassContactNym.mark = 0; + SwigClassContactNym.destroy = (void (*)(void *)) free_OTDB_ContactNym; + SwigClassContactNym.trackObjects = 0; + + SwigClassWalletData.klass = rb_define_class_under(mOtapi, "WalletData", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__WalletData, (void *) &SwigClassWalletData); + rb_undef_alloc_func(SwigClassWalletData.klass); + rb_define_method(SwigClassWalletData.klass, "GetBitcoinServerCount", VALUEFUNC(_wrap_WalletData_GetBitcoinServerCount), -1); + rb_define_method(SwigClassWalletData.klass, "GetBitcoinServer", VALUEFUNC(_wrap_WalletData_GetBitcoinServer), -1); + rb_define_method(SwigClassWalletData.klass, "RemoveBitcoinServer", VALUEFUNC(_wrap_WalletData_RemoveBitcoinServer), -1); + rb_define_method(SwigClassWalletData.klass, "AddBitcoinServer", VALUEFUNC(_wrap_WalletData_AddBitcoinServer), -1); + rb_define_method(SwigClassWalletData.klass, "GetBitcoinAcctCount", VALUEFUNC(_wrap_WalletData_GetBitcoinAcctCount), -1); + rb_define_method(SwigClassWalletData.klass, "GetBitcoinAcct", VALUEFUNC(_wrap_WalletData_GetBitcoinAcct), -1); + rb_define_method(SwigClassWalletData.klass, "RemoveBitcoinAcct", VALUEFUNC(_wrap_WalletData_RemoveBitcoinAcct), -1); + rb_define_method(SwigClassWalletData.klass, "AddBitcoinAcct", VALUEFUNC(_wrap_WalletData_AddBitcoinAcct), -1); + rb_define_method(SwigClassWalletData.klass, "GetRippleServerCount", VALUEFUNC(_wrap_WalletData_GetRippleServerCount), -1); + rb_define_method(SwigClassWalletData.klass, "GetRippleServer", VALUEFUNC(_wrap_WalletData_GetRippleServer), -1); + rb_define_method(SwigClassWalletData.klass, "RemoveRippleServer", VALUEFUNC(_wrap_WalletData_RemoveRippleServer), -1); + rb_define_method(SwigClassWalletData.klass, "AddRippleServer", VALUEFUNC(_wrap_WalletData_AddRippleServer), -1); + rb_define_method(SwigClassWalletData.klass, "GetLoomServerCount", VALUEFUNC(_wrap_WalletData_GetLoomServerCount), -1); + rb_define_method(SwigClassWalletData.klass, "GetLoomServer", VALUEFUNC(_wrap_WalletData_GetLoomServer), -1); + rb_define_method(SwigClassWalletData.klass, "RemoveLoomServer", VALUEFUNC(_wrap_WalletData_RemoveLoomServer), -1); + rb_define_method(SwigClassWalletData.klass, "AddLoomServer", VALUEFUNC(_wrap_WalletData_AddLoomServer), -1); + rb_define_singleton_method(SwigClassWalletData.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_WalletData_ot_dynamic_cast), -1); + SwigClassWalletData.mark = 0; + SwigClassWalletData.destroy = (void (*)(void *)) free_OTDB_WalletData; + SwigClassWalletData.trackObjects = 0; + + SwigClassContactAcct.klass = rb_define_class_under(mOtapi, "ContactAcct", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__ContactAcct, (void *) &SwigClassContactAcct); + rb_undef_alloc_func(SwigClassContactAcct.klass); + rb_define_method(SwigClassContactAcct.klass, "gui_label=", VALUEFUNC(_wrap_ContactAcct_gui_label_set), -1); + rb_define_method(SwigClassContactAcct.klass, "gui_label", VALUEFUNC(_wrap_ContactAcct_gui_label_get), -1); + rb_define_method(SwigClassContactAcct.klass, "server_type=", VALUEFUNC(_wrap_ContactAcct_server_type_set), -1); + rb_define_method(SwigClassContactAcct.klass, "server_type", VALUEFUNC(_wrap_ContactAcct_server_type_get), -1); + rb_define_method(SwigClassContactAcct.klass, "server_id=", VALUEFUNC(_wrap_ContactAcct_server_id_set), -1); + rb_define_method(SwigClassContactAcct.klass, "server_id", VALUEFUNC(_wrap_ContactAcct_server_id_get), -1); + rb_define_method(SwigClassContactAcct.klass, "asset_type_id=", VALUEFUNC(_wrap_ContactAcct_asset_type_id_set), -1); + rb_define_method(SwigClassContactAcct.klass, "asset_type_id", VALUEFUNC(_wrap_ContactAcct_asset_type_id_get), -1); + rb_define_method(SwigClassContactAcct.klass, "acct_id=", VALUEFUNC(_wrap_ContactAcct_acct_id_set), -1); + rb_define_method(SwigClassContactAcct.klass, "acct_id", VALUEFUNC(_wrap_ContactAcct_acct_id_get), -1); + rb_define_method(SwigClassContactAcct.klass, "nym_id=", VALUEFUNC(_wrap_ContactAcct_nym_id_set), -1); + rb_define_method(SwigClassContactAcct.klass, "nym_id", VALUEFUNC(_wrap_ContactAcct_nym_id_get), -1); + rb_define_method(SwigClassContactAcct.klass, "memo=", VALUEFUNC(_wrap_ContactAcct_memo_set), -1); + rb_define_method(SwigClassContactAcct.klass, "memo", VALUEFUNC(_wrap_ContactAcct_memo_get), -1); + rb_define_method(SwigClassContactAcct.klass, "public_key=", VALUEFUNC(_wrap_ContactAcct_public_key_set), -1); + rb_define_method(SwigClassContactAcct.klass, "public_key", VALUEFUNC(_wrap_ContactAcct_public_key_get), -1); + rb_define_singleton_method(SwigClassContactAcct.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_ContactAcct_ot_dynamic_cast), -1); + SwigClassContactAcct.mark = 0; + SwigClassContactAcct.destroy = (void (*)(void *)) free_OTDB_ContactAcct; + SwigClassContactAcct.trackObjects = 0; + + SwigClassContact.klass = rb_define_class_under(mOtapi, "Contact", ((swig_class *) SWIGTYPE_p_OTDB__Displayable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__Contact, (void *) &SwigClassContact); + rb_undef_alloc_func(SwigClassContact.klass); + rb_define_method(SwigClassContact.klass, "gui_label=", VALUEFUNC(_wrap_Contact_gui_label_set), -1); + rb_define_method(SwigClassContact.klass, "gui_label", VALUEFUNC(_wrap_Contact_gui_label_get), -1); + rb_define_method(SwigClassContact.klass, "contact_id=", VALUEFUNC(_wrap_Contact_contact_id_set), -1); + rb_define_method(SwigClassContact.klass, "contact_id", VALUEFUNC(_wrap_Contact_contact_id_get), -1); + rb_define_method(SwigClassContact.klass, "email=", VALUEFUNC(_wrap_Contact_email_set), -1); + rb_define_method(SwigClassContact.klass, "email", VALUEFUNC(_wrap_Contact_email_get), -1); + rb_define_method(SwigClassContact.klass, "memo=", VALUEFUNC(_wrap_Contact_memo_set), -1); + rb_define_method(SwigClassContact.klass, "memo", VALUEFUNC(_wrap_Contact_memo_get), -1); + rb_define_method(SwigClassContact.klass, "public_key=", VALUEFUNC(_wrap_Contact_public_key_set), -1); + rb_define_method(SwigClassContact.klass, "public_key", VALUEFUNC(_wrap_Contact_public_key_get), -1); + rb_define_method(SwigClassContact.klass, "GetContactNymCount", VALUEFUNC(_wrap_Contact_GetContactNymCount), -1); + rb_define_method(SwigClassContact.klass, "GetContactNym", VALUEFUNC(_wrap_Contact_GetContactNym), -1); + rb_define_method(SwigClassContact.klass, "RemoveContactNym", VALUEFUNC(_wrap_Contact_RemoveContactNym), -1); + rb_define_method(SwigClassContact.klass, "AddContactNym", VALUEFUNC(_wrap_Contact_AddContactNym), -1); + rb_define_method(SwigClassContact.klass, "GetContactAcctCount", VALUEFUNC(_wrap_Contact_GetContactAcctCount), -1); + rb_define_method(SwigClassContact.klass, "GetContactAcct", VALUEFUNC(_wrap_Contact_GetContactAcct), -1); + rb_define_method(SwigClassContact.klass, "RemoveContactAcct", VALUEFUNC(_wrap_Contact_RemoveContactAcct), -1); + rb_define_method(SwigClassContact.klass, "AddContactAcct", VALUEFUNC(_wrap_Contact_AddContactAcct), -1); + rb_define_singleton_method(SwigClassContact.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_Contact_ot_dynamic_cast), -1); + SwigClassContact.mark = 0; + SwigClassContact.destroy = (void (*)(void *)) free_OTDB_Contact; + SwigClassContact.trackObjects = 0; + + SwigClassAddressBook.klass = rb_define_class_under(mOtapi, "AddressBook", ((swig_class *) SWIGTYPE_p_OTDB__Storable->clientdata)->klass); + SWIG_TypeClientData(SWIGTYPE_p_OTDB__AddressBook, (void *) &SwigClassAddressBook); + rb_undef_alloc_func(SwigClassAddressBook.klass); + rb_define_method(SwigClassAddressBook.klass, "GetContactCount", VALUEFUNC(_wrap_AddressBook_GetContactCount), -1); + rb_define_method(SwigClassAddressBook.klass, "GetContact", VALUEFUNC(_wrap_AddressBook_GetContact), -1); + rb_define_method(SwigClassAddressBook.klass, "RemoveContact", VALUEFUNC(_wrap_AddressBook_RemoveContact), -1); + rb_define_method(SwigClassAddressBook.klass, "AddContact", VALUEFUNC(_wrap_AddressBook_AddContact), -1); + rb_define_singleton_method(SwigClassAddressBook.klass, "ot_dynamic_cast", VALUEFUNC(_wrap_AddressBook_ot_dynamic_cast), -1); + SwigClassAddressBook.mark = 0; + SwigClassAddressBook.destroy = (void (*)(void *)) free_OTDB_AddressBook; + SwigClassAddressBook.trackObjects = 0; +} + diff --git a/testwallet/OTAPI_ruby.h b/testwallet/OTAPI_ruby.h new file mode 100644 index 000000000..42fd7d730 --- /dev/null +++ b/testwallet/OTAPI_ruby.h @@ -0,0 +1,29 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_Otapi_WRAP_H_ +#define SWIG_Otapi_WRAP_H_ + +namespace Swig { + class Director; +} + + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + SwigDirector_OTCallback(VALUE self); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); +}; + + +#endif diff --git a/testwallet/OTAPI_tcl.cpp b/testwallet/OTAPI_tcl.cpp new file mode 100644 index 000000000..b5005b130 --- /dev/null +++ b/testwallet/OTAPI_tcl.cpp @@ -0,0 +1,26311 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#define SWIGTCL + + +#ifdef __cplusplus +/* SwigValueWrapper is described in swig.swg */ +template class SwigValueWrapper { + struct SwigMovePointer { + T *ptr; + SwigMovePointer(T *p) : ptr(p) { } + ~SwigMovePointer() { delete ptr; } + SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } + } pointer; + SwigValueWrapper& operator=(const SwigValueWrapper& rhs); + SwigValueWrapper(const SwigValueWrapper& rhs); +public: + SwigValueWrapper() : pointer(0) { } + SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } + operator T&() const { return *pointer.ptr; } + T *operator&() { return pointer.ptr; } +}; + +template T SwigValueInit() { + return T(); +} +#endif + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + + + +#include +#include +#include +#include +#include +#include + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCompare(const char *nb, const char *tb) { + int equiv = 0; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (!equiv && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0; + if (*ne) ++ne; + } + return equiv; +} + + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + register size_t l = 0; + register size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + register size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + register int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + register size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + register const unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + register unsigned char *u = (unsigned char *) ptr; + register const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + register char d = *(c++); + register unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = ((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = ((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGINTERN const char* +SWIG_Tcl_ErrorType(int code) { + const char* type = 0; + switch(code) { + case SWIG_MemoryError: + type = "MemoryError"; + break; + case SWIG_IOError: + type = "IOError"; + break; + case SWIG_RuntimeError: + type = "RuntimeError"; + break; + case SWIG_IndexError: + type = "IndexError"; + break; + case SWIG_TypeError: + type = "TypeError"; + break; + case SWIG_DivisionByZero: + type = "ZeroDivisionError"; + break; + case SWIG_OverflowError: + type = "OverflowError"; + break; + case SWIG_SyntaxError: + type = "SyntaxError"; + break; + case SWIG_ValueError: + type = "ValueError"; + break; + case SWIG_SystemError: + type = "SystemError"; + break; + case SWIG_AttributeError: + type = "AttributeError"; + break; + default: + type = "RuntimeError"; + } + return type; +} + + +SWIGINTERN void +SWIG_Tcl_SetErrorObj(Tcl_Interp *interp, const char *ctype, Tcl_Obj *obj) +{ + Tcl_ResetResult(interp); + Tcl_SetObjResult(interp, obj); + Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); +} + +SWIGINTERN void +SWIG_Tcl_SetErrorMsg(Tcl_Interp *interp, const char *ctype, const char *mesg) +{ + Tcl_ResetResult(interp); + Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); + Tcl_AppendResult(interp, ctype, " ", mesg, NULL); + /* + Tcl_AddErrorInfo(interp, ctype); + Tcl_AddErrorInfo(interp, " "); + Tcl_AddErrorInfo(interp, mesg); + */ +} + +SWIGINTERNINLINE void +SWIG_Tcl_AddErrorMsg(Tcl_Interp *interp, const char* mesg) +{ + Tcl_AddErrorInfo(interp, mesg); +} + + + +/* ----------------------------------------------------------------------------- + * SWIG API. Portion that goes into the runtime + * ----------------------------------------------------------------------------- */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_TCL_POINTER 4 +#define SWIG_TCL_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + +typedef int (*swig_wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); +typedef int (*swig_wrapper_func)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); +typedef char *(*swig_variable_func)(ClientData, Tcl_Interp *, char *, char *, int); +typedef void (*swig_delete_func)(ClientData); + +typedef struct swig_method { + const char *name; + swig_wrapper method; +} swig_method; + +typedef struct swig_attribute { + const char *name; + swig_wrapper getmethod; + swig_wrapper setmethod; +} swig_attribute; + +typedef struct swig_class { + const char *name; + swig_type_info **type; + swig_wrapper constructor; + void (*destructor)(void *); + swig_method *methods; + swig_attribute *attributes; + struct swig_class **bases; + const char **base_names; + swig_module_info *module; + Tcl_HashTable hashtable; +} swig_class; + +typedef struct swig_instance { + Tcl_Obj *thisptr; + void *thisvalue; + swig_class *classptr; + int destroy; + Tcl_Command cmdtok; +} swig_instance; + +/* Structure for command table */ +typedef struct { + const char *name; + int (*wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); + ClientData clientdata; +} swig_command_info; + +/* Structure for variable linking table */ +typedef struct { + const char *name; + void *addr; + char * (*get)(ClientData, Tcl_Interp *, char *, char *, int); + char * (*set)(ClientData, Tcl_Interp *, char *, char *, int); +} swig_var_info; + + +/* -----------------------------------------------------------------------------* + * Install a constant object + * -----------------------------------------------------------------------------*/ + +static Tcl_HashTable swigconstTable; +static int swigconstTableinit = 0; + +SWIGINTERN void +SWIG_Tcl_SetConstantObj(Tcl_Interp *interp, const char* name, Tcl_Obj *obj) { + int newobj; + Tcl_ObjSetVar2(interp,Tcl_NewStringObj(name,-1), NULL, obj, TCL_GLOBAL_ONLY); + Tcl_SetHashValue(Tcl_CreateHashEntry(&swigconstTable, name, &newobj), (ClientData) obj); +} + +SWIGINTERN Tcl_Obj * +SWIG_Tcl_GetConstantObj(const char *key) { + Tcl_HashEntry *entryPtr; + if (!swigconstTableinit) return 0; + entryPtr = Tcl_FindHashEntry(&swigconstTable, key); + if (entryPtr) { + return (Tcl_Obj *) Tcl_GetHashValue(entryPtr); + } + return 0; +} + +#ifdef __cplusplus +} +#endif + + + +/* ----------------------------------------------------------------------------- + * tclrun.swg + * + * This file contains the runtime support for Tcl modules and includes + * code for managing global variables and pointer type checking. + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_Tcl_ConvertPtr(interp, oc, ptr, ty, flags) +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Tcl_NewPointerObj(ptr, type, flags) + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp, obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, flags) +#define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_Tcl_NewInstanceObj(interp, thisvalue, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, 0) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Tcl_NewPointerObj(ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp,obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Tcl_GetModule((Tcl_Interp *) (clientdata)) +#define SWIG_SetModule(clientdata, pointer) SWIG_Tcl_SetModule((Tcl_Interp *) (clientdata), pointer) + + +/* Error manipulation */ + +#define SWIG_ErrorType(code) SWIG_Tcl_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Tcl_SetErrorMsg(interp, SWIG_Tcl_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Tcl-specific SWIG API */ + +#define SWIG_Acquire(ptr) SWIG_Tcl_Acquire(ptr) +#define SWIG_MethodCommand SWIG_Tcl_MethodCommand +#define SWIG_Disown(ptr) SWIG_Tcl_Disown(ptr) +#define SWIG_ConvertPtrFromString(c, ptr, ty, flags) SWIG_Tcl_ConvertPtrFromString(interp, c, ptr, ty, flags) +#define SWIG_MakePtr(c, ptr, ty, flags) SWIG_Tcl_MakePtr(c, ptr, ty, flags) +#define SWIG_PointerTypeFromString(c) SWIG_Tcl_PointerTypeFromString(c) +#define SWIG_GetArgs SWIG_Tcl_GetArgs +#define SWIG_GetConstantObj(key) SWIG_Tcl_GetConstantObj(key) +#define SWIG_ObjectConstructor SWIG_Tcl_ObjectConstructor +#define SWIG_Thisown(ptr) SWIG_Tcl_Thisown(ptr) +#define SWIG_ObjectDelete SWIG_Tcl_ObjectDelete + + +#define SWIG_TCL_DECL_ARGS_2(arg1, arg2) (Tcl_Interp *interp SWIGUNUSED, arg1, arg2) +#define SWIG_TCL_CALL_ARGS_2(arg1, arg2) (interp, arg1, arg2) +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +/* For backward compatibility only */ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_GetConstant SWIG_GetConstantObj +#define SWIG_Tcl_GetConstant SWIG_Tcl_GetConstantObj + +#include "assert.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Object support */ + +SWIGRUNTIME Tcl_HashTable* +SWIG_Tcl_ObjectTable(void) { + static Tcl_HashTable swigobjectTable; + static int swigobjectTableinit = 0; + if (!swigobjectTableinit) { + Tcl_InitHashTable(&swigobjectTable, TCL_ONE_WORD_KEYS); + swigobjectTableinit = 1; + } + return &swigobjectTable; +} + +/* Acquire ownership of a pointer */ +SWIGRUNTIME void +SWIG_Tcl_Acquire(void *ptr) { + int newobj; + Tcl_CreateHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr, &newobj); +} + +SWIGRUNTIME int +SWIG_Tcl_Thisown(void *ptr) { + if (Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr)) { + return 1; + } + return 0; +} + +/* Disown a pointer. Returns 1 if we owned it to begin with */ +SWIGRUNTIME int +SWIG_Tcl_Disown(void *ptr) { + Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr); + if (entryPtr) { + Tcl_DeleteHashEntry(entryPtr); + return 1; + } + return 0; +} + +/* Convert a pointer value */ +SWIGRUNTIME int +SWIG_Tcl_ConvertPtrFromString(Tcl_Interp *interp, const char *c, void **ptr, swig_type_info *ty, int flags) { + swig_cast_info *tc; + /* Pointer values must start with leading underscore */ + while (*c != '_') { + *ptr = (void *) 0; + if (strcmp(c,"NULL") == 0) return SWIG_OK; + + /* Empty string: not a pointer */ + if (*c == 0) return SWIG_ERROR; + + /* Hmmm. It could be an object name. */ + + /* Check if this is a command at all. Prevents cget -this */ + /* from being called when c is not a command, firing the unknown proc */ + if (Tcl_VarEval(interp,"info commands ", c, (char *) NULL) == TCL_OK) { + Tcl_Obj *result = Tcl_GetObjResult(interp); + if (*(Tcl_GetStringFromObj(result, NULL)) == 0) { + /* It's not a command, so it can't be a pointer */ + Tcl_ResetResult(interp); + return SWIG_ERROR; + } + } else { + /* This will only fail if the argument is multiple words. */ + /* Multiple words are also not commands. */ + Tcl_ResetResult(interp); + return SWIG_ERROR; + } + + /* Check if this is really a SWIG pointer */ + if (Tcl_VarEval(interp,c," cget -this", (char *) NULL) != TCL_OK) { + Tcl_ResetResult(interp); + return SWIG_ERROR; + } + + c = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), NULL); + } + + c++; + c = SWIG_UnpackData(c,ptr,sizeof(void *)); + if (ty) { + tc = c ? SWIG_TypeCheck(c,ty) : 0; + if (!tc) { + return SWIG_ERROR; + } + if (flags & SWIG_POINTER_DISOWN) { + SWIG_Disown((void *) *ptr); + } + { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,(void *) *ptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } + } + return SWIG_OK; +} + +/* Convert a pointer value */ +SWIGRUNTIMEINLINE int +SWIG_Tcl_ConvertPtr(Tcl_Interp *interp, Tcl_Obj *oc, void **ptr, swig_type_info *ty, int flags) { + return SWIG_Tcl_ConvertPtrFromString(interp, Tcl_GetStringFromObj(oc,NULL), ptr, ty, flags); +} + +/* Convert a pointer value */ +SWIGRUNTIME char * +SWIG_Tcl_PointerTypeFromString(char *c) { + char d; + /* Pointer values must start with leading underscore. NULL has no type */ + if (*c != '_') { + return 0; + } + c++; + /* Extract hex value from pointer */ + while ((d = *c)) { + if (!(((d >= '0') && (d <= '9')) || ((d >= 'a') && (d <= 'f')))) break; + c++; + } + return c; +} + +/* Convert a packed value value */ +SWIGRUNTIME int +SWIG_Tcl_ConvertPacked(Tcl_Interp *SWIGUNUSEDPARM(interp) , Tcl_Obj *obj, void *ptr, int sz, swig_type_info *ty) { + swig_cast_info *tc; + const char *c; + + if (!obj) goto type_error; + c = Tcl_GetStringFromObj(obj,NULL); + /* Pointer values must start with leading underscore */ + if (*c != '_') goto type_error; + c++; + c = SWIG_UnpackData(c,ptr,sz); + if (ty) { + tc = SWIG_TypeCheck(c,ty); + if (!tc) goto type_error; + } + return SWIG_OK; + + type_error: + + return SWIG_ERROR; +} + + +/* Take a pointer and convert it to a string */ +SWIGRUNTIME void +SWIG_Tcl_MakePtr(char *c, void *ptr, swig_type_info *ty, int flags) { + if (ptr) { + *(c++) = '_'; + c = SWIG_PackData(c,&ptr,sizeof(void *)); + strcpy(c,ty->name); + } else { + strcpy(c,(char *)"NULL"); + } + flags = 0; +} + +/* Create a new pointer object */ +SWIGRUNTIMEINLINE Tcl_Obj * +SWIG_Tcl_NewPointerObj(void *ptr, swig_type_info *type, int flags) { + Tcl_Obj *robj; + char result[SWIG_BUFFER_SIZE]; + SWIG_MakePtr(result,ptr,type,flags); + robj = Tcl_NewStringObj(result,-1); + return robj; +} + +SWIGRUNTIME Tcl_Obj * +SWIG_Tcl_NewPackedObj(void *ptr, int sz, swig_type_info *type) { + char result[1024]; + char *r = result; + if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + strcpy(r,type->name); + return Tcl_NewStringObj(result,-1); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +SWIGRUNTIME swig_module_info * +SWIG_Tcl_GetModule(Tcl_Interp *interp) { + const char *data; + swig_module_info *ret = 0; + + /* first check if pointer already created */ + data = Tcl_GetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TCL_GLOBAL_ONLY); + if (data) { + SWIG_UnpackData(data, &ret, sizeof(swig_type_info **)); + } + + return ret; +} + +SWIGRUNTIME void +SWIG_Tcl_SetModule(Tcl_Interp *interp, swig_module_info *module) { + char buf[SWIG_BUFFER_SIZE]; + char *data; + + /* create a new pointer */ + data = SWIG_PackData(buf, &module, sizeof(swig_type_info **)); + *data = 0; + Tcl_SetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, buf, TCL_GLOBAL_ONLY); +} + +/* -----------------------------------------------------------------------------* + * Object auxiliars + * -----------------------------------------------------------------------------*/ + + +SWIGRUNTIME void +SWIG_Tcl_ObjectDelete(ClientData clientData) { + swig_instance *si = (swig_instance *) clientData; + if ((si) && (si->destroy) && (SWIG_Disown(si->thisvalue))) { + if (si->classptr->destructor) { + (si->classptr->destructor)(si->thisvalue); + } + } + Tcl_DecrRefCount(si->thisptr); + free(si); +} + +/* Function to invoke object methods given an instance */ +SWIGRUNTIME int +SWIG_Tcl_MethodCommand(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST _objv[]) { + char *method, *attrname; + swig_instance *inst = (swig_instance *) clientData; + swig_method *meth; + swig_attribute *attr; + Tcl_Obj *oldarg; + Tcl_Obj **objv; + int rcode; + swig_class *cls; + swig_class *cls_stack[64]; + int cls_stack_bi[64]; + int cls_stack_top = 0; + int numconf = 2; + int bi; + + objv = (Tcl_Obj **) _objv; + if (objc < 2) { + Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); + return TCL_ERROR; + } + method = Tcl_GetStringFromObj(objv[1],NULL); + if (strcmp(method,"-acquire") == 0) { + inst->destroy = 1; + SWIG_Acquire(inst->thisvalue); + return TCL_OK; + } + if (strcmp(method,"-disown") == 0) { + if (inst->destroy) { + SWIG_Disown(inst->thisvalue); + } + inst->destroy = 0; + return TCL_OK; + } + if (strcmp(method,"-delete") == 0) { + Tcl_DeleteCommandFromToken(interp,inst->cmdtok); + return TCL_OK; + } + cls_stack[cls_stack_top] = inst->classptr; + cls_stack_bi[cls_stack_top] = -1; + cls = inst->classptr; + while (1) { + bi = cls_stack_bi[cls_stack_top]; + cls = cls_stack[cls_stack_top]; + if (bi != -1) { + if (!cls->bases[bi] && cls->base_names[bi]) { + /* lookup and cache the base class */ + swig_type_info *info = SWIG_TypeQueryModule(cls->module, cls->module, cls->base_names[bi]); + if (info) cls->bases[bi] = (swig_class *) info->clientdata; + } + cls = cls->bases[bi]; + if (cls) { + cls_stack_bi[cls_stack_top]++; + cls_stack_top++; + cls_stack[cls_stack_top] = cls; + cls_stack_bi[cls_stack_top] = -1; + continue; + } + } + if (!cls) { + cls_stack_top--; + if (cls_stack_top < 0) break; + else continue; + } + cls_stack_bi[cls_stack_top]++; + + Tcl_HashEntry* hashentry = Tcl_FindHashEntry(&(cls->hashtable), method); + if (hashentry) { + ClientData cd = Tcl_GetHashValue(hashentry); + swig_wrapper method_wrapper = (swig_wrapper)cd; + oldarg = objv[1]; + objv[1] = inst->thisptr; + Tcl_IncrRefCount(inst->thisptr); + rcode = (method_wrapper)(clientData,interp,objc,objv); + objv[1] = oldarg; + Tcl_DecrRefCount(inst->thisptr); + return rcode; + } + /* Check class methods for a match */ + if (strcmp(method,"cget") == 0) { + if (objc < 3) { + Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); + return TCL_ERROR; + } + attrname = Tcl_GetStringFromObj(objv[2],NULL); + attr = cls->attributes; + while (attr && attr->name) { + if ((strcmp(attr->name, attrname) == 0) && (attr->getmethod)) { + oldarg = objv[1]; + objv[1] = inst->thisptr; + Tcl_IncrRefCount(inst->thisptr); + rcode = (*attr->getmethod)(clientData,interp,2, objv); + objv[1] = oldarg; + Tcl_DecrRefCount(inst->thisptr); + return rcode; + } + attr++; + } + if (strcmp(attrname, "-this") == 0) { + Tcl_SetObjResult(interp, Tcl_DuplicateObj(inst->thisptr)); + return TCL_OK; + } + if (strcmp(attrname, "-thisown") == 0) { + if (SWIG_Thisown(inst->thisvalue)) { + Tcl_SetResult(interp,(char*)"1",TCL_STATIC); + } else { + Tcl_SetResult(interp,(char*)"0",TCL_STATIC); + } + return TCL_OK; + } + } else if (strcmp(method, "configure") == 0) { + int i; + if (objc < 4) { + Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); + return TCL_ERROR; + } + i = 2; + while (i < objc) { + attrname = Tcl_GetStringFromObj(objv[i],NULL); + attr = cls->attributes; + while (attr && attr->name) { + if ((strcmp(attr->name, attrname) == 0) && (attr->setmethod)) { + oldarg = objv[i]; + objv[i] = inst->thisptr; + Tcl_IncrRefCount(inst->thisptr); + rcode = (*attr->setmethod)(clientData,interp,3, &objv[i-1]); + objv[i] = oldarg; + Tcl_DecrRefCount(inst->thisptr); + if (rcode != TCL_OK) return rcode; + numconf += 2; + } + attr++; + } + i+=2; + } + } + } + if (strcmp(method,"configure") == 0) { + if (numconf >= objc) { + return TCL_OK; + } else { + Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); + return TCL_ERROR; + } + } + if (strcmp(method,"cget") == 0) { + Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); + return TCL_ERROR; + } + Tcl_SetResult(interp, (char *) "Invalid method. Must be one of: configure cget -acquire -disown -delete", TCL_STATIC); + cls = inst->classptr; + bi = 0; + while (cls) { + meth = cls->methods; + while (meth && meth->name) { + char *cr = (char *) Tcl_GetStringResult(interp); + size_t meth_len = strlen(meth->name); + char* where = strchr(cr,':'); + while(where) { + where = strstr(where, meth->name); + if(where) { + if(where[-1] == ' ' && (where[meth_len] == ' ' || where[meth_len]==0)) { + break; + } else { + where++; + } + } + } + + if (!where) + Tcl_AppendElement(interp, (char *) meth->name); + meth++; + } + cls = inst->classptr->bases[bi++]; + } + return TCL_ERROR; +} + +/* This function takes the current result and turns it into an object command */ +SWIGRUNTIME Tcl_Obj * +SWIG_Tcl_NewInstanceObj(Tcl_Interp *interp, void *thisvalue, swig_type_info *type, int flags) { + Tcl_Obj *robj = SWIG_NewPointerObj(thisvalue, type,0); + /* Check to see if this pointer belongs to a class or not */ + if (thisvalue && (type->clientdata) && (interp)) { + Tcl_CmdInfo ci; + char *name; + name = Tcl_GetStringFromObj(robj,NULL); + if (!Tcl_GetCommandInfo(interp,name, &ci) || (flags)) { + swig_instance *newinst = (swig_instance *) malloc(sizeof(swig_instance)); + newinst->thisptr = Tcl_DuplicateObj(robj); + Tcl_IncrRefCount(newinst->thisptr); + newinst->thisvalue = thisvalue; + newinst->classptr = (swig_class *) type->clientdata; + newinst->destroy = flags; + newinst->cmdtok = Tcl_CreateObjCommand(interp, Tcl_GetStringFromObj(robj,NULL), (swig_wrapper_func) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); + if (flags) { + SWIG_Acquire(thisvalue); + } + } + } + return robj; +} + +/* Function to create objects */ +SWIGRUNTIME int +SWIG_Tcl_ObjectConstructor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *newObj = 0; + void *thisvalue = 0; + swig_instance *newinst = 0; + swig_class *classptr = (swig_class *) clientData; + swig_wrapper cons = 0; + char *name = 0; + int firstarg = 0; + int thisarg = 0; + int destroy = 1; + + if (!classptr) { + Tcl_SetResult(interp, (char *) "swig: internal runtime error. No class object defined.", TCL_STATIC); + return TCL_ERROR; + } + cons = classptr->constructor; + if (objc > 1) { + char *s = Tcl_GetStringFromObj(objv[1],NULL); + if (strcmp(s,"-this") == 0) { + thisarg = 2; + cons = 0; + } else if (strcmp(s,"-args") == 0) { + firstarg = 1; + } else if (objc == 2) { + firstarg = 1; + name = s; + } else if (objc >= 3) { + char *s1; + name = s; + s1 = Tcl_GetStringFromObj(objv[2],NULL); + if (strcmp(s1,"-this") == 0) { + thisarg = 3; + cons = 0; + } else { + firstarg = 1; + } + } + } + if (cons) { + int result; + result = (*cons)(0, interp, objc-firstarg, &objv[firstarg]); + if (result != TCL_OK) { + return result; + } + newObj = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); + if (!name) name = Tcl_GetStringFromObj(newObj,NULL); + } else if (thisarg > 0) { + if (thisarg < objc) { + destroy = 0; + newObj = Tcl_DuplicateObj(objv[thisarg]); + if (!name) name = Tcl_GetStringFromObj(newObj,NULL); + } else { + Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); + return TCL_ERROR; + } + } else { + Tcl_SetResult(interp, (char *) "No constructor available.", TCL_STATIC); + return TCL_ERROR; + } + if (SWIG_Tcl_ConvertPtr(interp,newObj, (void **) &thisvalue, *(classptr->type), 0) != SWIG_OK) { + Tcl_DecrRefCount(newObj); + return TCL_ERROR; + } + newinst = (swig_instance *) malloc(sizeof(swig_instance)); + newinst->thisptr = newObj; + Tcl_IncrRefCount(newObj); + newinst->thisvalue = thisvalue; + newinst->classptr = classptr; + newinst->destroy = destroy; + if (destroy) { + SWIG_Acquire(thisvalue); + } + newinst->cmdtok = Tcl_CreateObjCommand(interp,name, (swig_wrapper) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); + return TCL_OK; +} + +/* -----------------------------------------------------------------------------* + * Get arguments + * -----------------------------------------------------------------------------*/ +SWIGRUNTIME int +SWIG_Tcl_GetArgs(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], const char *fmt, ...) { + int argno = 0, opt = 0; + long tempi; + double tempd; + const char *c; + va_list ap; + void *vptr; + Tcl_Obj *obj = 0; + swig_type_info *ty; + + va_start(ap,fmt); + for (c = fmt; (*c && (*c != ':') && (*c != ';')); c++,argno++) { + if (*c == '|') { + opt = 1; + c++; + } + if (argno >= (objc-1)) { + if (!opt) { + Tcl_SetResult(interp, (char *) "Wrong number of arguments ", TCL_STATIC); + goto argerror; + } else { + va_end(ap); + return TCL_OK; + } + } + + vptr = va_arg(ap,void *); + if (vptr) { + if (isupper(*c)) { + obj = SWIG_Tcl_GetConstantObj(Tcl_GetStringFromObj(objv[argno+1],0)); + if (!obj) obj = objv[argno+1]; + } else { + obj = objv[argno+1]; + } + switch(*c) { + case 'i': case 'I': + case 'l': case 'L': + case 'h': case 'H': + case 'b': case 'B': + if (Tcl_GetLongFromObj(interp,obj,&tempi) != TCL_OK) goto argerror; + if ((*c == 'i') || (*c == 'I')) *((int *)vptr) = (int)tempi; + else if ((*c == 'l') || (*c == 'L')) *((long *)vptr) = (long)tempi; + else if ((*c == 'h') || (*c == 'H')) *((short*)vptr) = (short)tempi; + else if ((*c == 'b') || (*c == 'B')) *((unsigned char *)vptr) = (unsigned char)tempi; + break; + case 'f': case 'F': + case 'd': case 'D': + if (Tcl_GetDoubleFromObj(interp,obj,&tempd) != TCL_OK) goto argerror; + if ((*c == 'f') || (*c == 'F')) *((float *) vptr) = (float)tempd; + else if ((*c == 'd') || (*c == 'D')) *((double*) vptr) = tempd; + break; + case 's': case 'S': + if (*(c+1) == '#') { + int *vlptr = (int *) va_arg(ap, void *); + *((char **) vptr) = Tcl_GetStringFromObj(obj, vlptr); + c++; + } else { + *((char **)vptr) = Tcl_GetStringFromObj(obj,NULL); + } + break; + case 'c': case 'C': + *((char *)vptr) = *(Tcl_GetStringFromObj(obj,NULL)); + break; + case 'p': case 'P': + ty = (swig_type_info *) va_arg(ap, void *); + if (SWIG_Tcl_ConvertPtr(interp, obj, (void **) vptr, ty, 0) != SWIG_OK) goto argerror; + break; + case 'o': case 'O': + *((Tcl_Obj **)vptr) = objv[argno+1]; + break; + default: + break; + } + } + } + + if ((*c != ';') && ((objc-1) > argno)) { + Tcl_SetResult(interp, (char *) "Wrong # args.", TCL_STATIC); + goto argerror; + } + va_end(ap); + return TCL_OK; + + argerror: + { + char temp[32]; + sprintf(temp,"%d", argno+1); + c = strchr(fmt,':'); + if (!c) c = strchr(fmt,';'); + if (!c) c = (char *)""; + Tcl_AppendResult(interp,c," argument ", temp, NULL); + va_end(ap); + return TCL_ERROR; + } +} + +#ifdef __cplusplus +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_OTCallback swig_types[0] +#define SWIGTYPE_p_OTCaller swig_types[1] +#define SWIGTYPE_p_OTDB__Acct swig_types[2] +#define SWIGTYPE_p_OTDB__AddressBook swig_types[3] +#define SWIGTYPE_p_OTDB__AskData swig_types[4] +#define SWIGTYPE_p_OTDB__BidData swig_types[5] +#define SWIGTYPE_p_OTDB__BitcoinAcct swig_types[6] +#define SWIGTYPE_p_OTDB__BitcoinServer swig_types[7] +#define SWIGTYPE_p_OTDB__Blob swig_types[8] +#define SWIGTYPE_p_OTDB__Contact swig_types[9] +#define SWIGTYPE_p_OTDB__ContactAcct swig_types[10] +#define SWIGTYPE_p_OTDB__ContactNym swig_types[11] +#define SWIGTYPE_p_OTDB__Displayable swig_types[12] +#define SWIGTYPE_p_OTDB__LoomServer swig_types[13] +#define SWIGTYPE_p_OTDB__MarketData swig_types[14] +#define SWIGTYPE_p_OTDB__MarketList swig_types[15] +#define SWIGTYPE_p_OTDB__OTDBString swig_types[16] +#define SWIGTYPE_p_OTDB__OfferDataMarket swig_types[17] +#define SWIGTYPE_p_OTDB__OfferDataNym swig_types[18] +#define SWIGTYPE_p_OTDB__OfferListMarket swig_types[19] +#define SWIGTYPE_p_OTDB__OfferListNym swig_types[20] +#define SWIGTYPE_p_OTDB__RippleServer swig_types[21] +#define SWIGTYPE_p_OTDB__Server swig_types[22] +#define SWIGTYPE_p_OTDB__ServerInfo swig_types[23] +#define SWIGTYPE_p_OTDB__Storable swig_types[24] +#define SWIGTYPE_p_OTDB__Storage swig_types[25] +#define SWIGTYPE_p_OTDB__StringMap swig_types[26] +#define SWIGTYPE_p_OTDB__TradeDataMarket swig_types[27] +#define SWIGTYPE_p_OTDB__TradeDataNym swig_types[28] +#define SWIGTYPE_p_OTDB__TradeListMarket swig_types[29] +#define SWIGTYPE_p_OTDB__TradeListNym swig_types[30] +#define SWIGTYPE_p_OTDB__WalletData swig_types[31] +#define SWIGTYPE_p_OTPacker swig_types[32] +#define SWIGTYPE_p_char swig_types[33] +#define SWIGTYPE_p_std__mapT_std__string_std__string_t swig_types[34] +#define SWIGTYPE_p_std__vectorT_unsigned_char_t swig_types[35] +static swig_type_info *swig_types[37]; +static swig_module_info swig_module = {swig_types, 36, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#define SWIG_init Otapi_Init +#define SWIG_name "otapi" +#define SWIG_prefix "" +#define SWIG_version "0.0" + +#define SWIGVERSION 0x020004 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) + + +#include + + + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef MAC_TCL +#pragma export on +#endif +SWIGEXPORT int SWIG_init(Tcl_Interp *); +#ifdef MAC_TCL +#pragma export off +#endif +#ifdef __cplusplus +} +#endif + +/* Compatibility version for TCL stubs */ +#ifndef SWIG_TCL_STUBS_VERSION +#define SWIG_TCL_STUBS_VERSION "8.1" +#endif + + + +#include +#include +#include "../OTLib/OTAsymmetricKey.h" +#include "OTAPI_funcdef.h" +#include "../OTLib/OTStorage.h" + + +#include + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERNINLINE Tcl_Obj * +SWIG_FromCharPtrAndSize(const char* carray, size_t size) +{ + return (size < INT_MAX) ? Tcl_NewStringObj(carray, static_cast< int >(size)) : NULL; +} + + +SWIGINTERNINLINE Tcl_Obj * +SWIG_From_std_string (const std::string& s) +{ + return SWIG_FromCharPtrAndSize(s.data(), s.size()); +} + + +SWIGINTERNINLINE Tcl_Obj * +SWIG_FromCharPtr(const char *cptr) +{ + return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); +} + + + #define SWIG_From_bool Tcl_NewBooleanObj + + +SWIGINTERN int +SWIG_AsCharPtrAndSize(Tcl_Obj *obj, char** cptr, size_t* psize, int *alloc) +{ + int len = 0; + char *cstr = Tcl_GetStringFromObj(obj, &len); + if (cstr) { + if (cptr) *cptr = cstr; + if (psize) *psize = len + 1; + if (alloc) *alloc = SWIG_OLDOBJ; + return SWIG_OK; + } + return SWIG_TypeError; +} + + + + + +SWIGINTERNINLINE Tcl_Obj* +SWIG_From_long (long value) +{ + if (((long) INT_MIN <= value) && (value <= (long) INT_MAX)) { + return Tcl_NewIntObj(static_cast< int >(value)); + } else { + return Tcl_NewLongObj(value); + } +} + + +SWIGINTERNINLINE Tcl_Obj * +SWIG_From_int (int value) +{ + return SWIG_From_long (value); +} + + +SWIGINTERN int +SWIG_AsVal_long SWIG_TCL_DECL_ARGS_2(Tcl_Obj *obj, long* val) +{ + long v; + if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { + if (val) *val = (long) v; + return SWIG_OK; + } + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int SWIG_TCL_DECL_ARGS_2(Tcl_Obj * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long SWIG_TCL_CALL_ARGS_2(obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = static_cast< int >(v); + } + } + return res; +} + + +SWIGINTERN int +SWIG_AsPtr_std_string SWIG_TCL_DECL_ARGS_2(Tcl_Obj * obj, std::string **val) +{ + char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; + if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { + if (buf) { + if (val) *val = new std::string(buf, size - 1); + if (alloc == SWIG_NEWOBJ) delete[] buf; + return SWIG_NEWOBJ; + } else { + if (val) *val = 0; + return SWIG_OLDOBJ; + } + } else { + static int init = 0; + static swig_type_info* descriptor = 0; + if (!init) { + descriptor = SWIG_TypeQuery("std::string" " *"); + init = 1; + } + if (descriptor) { + std::string *vptr; + int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); + if (SWIG_IsOK(res) && val) *val = vptr; + return res; + } + } + return SWIG_ERROR; +} + + +#include +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif + + +SWIGINTERNINLINE Tcl_Obj* +SWIG_From_unsigned_SS_long (unsigned long value) +{ + if (value < (unsigned long) LONG_MAX) { + return SWIG_From_long (static_cast< long >(value)); + } else { + char temp[256]; + sprintf(temp, "%lu", value); + return Tcl_NewStringObj(temp,-1); + } +} + + +SWIGINTERNINLINE Tcl_Obj * +SWIG_From_size_t (size_t value) +{ + return SWIG_From_unsigned_SS_long (static_cast< unsigned long >(value)); +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long SWIG_TCL_DECL_ARGS_2(Tcl_Obj *obj, unsigned long *val) { + long v; + if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { + if (v >= 0) { + if (val) *val = (unsigned long) v; + return SWIG_OK; + } + /* If v is negative, then this could be a negative number, or an + unsigned value which doesn't fit in a signed long, so try to + get it as a string so we can distinguish these cases. */ + } + { + int len = 0; + const char *nptr = Tcl_GetStringFromObj(obj, &len); + if (nptr && len > 0) { + char *endptr; + unsigned long v; + if (*nptr == '-') return SWIG_OverflowError; + errno = 0; + v = strtoul(nptr, &endptr,0); + if (nptr[0] == '\0' || *endptr != '\0') + return SWIG_TypeError; + if (v == ULONG_MAX && errno == ERANGE) { + errno = 0; + return SWIG_OverflowError; + } else { + if (*endptr == '\0') { + if (val) *val = v; + return SWIG_OK; + } + } + } + } + + return SWIG_TypeError; +} + + +SWIGINTERNINLINE int +SWIG_AsVal_size_t SWIG_TCL_DECL_ARGS_2(Tcl_Obj * obj, size_t *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long SWIG_TCL_CALL_ARGS_2(obj, val ? &v : 0); + if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); + return res; +} + + +SWIGINTERN int +SWIG_AsVal_bool SWIG_TCL_DECL_ARGS_2(Tcl_Obj *obj, bool *val) +{ + int v; + if (Tcl_GetBooleanFromObj(0, obj, &v) == TCL_OK) { + if (val) *val = v ? true : false; + return SWIG_OK; + } + return SWIG_TypeError; +} + + + using namespace OTDB; + +#ifdef __cplusplus +extern "C" { +#endif +SWIGINTERN int +_wrap_new_OTCallback(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCallback *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":new_OTCallback ") == TCL_ERROR) SWIG_fail; + result = (OTCallback *)new OTCallback(); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTCallback,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_delete_OTCallback(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OTCallback self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCallback, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCallback" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCallback_runOne(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCallback_runOne self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runOne" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + result = (arg1)->runOne(); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCallback_runTwo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCallback *arg1 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCallback_runTwo self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCallback_runTwo" "', argument " "1"" of type '" "OTCallback *""'"); + } + arg1 = reinterpret_cast< OTCallback * >(argp1); + result = (arg1)->runTwo(); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OTCallback(void *obj) { +OTCallback *arg1 = (OTCallback *) obj; +delete arg1; +} +static swig_method swig_OTCallback_methods[] = { + {"runOne", _wrap_OTCallback_runOne}, + {"runTwo", _wrap_OTCallback_runTwo}, + {0,0} +}; +static swig_attribute swig_OTCallback_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTCallback_bases[] = {0}; +static const char * swig_OTCallback_base_names[] = {0}; +static swig_class _wrap_class_OTCallback = { "OTCallback", &SWIGTYPE_p_OTCallback,_wrap_new_OTCallback, swig_delete_OTCallback, swig_OTCallback_methods, swig_OTCallback_attributes, swig_OTCallback_bases,swig_OTCallback_base_names, &swig_module }; +SWIGINTERN int +_wrap_new_OTCaller(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":new_OTCaller ") == TCL_ERROR) SWIG_fail; + result = (OTCaller *)new OTCaller(); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTCaller,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_delete_OTCaller(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OTCaller self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTCaller" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_GetPassword(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCaller_GetPassword self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_GetPassword" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (char *)(arg1)->GetPassword(); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_delCallback(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCaller_delCallback self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_delCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->delCallback(); + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_setCallback(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + OTCallback *arg2 = (OTCallback *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OTCaller_setCallback self cb ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_setCallback" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2,SWIGTYPE_p_OTCallback, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTCaller_setCallback" "', argument " "2"" of type '" "OTCallback *""'"); + } + arg2 = reinterpret_cast< OTCallback * >(argp2); + (arg1)->setCallback(arg2); + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_isCallbackSet(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCaller_isCallbackSet self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_isCallbackSet" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)(arg1)->isCallbackSet(); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_callOne(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCaller_callOne self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callOne" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callOne(); + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTCaller_callTwo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = (OTCaller *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTCaller_callTwo self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTCaller, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTCaller_callTwo" "', argument " "1"" of type '" "OTCaller *""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + (arg1)->callTwo(); + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OTCaller(void *obj) { +OTCaller *arg1 = (OTCaller *) obj; +delete arg1; +} +static swig_method swig_OTCaller_methods[] = { + {"GetPassword", _wrap_OTCaller_GetPassword}, + {"delCallback", _wrap_OTCaller_delCallback}, + {"setCallback", _wrap_OTCaller_setCallback}, + {"isCallbackSet", _wrap_OTCaller_isCallbackSet}, + {"callOne", _wrap_OTCaller_callOne}, + {"callTwo", _wrap_OTCaller_callTwo}, + {0,0} +}; +static swig_attribute swig_OTCaller_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTCaller_bases[] = {0}; +static const char * swig_OTCaller_base_names[] = {0}; +static swig_class _wrap_class_OTCaller = { "OTCaller", &SWIGTYPE_p_OTCaller,_wrap_new_OTCaller, swig_delete_OTCaller, swig_OTCaller_methods, swig_OTCaller_attributes, swig_OTCaller_bases,swig_OTCaller_base_names, &swig_module }; +SWIGINTERN int +_wrap_OT_API_Set_PasswordCallback(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTCaller *arg1 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Set_PasswordCallback theCaller ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1, SWIGTYPE_p_OTCaller, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OT_API_Set_PasswordCallback" "', argument " "1"" of type '" "OTCaller &""'"); + } + arg1 = reinterpret_cast< OTCaller * >(argp1); + result = (bool)OT_API_Set_PasswordCallback(*arg1); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Init(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Init szClientPath ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Init" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Init((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadWallet(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_LoadWallet szWalletFilename ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_LoadWallet((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SwitchWallet(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_SwitchWallet szDataFolderPath szWalletFilename ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SwitchWallet" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SwitchWallet" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SwitchWallet((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetMemlogSize(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_GetMemlogSize ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_GetMemlogSize(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetMemlogAtIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetMemlogAtIndex nIndex ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetMemlogAtIndex" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetMemlogAtIndex(arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_PeekMemlogFront(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_PeekMemlogFront ") == TCL_ERROR) SWIG_fail; + result = (char *)OT_API_PeekMemlogFront(); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_PeekMemlogBack(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_PeekMemlogBack ") == TCL_ERROR) SWIG_fail; + result = (char *)OT_API_PeekMemlogBack(); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_PopMemlogFront(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_PopMemlogFront ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_PopMemlogFront(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_PopMemlogBack(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_PopMemlogBack ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_PopMemlogBack(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_CreateNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_CreateNym ") == TCL_ERROR) SWIG_fail; + result = (char *)OT_API_CreateNym(); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_AddServerContract(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_AddServerContract szContract ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddServerContract((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_AddAssetContract(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_AddAssetContract szContract ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_AddAssetContract((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetServerCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_GetServerCount ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_GetServerCount(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAssetTypeCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_GetAssetTypeCount ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_GetAssetTypeCount(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_GetAccountCount ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_GetAccountCount(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNymCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_GetNymCount ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_GetNymCount(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetServer_ID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetServer_ID nIndex ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetServer_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetServer_ID(arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetServer_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetServer_Name SERVER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetServer_Name((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAssetType_ID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAssetType_ID nIndex ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAssetType_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAssetType_ID(arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAssetType_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAssetType_Name ASSET_TYPE_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAssetType_Name((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_ID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_ID nIndex ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetAccountWallet_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetAccountWallet_ID(arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_Name ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Name((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_Balance(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_Balance ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Balance" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Balance((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_Type(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_Type ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_Type" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_Type((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_AssetTypeID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_AssetTypeID ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_AssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_AssetTypeID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_ServerID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_ServerID ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_ServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_ServerID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetAccountWallet_NymID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetAccountWallet_NymID ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetAccountWallet_NymID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetAccountWallet_NymID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_VerifyAccountReceipt(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_VerifyAccountReceipt SERVER_ID NYM_ID ACCT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_VerifyAccountReceipt" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_VerifyAccountReceipt((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_TransactionNumCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_TransactionNumCount SERVER_ID NYM_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GetNym_TransactionNumCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_GetNym_TransactionNumCount((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_ID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int arg1 ; + int val1 ; + int ecode1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetNym_ID nIndex ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "OT_API_GetNym_ID" "', argument " "1"" of type '" "int""'"); + } + arg1 = static_cast< int >(val1); + result = (char *)OT_API_GetNym_ID(arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetNym_Name NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Name((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_Stats(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetNym_Stats NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_Stats" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_GetNym_Stats((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_IsNym_RegisteredAtServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_IsNym_RegisteredAtServer NYM_ID SERVER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_IsNym_RegisteredAtServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_IsNym_RegisteredAtServer((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_MailCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetNym_MailCount NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_MailCount((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_MailContentsByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_MailContentsByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailContentsByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_MailSenderIDByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_MailSenderIDByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailSenderIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailSenderIDByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_MailServerIDByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_MailServerIDByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_MailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_MailServerIDByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Nym_RemoveMailByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Nym_RemoveMailByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveMailByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Nym_VerifyMailByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Nym_VerifyMailByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyMailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyMailByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_OutmailCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_GetNym_OutmailCount NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_GetNym_OutmailCount((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_OutmailContentsByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_OutmailContentsByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailContentsByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailContentsByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_OutmailRecipientIDByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_OutmailRecipientIDByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailRecipientIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailRecipientIDByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GetNym_OutmailServerIDByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GetNym_OutmailServerIDByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_GetNym_OutmailServerIDByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_GetNym_OutmailServerIDByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Nym_RemoveOutmailByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Nym_RemoveOutmailByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_RemoveOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_RemoveOutmailByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Nym_VerifyOutmailByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Nym_VerifyOutmailByIndex NYM_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Nym_VerifyOutmailByIndex" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (int)OT_API_Nym_VerifyOutmailByIndex((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_CanRemoveServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_CanRemoveServer SERVER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveServer((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_RemoveServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_RemoveServer SERVER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveServer((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_CanRemoveAssetType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_CanRemoveAssetType ASSET_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAssetType((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_RemoveAssetType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_RemoveAssetType ASSET_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveAssetType((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_CanRemoveNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_CanRemoveNym NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveNym((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_RemoveNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_RemoveNym NYM_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_RemoveNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_RemoveNym((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_CanRemoveAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Wallet_CanRemoveAccount ACCOUNT_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_CanRemoveAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Wallet_CanRemoveAccount((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_ImportNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Wallet_ImportNym DISPLAY_NAME KEY_FILE_CONTENTS ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportNym" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportNym" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_Wallet_ImportNym((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SetNym_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_SetNym_Name NYM_ID SIGNER_NYM_ID NYM_NEW_NAME ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetNym_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetNym_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetNym_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetNym_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SetAccountWallet_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_SetAccountWallet_Name ACCT_ID SIGNER_NYM_ID ACCT_NEW_NAME ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SetAccountWallet_Name" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_SetAccountWallet_Name((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SetAssetType_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_SetAssetType_Name ASSET_ID STR_NEW_NAME ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetAssetType_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetAssetType_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetAssetType_Name((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SetServer_Name(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_SetServer_Name SERVER_ID STR_NEW_NAME ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SetServer_Name" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SetServer_Name" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (int)OT_API_SetServer_Name((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_VerifyAndRetrieveXMLContents(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_VerifyAndRetrieveXMLContents THE_CONTRACT USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_VerifyAndRetrieveXMLContents" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_VerifyAndRetrieveXMLContents((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_WriteCheque(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooooooo:OT_API_WriteCheque SERVER_ID CHEQUE_AMOUNT VALID_FROM VALID_TO SENDER_ACCT_ID SENDER_USER_ID CHEQUE_MEMO RECIPIENT_USER_ID ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_WriteCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_WriteCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_WriteCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_WriteCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_WriteCheque" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(objv[6], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_WriteCheque" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(objv[7], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_WriteCheque" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(objv[8], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_WriteCheque" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + result = (char *)OT_API_WriteCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_ProposePaymentPlan(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + char *arg11 = (char *) 0 ; + char *arg12 = (char *) 0 ; + char *arg13 = (char *) 0 ; + char *arg14 = (char *) 0 ; + char *arg15 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int res11 ; + char *buf11 = 0 ; + int alloc11 = 0 ; + int res12 ; + char *buf12 = 0 ; + int alloc12 = 0 ; + int res13 ; + char *buf13 = 0 ; + int alloc13 = 0 ; + int res14 ; + char *buf14 = 0 ; + int alloc14 = 0 ; + int res15 ; + char *buf15 = 0 ; + int alloc15 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooooooooooooo:OT_API_ProposePaymentPlan SERVER_ID VALID_FROM VALID_TO SENDER_ACCT_ID SENDER_USER_ID PLAN_CONSIDERATION RECIPIENT_ACCT_ID RECIPIENT_USER_ID INITIAL_PAYMENT_AMOUNT INITIAL_PAYMENT_DELAY PAYMENT_PLAN_AMOUNT PAYMENT_PLAN_DELAY PAYMENT_PLAN_PERIOD PAYMENT_PLAN_LENGTH PAYMENT_PLAN_MAX_PAYMENTS ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ProposePaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ProposePaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ProposePaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ProposePaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ProposePaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(objv[6], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_ProposePaymentPlan" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(objv[7], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_ProposePaymentPlan" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(objv[8], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_ProposePaymentPlan" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(objv[9], &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_ProposePaymentPlan" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(objv[10], &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_ProposePaymentPlan" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + res11 = SWIG_AsCharPtrAndSize(objv[11], &buf11, NULL, &alloc11); + if (!SWIG_IsOK(res11)) { + SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "OT_API_ProposePaymentPlan" "', argument " "11"" of type '" "char const *""'"); + } + arg11 = reinterpret_cast< char * >(buf11); + res12 = SWIG_AsCharPtrAndSize(objv[12], &buf12, NULL, &alloc12); + if (!SWIG_IsOK(res12)) { + SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "OT_API_ProposePaymentPlan" "', argument " "12"" of type '" "char const *""'"); + } + arg12 = reinterpret_cast< char * >(buf12); + res13 = SWIG_AsCharPtrAndSize(objv[13], &buf13, NULL, &alloc13); + if (!SWIG_IsOK(res13)) { + SWIG_exception_fail(SWIG_ArgError(res13), "in method '" "OT_API_ProposePaymentPlan" "', argument " "13"" of type '" "char const *""'"); + } + arg13 = reinterpret_cast< char * >(buf13); + res14 = SWIG_AsCharPtrAndSize(objv[14], &buf14, NULL, &alloc14); + if (!SWIG_IsOK(res14)) { + SWIG_exception_fail(SWIG_ArgError(res14), "in method '" "OT_API_ProposePaymentPlan" "', argument " "14"" of type '" "char const *""'"); + } + arg14 = reinterpret_cast< char * >(buf14); + res15 = SWIG_AsCharPtrAndSize(objv[15], &buf15, NULL, &alloc15); + if (!SWIG_IsOK(res15)) { + SWIG_exception_fail(SWIG_ArgError(res15), "in method '" "OT_API_ProposePaymentPlan" "', argument " "15"" of type '" "char const *""'"); + } + arg15 = reinterpret_cast< char * >(buf15); + result = (char *)OT_API_ProposePaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,(char const *)arg11,(char const *)arg12,(char const *)arg13,(char const *)arg14,(char const *)arg15); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + if (alloc11 == SWIG_NEWOBJ) delete[] buf11; + if (alloc12 == SWIG_NEWOBJ) delete[] buf12; + if (alloc13 == SWIG_NEWOBJ) delete[] buf13; + if (alloc14 == SWIG_NEWOBJ) delete[] buf14; + if (alloc15 == SWIG_NEWOBJ) delete[] buf15; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_ConfirmPaymentPlan(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_ConfirmPaymentPlan SERVER_ID SENDER_USER_ID SENDER_ACCT_ID RECIPIENT_USER_ID PAYMENT_PLAN ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConfirmPaymentPlan" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_ConfirmPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadUserPubkey(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_LoadUserPubkey USER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadUserPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadUserPubkey((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadPubkey(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_LoadPubkey USER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPubkey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadPubkey((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_VerifyUserPrivateKey(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_VerifyUserPrivateKey USER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_VerifyUserPrivateKey" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_VerifyUserPrivateKey((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadPurse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_LoadPurse SERVER_ID ASSET_TYPE_ID USER_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadPurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadMint(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_LoadMint SERVER_ID ASSET_TYPE_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadMint((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadAssetContract(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_LoadAssetContract ASSET_TYPE_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadAssetContract((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadServerContract(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_LoadServerContract SERVER_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadServerContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_LoadServerContract((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Mint_IsStillGood(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Mint_IsStillGood SERVER_ID USER_ID ASSET_TYPE_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Mint_IsStillGood" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Mint_IsStillGood" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Mint_IsStillGood" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Mint_IsStillGood((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_IsBasketCurrency(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_IsBasketCurrency ASSET_TYPE_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_IsBasketCurrency" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_IsBasketCurrency((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Basket_GetMemberCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Basket_GetMemberCount BASKET_ASSET_TYPE_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Basket_GetMemberCount((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Basket_GetMemberType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Basket_GetMemberType BASKET_ASSET_TYPE_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberType" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberType((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Basket_GetMinimumTransferAmount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Basket_GetMinimumTransferAmount BASKET_ASSET_TYPE_ID ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Basket_GetMinimumTransferAmount((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Basket_GetMemberMinimumTransferAmount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int arg2 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int val2 ; + int ecode2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_Basket_GetMemberMinimumTransferAmount BASKET_ASSET_TYPE_ID nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OT_API_Basket_GetMemberMinimumTransferAmount" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + result = (char *)OT_API_Basket_GetMemberMinimumTransferAmount((char const *)arg1,arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadAssetAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_LoadAssetAccount SERVER_ID USER_ID ACCOUNT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadInbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_LoadInbox SERVER_ID USER_ID ACCOUNT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadOutbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_LoadOutbox SERVER_ID USER_ID ACCOUNT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_LoadOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_LoadOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_GetCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Ledger_GetCount SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetCount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetCount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetCount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetCount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Ledger_GetCount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_CreateResponse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Ledger_CreateResponse SERVER_ID USER_ID ACCOUNT_ID ORIGINAL_LEDGER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_GetTransactionByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Ledger_GetTransactionByIndex SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER nIndex ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[5], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_GetTransactionByID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Ledger_GetTransactionByID SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER TRANSACTION_NUMBER ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_GetTransactionByID" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_GetTransactionByID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_GetTransactionIDByIndex(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Ledger_GetTransactionIDByIndex SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER nIndex ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[5], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_Ledger_GetTransactionIDByIndex" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_Ledger_GetTransactionIDByIndex((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_AddTransaction(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Ledger_AddTransaction SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Ledger_AddTransaction" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Ledger_AddTransaction((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_CreateResponse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int arg6 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int val6 ; + int ecode6 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:OT_API_Transaction_CreateResponse SERVER_ID USER_ID ACCOUNT_ID RESPONSE_LEDGER ORIGINAL_TRANSACTION BOOL_DO_I_ACCEPT ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + ecode6 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[6], &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "OT_API_Transaction_CreateResponse" "', argument " "6"" of type '" "int""'"); + } + arg6 = static_cast< int >(val6); + result = (char *)OT_API_Transaction_CreateResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,arg6); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Ledger_FinalizeResponse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Ledger_FinalizeResponse SERVER_ID USER_ID ACCOUNT_ID THE_LEDGER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Ledger_FinalizeResponse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Ledger_FinalizeResponse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetType SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetType" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetType((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetVoucher(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetVoucher SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetSuccess(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetSuccess SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetBalanceAgreementSuccess(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetBalanceAgreementSuccess SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Transaction_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetDateSigned(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetDateSigned SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDateSigned" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDateSigned((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetAmount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetAmount SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetAmount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetAmount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetAmount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetAmount" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetAmount((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Pending_GetNote(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Pending_GetNote SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Pending_GetNote" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Pending_GetNote" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Pending_GetNote" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Pending_GetNote" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Pending_GetNote((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetSenderUserID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetSenderUserID SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetSenderAcctID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetSenderAcctID SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetSenderAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetSenderAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetRecipientUserID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetRecipientUserID SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientUserID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientUserID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetRecipientAcctID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetRecipientAcctID SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetRecipientAcctID" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetRecipientAcctID((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Transaction_GetDisplayReferenceToNum(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Transaction_GetDisplayReferenceToNum SERVER_ID USER_ID ACCOUNT_ID THE_TRANSACTION ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Transaction_GetDisplayReferenceToNum" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Transaction_GetDisplayReferenceToNum((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_CreatePurse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_CreatePurse SERVER_ID ASSET_TYPE_ID USER_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_CreatePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_CreatePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_CreatePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_CreatePurse((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_SavePurse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_SavePurse SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_SavePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_SavePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_SavePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_SavePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_SavePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Purse_GetTotalValue(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Purse_GetTotalValue SERVER_ID ASSET_TYPE_ID THE_PURSE ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_GetTotalValue" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Purse_GetTotalValue((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Purse_Count(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Purse_Count SERVER_ID ASSET_TYPE_ID THE_PURSE ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Count" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Count" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Count" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Purse_Count((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Purse_Peek(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Purse_Peek SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Peek" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Peek" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Peek" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Peek" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Peek((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Purse_Pop(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Purse_Pop SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Pop" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Pop" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Pop" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Pop" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_Purse_Pop((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Purse_Push(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Purse_Push SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE THE_TOKEN ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Purse_Push" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Purse_Push" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Purse_Push" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Purse_Push" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Purse_Push" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Purse_Push((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Wallet_ImportPurse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Wallet_ImportPurse SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Wallet_ImportPurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Wallet_ImportPurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_exchangePurse(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_exchangePurse SERVER_ID ASSET_TYPE_ID USER_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangePurse" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangePurse" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangePurse" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangePurse" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_exchangePurse((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_ChangeOwner(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_Token_ChangeOwner SERVER_ID ASSET_TYPE_ID THE_TOKEN OLD_OWNER_NYM_ID NEW_OWNER_NYM_ID ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_ChangeOwner" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_ChangeOwner" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_ChangeOwner" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Token_ChangeOwner" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_Token_ChangeOwner" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_Token_ChangeOwner((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Token_GetID SERVER_ID ASSET_TYPE_ID THE_TOKEN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetID" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetID((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetDenomination(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Token_GetDenomination SERVER_ID ASSET_TYPE_ID THE_TOKEN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetDenomination" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetDenomination" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetDenomination" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetDenomination((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetSeries(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Token_GetSeries SERVER_ID ASSET_TYPE_ID THE_TOKEN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetSeries" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetSeries" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetSeries" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (int)OT_API_Token_GetSeries((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetValidFrom(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Token_GetValidFrom SERVER_ID ASSET_TYPE_ID THE_TOKEN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidFrom" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidFrom" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidFrom" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidFrom((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetValidTo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_Token_GetValidTo SERVER_ID ASSET_TYPE_ID THE_TOKEN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetValidTo" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Token_GetValidTo" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Token_GetValidTo" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + result = (char *)OT_API_Token_GetValidTo((char const *)arg1,(char const *)arg2,(char const *)arg3); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetAssetID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Token_GetAssetID THE_TOKEN ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetAssetID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetAssetID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Token_GetServerID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Token_GetServerID THE_TOKEN ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Token_GetServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Token_GetServerID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_checkServerID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_checkServerID SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkServerID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkServerID" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_checkServerID((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_createUserAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_createUserAccount SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_createUserAccount((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_deleteUserAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_deleteUserAccount SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteUserAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteUserAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_deleteUserAccount((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_deleteAssetAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_deleteAssetAccount SERVER_ID USER_ID ACCOUNT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_deleteAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_deleteAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_deleteAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_deleteAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_checkUser(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_checkUser SERVER_ID USER_ID USER_ID_CHECK ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_checkUser" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_checkUser" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_checkUser" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_checkUser((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_sendUserMessage(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_sendUserMessage SERVER_ID USER_ID USER_ID_RECIPIENT RECIPIENT_PUBKEY THE_MESSAGE ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_sendUserMessage" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_sendUserMessage" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_sendUserMessage" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_sendUserMessage" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_sendUserMessage" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + OT_API_sendUserMessage((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getRequest(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_getRequest SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getRequest" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getRequest" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getRequest((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getTransactionNumber(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_getTransactionNumber SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getTransactionNumber" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getTransactionNumber" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getTransactionNumber((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_issueAssetType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_issueAssetType SERVER_ID USER_ID THE_CONTRACT ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueAssetType" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueAssetType" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueAssetType" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueAssetType((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getContract(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getContract SERVER_ID USER_ID ASSET_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getContract" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getContract" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getContract" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getContract((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getMint(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getMint SERVER_ID USER_ID ASSET_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMint" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMint" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMint" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMint((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_createAssetAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_createAssetAccount SERVER_ID USER_ID ASSET_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_createAssetAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_createAssetAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_createAssetAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_createAssetAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getAccount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getAccount SERVER_ID USER_ID ACCT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getAccount" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getAccount" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getAccount" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getAccount((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GenerateBasketCreation(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_GenerateBasketCreation USER_ID MINIMUM_TRANSFER ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketCreation" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketCreation" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_GenerateBasketCreation((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_AddBasketCreationItem(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_AddBasketCreationItem USER_ID THE_BASKET ASSET_TYPE_ID MINIMUM_TRANSFER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketCreationItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketCreationItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketCreationItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketCreationItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (char *)OT_API_AddBasketCreationItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_issueBasket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_issueBasket SERVER_ID USER_ID THE_BASKET ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_issueBasket((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_GenerateBasketExchange(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_GenerateBasketExchange SERVER_ID USER_ID BASKET_ASSET_TYPE_ID BASKET_ASSET_ACCT_ID TRANSFER_MULTIPLE ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_GenerateBasketExchange" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_GenerateBasketExchange" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_GenerateBasketExchange" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_GenerateBasketExchange" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[5], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_GenerateBasketExchange" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + result = (char *)OT_API_GenerateBasketExchange((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_AddBasketExchangeItem(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_AddBasketExchangeItem SERVER_ID USER_ID THE_BASKET ASSET_TYPE_ID ASSET_ACCT_ID ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_AddBasketExchangeItem" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (char *)OT_API_AddBasketExchangeItem((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_exchangeBasket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int arg5 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int val5 ; + int ecode5 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_exchangeBasket SERVER_ID USER_ID BASKET_ASSET_ID THE_BASKET BOOL_EXCHANGE_IN_OR_OUT ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_exchangeBasket" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_exchangeBasket" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_exchangeBasket" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_exchangeBasket" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + ecode5 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[5], &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "OT_API_exchangeBasket" "', argument " "5"" of type '" "int""'"); + } + arg5 = static_cast< int >(val5); + OT_API_exchangeBasket((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_notarizeWithdrawal(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_notarizeWithdrawal SERVER_ID USER_ID ACCT_ID AMOUNT ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeWithdrawal" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeWithdrawal" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeWithdrawal" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeWithdrawal" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeWithdrawal((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_notarizeDeposit(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_notarizeDeposit SERVER_ID USER_ID ACCT_ID THE_PURSE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeDeposit" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeDeposit" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeDeposit" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeDeposit" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_notarizeDeposit((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_notarizeTransfer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:OT_API_notarizeTransfer SERVER_ID USER_ID ACCT_FROM ACCT_TO AMOUNT NOTE ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_notarizeTransfer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_notarizeTransfer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_notarizeTransfer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_notarizeTransfer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_notarizeTransfer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(objv[6], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_notarizeTransfer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_notarizeTransfer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getInbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getInbox SERVER_ID USER_ID ACCT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getInbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getOutbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getOutbox SERVER_ID USER_ID ACCT_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getOutbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getOutbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getOutbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getOutbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getNymbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_getNymbox SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNymbox((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_LoadNymbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_LoadNymbox SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_LoadNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_LoadNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + result = (char *)OT_API_LoadNymbox((char const *)arg1,(char const *)arg2); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_processInbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_processInbox SERVER_ID USER_ID ACCT_ID ACCT_LEDGER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processInbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processInbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processInbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_processInbox" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_processInbox((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_processNymbox(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_processNymbox SERVER_ID USER_ID ACCT_LEDGER ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_processNymbox" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_processNymbox" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_processNymbox" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_processNymbox((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_withdrawVoucher(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:OT_API_withdrawVoucher SERVER_ID USER_ID ACCT_ID RECIPIENT_USER_ID CHEQUE_MEMO AMOUNT ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_withdrawVoucher" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_withdrawVoucher" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_withdrawVoucher" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_withdrawVoucher" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_withdrawVoucher" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(objv[6], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_withdrawVoucher" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + OT_API_withdrawVoucher((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_depositCheque(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_depositCheque SERVER_ID USER_ID ACCT_ID THE_CHEQUE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositCheque" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositCheque" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositCheque" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_depositCheque" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_depositCheque((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_depositPaymentPlan(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_depositPaymentPlan SERVER_ID USER_ID THE_PAYMENT_PLAN ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_depositPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_depositPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_depositPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_depositPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_issueMarketOffer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + char *arg6 = (char *) 0 ; + char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; + char *arg9 = (char *) 0 ; + char *arg10 = (char *) 0 ; + int arg11 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int res6 ; + char *buf6 = 0 ; + int alloc6 = 0 ; + int res7 ; + char *buf7 = 0 ; + int alloc7 = 0 ; + int res8 ; + char *buf8 = 0 ; + int alloc8 = 0 ; + int res9 ; + char *buf9 = 0 ; + int alloc9 = 0 ; + int res10 ; + char *buf10 = 0 ; + int alloc10 = 0 ; + int val11 ; + int ecode11 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooooooooo:OT_API_issueMarketOffer SERVER_ID USER_ID ASSET_TYPE_ID ASSET_ACCT_ID CURRENCY_TYPE_ID CURRENCY_ACCT_ID MARKET_SCALE MINIMUM_INCREMENT TOTAL_ASSETS_ON_OFFER PRICE_LIMIT bBuyingOrSelling ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_issueMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_issueMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_issueMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_issueMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_issueMarketOffer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + res6 = SWIG_AsCharPtrAndSize(objv[6], &buf6, NULL, &alloc6); + if (!SWIG_IsOK(res6)) { + SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "OT_API_issueMarketOffer" "', argument " "6"" of type '" "char const *""'"); + } + arg6 = reinterpret_cast< char * >(buf6); + res7 = SWIG_AsCharPtrAndSize(objv[7], &buf7, NULL, &alloc7); + if (!SWIG_IsOK(res7)) { + SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "OT_API_issueMarketOffer" "', argument " "7"" of type '" "char const *""'"); + } + arg7 = reinterpret_cast< char * >(buf7); + res8 = SWIG_AsCharPtrAndSize(objv[8], &buf8, NULL, &alloc8); + if (!SWIG_IsOK(res8)) { + SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "OT_API_issueMarketOffer" "', argument " "8"" of type '" "char const *""'"); + } + arg8 = reinterpret_cast< char * >(buf8); + res9 = SWIG_AsCharPtrAndSize(objv[9], &buf9, NULL, &alloc9); + if (!SWIG_IsOK(res9)) { + SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "OT_API_issueMarketOffer" "', argument " "9"" of type '" "char const *""'"); + } + arg9 = reinterpret_cast< char * >(buf9); + res10 = SWIG_AsCharPtrAndSize(objv[10], &buf10, NULL, &alloc10); + if (!SWIG_IsOK(res10)) { + SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "OT_API_issueMarketOffer" "', argument " "10"" of type '" "char const *""'"); + } + arg10 = reinterpret_cast< char * >(buf10); + ecode11 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[11], &val11); + if (!SWIG_IsOK(ecode11)) { + SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "OT_API_issueMarketOffer" "', argument " "11"" of type '" "int""'"); + } + arg11 = static_cast< int >(val11); + OT_API_issueMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,(char const *)arg9,(char const *)arg10,arg11); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + if (alloc6 == SWIG_NEWOBJ) delete[] buf6; + if (alloc7 == SWIG_NEWOBJ) delete[] buf7; + if (alloc8 == SWIG_NEWOBJ) delete[] buf8; + if (alloc9 == SWIG_NEWOBJ) delete[] buf9; + if (alloc10 == SWIG_NEWOBJ) delete[] buf10; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getMarketList(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_getMarketList SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketList" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketList" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getMarketList((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getMarketOffers(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_getMarketOffers SERVER_ID USER_ID MARKET_ID MAX_DEPTH ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketOffers" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_getMarketOffers" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_getMarketOffers((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getMarketRecentTrades(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:OT_API_getMarketRecentTrades SERVER_ID USER_ID MARKET_ID ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getMarketRecentTrades" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getMarketRecentTrades" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_getMarketRecentTrades" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + OT_API_getMarketRecentTrades((char const *)arg1,(char const *)arg2,(char const *)arg3); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_getNym_MarketOffers(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OT_API_getNym_MarketOffers SERVER_ID USER_ID ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_getNym_MarketOffers" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_getNym_MarketOffers" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + OT_API_getNym_MarketOffers((char const *)arg1,(char const *)arg2); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_cancelMarketOffer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_cancelMarketOffer SERVER_ID USER_ID ASSET_ACCT_ID TRANSACTION_NUMBER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelMarketOffer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelMarketOffer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelMarketOffer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelMarketOffer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelMarketOffer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_cancelPaymentPlan(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_cancelPaymentPlan SERVER_ID USER_ID FROM_ACCT_ID TRANSACTION_NUMBER ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_cancelPaymentPlan" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_cancelPaymentPlan" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_cancelPaymentPlan" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_cancelPaymentPlan" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + OT_API_cancelPaymentPlan((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_PopMessageBuffer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_PopMessageBuffer ") == TCL_ERROR) SWIG_fail; + result = (char *)OT_API_PopMessageBuffer(); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_FlushMessageBuffer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + if (SWIG_GetArgs(interp, objc, objv,":OT_API_FlushMessageBuffer ") == TCL_ERROR) SWIG_fail; + OT_API_FlushMessageBuffer(); + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetCommand(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetCommand THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetCommand" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetCommand((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetSuccess(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetSuccess THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetSuccess((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetDepth(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetDepth THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetDepth" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (int)OT_API_Message_GetDepth((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetTransactionSuccess(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Message_GetTransactionSuccess SERVER_ID USER_ID ACCOUNT_ID THE_MESSAGE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetTransactionSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetTransactionSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetBalanceAgreementSuccess(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:OT_API_Message_GetBalanceAgreementSuccess SERVER_ID USER_ID ACCOUNT_ID THE_MESSAGE ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_Message_GetBalanceAgreementSuccess" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + result = (int)OT_API_Message_GetBalanceAgreementSuccess((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetLedger(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetLedger THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetLedger" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetLedger((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetNewAssetTypeID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetNewAssetTypeID THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAssetTypeID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAssetTypeID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetNewIssuerAcctID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetNewIssuerAcctID THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewIssuerAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewIssuerAcctID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_Message_GetNewAcctID(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + char *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OT_API_Message_GetNewAcctID THE_MESSAGE ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_Message_GetNewAcctID" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + result = (char *)OT_API_Message_GetNewAcctID((char const *)arg1); + Tcl_SetObjResult(interp,SWIG_FromCharPtr((const char *)result)); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_ConnectServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + char *arg1 = (char *) 0 ; + char *arg2 = (char *) 0 ; + char *arg3 = (char *) 0 ; + char *arg4 = (char *) 0 ; + char *arg5 = (char *) 0 ; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + int res2 ; + char *buf2 = 0 ; + int alloc2 = 0 ; + int res3 ; + char *buf3 = 0 ; + int alloc3 = 0 ; + int res4 ; + char *buf4 = 0 ; + int alloc4 = 0 ; + int res5 ; + char *buf5 = 0 ; + int alloc5 = 0 ; + int result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:OT_API_ConnectServer SERVER_ID USER_ID szCA_FILE szKEY_FILE szKEY_PASSWORD ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(objv[1], &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OT_API_ConnectServer" "', argument " "1"" of type '" "char const *""'"); + } + arg1 = reinterpret_cast< char * >(buf1); + res2 = SWIG_AsCharPtrAndSize(objv[2], &buf2, NULL, &alloc2); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OT_API_ConnectServer" "', argument " "2"" of type '" "char const *""'"); + } + arg2 = reinterpret_cast< char * >(buf2); + res3 = SWIG_AsCharPtrAndSize(objv[3], &buf3, NULL, &alloc3); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "OT_API_ConnectServer" "', argument " "3"" of type '" "char const *""'"); + } + arg3 = reinterpret_cast< char * >(buf3); + res4 = SWIG_AsCharPtrAndSize(objv[4], &buf4, NULL, &alloc4); + if (!SWIG_IsOK(res4)) { + SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "OT_API_ConnectServer" "', argument " "4"" of type '" "char const *""'"); + } + arg4 = reinterpret_cast< char * >(buf4); + res5 = SWIG_AsCharPtrAndSize(objv[5], &buf5, NULL, &alloc5); + if (!SWIG_IsOK(res5)) { + SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "OT_API_ConnectServer" "', argument " "5"" of type '" "char const *""'"); + } + arg5 = reinterpret_cast< char * >(buf5); + result = (int)OT_API_ConnectServer((char const *)arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_OK; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + if (alloc2 == SWIG_NEWOBJ) delete[] buf2; + if (alloc3 == SWIG_NEWOBJ) delete[] buf3; + if (alloc4 == SWIG_NEWOBJ) delete[] buf4; + if (alloc5 == SWIG_NEWOBJ) delete[] buf5; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OT_API_ProcessSockets(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + int result; + + if (SWIG_GetArgs(interp, objc, objv,":OT_API_ProcessSockets ") == TCL_ERROR) SWIG_fail; + result = (int)OT_API_ProcessSockets(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_delete_Storable(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Storable self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storable" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storable_Create(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storable_Create eType thePackType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storable_Create" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storable_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storable *)OTDB::Storable::Create(arg1,arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storable_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Storable_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Storable *)OTDB::Storable::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Storable(void *obj) { +OTDB::Storable *arg1 = (OTDB::Storable *) obj; +delete arg1; +} +static swig_method swig_OTDB_Storable_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_Storable_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_Storable_bases[] = {0}; +static const char * swig_OTDB_Storable_base_names[] = {0}; +static swig_class _wrap_class_OTDB_Storable = { "Storable", &SWIGTYPE_p_OTDB__Storable,0, swig_delete_Storable, swig_OTDB_Storable_methods, swig_OTDB_Storable_attributes, swig_OTDB_Storable_bases,swig_OTDB_Storable_base_names, &swig_module }; +SWIGINTERN int +_wrap_Storage_GetPacker__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::PackType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTPacker *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_GetPacker self ePackType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_GetPacker" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTPacker *)(arg1)->GetPacker(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_GetPacker__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTPacker *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Storage_GetPacker self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetPacker" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTPacker *)(arg1)->GetPacker(); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTPacker,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_GetPacker(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_GetPacker__SWIG_1(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_Storage_GetPacker__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_GetPacker'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::GetPacker(OTDB::PackType)\n" + " OTDB::Storage::GetPacker()\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooooo:Storage_Init self oneStr twoStr threeStr fourStr fiveStr sixStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[7], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6,arg7); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:Storage_Init self oneStr twoStr threeStr fourStr fiveStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_Init self oneStr twoStr threeStr fourStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_Init self oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_4(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_Init self oneStr twoStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_5(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_Init self oneStr ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Init" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Init(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init__SWIG_6(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Storage_Init self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Init" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (bool)(arg1)->Init(); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Init(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_6(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_5(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_4(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Init__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_Init'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string,std::string)\n" + " OTDB::Storage::Init(std::string,std::string)\n" + " OTDB::Storage::Init(std::string)\n" + " OTDB::Storage::Init()\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Exists__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_Exists self strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Exists__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_Exists self strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Exists__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_Exists self strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Exists__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_Exists self strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_Exists" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->Exists(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Exists(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_Exists__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_Exists'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::Exists(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::Exists(std::string,std::string,std::string)\n" + " OTDB::Storage::Exists(std::string,std::string)\n" + " OTDB::Storage::Exists(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_delete_Storage(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Storage self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Storage" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:Storage_StoreString self strContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_StoreString self strContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_StoreString self strContents strFolder oneStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_StoreString self strContents strFolder ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreString(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_StoreString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string,std::string)\n" + " OTDB::Storage::StoreString(std::string,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_QueryString self strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_QueryString self strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_QueryString self strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_QueryString self strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryString(arg2); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_QueryString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string,std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string,std::string)\n" + " OTDB::Storage::QueryString(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StorePlainString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:Storage_StorePlainString self strContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StorePlainString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_StorePlainString self strContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StorePlainString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_StorePlainString self strContents strFolder oneStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StorePlainString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_StorePlainString self strContents strFolder ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StorePlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StorePlainString(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StorePlainString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StorePlainString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_StorePlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string,std::string)\n" + " OTDB::Storage::StorePlainString(std::string,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryPlainString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_QueryPlainString self strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryPlainString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_QueryPlainString self strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryPlainString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_QueryPlainString self strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryPlainString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_QueryPlainString self strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryPlainString" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (arg1)->QueryPlainString(arg2); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryPlainString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryPlainString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_QueryPlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryPlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string,std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string,std::string)\n" + " OTDB::Storage::QueryPlainString(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreObject__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:Storage_StoreObject self theContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreObject__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_StoreObject self theContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreObject__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_StoreObject self theContents strFolder oneStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreObject__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::Storable *arg2 = 0 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_StoreObject self theContents strFolder ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_StoreObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Storage_StoreObject" "', argument " "2"" of type '" "OTDB::Storable &""'"); + } + arg2 = reinterpret_cast< OTDB::Storable * >(argp2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->StoreObject(*arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_StoreObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_StoreObject__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_StoreObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string,std::string)\n" + " OTDB::Storage::StoreObject(OTDB::Storable &,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryObject__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:Storage_QueryObject self theObjectType strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryObject__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_QueryObject self theObjectType strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryObject__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_QueryObject self theObjectType strFolder oneStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3,arg4); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryObject__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_QueryObject self theObjectType strFolder ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_QueryObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_QueryObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)(arg1)->QueryObject(arg2,arg3); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_QueryObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_QueryObject__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_QueryObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string,std::string)\n" + " OTDB::Storage::QueryObject(OTDB::StoredObjectType,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_EraseValueByKey__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:Storage_EraseValueByKey self strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_EraseValueByKey__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Storage_EraseValueByKey self strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_EraseValueByKey__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Storage_EraseValueByKey self strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_EraseValueByKey__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_EraseValueByKey self strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_EraseValueByKey" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Storage_EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)(arg1)->EraseValueByKey(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_EraseValueByKey(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storage, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Storage_EraseValueByKey__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Storage_EraseValueByKey'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string,std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string,std::string)\n" + " OTDB::Storage::EraseValueByKey(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_CreateObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + OTDB::StoredObjectType arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_CreateObject self eType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_CreateObject" "', argument " "1"" of type '" "OTDB::Storage *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_CreateObject" "', argument " "2"" of type '" "OTDB::StoredObjectType""'"); + } + arg2 = static_cast< OTDB::StoredObjectType >(val2); + result = (OTDB::Storable *)(arg1)->CreateObject(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_Create(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storage *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Storage_Create eStorageType ePackType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Storage_Create" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Storage_Create" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::Storage::Create(arg1,arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Storage_GetType(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *arg1 = (OTDB::Storage *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::StorageType result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Storage_GetType self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storage, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Storage_GetType" "', argument " "1"" of type '" "OTDB::Storage const *""'"); + } + arg1 = reinterpret_cast< OTDB::Storage * >(argp1); + result = (OTDB::StorageType)((OTDB::Storage const *)arg1)->GetType(); + Tcl_SetObjResult(interp,SWIG_From_int(static_cast< int >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Storage(void *obj) { +OTDB::Storage *arg1 = (OTDB::Storage *) obj; +delete arg1; +} +static swig_method swig_OTDB_Storage_methods[] = { + {"GetPacker", _wrap_Storage_GetPacker}, + {"Init", _wrap_Storage_Init}, + {"Exists", _wrap_Storage_Exists}, + {"StoreString", _wrap_Storage_StoreString}, + {"QueryString", _wrap_Storage_QueryString}, + {"StorePlainString", _wrap_Storage_StorePlainString}, + {"QueryPlainString", _wrap_Storage_QueryPlainString}, + {"StoreObject", _wrap_Storage_StoreObject}, + {"QueryObject", _wrap_Storage_QueryObject}, + {"EraseValueByKey", _wrap_Storage_EraseValueByKey}, + {"CreateObject", _wrap_Storage_CreateObject}, + {"GetType", _wrap_Storage_GetType}, + {0,0} +}; +static swig_attribute swig_OTDB_Storage_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_Storage_bases[] = {0}; +static const char * swig_OTDB_Storage_base_names[] = {0}; +static swig_class _wrap_class_OTDB_Storage = { "Storage", &SWIGTYPE_p_OTDB__Storage,0, swig_delete_Storage, swig_OTDB_Storage_methods, swig_OTDB_Storage_attributes, swig_OTDB_Storage_bases,swig_OTDB_Storage_base_names, &swig_module }; +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + std::string arg8 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooooo:InitDefaultStorage eStoreType ePackType oneStr twoStr threeStr fourStr fiveStr sixStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[7], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[8], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "8"" of type '" "std::string""'"); + } + arg8 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + std::string arg7 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooooo:InitDefaultStorage eStoreType ePackType oneStr twoStr threeStr fourStr fiveStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[7], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "7"" of type '" "std::string""'"); + } + arg7 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + std::string arg6 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooooo:InitDefaultStorage eStoreType ePackType oneStr twoStr threeStr fourStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[6], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "6"" of type '" "std::string""'"); + } + arg6 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5,arg6); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:InitDefaultStorage eStoreType ePackType oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_4(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:InitDefaultStorage eStoreType ePackType oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_5(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:InitDefaultStorage eStoreType ePackType oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "InitDefaultStorage" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::InitDefaultStorage(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage__SWIG_6(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:InitDefaultStorage eStoreType ePackType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InitDefaultStorage" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InitDefaultStorage" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (bool)OTDB::InitDefaultStorage(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_InitDefaultStorage(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_InitDefaultStorage__SWIG_6(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_5(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_4(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + if (argc == 6) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + if (argc == 7) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + } + if (argc == 8) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[5], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[6], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[7], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_InitDefaultStorage__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'InitDefaultStorage'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType,std::string)\n" + " OTDB::InitDefaultStorage(OTDB::StorageType,OTDB::PackType)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_GetDefaultStorage(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storage *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,":GetDefaultStorage ") == TCL_ERROR) SWIG_fail; + result = (OTDB::Storage *)OTDB::GetDefaultStorage(); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_CreateStorageContext__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + OTDB::PackType arg2 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + OTDB::Storage *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:CreateStorageContext eStoreType ePackType ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + ecode2 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CreateStorageContext" "', argument " "2"" of type '" "OTDB::PackType""'"); + } + arg2 = static_cast< OTDB::PackType >(val2); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1,arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_CreateStorageContext__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StorageType arg1 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storage *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:CreateStorageContext eStoreType ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateStorageContext" "', argument " "1"" of type '" "OTDB::StorageType""'"); + } + arg1 = static_cast< OTDB::StorageType >(val1); + result = (OTDB::Storage *)OTDB::CreateStorageContext(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storage,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_CreateStorageContext(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_1(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CreateStorageContext__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'CreateStorageContext'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::CreateStorageContext(OTDB::StorageType,OTDB::PackType)\n" + " OTDB::CreateStorageContext(OTDB::StorageType)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_CreateObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:CreateObject eType ",(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CreateObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + result = (OTDB::Storable *)OTDB::CreateObject(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Exists__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:Exists strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Exists__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:Exists strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Exists__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Exists strFolder oneStr ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Exists__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Exists strFolder ",(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "Exists" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::Exists(arg1); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Exists(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_3(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_Exists__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'Exists'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::Exists(std::string,std::string,std::string,std::string)\n" + " OTDB::Exists(std::string,std::string,std::string)\n" + " OTDB::Exists(std::string,std::string)\n" + " OTDB::Exists(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:StoreString strContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:StoreString strContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:StoreString strContents strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:StoreString strContents strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreString(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'StoreString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StoreString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string,std::string)\n" + " OTDB::StoreString(std::string,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:QueryString strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:QueryString strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:QueryString strFolder oneStr ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"o:QueryString strFolder ",(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryString(arg1); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'QueryString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryString(std::string,std::string,std::string,std::string)\n" + " OTDB::QueryString(std::string,std::string,std::string)\n" + " OTDB::QueryString(std::string,std::string)\n" + " OTDB::QueryString(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StorePlainString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:StorePlainString strContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StorePlainString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:StorePlainString strContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StorePlainString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:StorePlainString strContents strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StorePlainString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:StorePlainString strContents strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StorePlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StorePlainString(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StorePlainString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StorePlainString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'StorePlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StorePlainString(std::string,std::string,std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string,std::string)\n" + " OTDB::StorePlainString(std::string,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryPlainString__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:QueryPlainString strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryPlainString__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:QueryPlainString strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryPlainString__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:QueryPlainString strFolder oneStr ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryPlainString__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"o:QueryPlainString strFolder ",(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryPlainString" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = OTDB::QueryPlainString(arg1); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryPlainString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_3(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryPlainString__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'QueryPlainString'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryPlainString(std::string,std::string,std::string,std::string)\n" + " OTDB::QueryPlainString(std::string,std::string,std::string)\n" + " OTDB::QueryPlainString(std::string,std::string)\n" + " OTDB::QueryPlainString(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreObject__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:StoreObject theContents strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreObject__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:StoreObject theContents strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreObject__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + std::string arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:StoreObject theContents strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreObject__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = 0 ; + std::string arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:StoreObject theContents strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1, SWIGTYPE_p_OTDB__Storable, 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + if (!argp1) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StoreObject" "', argument " "1"" of type '" "OTDB::Storable &""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "StoreObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::StoreObject(*arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StoreObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_OTDB__Storable, 0); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_StoreObject__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'StoreObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string,std::string)\n" + " OTDB::StoreObject(OTDB::Storable &,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryObject__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + std::string arg5 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooooo:QueryObject theObjectType strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[5], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "5"" of type '" "std::string""'"); + } + arg5 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4,arg5); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryObject__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:QueryObject theObjectType strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryObject__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + std::string arg3 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:QueryObject theObjectType strFolder oneStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2,arg3); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryObject__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StoredObjectType arg1 ; + std::string arg2 ; + int val1 ; + int ecode1 = 0 ; + OTDB::Storable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:QueryObject theObjectType strFolder ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + ecode1 = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(objv[1], &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "QueryObject" "', argument " "1"" of type '" "OTDB::StoredObjectType""'"); + } + arg1 = static_cast< OTDB::StoredObjectType >(val1); + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "QueryObject" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (OTDB::Storable *)OTDB::QueryObject(arg1,arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Storable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_QueryObject(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 2) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_3(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + } + if (argc == 5) { + int _v; + { + int res = SWIG_AsVal_int SWIG_TCL_CALL_ARGS_2(argv[0], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[4], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_QueryObject__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'QueryObject'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string,std::string)\n" + " OTDB::QueryObject(OTDB::StoredObjectType,std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_EraseValueByKey__SWIG_0(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + std::string arg4 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oooo:EraseValueByKey strFolder oneStr twoStr threeStr ",(void *)0,(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[4], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "4"" of type '" "std::string""'"); + } + arg4 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3,arg4); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_EraseValueByKey__SWIG_1(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + std::string arg3 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:EraseValueByKey strFolder oneStr twoStr ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "3"" of type '" "std::string""'"); + } + arg3 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2,arg3); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_EraseValueByKey__SWIG_2(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + std::string arg2 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:EraseValueByKey strFolder oneStr ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "2"" of type '" "std::string""'"); + } + arg2 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1,arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_EraseValueByKey__SWIG_3(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + std::string arg1 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:EraseValueByKey strFolder ",(void *)0) == TCL_ERROR) SWIG_fail; + { + std::string *ptr = (std::string *)0; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[1], &ptr); + if (!SWIG_IsOK(res) || !ptr) { + SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "EraseValueByKey" "', argument " "1"" of type '" "std::string""'"); + } + arg1 = *ptr; + if (SWIG_IsNewObj(res)) delete ptr; + } + result = (bool)OTDB::EraseValueByKey(arg1); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_EraseValueByKey(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + Tcl_Obj *CONST *argv = objv+1; + int argc = objc-1; + if (argc == 1) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_3(clientData, interp, objc, argv - 1); + } + } + if (argc == 2) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_2(clientData, interp, objc, argv - 1); + } + } + } + if (argc == 3) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_1(clientData, interp, objc, argv - 1); + } + } + } + } + if (argc == 4) { + int _v; + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[0], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[1], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[2], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + int res = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(argv[3], (std::string**)(0)); + _v = SWIG_CheckState(res); + if (_v) { + return _wrap_EraseValueByKey__SWIG_0(clientData, interp, objc, argv - 1); + } + } + } + } + } + + Tcl_SetResult(interp,(char *) "Wrong number or type of arguments for overloaded function 'EraseValueByKey'.\n" + " Possible C/C++ prototypes are:\n" + " OTDB::EraseValueByKey(std::string,std::string,std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string,std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string,std::string)\n" + " OTDB::EraseValueByKey(std::string)\n", TCL_STATIC); + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_delete_OTDBString(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OTDBString self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OTDBString, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OTDBString" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTDBString_m_string_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OTDBString_m_string_set self m_string ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_set" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OTDBString_m_string_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->m_string = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTDBString_m_string_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OTDBString *arg1 = (OTDB::OTDBString *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTDBString_m_string_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OTDBString, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_m_string_get" "', argument " "1"" of type '" "OTDB::OTDBString *""'"); + } + arg1 = reinterpret_cast< OTDB::OTDBString * >(argp1); + result = (std::string *) & ((arg1)->m_string); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OTDBString_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OTDBString *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OTDBString_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OTDBString_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OTDBString *)OTDB::OTDBString::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OTDBString,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OTDBString(void *obj) { +OTDB::OTDBString *arg1 = (OTDB::OTDBString *) obj; +delete arg1; +} +static swig_method swig_OTDB_OTDBString_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_OTDBString_attributes[] = { + { "-m_string",_wrap_OTDBString_m_string_get, _wrap_OTDBString_m_string_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_OTDBString_bases[] = {0,0}; +static const char * swig_OTDB_OTDBString_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_OTDBString = { "OTDBString", &SWIGTYPE_p_OTDB__OTDBString,0, swig_delete_OTDBString, swig_OTDB_OTDBString_methods, swig_OTDB_OTDBString_attributes, swig_OTDB_OTDBString_bases,swig_OTDB_OTDBString_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_Blob(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Blob self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Blob, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Blob" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Blob_m_memBuffer_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + std::vector< unsigned char > arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 ; + int res2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Blob_m_memBuffer_set self m_memBuffer ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_set" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + { + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_std__vectorT_unsigned_char_t, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Blob_m_memBuffer_set" "', argument " "2"" of type '" "std::vector< unsigned char >""'"); + } else { + arg2 = *(reinterpret_cast< std::vector< unsigned char > * >(argp2)); + } + } + if (arg1) (arg1)->m_memBuffer = arg2; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Blob_m_memBuffer_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Blob *arg1 = (OTDB::Blob *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::vector< unsigned char > result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Blob_m_memBuffer_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Blob, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_m_memBuffer_get" "', argument " "1"" of type '" "OTDB::Blob *""'"); + } + arg1 = reinterpret_cast< OTDB::Blob * >(argp1); + result = ((arg1)->m_memBuffer); + Tcl_SetObjResult(interp,SWIG_NewInstanceObj((new std::vector< unsigned char >(static_cast< const std::vector< unsigned char >& >(result))), SWIGTYPE_p_std__vectorT_unsigned_char_t, SWIG_POINTER_OWN | 0 )); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Blob_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Blob *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Blob_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Blob_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Blob *)OTDB::Blob::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Blob,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Blob(void *obj) { +OTDB::Blob *arg1 = (OTDB::Blob *) obj; +delete arg1; +} +static swig_method swig_OTDB_Blob_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_Blob_attributes[] = { + { "-m_memBuffer",_wrap_Blob_m_memBuffer_get, _wrap_Blob_m_memBuffer_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_Blob_bases[] = {0,0}; +static const char * swig_OTDB_Blob_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_Blob = { "Blob", &SWIGTYPE_p_OTDB__Blob,0, swig_delete_Blob, swig_OTDB_Blob_methods, swig_OTDB_Blob_attributes, swig_OTDB_Blob_bases,swig_OTDB_Blob_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_StringMap(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_StringMap self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__StringMap, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_StringMap" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StringMap_the_map_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::map< std::string,std::string > *arg2 = (std::map< std::string,std::string > *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:StringMap_the_map_set self the_map ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_set" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2,SWIGTYPE_p_std__mapT_std__string_std__string_t, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_the_map_set" "', argument " "2"" of type '" "std::map< std::string,std::string > *""'"); + } + arg2 = reinterpret_cast< std::map< std::string,std::string > * >(argp2); + if (arg1) (arg1)->the_map = *arg2; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StringMap_the_map_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::map< std::string,std::string > *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:StringMap_the_map_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_the_map_get" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + result = (std::map< std::string,std::string > *)& ((arg1)->the_map); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_std__string_t,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StringMap_SetValue(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + std::string *arg3 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + int res3 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"ooo:StringMap_SetValue self strKey strValue ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_SetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + { + std::string *ptr = (std::string *)0; + res3 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[3], &ptr); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_SetValue" "', argument " "3"" of type '" "std::string const &""'"); + } + arg3 = ptr; + } + (arg1)->SetValue((std::string const &)*arg2,(std::string const &)*arg3); + + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + if (SWIG_IsNewObj(res3)) delete arg3; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StringMap_GetValue(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::StringMap *arg1 = (OTDB::StringMap *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + std::string result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:StringMap_GetValue self strKey ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__StringMap, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_GetValue" "', argument " "1"" of type '" "OTDB::StringMap *""'"); + } + arg1 = reinterpret_cast< OTDB::StringMap * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringMap_GetValue" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + result = (arg1)->GetValue((std::string const &)*arg2); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(result))); + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_StringMap_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::StringMap *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:StringMap_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringMap_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::StringMap *)OTDB::StringMap::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__StringMap,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_StringMap(void *obj) { +OTDB::StringMap *arg1 = (OTDB::StringMap *) obj; +delete arg1; +} +static swig_method swig_OTDB_StringMap_methods[] = { + {"SetValue", _wrap_StringMap_SetValue}, + {"GetValue", _wrap_StringMap_GetValue}, + {0,0} +}; +static swig_attribute swig_OTDB_StringMap_attributes[] = { + { "-the_map",_wrap_StringMap_the_map_get, _wrap_StringMap_the_map_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_StringMap_bases[] = {0,0}; +static const char * swig_OTDB_StringMap_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_StringMap = { "StringMap", &SWIGTYPE_p_OTDB__StringMap,0, swig_delete_StringMap, swig_OTDB_StringMap_methods, swig_OTDB_StringMap_attributes, swig_OTDB_StringMap_bases,swig_OTDB_StringMap_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_Displayable(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Displayable self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Displayable, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Displayable" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Displayable_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Displayable_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_set" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Displayable_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Displayable_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Displayable *arg1 = (OTDB::Displayable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Displayable_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Displayable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_gui_label_get" "', argument " "1"" of type '" "OTDB::Displayable *""'"); + } + arg1 = reinterpret_cast< OTDB::Displayable * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Displayable_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Displayable *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Displayable_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Displayable_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Displayable *)OTDB::Displayable::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Displayable,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Displayable(void *obj) { +OTDB::Displayable *arg1 = (OTDB::Displayable *) obj; +delete arg1; +} +static swig_method swig_OTDB_Displayable_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_Displayable_attributes[] = { + { "-gui_label",_wrap_Displayable_gui_label_get, _wrap_Displayable_gui_label_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_Displayable_bases[] = {0,0}; +static const char * swig_OTDB_Displayable_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_Displayable = { "Displayable", &SWIGTYPE_p_OTDB__Displayable,0, swig_delete_Displayable, swig_OTDB_Displayable_methods, swig_OTDB_Displayable_attributes, swig_OTDB_Displayable_bases,swig_OTDB_Displayable_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_MarketData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_MarketData self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketData" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_gui_label_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_server_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_market_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_market_id_set self market_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_market_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->market_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_market_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_market_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_market_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->market_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_asset_type_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_asset_type_id_set self asset_type_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_asset_type_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_asset_type_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_asset_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_currency_type_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_currency_type_id_set self currency_type_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_currency_type_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_currency_type_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_currency_type_id_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_scale_set self scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_scale_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_total_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_total_assets_set self total_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_total_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_total_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_total_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_number_bids_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_number_bids_set self number_bids ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_bids_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_bids = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_number_bids_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_number_bids_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_bids_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_bids); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_number_asks_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_number_asks_set self number_asks ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_number_asks_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->number_asks = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_number_asks_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_number_asks_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_number_asks_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->number_asks); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_last_sale_price_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_last_sale_price_set self last_sale_price ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_last_sale_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->last_sale_price = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_last_sale_price_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_last_sale_price_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_last_sale_price_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->last_sale_price); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_current_bid_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_current_bid_set self current_bid ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_bid = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_current_bid_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_current_bid_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_bid); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_current_ask_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_current_ask_set self current_ask ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_current_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->current_ask = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_current_ask_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_current_ask_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_current_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->current_ask); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_trades_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_volume_trades_set self volume_trades ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_trades_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_trades = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_trades_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_volume_trades_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_trades_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_trades); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_volume_assets_set self volume_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_volume_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_assets_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_currency_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_volume_currency_set self volume_currency ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_volume_currency_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->volume_currency = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_volume_currency_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_volume_currency_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_volume_currency_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->volume_currency); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_recent_highest_bid_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_recent_highest_bid_set self recent_highest_bid ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_highest_bid_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_highest_bid = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_recent_highest_bid_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_recent_highest_bid_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_highest_bid_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_highest_bid); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_recent_lowest_ask_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketData_recent_lowest_ask_set self recent_lowest_ask ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketData_recent_lowest_ask_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->recent_lowest_ask = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_recent_lowest_ask_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketData *arg1 = (OTDB::MarketData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_recent_lowest_ask_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_recent_lowest_ask_get" "', argument " "1"" of type '" "OTDB::MarketData *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketData * >(argp1); + result = (std::string *) & ((arg1)->recent_lowest_ask); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketData_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::MarketData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketData_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketData *)OTDB::MarketData::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_MarketData(void *obj) { +OTDB::MarketData *arg1 = (OTDB::MarketData *) obj; +delete arg1; +} +static swig_method swig_OTDB_MarketData_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_MarketData_attributes[] = { + { "-gui_label",_wrap_MarketData_gui_label_get, _wrap_MarketData_gui_label_set}, + { "-server_id",_wrap_MarketData_server_id_get, _wrap_MarketData_server_id_set}, + { "-market_id",_wrap_MarketData_market_id_get, _wrap_MarketData_market_id_set}, + { "-asset_type_id",_wrap_MarketData_asset_type_id_get, _wrap_MarketData_asset_type_id_set}, + { "-currency_type_id",_wrap_MarketData_currency_type_id_get, _wrap_MarketData_currency_type_id_set}, + { "-scale",_wrap_MarketData_scale_get, _wrap_MarketData_scale_set}, + { "-total_assets",_wrap_MarketData_total_assets_get, _wrap_MarketData_total_assets_set}, + { "-number_bids",_wrap_MarketData_number_bids_get, _wrap_MarketData_number_bids_set}, + { "-number_asks",_wrap_MarketData_number_asks_get, _wrap_MarketData_number_asks_set}, + { "-last_sale_price",_wrap_MarketData_last_sale_price_get, _wrap_MarketData_last_sale_price_set}, + { "-current_bid",_wrap_MarketData_current_bid_get, _wrap_MarketData_current_bid_set}, + { "-current_ask",_wrap_MarketData_current_ask_get, _wrap_MarketData_current_ask_set}, + { "-volume_trades",_wrap_MarketData_volume_trades_get, _wrap_MarketData_volume_trades_set}, + { "-volume_assets",_wrap_MarketData_volume_assets_get, _wrap_MarketData_volume_assets_set}, + { "-volume_currency",_wrap_MarketData_volume_currency_get, _wrap_MarketData_volume_currency_set}, + { "-recent_highest_bid",_wrap_MarketData_recent_highest_bid_get, _wrap_MarketData_recent_highest_bid_set}, + { "-recent_lowest_ask",_wrap_MarketData_recent_lowest_ask_get, _wrap_MarketData_recent_lowest_ask_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_MarketData_bases[] = {0,0}; +static const char * swig_OTDB_MarketData_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_MarketData = { "MarketData", &SWIGTYPE_p_OTDB__MarketData,0, swig_delete_MarketData, swig_OTDB_MarketData_methods, swig_OTDB_MarketData_attributes, swig_OTDB_MarketData_bases,swig_OTDB_MarketData_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_MarketList(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_MarketList self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketList, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_MarketList" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketList_GetMarketDataCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketList_GetMarketDataCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketDataCount" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + result = (arg1)->GetMarketDataCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketList_GetMarketData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::MarketData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketList_GetMarketData self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_GetMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_GetMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::MarketData *)(arg1)->GetMarketData(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketList_RemoveMarketData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketList_RemoveMarketData self nIndexMarketData ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_RemoveMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MarketList_RemoveMarketData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveMarketData(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketList_AddMarketData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::MarketList *arg1 = (OTDB::MarketList *) 0 ; + OTDB::MarketData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:MarketList_AddMarketData self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__MarketList, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_AddMarketData" "', argument " "1"" of type '" "OTDB::MarketList *""'"); + } + arg1 = reinterpret_cast< OTDB::MarketList * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__MarketData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MarketList_AddMarketData" "', argument " "2"" of type '" "OTDB::MarketData &""'"); + } + arg2 = reinterpret_cast< OTDB::MarketData * >(argp2); + result = (bool)(arg1)->AddMarketData(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_MarketList_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::MarketList *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:MarketList_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MarketList_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::MarketList *)OTDB::MarketList::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__MarketList,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_MarketList(void *obj) { +OTDB::MarketList *arg1 = (OTDB::MarketList *) obj; +delete arg1; +} +static swig_method swig_OTDB_MarketList_methods[] = { + {"GetMarketDataCount", _wrap_MarketList_GetMarketDataCount}, + {"GetMarketData", _wrap_MarketList_GetMarketData}, + {"RemoveMarketData", _wrap_MarketList_RemoveMarketData}, + {"AddMarketData", _wrap_MarketList_AddMarketData}, + {0,0} +}; +static swig_attribute swig_OTDB_MarketList_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_MarketList_bases[] = {0,0}; +static const char * swig_OTDB_MarketList_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_MarketList = { "MarketList", &SWIGTYPE_p_OTDB__MarketList,0, swig_delete_MarketList, swig_OTDB_MarketList_methods, swig_OTDB_MarketList_attributes, swig_OTDB_MarketList_bases,swig_OTDB_MarketList_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_OfferDataMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OfferDataMarket self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataMarket" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataMarket_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataMarket_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_price_per_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataMarket_price_per_scale_set self price_per_scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_price_per_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_price_per_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_available_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataMarket_available_assets_set self available_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_available_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_available_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_available_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_minimum_increment_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataMarket_minimum_increment_set self minimum_increment ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataMarket_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_minimum_increment_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_minimum_increment_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataMarket * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataMarket_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferDataMarket *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataMarket_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataMarket *)OTDB::OfferDataMarket::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataMarket,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OfferDataMarket(void *obj) { +OTDB::OfferDataMarket *arg1 = (OTDB::OfferDataMarket *) obj; +delete arg1; +} +static swig_method swig_OTDB_OfferDataMarket_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_OfferDataMarket_attributes[] = { + { "-gui_label",_wrap_OfferDataMarket_gui_label_get, _wrap_OfferDataMarket_gui_label_set}, + { "-transaction_id",_wrap_OfferDataMarket_transaction_id_get, _wrap_OfferDataMarket_transaction_id_set}, + { "-price_per_scale",_wrap_OfferDataMarket_price_per_scale_get, _wrap_OfferDataMarket_price_per_scale_set}, + { "-available_assets",_wrap_OfferDataMarket_available_assets_get, _wrap_OfferDataMarket_available_assets_set}, + { "-minimum_increment",_wrap_OfferDataMarket_minimum_increment_get, _wrap_OfferDataMarket_minimum_increment_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_OfferDataMarket_bases[] = {0,0}; +static const char * swig_OTDB_OfferDataMarket_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_OfferDataMarket = { "OfferDataMarket", &SWIGTYPE_p_OTDB__OfferDataMarket,0, swig_delete_OfferDataMarket, swig_OTDB_OfferDataMarket_methods, swig_OTDB_OfferDataMarket_attributes, swig_OTDB_OfferDataMarket_bases,swig_OTDB_OfferDataMarket_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_BidData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_BidData self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BidData" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BidData_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_gui_label_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BidData_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_transaction_id_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_price_per_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BidData_price_per_scale_set self price_per_scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_price_per_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_price_per_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_available_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BidData_available_assets_set self available_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_available_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_available_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_available_assets_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_minimum_increment_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BidData_minimum_increment_set self minimum_increment ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BidData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_minimum_increment_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BidData *arg1 = (OTDB::BidData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_minimum_increment_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BidData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::BidData *""'"); + } + arg1 = reinterpret_cast< OTDB::BidData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BidData_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BidData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BidData_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BidData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BidData *)OTDB::BidData::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_BidData(void *obj) { +OTDB::BidData *arg1 = (OTDB::BidData *) obj; +delete arg1; +} +static swig_method swig_OTDB_BidData_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_BidData_attributes[] = { + { "-gui_label",_wrap_BidData_gui_label_get, _wrap_BidData_gui_label_set}, + { "-transaction_id",_wrap_BidData_transaction_id_get, _wrap_BidData_transaction_id_set}, + { "-price_per_scale",_wrap_BidData_price_per_scale_get, _wrap_BidData_price_per_scale_set}, + { "-available_assets",_wrap_BidData_available_assets_get, _wrap_BidData_available_assets_set}, + { "-minimum_increment",_wrap_BidData_minimum_increment_get, _wrap_BidData_minimum_increment_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_BidData_bases[] = {0,0}; +static const char * swig_OTDB_BidData_base_names[] = {"OTDB::OfferDataMarket *",0}; +static swig_class _wrap_class_OTDB_BidData = { "BidData", &SWIGTYPE_p_OTDB__BidData,0, swig_delete_BidData, swig_OTDB_BidData_methods, swig_OTDB_BidData_attributes, swig_OTDB_BidData_bases,swig_OTDB_BidData_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_AskData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_AskData self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AskData" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AskData_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_gui_label_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AskData_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_transaction_id_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_price_per_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AskData_price_per_scale_set self price_per_scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_price_per_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_price_per_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_price_per_scale_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_available_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AskData_available_assets_set self available_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_available_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->available_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_available_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_available_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_available_assets_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->available_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_minimum_increment_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AskData_minimum_increment_set self minimum_increment ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_set" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AskData_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_minimum_increment_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AskData *arg1 = (OTDB::AskData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_minimum_increment_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AskData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_minimum_increment_get" "', argument " "1"" of type '" "OTDB::AskData *""'"); + } + arg1 = reinterpret_cast< OTDB::AskData * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AskData_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::AskData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AskData_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AskData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AskData *)OTDB::AskData::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_AskData(void *obj) { +OTDB::AskData *arg1 = (OTDB::AskData *) obj; +delete arg1; +} +static swig_method swig_OTDB_AskData_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_AskData_attributes[] = { + { "-gui_label",_wrap_AskData_gui_label_get, _wrap_AskData_gui_label_set}, + { "-transaction_id",_wrap_AskData_transaction_id_get, _wrap_AskData_transaction_id_set}, + { "-price_per_scale",_wrap_AskData_price_per_scale_get, _wrap_AskData_price_per_scale_set}, + { "-available_assets",_wrap_AskData_available_assets_get, _wrap_AskData_available_assets_set}, + { "-minimum_increment",_wrap_AskData_minimum_increment_get, _wrap_AskData_minimum_increment_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_AskData_bases[] = {0,0}; +static const char * swig_OTDB_AskData_base_names[] = {"OTDB::OfferDataMarket *",0}; +static swig_class _wrap_class_OTDB_AskData = { "AskData", &SWIGTYPE_p_OTDB__AskData,0, swig_delete_AskData, swig_OTDB_AskData_methods, swig_OTDB_AskData_attributes, swig_OTDB_AskData_bases,swig_OTDB_AskData_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_OfferListMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OfferListMarket self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListMarket" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_GetBidDataCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferListMarket_GetBidDataCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetBidDataCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_GetBidData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BidData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_GetBidData self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BidData *)(arg1)->GetBidData(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BidData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_RemoveBidData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_RemoveBidData self nIndexBidData ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveBidData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBidData(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_AddBidData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::BidData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_AddBidData self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddBidData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__BidData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddBidData" "', argument " "2"" of type '" "OTDB::BidData &""'"); + } + arg2 = reinterpret_cast< OTDB::BidData * >(argp2); + result = (bool)(arg1)->AddBidData(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_GetAskDataCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferListMarket_GetAskDataCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskDataCount" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + result = (arg1)->GetAskDataCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_GetAskData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::AskData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_GetAskData self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_GetAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_GetAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::AskData *)(arg1)->GetAskData(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AskData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_RemoveAskData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_RemoveAskData self nIndexAskData ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_RemoveAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListMarket_RemoveAskData" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveAskData(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_AddAskData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) 0 ; + OTDB::AskData *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListMarket_AddAskData self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_AddAskData" "', argument " "1"" of type '" "OTDB::OfferListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListMarket * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__AskData, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListMarket_AddAskData" "', argument " "2"" of type '" "OTDB::AskData &""'"); + } + arg2 = reinterpret_cast< OTDB::AskData * >(argp2); + result = (bool)(arg1)->AddAskData(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListMarket_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferListMarket *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferListMarket_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListMarket *)OTDB::OfferListMarket::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListMarket,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OfferListMarket(void *obj) { +OTDB::OfferListMarket *arg1 = (OTDB::OfferListMarket *) obj; +delete arg1; +} +static swig_method swig_OTDB_OfferListMarket_methods[] = { + {"GetBidDataCount", _wrap_OfferListMarket_GetBidDataCount}, + {"GetBidData", _wrap_OfferListMarket_GetBidData}, + {"RemoveBidData", _wrap_OfferListMarket_RemoveBidData}, + {"AddBidData", _wrap_OfferListMarket_AddBidData}, + {"GetAskDataCount", _wrap_OfferListMarket_GetAskDataCount}, + {"GetAskData", _wrap_OfferListMarket_GetAskData}, + {"RemoveAskData", _wrap_OfferListMarket_RemoveAskData}, + {"AddAskData", _wrap_OfferListMarket_AddAskData}, + {0,0} +}; +static swig_attribute swig_OTDB_OfferListMarket_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_OfferListMarket_bases[] = {0,0}; +static const char * swig_OTDB_OfferListMarket_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_OfferListMarket = { "OfferListMarket", &SWIGTYPE_p_OTDB__OfferListMarket,0, swig_delete_OfferListMarket, swig_OTDB_OfferListMarket_methods, swig_OTDB_OfferListMarket_attributes, swig_OTDB_OfferListMarket_bases,swig_OTDB_OfferListMarket_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_TradeDataMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_TradeDataMarket self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataMarket_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataMarket_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_date_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataMarket_date_set self date ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_date_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_date_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_date_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->date); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_price_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataMarket_price_set self price ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_price_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_price_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_price_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->price); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_amount_sold_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataMarket_amount_sold_set self amount_sold ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataMarket_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_amount_sold_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_amount_sold_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataMarket * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataMarket_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataMarket_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataMarket *)OTDB::TradeDataMarket::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_TradeDataMarket(void *obj) { +OTDB::TradeDataMarket *arg1 = (OTDB::TradeDataMarket *) obj; +delete arg1; +} +static swig_method swig_OTDB_TradeDataMarket_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_TradeDataMarket_attributes[] = { + { "-gui_label",_wrap_TradeDataMarket_gui_label_get, _wrap_TradeDataMarket_gui_label_set}, + { "-transaction_id",_wrap_TradeDataMarket_transaction_id_get, _wrap_TradeDataMarket_transaction_id_set}, + { "-date",_wrap_TradeDataMarket_date_get, _wrap_TradeDataMarket_date_set}, + { "-price",_wrap_TradeDataMarket_price_get, _wrap_TradeDataMarket_price_set}, + { "-amount_sold",_wrap_TradeDataMarket_amount_sold_get, _wrap_TradeDataMarket_amount_sold_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_TradeDataMarket_bases[] = {0,0}; +static const char * swig_OTDB_TradeDataMarket_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_TradeDataMarket = { "TradeDataMarket", &SWIGTYPE_p_OTDB__TradeDataMarket,0, swig_delete_TradeDataMarket, swig_OTDB_TradeDataMarket_methods, swig_OTDB_TradeDataMarket_attributes, swig_OTDB_TradeDataMarket_bases,swig_OTDB_TradeDataMarket_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_TradeListMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_TradeListMarket self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListMarket, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListMarket_GetTradeDataMarketCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeListMarket_GetTradeDataMarketCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarketCount" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + result = (arg1)->GetTradeDataMarketCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListMarket_GetTradeDataMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::TradeDataMarket *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListMarket_GetTradeDataMarket self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_GetTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataMarket *)(arg1)->GetTradeDataMarket(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataMarket,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListMarket_RemoveTradeDataMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListMarket_RemoveTradeDataMarket self nIndexTradeDataMarket ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListMarket_RemoveTradeDataMarket" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataMarket(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListMarket_AddTradeDataMarket(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) 0 ; + OTDB::TradeDataMarket *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListMarket_AddTradeDataMarket self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListMarket, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "1"" of type '" "OTDB::TradeListMarket *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListMarket * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__TradeDataMarket, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListMarket_AddTradeDataMarket" "', argument " "2"" of type '" "OTDB::TradeDataMarket &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataMarket * >(argp2); + result = (bool)(arg1)->AddTradeDataMarket(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListMarket_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeListMarket *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeListMarket_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListMarket_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListMarket *)OTDB::TradeListMarket::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListMarket,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_TradeListMarket(void *obj) { +OTDB::TradeListMarket *arg1 = (OTDB::TradeListMarket *) obj; +delete arg1; +} +static swig_method swig_OTDB_TradeListMarket_methods[] = { + {"GetTradeDataMarketCount", _wrap_TradeListMarket_GetTradeDataMarketCount}, + {"GetTradeDataMarket", _wrap_TradeListMarket_GetTradeDataMarket}, + {"RemoveTradeDataMarket", _wrap_TradeListMarket_RemoveTradeDataMarket}, + {"AddTradeDataMarket", _wrap_TradeListMarket_AddTradeDataMarket}, + {0,0} +}; +static swig_attribute swig_OTDB_TradeListMarket_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_TradeListMarket_bases[] = {0,0}; +static const char * swig_OTDB_TradeListMarket_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_TradeListMarket = { "TradeListMarket", &SWIGTYPE_p_OTDB__TradeListMarket,0, swig_delete_TradeListMarket, swig_OTDB_TradeListMarket_methods, swig_OTDB_TradeListMarket_attributes, swig_OTDB_TradeListMarket_bases,swig_OTDB_TradeListMarket_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_OfferDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OfferDataNym self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferDataNym" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_valid_from_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_valid_from_set self valid_from ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_from_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_from = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_valid_from_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_valid_from_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_from_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_from); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_valid_to_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_valid_to_set self valid_to ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_valid_to_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->valid_to = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_valid_to_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_valid_to_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_valid_to_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->valid_to); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_server_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_asset_type_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_asset_type_id_set self asset_type_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_asset_type_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_asset_type_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_asset_acct_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_asset_acct_id_set self asset_acct_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_asset_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_acct_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_asset_acct_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_asset_acct_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_asset_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->asset_acct_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_currency_type_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_currency_type_id_set self currency_type_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_type_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_currency_type_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_currency_type_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_type_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_type_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_currency_acct_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_currency_acct_id_set self currency_acct_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_currency_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->currency_acct_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_currency_acct_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_currency_acct_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_currency_acct_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->currency_acct_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_selling_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + bool arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool val2 ; + int ecode2 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_selling_set self selling ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + ecode2 = SWIG_AsVal_bool SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferDataNym_selling_set" "', argument " "2"" of type '" "bool""'"); + } + arg2 = static_cast< bool >(val2); + if (arg1) (arg1)->selling = arg2; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_selling_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_selling_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_selling_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (bool) ((arg1)->selling); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_scale_set self scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_price_per_scale_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_price_per_scale_set self price_per_scale ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_price_per_scale_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price_per_scale = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_price_per_scale_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_price_per_scale_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_price_per_scale_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->price_per_scale); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_total_assets_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_total_assets_set self total_assets ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_total_assets_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->total_assets = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_total_assets_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_total_assets_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_total_assets_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->total_assets); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_finished_so_far_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_finished_so_far_set self finished_so_far ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_finished_so_far_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->finished_so_far = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_finished_so_far_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_finished_so_far_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_finished_so_far_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->finished_so_far); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_minimum_increment_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_minimum_increment_set self minimum_increment ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_minimum_increment_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->minimum_increment = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_minimum_increment_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_minimum_increment_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_minimum_increment_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->minimum_increment); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_stop_sign_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_stop_sign_set self stop_sign ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_sign_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_sign = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_stop_sign_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_stop_sign_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_sign_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_sign); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_stop_price_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferDataNym_stop_price_set self stop_price ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_set" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferDataNym_stop_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->stop_price = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_stop_price_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_stop_price_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_stop_price_get" "', argument " "1"" of type '" "OTDB::OfferDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferDataNym * >(argp1); + result = (std::string *) & ((arg1)->stop_price); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferDataNym_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferDataNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferDataNym_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferDataNym *)OTDB::OfferDataNym::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OfferDataNym(void *obj) { +OTDB::OfferDataNym *arg1 = (OTDB::OfferDataNym *) obj; +delete arg1; +} +static swig_method swig_OTDB_OfferDataNym_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_OfferDataNym_attributes[] = { + { "-gui_label",_wrap_OfferDataNym_gui_label_get, _wrap_OfferDataNym_gui_label_set}, + { "-valid_from",_wrap_OfferDataNym_valid_from_get, _wrap_OfferDataNym_valid_from_set}, + { "-valid_to",_wrap_OfferDataNym_valid_to_get, _wrap_OfferDataNym_valid_to_set}, + { "-server_id",_wrap_OfferDataNym_server_id_get, _wrap_OfferDataNym_server_id_set}, + { "-asset_type_id",_wrap_OfferDataNym_asset_type_id_get, _wrap_OfferDataNym_asset_type_id_set}, + { "-asset_acct_id",_wrap_OfferDataNym_asset_acct_id_get, _wrap_OfferDataNym_asset_acct_id_set}, + { "-currency_type_id",_wrap_OfferDataNym_currency_type_id_get, _wrap_OfferDataNym_currency_type_id_set}, + { "-currency_acct_id",_wrap_OfferDataNym_currency_acct_id_get, _wrap_OfferDataNym_currency_acct_id_set}, + { "-selling",_wrap_OfferDataNym_selling_get, _wrap_OfferDataNym_selling_set}, + { "-scale",_wrap_OfferDataNym_scale_get, _wrap_OfferDataNym_scale_set}, + { "-price_per_scale",_wrap_OfferDataNym_price_per_scale_get, _wrap_OfferDataNym_price_per_scale_set}, + { "-transaction_id",_wrap_OfferDataNym_transaction_id_get, _wrap_OfferDataNym_transaction_id_set}, + { "-total_assets",_wrap_OfferDataNym_total_assets_get, _wrap_OfferDataNym_total_assets_set}, + { "-finished_so_far",_wrap_OfferDataNym_finished_so_far_get, _wrap_OfferDataNym_finished_so_far_set}, + { "-minimum_increment",_wrap_OfferDataNym_minimum_increment_get, _wrap_OfferDataNym_minimum_increment_set}, + { "-stop_sign",_wrap_OfferDataNym_stop_sign_get, _wrap_OfferDataNym_stop_sign_set}, + { "-stop_price",_wrap_OfferDataNym_stop_price_get, _wrap_OfferDataNym_stop_price_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_OfferDataNym_bases[] = {0,0}; +static const char * swig_OTDB_OfferDataNym_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_OfferDataNym = { "OfferDataNym", &SWIGTYPE_p_OTDB__OfferDataNym,0, swig_delete_OfferDataNym, swig_OTDB_OfferDataNym_methods, swig_OTDB_OfferDataNym_attributes, swig_OTDB_OfferDataNym_bases,swig_OTDB_OfferDataNym_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_OfferListNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_OfferListNym self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_OfferListNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListNym_GetOfferDataNymCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferListNym_GetOfferDataNymCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNymCount" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + result = (arg1)->GetOfferDataNymCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListNym_GetOfferDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::OfferDataNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListNym_GetOfferDataNym self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_GetOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::OfferDataNym *)(arg1)->GetOfferDataNym(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferDataNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListNym_RemoveOfferDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListNym_RemoveOfferDataNym self nIndexOfferDataNym ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "OfferListNym_RemoveOfferDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveOfferDataNym(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListNym_AddOfferDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) 0 ; + OTDB::OfferDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:OfferListNym_AddOfferDataNym self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__OfferListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "1"" of type '" "OTDB::OfferListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::OfferListNym * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__OfferDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "OfferListNym_AddOfferDataNym" "', argument " "2"" of type '" "OTDB::OfferDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::OfferDataNym * >(argp2); + result = (bool)(arg1)->AddOfferDataNym(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_OfferListNym_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::OfferListNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:OfferListNym_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "OfferListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::OfferListNym *)OTDB::OfferListNym::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__OfferListNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_OfferListNym(void *obj) { +OTDB::OfferListNym *arg1 = (OTDB::OfferListNym *) obj; +delete arg1; +} +static swig_method swig_OTDB_OfferListNym_methods[] = { + {"GetOfferDataNymCount", _wrap_OfferListNym_GetOfferDataNymCount}, + {"GetOfferDataNym", _wrap_OfferListNym_GetOfferDataNym}, + {"RemoveOfferDataNym", _wrap_OfferListNym_RemoveOfferDataNym}, + {"AddOfferDataNym", _wrap_OfferListNym_AddOfferDataNym}, + {0,0} +}; +static swig_attribute swig_OTDB_OfferListNym_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_OfferListNym_bases[] = {0,0}; +static const char * swig_OTDB_OfferListNym_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_OfferListNym = { "OfferListNym", &SWIGTYPE_p_OTDB__OfferListNym,0, swig_delete_OfferListNym, swig_OTDB_OfferListNym_methods, swig_OTDB_OfferListNym_attributes, swig_OTDB_OfferListNym_bases,swig_OTDB_OfferListNym_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_TradeDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_TradeDataNym self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeDataNym" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_gui_label_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_transaction_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_transaction_id_set self transaction_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_transaction_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->transaction_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_transaction_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_transaction_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_transaction_id_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->transaction_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_completed_count_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_completed_count_set self completed_count ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_completed_count_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->completed_count = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_completed_count_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_completed_count_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_completed_count_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->completed_count); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_date_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_date_set self date ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_date_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->date = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_date_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_date_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_date_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->date); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_price_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_price_set self price ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_price_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->price = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_price_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_price_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_price_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->price); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_amount_sold_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeDataNym_amount_sold_set self amount_sold ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_set" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeDataNym_amount_sold_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->amount_sold = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_amount_sold_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_amount_sold_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeDataNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_amount_sold_get" "', argument " "1"" of type '" "OTDB::TradeDataNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeDataNym * >(argp1); + result = (std::string *) & ((arg1)->amount_sold); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeDataNym_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeDataNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeDataNym_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeDataNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeDataNym *)OTDB::TradeDataNym::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_TradeDataNym(void *obj) { +OTDB::TradeDataNym *arg1 = (OTDB::TradeDataNym *) obj; +delete arg1; +} +static swig_method swig_OTDB_TradeDataNym_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_TradeDataNym_attributes[] = { + { "-gui_label",_wrap_TradeDataNym_gui_label_get, _wrap_TradeDataNym_gui_label_set}, + { "-transaction_id",_wrap_TradeDataNym_transaction_id_get, _wrap_TradeDataNym_transaction_id_set}, + { "-completed_count",_wrap_TradeDataNym_completed_count_get, _wrap_TradeDataNym_completed_count_set}, + { "-date",_wrap_TradeDataNym_date_get, _wrap_TradeDataNym_date_set}, + { "-price",_wrap_TradeDataNym_price_get, _wrap_TradeDataNym_price_set}, + { "-amount_sold",_wrap_TradeDataNym_amount_sold_get, _wrap_TradeDataNym_amount_sold_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_TradeDataNym_bases[] = {0,0}; +static const char * swig_OTDB_TradeDataNym_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_TradeDataNym = { "TradeDataNym", &SWIGTYPE_p_OTDB__TradeDataNym,0, swig_delete_TradeDataNym, swig_OTDB_TradeDataNym_methods, swig_OTDB_TradeDataNym_attributes, swig_OTDB_TradeDataNym_bases,swig_OTDB_TradeDataNym_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_TradeListNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_TradeListNym self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TradeListNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListNym_GetTradeDataNymCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeListNym_GetTradeDataNymCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNymCount" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + result = (arg1)->GetTradeDataNymCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListNym_GetTradeDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::TradeDataNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListNym_GetTradeDataNym self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_GetTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::TradeDataNym *)(arg1)->GetTradeDataNym(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeDataNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListNym_RemoveTradeDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListNym_RemoveTradeDataNym self nIndexTradeDataNym ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TradeListNym_RemoveTradeDataNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveTradeDataNym(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListNym_AddTradeDataNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) 0 ; + OTDB::TradeDataNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:TradeListNym_AddTradeDataNym self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__TradeListNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "1"" of type '" "OTDB::TradeListNym *""'"); + } + arg1 = reinterpret_cast< OTDB::TradeListNym * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__TradeDataNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TradeListNym_AddTradeDataNym" "', argument " "2"" of type '" "OTDB::TradeDataNym &""'"); + } + arg2 = reinterpret_cast< OTDB::TradeDataNym * >(argp2); + result = (bool)(arg1)->AddTradeDataNym(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_TradeListNym_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::TradeListNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:TradeListNym_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TradeListNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::TradeListNym *)OTDB::TradeListNym::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__TradeListNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_TradeListNym(void *obj) { +OTDB::TradeListNym *arg1 = (OTDB::TradeListNym *) obj; +delete arg1; +} +static swig_method swig_OTDB_TradeListNym_methods[] = { + {"GetTradeDataNymCount", _wrap_TradeListNym_GetTradeDataNymCount}, + {"GetTradeDataNym", _wrap_TradeListNym_GetTradeDataNym}, + {"RemoveTradeDataNym", _wrap_TradeListNym_RemoveTradeDataNym}, + {"AddTradeDataNym", _wrap_TradeListNym_AddTradeDataNym}, + {0,0} +}; +static swig_attribute swig_OTDB_TradeListNym_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_TradeListNym_bases[] = {0,0}; +static const char * swig_OTDB_TradeListNym_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_TradeListNym = { "TradeListNym", &SWIGTYPE_p_OTDB__TradeListNym,0, swig_delete_TradeListNym, swig_OTDB_TradeListNym_methods, swig_OTDB_TradeListNym_attributes, swig_OTDB_TradeListNym_bases,swig_OTDB_TradeListNym_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_Acct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Acct self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Acct" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Acct_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Acct_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_gui_label_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_acct_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Acct_acct_id_set self acct_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_acct_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Acct_acct_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_acct_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Acct_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_set" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Acct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Acct *arg1 = (OTDB::Acct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Acct_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Acct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_server_id_get" "', argument " "1"" of type '" "OTDB::Acct *""'"); + } + arg1 = reinterpret_cast< OTDB::Acct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Acct_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Acct *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Acct_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Acct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Acct *)OTDB::Acct::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Acct,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Acct(void *obj) { +OTDB::Acct *arg1 = (OTDB::Acct *) obj; +delete arg1; +} +static swig_method swig_OTDB_Acct_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_Acct_attributes[] = { + { "-gui_label",_wrap_Acct_gui_label_get, _wrap_Acct_gui_label_set}, + { "-acct_id",_wrap_Acct_acct_id_get, _wrap_Acct_acct_id_set}, + { "-server_id",_wrap_Acct_server_id_get, _wrap_Acct_server_id_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_Acct_bases[] = {0,0}; +static const char * swig_OTDB_Acct_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_Acct = { "Acct", &SWIGTYPE_p_OTDB__Acct,0, swig_delete_Acct, swig_OTDB_Acct_methods, swig_OTDB_Acct_attributes, swig_OTDB_Acct_bases,swig_OTDB_Acct_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_BitcoinAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_BitcoinAcct self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinAcct" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinAcct_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinAcct_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_acct_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinAcct_acct_id_set self acct_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_acct_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinAcct_acct_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinAcct_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinAcct_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_bitcoin_acct_name_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinAcct_bitcoin_acct_name_set self bitcoin_acct_name ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinAcct_bitcoin_acct_name_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_acct_name = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_bitcoin_acct_name_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinAcct_bitcoin_acct_name_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_bitcoin_acct_name_get" "', argument " "1"" of type '" "OTDB::BitcoinAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinAcct * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_acct_name); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinAcct_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinAcct_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinAcct *)OTDB::BitcoinAcct::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_BitcoinAcct(void *obj) { +OTDB::BitcoinAcct *arg1 = (OTDB::BitcoinAcct *) obj; +delete arg1; +} +static swig_method swig_OTDB_BitcoinAcct_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_BitcoinAcct_attributes[] = { + { "-gui_label",_wrap_BitcoinAcct_gui_label_get, _wrap_BitcoinAcct_gui_label_set}, + { "-acct_id",_wrap_BitcoinAcct_acct_id_get, _wrap_BitcoinAcct_acct_id_set}, + { "-server_id",_wrap_BitcoinAcct_server_id_get, _wrap_BitcoinAcct_server_id_set}, + { "-bitcoin_acct_name",_wrap_BitcoinAcct_bitcoin_acct_name_get, _wrap_BitcoinAcct_bitcoin_acct_name_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_BitcoinAcct_bases[] = {0,0}; +static const char * swig_OTDB_BitcoinAcct_base_names[] = {"OTDB::Acct *",0}; +static swig_class _wrap_class_OTDB_BitcoinAcct = { "BitcoinAcct", &SWIGTYPE_p_OTDB__BitcoinAcct,0, swig_delete_BitcoinAcct, swig_OTDB_BitcoinAcct_methods, swig_OTDB_BitcoinAcct_attributes, swig_OTDB_BitcoinAcct_bases,swig_OTDB_BitcoinAcct_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_ServerInfo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_ServerInfo self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ServerInfo" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ServerInfo_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ServerInfo_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_gui_label_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ServerInfo_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ServerInfo_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_id_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ServerInfo_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_set" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ServerInfo_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ServerInfo_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ServerInfo, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_server_type_get" "', argument " "1"" of type '" "OTDB::ServerInfo *""'"); + } + arg1 = reinterpret_cast< OTDB::ServerInfo * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ServerInfo_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ServerInfo *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ServerInfo_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ServerInfo_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ServerInfo *)OTDB::ServerInfo::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_ServerInfo(void *obj) { +OTDB::ServerInfo *arg1 = (OTDB::ServerInfo *) obj; +delete arg1; +} +static swig_method swig_OTDB_ServerInfo_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_ServerInfo_attributes[] = { + { "-gui_label",_wrap_ServerInfo_gui_label_get, _wrap_ServerInfo_gui_label_set}, + { "-server_id",_wrap_ServerInfo_server_id_get, _wrap_ServerInfo_server_id_set}, + { "-server_type",_wrap_ServerInfo_server_type_get, _wrap_ServerInfo_server_type_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_ServerInfo_bases[] = {0,0}; +static const char * swig_OTDB_ServerInfo_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_ServerInfo = { "ServerInfo", &SWIGTYPE_p_OTDB__ServerInfo,0, swig_delete_ServerInfo, swig_OTDB_ServerInfo_methods, swig_OTDB_ServerInfo_attributes, swig_OTDB_ServerInfo_bases,swig_OTDB_ServerInfo_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_Server(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Server self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Server" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Server_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_gui_label_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Server_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_id_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Server_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_type_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_host_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Server_server_host_set self server_host ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_host_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_server_host_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_host_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_host); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_port_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Server_server_port_set self server_port ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_set" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Server_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_server_port_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Server *arg1 = (OTDB::Server *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_server_port_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Server, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_server_port_get" "', argument " "1"" of type '" "OTDB::Server *""'"); + } + arg1 = reinterpret_cast< OTDB::Server * >(argp1); + result = (std::string *) & ((arg1)->server_port); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Server_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Server *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Server_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Server_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Server *)OTDB::Server::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Server,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Server(void *obj) { +OTDB::Server *arg1 = (OTDB::Server *) obj; +delete arg1; +} +static swig_method swig_OTDB_Server_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_Server_attributes[] = { + { "-gui_label",_wrap_Server_gui_label_get, _wrap_Server_gui_label_set}, + { "-server_id",_wrap_Server_server_id_get, _wrap_Server_server_id_set}, + { "-server_type",_wrap_Server_server_type_get, _wrap_Server_server_type_set}, + { "-server_host",_wrap_Server_server_host_get, _wrap_Server_server_host_set}, + { "-server_port",_wrap_Server_server_port_get, _wrap_Server_server_port_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_Server_bases[] = {0,0}; +static const char * swig_OTDB_Server_base_names[] = {"OTDB::ServerInfo *",0}; +static swig_class _wrap_class_OTDB_Server = { "Server", &SWIGTYPE_p_OTDB__Server,0, swig_delete_Server, swig_OTDB_Server_methods, swig_OTDB_Server_attributes, swig_OTDB_Server_bases,swig_OTDB_Server_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_BitcoinServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_BitcoinServer self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BitcoinServer" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_gui_label_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_id_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_type_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_host_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_server_host_set self server_host ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_host_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_server_host_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_host_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_port_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_server_port_set self server_port ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_server_port_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_server_port_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_server_port_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_bitcoin_username_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_bitcoin_username_set self bitcoin_username ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_username = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_bitcoin_username_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_bitcoin_username_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_username_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_username); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_bitcoin_password_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:BitcoinServer_bitcoin_password_set self bitcoin_password ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "BitcoinServer_bitcoin_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->bitcoin_password = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_bitcoin_password_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_bitcoin_password_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__BitcoinServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_bitcoin_password_get" "', argument " "1"" of type '" "OTDB::BitcoinServer *""'"); + } + arg1 = reinterpret_cast< OTDB::BitcoinServer * >(argp1); + result = (std::string *) & ((arg1)->bitcoin_password); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_BitcoinServer_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::BitcoinServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:BitcoinServer_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BitcoinServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::BitcoinServer *)OTDB::BitcoinServer::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_BitcoinServer(void *obj) { +OTDB::BitcoinServer *arg1 = (OTDB::BitcoinServer *) obj; +delete arg1; +} +static swig_method swig_OTDB_BitcoinServer_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_BitcoinServer_attributes[] = { + { "-gui_label",_wrap_BitcoinServer_gui_label_get, _wrap_BitcoinServer_gui_label_set}, + { "-server_id",_wrap_BitcoinServer_server_id_get, _wrap_BitcoinServer_server_id_set}, + { "-server_type",_wrap_BitcoinServer_server_type_get, _wrap_BitcoinServer_server_type_set}, + { "-server_host",_wrap_BitcoinServer_server_host_get, _wrap_BitcoinServer_server_host_set}, + { "-server_port",_wrap_BitcoinServer_server_port_get, _wrap_BitcoinServer_server_port_set}, + { "-bitcoin_username",_wrap_BitcoinServer_bitcoin_username_get, _wrap_BitcoinServer_bitcoin_username_set}, + { "-bitcoin_password",_wrap_BitcoinServer_bitcoin_password_get, _wrap_BitcoinServer_bitcoin_password_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_BitcoinServer_bases[] = {0,0}; +static const char * swig_OTDB_BitcoinServer_base_names[] = {"OTDB::Server *",0}; +static swig_class _wrap_class_OTDB_BitcoinServer = { "BitcoinServer", &SWIGTYPE_p_OTDB__BitcoinServer,0, swig_delete_BitcoinServer, swig_OTDB_BitcoinServer_methods, swig_OTDB_BitcoinServer_attributes, swig_OTDB_BitcoinServer_bases,swig_OTDB_BitcoinServer_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_RippleServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_RippleServer self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RippleServer" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_gui_label_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_type_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_host_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_server_host_set self server_host ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_host_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_server_host_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_host_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_port_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_server_port_set self server_port ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_server_port_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_server_port_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_server_port_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_ripple_username_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_ripple_username_set self ripple_username ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_username = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_ripple_username_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_ripple_username_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_username_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_username); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_ripple_password_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_ripple_password_set self ripple_password ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_ripple_password_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->ripple_password = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_ripple_password_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_ripple_password_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ripple_password_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->ripple_password); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_namefield_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_namefield_id_set self namefield_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_namefield_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_namefield_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_passfield_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:RippleServer_passfield_id_set self passfield_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_set" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RippleServer_passfield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->passfield_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_passfield_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::RippleServer *arg1 = (OTDB::RippleServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_passfield_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__RippleServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_passfield_id_get" "', argument " "1"" of type '" "OTDB::RippleServer *""'"); + } + arg1 = reinterpret_cast< OTDB::RippleServer * >(argp1); + result = (std::string *) & ((arg1)->passfield_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_RippleServer_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::RippleServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:RippleServer_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RippleServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::RippleServer *)OTDB::RippleServer::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_RippleServer(void *obj) { +OTDB::RippleServer *arg1 = (OTDB::RippleServer *) obj; +delete arg1; +} +static swig_method swig_OTDB_RippleServer_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_RippleServer_attributes[] = { + { "-gui_label",_wrap_RippleServer_gui_label_get, _wrap_RippleServer_gui_label_set}, + { "-server_id",_wrap_RippleServer_server_id_get, _wrap_RippleServer_server_id_set}, + { "-server_type",_wrap_RippleServer_server_type_get, _wrap_RippleServer_server_type_set}, + { "-server_host",_wrap_RippleServer_server_host_get, _wrap_RippleServer_server_host_set}, + { "-server_port",_wrap_RippleServer_server_port_get, _wrap_RippleServer_server_port_set}, + { "-ripple_username",_wrap_RippleServer_ripple_username_get, _wrap_RippleServer_ripple_username_set}, + { "-ripple_password",_wrap_RippleServer_ripple_password_get, _wrap_RippleServer_ripple_password_set}, + { "-namefield_id",_wrap_RippleServer_namefield_id_get, _wrap_RippleServer_namefield_id_set}, + { "-passfield_id",_wrap_RippleServer_passfield_id_get, _wrap_RippleServer_passfield_id_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_RippleServer_bases[] = {0,0}; +static const char * swig_OTDB_RippleServer_base_names[] = {"OTDB::Server *",0}; +static swig_class _wrap_class_OTDB_RippleServer = { "RippleServer", &SWIGTYPE_p_OTDB__RippleServer,0, swig_delete_RippleServer, swig_OTDB_RippleServer_methods, swig_OTDB_RippleServer_attributes, swig_OTDB_RippleServer_bases,swig_OTDB_RippleServer_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_LoomServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_LoomServer self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_LoomServer" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_gui_label_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_type_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_host_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_server_host_set self server_host ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_host_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_host = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_host_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_server_host_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_host_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_host); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_port_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_server_port_set self server_port ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_server_port_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_port = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_server_port_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_server_port_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_server_port_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->server_port); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_loom_username_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_loom_username_set self loom_username ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_loom_username_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->loom_username = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_loom_username_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_loom_username_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_loom_username_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->loom_username); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_namefield_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:LoomServer_namefield_id_set self namefield_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_set" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "LoomServer_namefield_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->namefield_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_namefield_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::LoomServer *arg1 = (OTDB::LoomServer *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_namefield_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__LoomServer, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_namefield_id_get" "', argument " "1"" of type '" "OTDB::LoomServer *""'"); + } + arg1 = reinterpret_cast< OTDB::LoomServer * >(argp1); + result = (std::string *) & ((arg1)->namefield_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_LoomServer_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::LoomServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:LoomServer_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LoomServer_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::LoomServer *)OTDB::LoomServer::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_LoomServer(void *obj) { +OTDB::LoomServer *arg1 = (OTDB::LoomServer *) obj; +delete arg1; +} +static swig_method swig_OTDB_LoomServer_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_LoomServer_attributes[] = { + { "-gui_label",_wrap_LoomServer_gui_label_get, _wrap_LoomServer_gui_label_set}, + { "-server_id",_wrap_LoomServer_server_id_get, _wrap_LoomServer_server_id_set}, + { "-server_type",_wrap_LoomServer_server_type_get, _wrap_LoomServer_server_type_set}, + { "-server_host",_wrap_LoomServer_server_host_get, _wrap_LoomServer_server_host_set}, + { "-server_port",_wrap_LoomServer_server_port_get, _wrap_LoomServer_server_port_set}, + { "-loom_username",_wrap_LoomServer_loom_username_get, _wrap_LoomServer_loom_username_set}, + { "-namefield_id",_wrap_LoomServer_namefield_id_get, _wrap_LoomServer_namefield_id_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_LoomServer_bases[] = {0,0}; +static const char * swig_OTDB_LoomServer_base_names[] = {"OTDB::Server *",0}; +static swig_class _wrap_class_OTDB_LoomServer = { "LoomServer", &SWIGTYPE_p_OTDB__LoomServer,0, swig_delete_LoomServer, swig_OTDB_LoomServer_methods, swig_OTDB_LoomServer_attributes, swig_OTDB_LoomServer_bases,swig_OTDB_LoomServer_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_ContactNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_ContactNym self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactNym" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_nym_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_nym_type_set self nym_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_nym_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_nym_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_type_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_nym_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_nym_id_set self nym_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_nym_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_nym_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_public_key_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_public_key_set self public_key ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_public_key_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_public_key_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_public_key_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->public_key); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_memo_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_memo_set self memo ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_set" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_memo_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_memo_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_memo_get" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (std::string *) & ((arg1)->memo); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_GetServerInfoCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_GetServerInfoCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfoCount" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + result = (arg1)->GetServerInfoCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_GetServerInfo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ServerInfo *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_GetServerInfo self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_GetServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_GetServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ServerInfo *)(arg1)->GetServerInfo(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ServerInfo,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_RemoveServerInfo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_RemoveServerInfo self nIndexServerInfo ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_RemoveServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ContactNym_RemoveServerInfo" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveServerInfo(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_AddServerInfo(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactNym *arg1 = (OTDB::ContactNym *) 0 ; + OTDB::ServerInfo *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactNym_AddServerInfo self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactNym, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_AddServerInfo" "', argument " "1"" of type '" "OTDB::ContactNym *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactNym * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__ServerInfo, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactNym_AddServerInfo" "', argument " "2"" of type '" "OTDB::ServerInfo &""'"); + } + arg2 = reinterpret_cast< OTDB::ServerInfo * >(argp2); + result = (bool)(arg1)->AddServerInfo(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactNym_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ContactNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactNym_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactNym_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactNym *)OTDB::ContactNym::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_ContactNym(void *obj) { +OTDB::ContactNym *arg1 = (OTDB::ContactNym *) obj; +delete arg1; +} +static swig_method swig_OTDB_ContactNym_methods[] = { + {"GetServerInfoCount", _wrap_ContactNym_GetServerInfoCount}, + {"GetServerInfo", _wrap_ContactNym_GetServerInfo}, + {"RemoveServerInfo", _wrap_ContactNym_RemoveServerInfo}, + {"AddServerInfo", _wrap_ContactNym_AddServerInfo}, + {0,0} +}; +static swig_attribute swig_OTDB_ContactNym_attributes[] = { + { "-gui_label",_wrap_ContactNym_gui_label_get, _wrap_ContactNym_gui_label_set}, + { "-nym_type",_wrap_ContactNym_nym_type_get, _wrap_ContactNym_nym_type_set}, + { "-nym_id",_wrap_ContactNym_nym_id_get, _wrap_ContactNym_nym_id_set}, + { "-public_key",_wrap_ContactNym_public_key_get, _wrap_ContactNym_public_key_set}, + { "-memo",_wrap_ContactNym_memo_get, _wrap_ContactNym_memo_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_ContactNym_bases[] = {0,0}; +static const char * swig_OTDB_ContactNym_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_ContactNym = { "ContactNym", &SWIGTYPE_p_OTDB__ContactNym,0, swig_delete_ContactNym, swig_OTDB_ContactNym_methods, swig_OTDB_ContactNym_attributes, swig_OTDB_ContactNym_bases,swig_OTDB_ContactNym_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_WalletData(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_WalletData self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_WalletData" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetBitcoinServerCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:WalletData_GetBitcoinServerCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinServerCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetBitcoinServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BitcoinServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_GetBitcoinServer self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinServer *)(arg1)->GetBitcoinServer(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_RemoveBitcoinServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_RemoveBitcoinServer self nIndexBitcoinServer ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinServer(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_AddBitcoinServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_AddBitcoinServer self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__BitcoinServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinServer" "', argument " "2"" of type '" "OTDB::BitcoinServer &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinServer * >(argp2); + result = (bool)(arg1)->AddBitcoinServer(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetBitcoinAcctCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:WalletData_GetBitcoinAcctCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcctCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetBitcoinAcctCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetBitcoinAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::BitcoinAcct *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_GetBitcoinAcct self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::BitcoinAcct *)(arg1)->GetBitcoinAcct(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__BitcoinAcct,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_RemoveBitcoinAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_RemoveBitcoinAcct self nIndexBitcoinAcct ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveBitcoinAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveBitcoinAcct(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_AddBitcoinAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::BitcoinAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_AddBitcoinAcct self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddBitcoinAcct" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__BitcoinAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddBitcoinAcct" "', argument " "2"" of type '" "OTDB::BitcoinAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::BitcoinAcct * >(argp2); + result = (bool)(arg1)->AddBitcoinAcct(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetRippleServerCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:WalletData_GetRippleServerCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetRippleServerCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetRippleServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::RippleServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_GetRippleServer self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::RippleServer *)(arg1)->GetRippleServer(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__RippleServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_RemoveRippleServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_RemoveRippleServer self nIndexRippleServer ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveRippleServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveRippleServer(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_AddRippleServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::RippleServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_AddRippleServer self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddRippleServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__RippleServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddRippleServer" "', argument " "2"" of type '" "OTDB::RippleServer &""'"); + } + arg2 = reinterpret_cast< OTDB::RippleServer * >(argp2); + result = (bool)(arg1)->AddRippleServer(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetLoomServerCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:WalletData_GetLoomServerCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServerCount" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + result = (arg1)->GetLoomServerCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_GetLoomServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::LoomServer *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_GetLoomServer self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_GetLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_GetLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::LoomServer *)(arg1)->GetLoomServer(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__LoomServer,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_RemoveLoomServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_RemoveLoomServer self nIndexLoomServer ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_RemoveLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "WalletData_RemoveLoomServer" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveLoomServer(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_AddLoomServer(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::WalletData *arg1 = (OTDB::WalletData *) 0 ; + OTDB::LoomServer *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:WalletData_AddLoomServer self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__WalletData, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_AddLoomServer" "', argument " "1"" of type '" "OTDB::WalletData *""'"); + } + arg1 = reinterpret_cast< OTDB::WalletData * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__LoomServer, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "WalletData_AddLoomServer" "', argument " "2"" of type '" "OTDB::LoomServer &""'"); + } + arg2 = reinterpret_cast< OTDB::LoomServer * >(argp2); + result = (bool)(arg1)->AddLoomServer(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_WalletData_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::WalletData *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:WalletData_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WalletData_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::WalletData *)OTDB::WalletData::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__WalletData,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_WalletData(void *obj) { +OTDB::WalletData *arg1 = (OTDB::WalletData *) obj; +delete arg1; +} +static swig_method swig_OTDB_WalletData_methods[] = { + {"GetBitcoinServerCount", _wrap_WalletData_GetBitcoinServerCount}, + {"GetBitcoinServer", _wrap_WalletData_GetBitcoinServer}, + {"RemoveBitcoinServer", _wrap_WalletData_RemoveBitcoinServer}, + {"AddBitcoinServer", _wrap_WalletData_AddBitcoinServer}, + {"GetBitcoinAcctCount", _wrap_WalletData_GetBitcoinAcctCount}, + {"GetBitcoinAcct", _wrap_WalletData_GetBitcoinAcct}, + {"RemoveBitcoinAcct", _wrap_WalletData_RemoveBitcoinAcct}, + {"AddBitcoinAcct", _wrap_WalletData_AddBitcoinAcct}, + {"GetRippleServerCount", _wrap_WalletData_GetRippleServerCount}, + {"GetRippleServer", _wrap_WalletData_GetRippleServer}, + {"RemoveRippleServer", _wrap_WalletData_RemoveRippleServer}, + {"AddRippleServer", _wrap_WalletData_AddRippleServer}, + {"GetLoomServerCount", _wrap_WalletData_GetLoomServerCount}, + {"GetLoomServer", _wrap_WalletData_GetLoomServer}, + {"RemoveLoomServer", _wrap_WalletData_RemoveLoomServer}, + {"AddLoomServer", _wrap_WalletData_AddLoomServer}, + {0,0} +}; +static swig_attribute swig_OTDB_WalletData_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_WalletData_bases[] = {0,0}; +static const char * swig_OTDB_WalletData_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_WalletData = { "WalletData", &SWIGTYPE_p_OTDB__WalletData,0, swig_delete_WalletData, swig_OTDB_WalletData_methods, swig_OTDB_WalletData_attributes, swig_OTDB_WalletData_bases,swig_OTDB_WalletData_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_ContactAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_ContactAcct self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ContactAcct" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_gui_label_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_server_type_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_server_type_set self server_type ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_type_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_type = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_server_type_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_server_type_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_type_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_type); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_server_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_server_id_set self server_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_server_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->server_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_server_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_server_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_server_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->server_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_asset_type_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_asset_type_id_set self asset_type_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_asset_type_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->asset_type_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_asset_type_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_asset_type_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_asset_type_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->asset_type_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_acct_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_acct_id_set self acct_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_acct_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->acct_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_acct_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_acct_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_acct_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->acct_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_nym_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_nym_id_set self nym_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_nym_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->nym_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_nym_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_nym_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_nym_id_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->nym_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_memo_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_memo_set self memo ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_memo_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_memo_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_memo_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->memo); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_public_key_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:ContactAcct_public_key_set self public_key ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_set" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ContactAcct_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_public_key_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_public_key_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__ContactAcct, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_public_key_get" "', argument " "1"" of type '" "OTDB::ContactAcct *""'"); + } + arg1 = reinterpret_cast< OTDB::ContactAcct * >(argp1); + result = (std::string *) & ((arg1)->public_key); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_ContactAcct_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::ContactAcct *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:ContactAcct_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ContactAcct_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::ContactAcct *)OTDB::ContactAcct::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_ContactAcct(void *obj) { +OTDB::ContactAcct *arg1 = (OTDB::ContactAcct *) obj; +delete arg1; +} +static swig_method swig_OTDB_ContactAcct_methods[] = { + {0,0} +}; +static swig_attribute swig_OTDB_ContactAcct_attributes[] = { + { "-gui_label",_wrap_ContactAcct_gui_label_get, _wrap_ContactAcct_gui_label_set}, + { "-server_type",_wrap_ContactAcct_server_type_get, _wrap_ContactAcct_server_type_set}, + { "-server_id",_wrap_ContactAcct_server_id_get, _wrap_ContactAcct_server_id_set}, + { "-asset_type_id",_wrap_ContactAcct_asset_type_id_get, _wrap_ContactAcct_asset_type_id_set}, + { "-acct_id",_wrap_ContactAcct_acct_id_get, _wrap_ContactAcct_acct_id_set}, + { "-nym_id",_wrap_ContactAcct_nym_id_get, _wrap_ContactAcct_nym_id_set}, + { "-memo",_wrap_ContactAcct_memo_get, _wrap_ContactAcct_memo_set}, + { "-public_key",_wrap_ContactAcct_public_key_get, _wrap_ContactAcct_public_key_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_ContactAcct_bases[] = {0,0}; +static const char * swig_OTDB_ContactAcct_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_ContactAcct = { "ContactAcct", &SWIGTYPE_p_OTDB__ContactAcct,0, swig_delete_ContactAcct, swig_OTDB_ContactAcct_methods, swig_OTDB_ContactAcct_attributes, swig_OTDB_ContactAcct_bases,swig_OTDB_ContactAcct_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_Contact(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_Contact self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Contact" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_gui_label_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_gui_label_set self gui_label ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_gui_label_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->gui_label = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_gui_label_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_gui_label_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_gui_label_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->gui_label); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_contact_id_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_contact_id_set self contact_id ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_contact_id_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->contact_id = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_contact_id_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_contact_id_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_contact_id_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->contact_id); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_email_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_email_set self email ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_email_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->email = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_email_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_email_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_email_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->email); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_memo_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_memo_set self memo ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_memo_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->memo = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_memo_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_memo_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_memo_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->memo); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_public_key_set(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + std::string *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int res2 = SWIG_OLDOBJ ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_public_key_set self public_key ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_set" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + { + std::string *ptr = (std::string *)0; + res2 = SWIG_AsPtr_std_string SWIG_TCL_CALL_ARGS_2(objv[2], &ptr); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + if (!ptr) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_public_key_set" "', argument " "2"" of type '" "std::string const &""'"); + } + arg2 = ptr; + } + if (arg1) (arg1)->public_key = *arg2; + + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_OK; +fail: + if (SWIG_IsNewObj(res2)) delete arg2; + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_public_key_get(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + std::string *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_public_key_get self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_public_key_get" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (std::string *) & ((arg1)->public_key); + Tcl_SetObjResult(interp,SWIG_From_std_string(static_cast< std::string >(*result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_GetContactNymCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_GetContactNymCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNymCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactNymCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_GetContactNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ContactNym *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_GetContactNym self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactNym *)(arg1)->GetContactNym(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactNym,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_RemoveContactNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_RemoveContactNym self nIndexContactNym ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactNym" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactNym(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_AddContactNym(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactNym *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_AddContactNym self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactNym" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__ContactNym, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactNym" "', argument " "2"" of type '" "OTDB::ContactNym &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactNym * >(argp2); + result = (bool)(arg1)->AddContactNym(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_GetContactAcctCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_GetContactAcctCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcctCount" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + result = (arg1)->GetContactAcctCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_GetContactAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::ContactAcct *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_GetContactAcct self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_GetContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_GetContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::ContactAcct *)(arg1)->GetContactAcct(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__ContactAcct,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_RemoveContactAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_RemoveContactAcct self nIndexContactAcct ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_RemoveContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Contact_RemoveContactAcct" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContactAcct(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_AddContactAcct(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Contact *arg1 = (OTDB::Contact *) 0 ; + OTDB::ContactAcct *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:Contact_AddContactAcct self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Contact, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_AddContactAcct" "', argument " "1"" of type '" "OTDB::Contact *""'"); + } + arg1 = reinterpret_cast< OTDB::Contact * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__ContactAcct, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Contact_AddContactAcct" "', argument " "2"" of type '" "OTDB::ContactAcct &""'"); + } + arg2 = reinterpret_cast< OTDB::ContactAcct * >(argp2); + result = (bool)(arg1)->AddContactAcct(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_Contact_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::Contact *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:Contact_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Contact_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::Contact *)OTDB::Contact::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_Contact(void *obj) { +OTDB::Contact *arg1 = (OTDB::Contact *) obj; +delete arg1; +} +static swig_method swig_OTDB_Contact_methods[] = { + {"GetContactNymCount", _wrap_Contact_GetContactNymCount}, + {"GetContactNym", _wrap_Contact_GetContactNym}, + {"RemoveContactNym", _wrap_Contact_RemoveContactNym}, + {"AddContactNym", _wrap_Contact_AddContactNym}, + {"GetContactAcctCount", _wrap_Contact_GetContactAcctCount}, + {"GetContactAcct", _wrap_Contact_GetContactAcct}, + {"RemoveContactAcct", _wrap_Contact_RemoveContactAcct}, + {"AddContactAcct", _wrap_Contact_AddContactAcct}, + {0,0} +}; +static swig_attribute swig_OTDB_Contact_attributes[] = { + { "-gui_label",_wrap_Contact_gui_label_get, _wrap_Contact_gui_label_set}, + { "-contact_id",_wrap_Contact_contact_id_get, _wrap_Contact_contact_id_set}, + { "-email",_wrap_Contact_email_get, _wrap_Contact_email_set}, + { "-memo",_wrap_Contact_memo_get, _wrap_Contact_memo_set}, + { "-public_key",_wrap_Contact_public_key_get, _wrap_Contact_public_key_set}, + {0,0,0} +}; +static swig_class *swig_OTDB_Contact_bases[] = {0,0}; +static const char * swig_OTDB_Contact_base_names[] = {"OTDB::Displayable *",0}; +static swig_class _wrap_class_OTDB_Contact = { "Contact", &SWIGTYPE_p_OTDB__Contact,0, swig_delete_Contact, swig_OTDB_Contact_methods, swig_OTDB_Contact_attributes, swig_OTDB_Contact_bases,swig_OTDB_Contact_base_names, &swig_module }; +SWIGINTERN int +_wrap_delete_AddressBook(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:delete_AddressBook self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AddressBook, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AddressBook" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + delete arg1; + + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AddressBook_GetContactCount(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t result; + + if (SWIG_GetArgs(interp, objc, objv,"o:AddressBook_GetContactCount self ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContactCount" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + result = (arg1)->GetContactCount(); + Tcl_SetObjResult(interp,SWIG_From_size_t(static_cast< size_t >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AddressBook_GetContact(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + OTDB::Contact *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AddressBook_GetContact self nIndex ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_GetContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_GetContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (OTDB::Contact *)(arg1)->GetContact(arg2); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__Contact,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AddressBook_RemoveContact(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + size_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + size_t val2 ; + int ecode2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AddressBook_RemoveContact self nIndexContact ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_RemoveContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + ecode2 = SWIG_AsVal_size_t SWIG_TCL_CALL_ARGS_2(objv[2], &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AddressBook_RemoveContact" "', argument " "2"" of type '" "size_t""'"); + } + arg2 = static_cast< size_t >(val2); + result = (bool)(arg1)->RemoveContact(arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AddressBook_AddContact(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::AddressBook *arg1 = (OTDB::AddressBook *) 0 ; + OTDB::Contact *arg2 = 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + bool result; + + if (SWIG_GetArgs(interp, objc, objv,"oo:AddressBook_AddContact self disownObject ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__AddressBook, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_AddContact" "', argument " "1"" of type '" "OTDB::AddressBook *""'"); + } + arg1 = reinterpret_cast< OTDB::AddressBook * >(argp1); + res2 = SWIG_ConvertPtr(objv[2], &argp2, SWIGTYPE_p_OTDB__Contact, 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + if (!argp2) { + SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AddressBook_AddContact" "', argument " "2"" of type '" "OTDB::Contact &""'"); + } + arg2 = reinterpret_cast< OTDB::Contact * >(argp2); + result = (bool)(arg1)->AddContact(*arg2); + Tcl_SetObjResult(interp,SWIG_From_bool(static_cast< bool >(result))); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN int +_wrap_AddressBook_ot_dynamic_cast(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + OTDB::Storable *arg1 = (OTDB::Storable *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + OTDB::AddressBook *result = 0 ; + + if (SWIG_GetArgs(interp, objc, objv,"o:AddressBook_ot_dynamic_cast pObject ",(void *)0) == TCL_ERROR) SWIG_fail; + res1 = SWIG_ConvertPtr(objv[1], &argp1,SWIGTYPE_p_OTDB__Storable, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AddressBook_ot_dynamic_cast" "', argument " "1"" of type '" "OTDB::Storable *""'"); + } + arg1 = reinterpret_cast< OTDB::Storable * >(argp1); + result = (OTDB::AddressBook *)OTDB::AddressBook::ot_dynamic_cast(arg1); + Tcl_SetObjResult(interp, SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_OTDB__AddressBook,0)); + return TCL_OK; +fail: + return TCL_ERROR; +} + + +SWIGINTERN void swig_delete_AddressBook(void *obj) { +OTDB::AddressBook *arg1 = (OTDB::AddressBook *) obj; +delete arg1; +} +static swig_method swig_OTDB_AddressBook_methods[] = { + {"GetContactCount", _wrap_AddressBook_GetContactCount}, + {"GetContact", _wrap_AddressBook_GetContact}, + {"RemoveContact", _wrap_AddressBook_RemoveContact}, + {"AddContact", _wrap_AddressBook_AddContact}, + {0,0} +}; +static swig_attribute swig_OTDB_AddressBook_attributes[] = { + {0,0,0} +}; +static swig_class *swig_OTDB_AddressBook_bases[] = {0,0}; +static const char * swig_OTDB_AddressBook_base_names[] = {"OTDB::Storable *",0}; +static swig_class _wrap_class_OTDB_AddressBook = { "AddressBook", &SWIGTYPE_p_OTDB__AddressBook,0, swig_delete_AddressBook, swig_OTDB_AddressBook_methods, swig_OTDB_AddressBook_attributes, swig_OTDB_AddressBook_bases,swig_OTDB_AddressBook_base_names, &swig_module }; + +static swig_command_info swig_commands[] = { + { SWIG_prefix "new_OTCallback", (swig_wrapper_func) _wrap_new_OTCallback, NULL}, + { SWIG_prefix "delete_OTCallback", (swig_wrapper_func) _wrap_delete_OTCallback, NULL}, + { SWIG_prefix "OTCallback_runOne", (swig_wrapper_func) _wrap_OTCallback_runOne, NULL}, + { SWIG_prefix "OTCallback_runTwo", (swig_wrapper_func) _wrap_OTCallback_runTwo, NULL}, + { SWIG_prefix "OTCallback", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTCallback}, + { SWIG_prefix "new_OTCaller", (swig_wrapper_func) _wrap_new_OTCaller, NULL}, + { SWIG_prefix "delete_OTCaller", (swig_wrapper_func) _wrap_delete_OTCaller, NULL}, + { SWIG_prefix "OTCaller_GetPassword", (swig_wrapper_func) _wrap_OTCaller_GetPassword, NULL}, + { SWIG_prefix "OTCaller_delCallback", (swig_wrapper_func) _wrap_OTCaller_delCallback, NULL}, + { SWIG_prefix "OTCaller_setCallback", (swig_wrapper_func) _wrap_OTCaller_setCallback, NULL}, + { SWIG_prefix "OTCaller_isCallbackSet", (swig_wrapper_func) _wrap_OTCaller_isCallbackSet, NULL}, + { SWIG_prefix "OTCaller_callOne", (swig_wrapper_func) _wrap_OTCaller_callOne, NULL}, + { SWIG_prefix "OTCaller_callTwo", (swig_wrapper_func) _wrap_OTCaller_callTwo, NULL}, + { SWIG_prefix "OTCaller", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTCaller}, + { SWIG_prefix "OT_API_Set_PasswordCallback", (swig_wrapper_func) _wrap_OT_API_Set_PasswordCallback, NULL}, + { SWIG_prefix "OT_API_Init", (swig_wrapper_func) _wrap_OT_API_Init, NULL}, + { SWIG_prefix "OT_API_LoadWallet", (swig_wrapper_func) _wrap_OT_API_LoadWallet, NULL}, + { SWIG_prefix "OT_API_SwitchWallet", (swig_wrapper_func) _wrap_OT_API_SwitchWallet, NULL}, + { SWIG_prefix "OT_API_GetMemlogSize", (swig_wrapper_func) _wrap_OT_API_GetMemlogSize, NULL}, + { SWIG_prefix "OT_API_GetMemlogAtIndex", (swig_wrapper_func) _wrap_OT_API_GetMemlogAtIndex, NULL}, + { SWIG_prefix "OT_API_PeekMemlogFront", (swig_wrapper_func) _wrap_OT_API_PeekMemlogFront, NULL}, + { SWIG_prefix "OT_API_PeekMemlogBack", (swig_wrapper_func) _wrap_OT_API_PeekMemlogBack, NULL}, + { SWIG_prefix "OT_API_PopMemlogFront", (swig_wrapper_func) _wrap_OT_API_PopMemlogFront, NULL}, + { SWIG_prefix "OT_API_PopMemlogBack", (swig_wrapper_func) _wrap_OT_API_PopMemlogBack, NULL}, + { SWIG_prefix "OT_API_CreateNym", (swig_wrapper_func) _wrap_OT_API_CreateNym, NULL}, + { SWIG_prefix "OT_API_AddServerContract", (swig_wrapper_func) _wrap_OT_API_AddServerContract, NULL}, + { SWIG_prefix "OT_API_AddAssetContract", (swig_wrapper_func) _wrap_OT_API_AddAssetContract, NULL}, + { SWIG_prefix "OT_API_GetServerCount", (swig_wrapper_func) _wrap_OT_API_GetServerCount, NULL}, + { SWIG_prefix "OT_API_GetAssetTypeCount", (swig_wrapper_func) _wrap_OT_API_GetAssetTypeCount, NULL}, + { SWIG_prefix "OT_API_GetAccountCount", (swig_wrapper_func) _wrap_OT_API_GetAccountCount, NULL}, + { SWIG_prefix "OT_API_GetNymCount", (swig_wrapper_func) _wrap_OT_API_GetNymCount, NULL}, + { SWIG_prefix "OT_API_GetServer_ID", (swig_wrapper_func) _wrap_OT_API_GetServer_ID, NULL}, + { SWIG_prefix "OT_API_GetServer_Name", (swig_wrapper_func) _wrap_OT_API_GetServer_Name, NULL}, + { SWIG_prefix "OT_API_GetAssetType_ID", (swig_wrapper_func) _wrap_OT_API_GetAssetType_ID, NULL}, + { SWIG_prefix "OT_API_GetAssetType_Name", (swig_wrapper_func) _wrap_OT_API_GetAssetType_Name, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_ID", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_ID, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_Name", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_Name, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_Balance", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_Balance, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_Type", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_Type, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_AssetTypeID", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_AssetTypeID, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_ServerID", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_ServerID, NULL}, + { SWIG_prefix "OT_API_GetAccountWallet_NymID", (swig_wrapper_func) _wrap_OT_API_GetAccountWallet_NymID, NULL}, + { SWIG_prefix "OT_API_VerifyAccountReceipt", (swig_wrapper_func) _wrap_OT_API_VerifyAccountReceipt, NULL}, + { SWIG_prefix "OT_API_GetNym_TransactionNumCount", (swig_wrapper_func) _wrap_OT_API_GetNym_TransactionNumCount, NULL}, + { SWIG_prefix "OT_API_GetNym_ID", (swig_wrapper_func) _wrap_OT_API_GetNym_ID, NULL}, + { SWIG_prefix "OT_API_GetNym_Name", (swig_wrapper_func) _wrap_OT_API_GetNym_Name, NULL}, + { SWIG_prefix "OT_API_GetNym_Stats", (swig_wrapper_func) _wrap_OT_API_GetNym_Stats, NULL}, + { SWIG_prefix "OT_API_IsNym_RegisteredAtServer", (swig_wrapper_func) _wrap_OT_API_IsNym_RegisteredAtServer, NULL}, + { SWIG_prefix "OT_API_GetNym_MailCount", (swig_wrapper_func) _wrap_OT_API_GetNym_MailCount, NULL}, + { SWIG_prefix "OT_API_GetNym_MailContentsByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_MailContentsByIndex, NULL}, + { SWIG_prefix "OT_API_GetNym_MailSenderIDByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_MailSenderIDByIndex, NULL}, + { SWIG_prefix "OT_API_GetNym_MailServerIDByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_MailServerIDByIndex, NULL}, + { SWIG_prefix "OT_API_Nym_RemoveMailByIndex", (swig_wrapper_func) _wrap_OT_API_Nym_RemoveMailByIndex, NULL}, + { SWIG_prefix "OT_API_Nym_VerifyMailByIndex", (swig_wrapper_func) _wrap_OT_API_Nym_VerifyMailByIndex, NULL}, + { SWIG_prefix "OT_API_GetNym_OutmailCount", (swig_wrapper_func) _wrap_OT_API_GetNym_OutmailCount, NULL}, + { SWIG_prefix "OT_API_GetNym_OutmailContentsByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_OutmailContentsByIndex, NULL}, + { SWIG_prefix "OT_API_GetNym_OutmailRecipientIDByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_OutmailRecipientIDByIndex, NULL}, + { SWIG_prefix "OT_API_GetNym_OutmailServerIDByIndex", (swig_wrapper_func) _wrap_OT_API_GetNym_OutmailServerIDByIndex, NULL}, + { SWIG_prefix "OT_API_Nym_RemoveOutmailByIndex", (swig_wrapper_func) _wrap_OT_API_Nym_RemoveOutmailByIndex, NULL}, + { SWIG_prefix "OT_API_Nym_VerifyOutmailByIndex", (swig_wrapper_func) _wrap_OT_API_Nym_VerifyOutmailByIndex, NULL}, + { SWIG_prefix "OT_API_Wallet_CanRemoveServer", (swig_wrapper_func) _wrap_OT_API_Wallet_CanRemoveServer, NULL}, + { SWIG_prefix "OT_API_Wallet_RemoveServer", (swig_wrapper_func) _wrap_OT_API_Wallet_RemoveServer, NULL}, + { SWIG_prefix "OT_API_Wallet_CanRemoveAssetType", (swig_wrapper_func) _wrap_OT_API_Wallet_CanRemoveAssetType, NULL}, + { SWIG_prefix "OT_API_Wallet_RemoveAssetType", (swig_wrapper_func) _wrap_OT_API_Wallet_RemoveAssetType, NULL}, + { SWIG_prefix "OT_API_Wallet_CanRemoveNym", (swig_wrapper_func) _wrap_OT_API_Wallet_CanRemoveNym, NULL}, + { SWIG_prefix "OT_API_Wallet_RemoveNym", (swig_wrapper_func) _wrap_OT_API_Wallet_RemoveNym, NULL}, + { SWIG_prefix "OT_API_Wallet_CanRemoveAccount", (swig_wrapper_func) _wrap_OT_API_Wallet_CanRemoveAccount, NULL}, + { SWIG_prefix "OT_API_Wallet_ImportNym", (swig_wrapper_func) _wrap_OT_API_Wallet_ImportNym, NULL}, + { SWIG_prefix "OT_API_SetNym_Name", (swig_wrapper_func) _wrap_OT_API_SetNym_Name, NULL}, + { SWIG_prefix "OT_API_SetAccountWallet_Name", (swig_wrapper_func) _wrap_OT_API_SetAccountWallet_Name, NULL}, + { SWIG_prefix "OT_API_SetAssetType_Name", (swig_wrapper_func) _wrap_OT_API_SetAssetType_Name, NULL}, + { SWIG_prefix "OT_API_SetServer_Name", (swig_wrapper_func) _wrap_OT_API_SetServer_Name, NULL}, + { SWIG_prefix "OT_API_VerifyAndRetrieveXMLContents", (swig_wrapper_func) _wrap_OT_API_VerifyAndRetrieveXMLContents, NULL}, + { SWIG_prefix "OT_API_WriteCheque", (swig_wrapper_func) _wrap_OT_API_WriteCheque, NULL}, + { SWIG_prefix "OT_API_ProposePaymentPlan", (swig_wrapper_func) _wrap_OT_API_ProposePaymentPlan, NULL}, + { SWIG_prefix "OT_API_ConfirmPaymentPlan", (swig_wrapper_func) _wrap_OT_API_ConfirmPaymentPlan, NULL}, + { SWIG_prefix "OT_API_LoadUserPubkey", (swig_wrapper_func) _wrap_OT_API_LoadUserPubkey, NULL}, + { SWIG_prefix "OT_API_LoadPubkey", (swig_wrapper_func) _wrap_OT_API_LoadPubkey, NULL}, + { SWIG_prefix "OT_API_VerifyUserPrivateKey", (swig_wrapper_func) _wrap_OT_API_VerifyUserPrivateKey, NULL}, + { SWIG_prefix "OT_API_LoadPurse", (swig_wrapper_func) _wrap_OT_API_LoadPurse, NULL}, + { SWIG_prefix "OT_API_LoadMint", (swig_wrapper_func) _wrap_OT_API_LoadMint, NULL}, + { SWIG_prefix "OT_API_LoadAssetContract", (swig_wrapper_func) _wrap_OT_API_LoadAssetContract, NULL}, + { SWIG_prefix "OT_API_LoadServerContract", (swig_wrapper_func) _wrap_OT_API_LoadServerContract, NULL}, + { SWIG_prefix "OT_API_Mint_IsStillGood", (swig_wrapper_func) _wrap_OT_API_Mint_IsStillGood, NULL}, + { SWIG_prefix "OT_API_IsBasketCurrency", (swig_wrapper_func) _wrap_OT_API_IsBasketCurrency, NULL}, + { SWIG_prefix "OT_API_Basket_GetMemberCount", (swig_wrapper_func) _wrap_OT_API_Basket_GetMemberCount, NULL}, + { SWIG_prefix "OT_API_Basket_GetMemberType", (swig_wrapper_func) _wrap_OT_API_Basket_GetMemberType, NULL}, + { SWIG_prefix "OT_API_Basket_GetMinimumTransferAmount", (swig_wrapper_func) _wrap_OT_API_Basket_GetMinimumTransferAmount, NULL}, + { SWIG_prefix "OT_API_Basket_GetMemberMinimumTransferAmount", (swig_wrapper_func) _wrap_OT_API_Basket_GetMemberMinimumTransferAmount, NULL}, + { SWIG_prefix "OT_API_LoadAssetAccount", (swig_wrapper_func) _wrap_OT_API_LoadAssetAccount, NULL}, + { SWIG_prefix "OT_API_LoadInbox", (swig_wrapper_func) _wrap_OT_API_LoadInbox, NULL}, + { SWIG_prefix "OT_API_LoadOutbox", (swig_wrapper_func) _wrap_OT_API_LoadOutbox, NULL}, + { SWIG_prefix "OT_API_Ledger_GetCount", (swig_wrapper_func) _wrap_OT_API_Ledger_GetCount, NULL}, + { SWIG_prefix "OT_API_Ledger_CreateResponse", (swig_wrapper_func) _wrap_OT_API_Ledger_CreateResponse, NULL}, + { SWIG_prefix "OT_API_Ledger_GetTransactionByIndex", (swig_wrapper_func) _wrap_OT_API_Ledger_GetTransactionByIndex, NULL}, + { SWIG_prefix "OT_API_Ledger_GetTransactionByID", (swig_wrapper_func) _wrap_OT_API_Ledger_GetTransactionByID, NULL}, + { SWIG_prefix "OT_API_Ledger_GetTransactionIDByIndex", (swig_wrapper_func) _wrap_OT_API_Ledger_GetTransactionIDByIndex, NULL}, + { SWIG_prefix "OT_API_Ledger_AddTransaction", (swig_wrapper_func) _wrap_OT_API_Ledger_AddTransaction, NULL}, + { SWIG_prefix "OT_API_Transaction_CreateResponse", (swig_wrapper_func) _wrap_OT_API_Transaction_CreateResponse, NULL}, + { SWIG_prefix "OT_API_Ledger_FinalizeResponse", (swig_wrapper_func) _wrap_OT_API_Ledger_FinalizeResponse, NULL}, + { SWIG_prefix "OT_API_Transaction_GetType", (swig_wrapper_func) _wrap_OT_API_Transaction_GetType, NULL}, + { SWIG_prefix "OT_API_Transaction_GetVoucher", (swig_wrapper_func) _wrap_OT_API_Transaction_GetVoucher, NULL}, + { SWIG_prefix "OT_API_Transaction_GetSuccess", (swig_wrapper_func) _wrap_OT_API_Transaction_GetSuccess, NULL}, + { SWIG_prefix "OT_API_Transaction_GetBalanceAgreementSuccess", (swig_wrapper_func) _wrap_OT_API_Transaction_GetBalanceAgreementSuccess, NULL}, + { SWIG_prefix "OT_API_Transaction_GetDateSigned", (swig_wrapper_func) _wrap_OT_API_Transaction_GetDateSigned, NULL}, + { SWIG_prefix "OT_API_Transaction_GetAmount", (swig_wrapper_func) _wrap_OT_API_Transaction_GetAmount, NULL}, + { SWIG_prefix "OT_API_Pending_GetNote", (swig_wrapper_func) _wrap_OT_API_Pending_GetNote, NULL}, + { SWIG_prefix "OT_API_Transaction_GetSenderUserID", (swig_wrapper_func) _wrap_OT_API_Transaction_GetSenderUserID, NULL}, + { SWIG_prefix "OT_API_Transaction_GetSenderAcctID", (swig_wrapper_func) _wrap_OT_API_Transaction_GetSenderAcctID, NULL}, + { SWIG_prefix "OT_API_Transaction_GetRecipientUserID", (swig_wrapper_func) _wrap_OT_API_Transaction_GetRecipientUserID, NULL}, + { SWIG_prefix "OT_API_Transaction_GetRecipientAcctID", (swig_wrapper_func) _wrap_OT_API_Transaction_GetRecipientAcctID, NULL}, + { SWIG_prefix "OT_API_Transaction_GetDisplayReferenceToNum", (swig_wrapper_func) _wrap_OT_API_Transaction_GetDisplayReferenceToNum, NULL}, + { SWIG_prefix "OT_API_CreatePurse", (swig_wrapper_func) _wrap_OT_API_CreatePurse, NULL}, + { SWIG_prefix "OT_API_SavePurse", (swig_wrapper_func) _wrap_OT_API_SavePurse, NULL}, + { SWIG_prefix "OT_API_Purse_GetTotalValue", (swig_wrapper_func) _wrap_OT_API_Purse_GetTotalValue, NULL}, + { SWIG_prefix "OT_API_Purse_Count", (swig_wrapper_func) _wrap_OT_API_Purse_Count, NULL}, + { SWIG_prefix "OT_API_Purse_Peek", (swig_wrapper_func) _wrap_OT_API_Purse_Peek, NULL}, + { SWIG_prefix "OT_API_Purse_Pop", (swig_wrapper_func) _wrap_OT_API_Purse_Pop, NULL}, + { SWIG_prefix "OT_API_Purse_Push", (swig_wrapper_func) _wrap_OT_API_Purse_Push, NULL}, + { SWIG_prefix "OT_API_Wallet_ImportPurse", (swig_wrapper_func) _wrap_OT_API_Wallet_ImportPurse, NULL}, + { SWIG_prefix "OT_API_exchangePurse", (swig_wrapper_func) _wrap_OT_API_exchangePurse, NULL}, + { SWIG_prefix "OT_API_Token_ChangeOwner", (swig_wrapper_func) _wrap_OT_API_Token_ChangeOwner, NULL}, + { SWIG_prefix "OT_API_Token_GetID", (swig_wrapper_func) _wrap_OT_API_Token_GetID, NULL}, + { SWIG_prefix "OT_API_Token_GetDenomination", (swig_wrapper_func) _wrap_OT_API_Token_GetDenomination, NULL}, + { SWIG_prefix "OT_API_Token_GetSeries", (swig_wrapper_func) _wrap_OT_API_Token_GetSeries, NULL}, + { SWIG_prefix "OT_API_Token_GetValidFrom", (swig_wrapper_func) _wrap_OT_API_Token_GetValidFrom, NULL}, + { SWIG_prefix "OT_API_Token_GetValidTo", (swig_wrapper_func) _wrap_OT_API_Token_GetValidTo, NULL}, + { SWIG_prefix "OT_API_Token_GetAssetID", (swig_wrapper_func) _wrap_OT_API_Token_GetAssetID, NULL}, + { SWIG_prefix "OT_API_Token_GetServerID", (swig_wrapper_func) _wrap_OT_API_Token_GetServerID, NULL}, + { SWIG_prefix "OT_API_checkServerID", (swig_wrapper_func) _wrap_OT_API_checkServerID, NULL}, + { SWIG_prefix "OT_API_createUserAccount", (swig_wrapper_func) _wrap_OT_API_createUserAccount, NULL}, + { SWIG_prefix "OT_API_deleteUserAccount", (swig_wrapper_func) _wrap_OT_API_deleteUserAccount, NULL}, + { SWIG_prefix "OT_API_deleteAssetAccount", (swig_wrapper_func) _wrap_OT_API_deleteAssetAccount, NULL}, + { SWIG_prefix "OT_API_checkUser", (swig_wrapper_func) _wrap_OT_API_checkUser, NULL}, + { SWIG_prefix "OT_API_sendUserMessage", (swig_wrapper_func) _wrap_OT_API_sendUserMessage, NULL}, + { SWIG_prefix "OT_API_getRequest", (swig_wrapper_func) _wrap_OT_API_getRequest, NULL}, + { SWIG_prefix "OT_API_getTransactionNumber", (swig_wrapper_func) _wrap_OT_API_getTransactionNumber, NULL}, + { SWIG_prefix "OT_API_issueAssetType", (swig_wrapper_func) _wrap_OT_API_issueAssetType, NULL}, + { SWIG_prefix "OT_API_getContract", (swig_wrapper_func) _wrap_OT_API_getContract, NULL}, + { SWIG_prefix "OT_API_getMint", (swig_wrapper_func) _wrap_OT_API_getMint, NULL}, + { SWIG_prefix "OT_API_createAssetAccount", (swig_wrapper_func) _wrap_OT_API_createAssetAccount, NULL}, + { SWIG_prefix "OT_API_getAccount", (swig_wrapper_func) _wrap_OT_API_getAccount, NULL}, + { SWIG_prefix "OT_API_GenerateBasketCreation", (swig_wrapper_func) _wrap_OT_API_GenerateBasketCreation, NULL}, + { SWIG_prefix "OT_API_AddBasketCreationItem", (swig_wrapper_func) _wrap_OT_API_AddBasketCreationItem, NULL}, + { SWIG_prefix "OT_API_issueBasket", (swig_wrapper_func) _wrap_OT_API_issueBasket, NULL}, + { SWIG_prefix "OT_API_GenerateBasketExchange", (swig_wrapper_func) _wrap_OT_API_GenerateBasketExchange, NULL}, + { SWIG_prefix "OT_API_AddBasketExchangeItem", (swig_wrapper_func) _wrap_OT_API_AddBasketExchangeItem, NULL}, + { SWIG_prefix "OT_API_exchangeBasket", (swig_wrapper_func) _wrap_OT_API_exchangeBasket, NULL}, + { SWIG_prefix "OT_API_notarizeWithdrawal", (swig_wrapper_func) _wrap_OT_API_notarizeWithdrawal, NULL}, + { SWIG_prefix "OT_API_notarizeDeposit", (swig_wrapper_func) _wrap_OT_API_notarizeDeposit, NULL}, + { SWIG_prefix "OT_API_notarizeTransfer", (swig_wrapper_func) _wrap_OT_API_notarizeTransfer, NULL}, + { SWIG_prefix "OT_API_getInbox", (swig_wrapper_func) _wrap_OT_API_getInbox, NULL}, + { SWIG_prefix "OT_API_getOutbox", (swig_wrapper_func) _wrap_OT_API_getOutbox, NULL}, + { SWIG_prefix "OT_API_getNymbox", (swig_wrapper_func) _wrap_OT_API_getNymbox, NULL}, + { SWIG_prefix "OT_API_LoadNymbox", (swig_wrapper_func) _wrap_OT_API_LoadNymbox, NULL}, + { SWIG_prefix "OT_API_processInbox", (swig_wrapper_func) _wrap_OT_API_processInbox, NULL}, + { SWIG_prefix "OT_API_processNymbox", (swig_wrapper_func) _wrap_OT_API_processNymbox, NULL}, + { SWIG_prefix "OT_API_withdrawVoucher", (swig_wrapper_func) _wrap_OT_API_withdrawVoucher, NULL}, + { SWIG_prefix "OT_API_depositCheque", (swig_wrapper_func) _wrap_OT_API_depositCheque, NULL}, + { SWIG_prefix "OT_API_depositPaymentPlan", (swig_wrapper_func) _wrap_OT_API_depositPaymentPlan, NULL}, + { SWIG_prefix "OT_API_issueMarketOffer", (swig_wrapper_func) _wrap_OT_API_issueMarketOffer, NULL}, + { SWIG_prefix "OT_API_getMarketList", (swig_wrapper_func) _wrap_OT_API_getMarketList, NULL}, + { SWIG_prefix "OT_API_getMarketOffers", (swig_wrapper_func) _wrap_OT_API_getMarketOffers, NULL}, + { SWIG_prefix "OT_API_getMarketRecentTrades", (swig_wrapper_func) _wrap_OT_API_getMarketRecentTrades, NULL}, + { SWIG_prefix "OT_API_getNym_MarketOffers", (swig_wrapper_func) _wrap_OT_API_getNym_MarketOffers, NULL}, + { SWIG_prefix "OT_API_cancelMarketOffer", (swig_wrapper_func) _wrap_OT_API_cancelMarketOffer, NULL}, + { SWIG_prefix "OT_API_cancelPaymentPlan", (swig_wrapper_func) _wrap_OT_API_cancelPaymentPlan, NULL}, + { SWIG_prefix "OT_API_PopMessageBuffer", (swig_wrapper_func) _wrap_OT_API_PopMessageBuffer, NULL}, + { SWIG_prefix "OT_API_FlushMessageBuffer", (swig_wrapper_func) _wrap_OT_API_FlushMessageBuffer, NULL}, + { SWIG_prefix "OT_API_Message_GetCommand", (swig_wrapper_func) _wrap_OT_API_Message_GetCommand, NULL}, + { SWIG_prefix "OT_API_Message_GetSuccess", (swig_wrapper_func) _wrap_OT_API_Message_GetSuccess, NULL}, + { SWIG_prefix "OT_API_Message_GetDepth", (swig_wrapper_func) _wrap_OT_API_Message_GetDepth, NULL}, + { SWIG_prefix "OT_API_Message_GetTransactionSuccess", (swig_wrapper_func) _wrap_OT_API_Message_GetTransactionSuccess, NULL}, + { SWIG_prefix "OT_API_Message_GetBalanceAgreementSuccess", (swig_wrapper_func) _wrap_OT_API_Message_GetBalanceAgreementSuccess, NULL}, + { SWIG_prefix "OT_API_Message_GetLedger", (swig_wrapper_func) _wrap_OT_API_Message_GetLedger, NULL}, + { SWIG_prefix "OT_API_Message_GetNewAssetTypeID", (swig_wrapper_func) _wrap_OT_API_Message_GetNewAssetTypeID, NULL}, + { SWIG_prefix "OT_API_Message_GetNewIssuerAcctID", (swig_wrapper_func) _wrap_OT_API_Message_GetNewIssuerAcctID, NULL}, + { SWIG_prefix "OT_API_Message_GetNewAcctID", (swig_wrapper_func) _wrap_OT_API_Message_GetNewAcctID, NULL}, + { SWIG_prefix "OT_API_ConnectServer", (swig_wrapper_func) _wrap_OT_API_ConnectServer, NULL}, + { SWIG_prefix "OT_API_ProcessSockets", (swig_wrapper_func) _wrap_OT_API_ProcessSockets, NULL}, + { SWIG_prefix "delete_Storable", (swig_wrapper_func) _wrap_delete_Storable, NULL}, + { SWIG_prefix "Storable_Create", (swig_wrapper_func) _wrap_Storable_Create, NULL}, + { SWIG_prefix "Storable_ot_dynamic_cast", (swig_wrapper_func) _wrap_Storable_ot_dynamic_cast, NULL}, + { SWIG_prefix "Storable", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Storable}, + { SWIG_prefix "Storage_GetPacker", (swig_wrapper_func) _wrap_Storage_GetPacker, NULL}, + { SWIG_prefix "Storage_Init", (swig_wrapper_func) _wrap_Storage_Init, NULL}, + { SWIG_prefix "Storage_Exists", (swig_wrapper_func) _wrap_Storage_Exists, NULL}, + { SWIG_prefix "delete_Storage", (swig_wrapper_func) _wrap_delete_Storage, NULL}, + { SWIG_prefix "Storage_StoreString", (swig_wrapper_func) _wrap_Storage_StoreString, NULL}, + { SWIG_prefix "Storage_QueryString", (swig_wrapper_func) _wrap_Storage_QueryString, NULL}, + { SWIG_prefix "Storage_StorePlainString", (swig_wrapper_func) _wrap_Storage_StorePlainString, NULL}, + { SWIG_prefix "Storage_QueryPlainString", (swig_wrapper_func) _wrap_Storage_QueryPlainString, NULL}, + { SWIG_prefix "Storage_StoreObject", (swig_wrapper_func) _wrap_Storage_StoreObject, NULL}, + { SWIG_prefix "Storage_QueryObject", (swig_wrapper_func) _wrap_Storage_QueryObject, NULL}, + { SWIG_prefix "Storage_EraseValueByKey", (swig_wrapper_func) _wrap_Storage_EraseValueByKey, NULL}, + { SWIG_prefix "Storage_CreateObject", (swig_wrapper_func) _wrap_Storage_CreateObject, NULL}, + { SWIG_prefix "Storage_Create", (swig_wrapper_func) _wrap_Storage_Create, NULL}, + { SWIG_prefix "Storage_GetType", (swig_wrapper_func) _wrap_Storage_GetType, NULL}, + { SWIG_prefix "Storage", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Storage}, + { SWIG_prefix "InitDefaultStorage", (swig_wrapper_func) _wrap_InitDefaultStorage, NULL}, + { SWIG_prefix "GetDefaultStorage", (swig_wrapper_func) _wrap_GetDefaultStorage, NULL}, + { SWIG_prefix "CreateStorageContext", (swig_wrapper_func) _wrap_CreateStorageContext, NULL}, + { SWIG_prefix "CreateObject", (swig_wrapper_func) _wrap_CreateObject, NULL}, + { SWIG_prefix "Exists", (swig_wrapper_func) _wrap_Exists, NULL}, + { SWIG_prefix "StoreString", (swig_wrapper_func) _wrap_StoreString, NULL}, + { SWIG_prefix "QueryString", (swig_wrapper_func) _wrap_QueryString, NULL}, + { SWIG_prefix "StorePlainString", (swig_wrapper_func) _wrap_StorePlainString, NULL}, + { SWIG_prefix "QueryPlainString", (swig_wrapper_func) _wrap_QueryPlainString, NULL}, + { SWIG_prefix "StoreObject", (swig_wrapper_func) _wrap_StoreObject, NULL}, + { SWIG_prefix "QueryObject", (swig_wrapper_func) _wrap_QueryObject, NULL}, + { SWIG_prefix "EraseValueByKey", (swig_wrapper_func) _wrap_EraseValueByKey, NULL}, + { SWIG_prefix "delete_OTDBString", (swig_wrapper_func) _wrap_delete_OTDBString, NULL}, + { SWIG_prefix "OTDBString_m_string_set", (swig_wrapper_func) _wrap_OTDBString_m_string_set, NULL}, + { SWIG_prefix "OTDBString_m_string_get", (swig_wrapper_func) _wrap_OTDBString_m_string_get, NULL}, + { SWIG_prefix "OTDBString_ot_dynamic_cast", (swig_wrapper_func) _wrap_OTDBString_ot_dynamic_cast, NULL}, + { SWIG_prefix "OTDBString", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_OTDBString}, + { SWIG_prefix "delete_Blob", (swig_wrapper_func) _wrap_delete_Blob, NULL}, + { SWIG_prefix "Blob_m_memBuffer_set", (swig_wrapper_func) _wrap_Blob_m_memBuffer_set, NULL}, + { SWIG_prefix "Blob_m_memBuffer_get", (swig_wrapper_func) _wrap_Blob_m_memBuffer_get, NULL}, + { SWIG_prefix "Blob_ot_dynamic_cast", (swig_wrapper_func) _wrap_Blob_ot_dynamic_cast, NULL}, + { SWIG_prefix "Blob", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Blob}, + { SWIG_prefix "delete_StringMap", (swig_wrapper_func) _wrap_delete_StringMap, NULL}, + { SWIG_prefix "StringMap_the_map_set", (swig_wrapper_func) _wrap_StringMap_the_map_set, NULL}, + { SWIG_prefix "StringMap_the_map_get", (swig_wrapper_func) _wrap_StringMap_the_map_get, NULL}, + { SWIG_prefix "StringMap_SetValue", (swig_wrapper_func) _wrap_StringMap_SetValue, NULL}, + { SWIG_prefix "StringMap_GetValue", (swig_wrapper_func) _wrap_StringMap_GetValue, NULL}, + { SWIG_prefix "StringMap_ot_dynamic_cast", (swig_wrapper_func) _wrap_StringMap_ot_dynamic_cast, NULL}, + { SWIG_prefix "StringMap", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_StringMap}, + { SWIG_prefix "delete_Displayable", (swig_wrapper_func) _wrap_delete_Displayable, NULL}, + { SWIG_prefix "Displayable_gui_label_set", (swig_wrapper_func) _wrap_Displayable_gui_label_set, NULL}, + { SWIG_prefix "Displayable_gui_label_get", (swig_wrapper_func) _wrap_Displayable_gui_label_get, NULL}, + { SWIG_prefix "Displayable_ot_dynamic_cast", (swig_wrapper_func) _wrap_Displayable_ot_dynamic_cast, NULL}, + { SWIG_prefix "Displayable", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Displayable}, + { SWIG_prefix "delete_MarketData", (swig_wrapper_func) _wrap_delete_MarketData, NULL}, + { SWIG_prefix "MarketData_gui_label_set", (swig_wrapper_func) _wrap_MarketData_gui_label_set, NULL}, + { SWIG_prefix "MarketData_gui_label_get", (swig_wrapper_func) _wrap_MarketData_gui_label_get, NULL}, + { SWIG_prefix "MarketData_server_id_set", (swig_wrapper_func) _wrap_MarketData_server_id_set, NULL}, + { SWIG_prefix "MarketData_server_id_get", (swig_wrapper_func) _wrap_MarketData_server_id_get, NULL}, + { SWIG_prefix "MarketData_market_id_set", (swig_wrapper_func) _wrap_MarketData_market_id_set, NULL}, + { SWIG_prefix "MarketData_market_id_get", (swig_wrapper_func) _wrap_MarketData_market_id_get, NULL}, + { SWIG_prefix "MarketData_asset_type_id_set", (swig_wrapper_func) _wrap_MarketData_asset_type_id_set, NULL}, + { SWIG_prefix "MarketData_asset_type_id_get", (swig_wrapper_func) _wrap_MarketData_asset_type_id_get, NULL}, + { SWIG_prefix "MarketData_currency_type_id_set", (swig_wrapper_func) _wrap_MarketData_currency_type_id_set, NULL}, + { SWIG_prefix "MarketData_currency_type_id_get", (swig_wrapper_func) _wrap_MarketData_currency_type_id_get, NULL}, + { SWIG_prefix "MarketData_scale_set", (swig_wrapper_func) _wrap_MarketData_scale_set, NULL}, + { SWIG_prefix "MarketData_scale_get", (swig_wrapper_func) _wrap_MarketData_scale_get, NULL}, + { SWIG_prefix "MarketData_total_assets_set", (swig_wrapper_func) _wrap_MarketData_total_assets_set, NULL}, + { SWIG_prefix "MarketData_total_assets_get", (swig_wrapper_func) _wrap_MarketData_total_assets_get, NULL}, + { SWIG_prefix "MarketData_number_bids_set", (swig_wrapper_func) _wrap_MarketData_number_bids_set, NULL}, + { SWIG_prefix "MarketData_number_bids_get", (swig_wrapper_func) _wrap_MarketData_number_bids_get, NULL}, + { SWIG_prefix "MarketData_number_asks_set", (swig_wrapper_func) _wrap_MarketData_number_asks_set, NULL}, + { SWIG_prefix "MarketData_number_asks_get", (swig_wrapper_func) _wrap_MarketData_number_asks_get, NULL}, + { SWIG_prefix "MarketData_last_sale_price_set", (swig_wrapper_func) _wrap_MarketData_last_sale_price_set, NULL}, + { SWIG_prefix "MarketData_last_sale_price_get", (swig_wrapper_func) _wrap_MarketData_last_sale_price_get, NULL}, + { SWIG_prefix "MarketData_current_bid_set", (swig_wrapper_func) _wrap_MarketData_current_bid_set, NULL}, + { SWIG_prefix "MarketData_current_bid_get", (swig_wrapper_func) _wrap_MarketData_current_bid_get, NULL}, + { SWIG_prefix "MarketData_current_ask_set", (swig_wrapper_func) _wrap_MarketData_current_ask_set, NULL}, + { SWIG_prefix "MarketData_current_ask_get", (swig_wrapper_func) _wrap_MarketData_current_ask_get, NULL}, + { SWIG_prefix "MarketData_volume_trades_set", (swig_wrapper_func) _wrap_MarketData_volume_trades_set, NULL}, + { SWIG_prefix "MarketData_volume_trades_get", (swig_wrapper_func) _wrap_MarketData_volume_trades_get, NULL}, + { SWIG_prefix "MarketData_volume_assets_set", (swig_wrapper_func) _wrap_MarketData_volume_assets_set, NULL}, + { SWIG_prefix "MarketData_volume_assets_get", (swig_wrapper_func) _wrap_MarketData_volume_assets_get, NULL}, + { SWIG_prefix "MarketData_volume_currency_set", (swig_wrapper_func) _wrap_MarketData_volume_currency_set, NULL}, + { SWIG_prefix "MarketData_volume_currency_get", (swig_wrapper_func) _wrap_MarketData_volume_currency_get, NULL}, + { SWIG_prefix "MarketData_recent_highest_bid_set", (swig_wrapper_func) _wrap_MarketData_recent_highest_bid_set, NULL}, + { SWIG_prefix "MarketData_recent_highest_bid_get", (swig_wrapper_func) _wrap_MarketData_recent_highest_bid_get, NULL}, + { SWIG_prefix "MarketData_recent_lowest_ask_set", (swig_wrapper_func) _wrap_MarketData_recent_lowest_ask_set, NULL}, + { SWIG_prefix "MarketData_recent_lowest_ask_get", (swig_wrapper_func) _wrap_MarketData_recent_lowest_ask_get, NULL}, + { SWIG_prefix "MarketData_ot_dynamic_cast", (swig_wrapper_func) _wrap_MarketData_ot_dynamic_cast, NULL}, + { SWIG_prefix "MarketData", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_MarketData}, + { SWIG_prefix "delete_MarketList", (swig_wrapper_func) _wrap_delete_MarketList, NULL}, + { SWIG_prefix "MarketList_GetMarketDataCount", (swig_wrapper_func) _wrap_MarketList_GetMarketDataCount, NULL}, + { SWIG_prefix "MarketList_GetMarketData", (swig_wrapper_func) _wrap_MarketList_GetMarketData, NULL}, + { SWIG_prefix "MarketList_RemoveMarketData", (swig_wrapper_func) _wrap_MarketList_RemoveMarketData, NULL}, + { SWIG_prefix "MarketList_AddMarketData", (swig_wrapper_func) _wrap_MarketList_AddMarketData, NULL}, + { SWIG_prefix "MarketList_ot_dynamic_cast", (swig_wrapper_func) _wrap_MarketList_ot_dynamic_cast, NULL}, + { SWIG_prefix "MarketList", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_MarketList}, + { SWIG_prefix "delete_OfferDataMarket", (swig_wrapper_func) _wrap_delete_OfferDataMarket, NULL}, + { SWIG_prefix "OfferDataMarket_gui_label_set", (swig_wrapper_func) _wrap_OfferDataMarket_gui_label_set, NULL}, + { SWIG_prefix "OfferDataMarket_gui_label_get", (swig_wrapper_func) _wrap_OfferDataMarket_gui_label_get, NULL}, + { SWIG_prefix "OfferDataMarket_transaction_id_set", (swig_wrapper_func) _wrap_OfferDataMarket_transaction_id_set, NULL}, + { SWIG_prefix "OfferDataMarket_transaction_id_get", (swig_wrapper_func) _wrap_OfferDataMarket_transaction_id_get, NULL}, + { SWIG_prefix "OfferDataMarket_price_per_scale_set", (swig_wrapper_func) _wrap_OfferDataMarket_price_per_scale_set, NULL}, + { SWIG_prefix "OfferDataMarket_price_per_scale_get", (swig_wrapper_func) _wrap_OfferDataMarket_price_per_scale_get, NULL}, + { SWIG_prefix "OfferDataMarket_available_assets_set", (swig_wrapper_func) _wrap_OfferDataMarket_available_assets_set, NULL}, + { SWIG_prefix "OfferDataMarket_available_assets_get", (swig_wrapper_func) _wrap_OfferDataMarket_available_assets_get, NULL}, + { SWIG_prefix "OfferDataMarket_minimum_increment_set", (swig_wrapper_func) _wrap_OfferDataMarket_minimum_increment_set, NULL}, + { SWIG_prefix "OfferDataMarket_minimum_increment_get", (swig_wrapper_func) _wrap_OfferDataMarket_minimum_increment_get, NULL}, + { SWIG_prefix "OfferDataMarket_ot_dynamic_cast", (swig_wrapper_func) _wrap_OfferDataMarket_ot_dynamic_cast, NULL}, + { SWIG_prefix "OfferDataMarket", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_OfferDataMarket}, + { SWIG_prefix "delete_BidData", (swig_wrapper_func) _wrap_delete_BidData, NULL}, + { SWIG_prefix "BidData_gui_label_set", (swig_wrapper_func) _wrap_BidData_gui_label_set, NULL}, + { SWIG_prefix "BidData_gui_label_get", (swig_wrapper_func) _wrap_BidData_gui_label_get, NULL}, + { SWIG_prefix "BidData_transaction_id_set", (swig_wrapper_func) _wrap_BidData_transaction_id_set, NULL}, + { SWIG_prefix "BidData_transaction_id_get", (swig_wrapper_func) _wrap_BidData_transaction_id_get, NULL}, + { SWIG_prefix "BidData_price_per_scale_set", (swig_wrapper_func) _wrap_BidData_price_per_scale_set, NULL}, + { SWIG_prefix "BidData_price_per_scale_get", (swig_wrapper_func) _wrap_BidData_price_per_scale_get, NULL}, + { SWIG_prefix "BidData_available_assets_set", (swig_wrapper_func) _wrap_BidData_available_assets_set, NULL}, + { SWIG_prefix "BidData_available_assets_get", (swig_wrapper_func) _wrap_BidData_available_assets_get, NULL}, + { SWIG_prefix "BidData_minimum_increment_set", (swig_wrapper_func) _wrap_BidData_minimum_increment_set, NULL}, + { SWIG_prefix "BidData_minimum_increment_get", (swig_wrapper_func) _wrap_BidData_minimum_increment_get, NULL}, + { SWIG_prefix "BidData_ot_dynamic_cast", (swig_wrapper_func) _wrap_BidData_ot_dynamic_cast, NULL}, + { SWIG_prefix "BidData", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_BidData}, + { SWIG_prefix "delete_AskData", (swig_wrapper_func) _wrap_delete_AskData, NULL}, + { SWIG_prefix "AskData_gui_label_set", (swig_wrapper_func) _wrap_AskData_gui_label_set, NULL}, + { SWIG_prefix "AskData_gui_label_get", (swig_wrapper_func) _wrap_AskData_gui_label_get, NULL}, + { SWIG_prefix "AskData_transaction_id_set", (swig_wrapper_func) _wrap_AskData_transaction_id_set, NULL}, + { SWIG_prefix "AskData_transaction_id_get", (swig_wrapper_func) _wrap_AskData_transaction_id_get, NULL}, + { SWIG_prefix "AskData_price_per_scale_set", (swig_wrapper_func) _wrap_AskData_price_per_scale_set, NULL}, + { SWIG_prefix "AskData_price_per_scale_get", (swig_wrapper_func) _wrap_AskData_price_per_scale_get, NULL}, + { SWIG_prefix "AskData_available_assets_set", (swig_wrapper_func) _wrap_AskData_available_assets_set, NULL}, + { SWIG_prefix "AskData_available_assets_get", (swig_wrapper_func) _wrap_AskData_available_assets_get, NULL}, + { SWIG_prefix "AskData_minimum_increment_set", (swig_wrapper_func) _wrap_AskData_minimum_increment_set, NULL}, + { SWIG_prefix "AskData_minimum_increment_get", (swig_wrapper_func) _wrap_AskData_minimum_increment_get, NULL}, + { SWIG_prefix "AskData_ot_dynamic_cast", (swig_wrapper_func) _wrap_AskData_ot_dynamic_cast, NULL}, + { SWIG_prefix "AskData", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_AskData}, + { SWIG_prefix "delete_OfferListMarket", (swig_wrapper_func) _wrap_delete_OfferListMarket, NULL}, + { SWIG_prefix "OfferListMarket_GetBidDataCount", (swig_wrapper_func) _wrap_OfferListMarket_GetBidDataCount, NULL}, + { SWIG_prefix "OfferListMarket_GetBidData", (swig_wrapper_func) _wrap_OfferListMarket_GetBidData, NULL}, + { SWIG_prefix "OfferListMarket_RemoveBidData", (swig_wrapper_func) _wrap_OfferListMarket_RemoveBidData, NULL}, + { SWIG_prefix "OfferListMarket_AddBidData", (swig_wrapper_func) _wrap_OfferListMarket_AddBidData, NULL}, + { SWIG_prefix "OfferListMarket_GetAskDataCount", (swig_wrapper_func) _wrap_OfferListMarket_GetAskDataCount, NULL}, + { SWIG_prefix "OfferListMarket_GetAskData", (swig_wrapper_func) _wrap_OfferListMarket_GetAskData, NULL}, + { SWIG_prefix "OfferListMarket_RemoveAskData", (swig_wrapper_func) _wrap_OfferListMarket_RemoveAskData, NULL}, + { SWIG_prefix "OfferListMarket_AddAskData", (swig_wrapper_func) _wrap_OfferListMarket_AddAskData, NULL}, + { SWIG_prefix "OfferListMarket_ot_dynamic_cast", (swig_wrapper_func) _wrap_OfferListMarket_ot_dynamic_cast, NULL}, + { SWIG_prefix "OfferListMarket", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_OfferListMarket}, + { SWIG_prefix "delete_TradeDataMarket", (swig_wrapper_func) _wrap_delete_TradeDataMarket, NULL}, + { SWIG_prefix "TradeDataMarket_gui_label_set", (swig_wrapper_func) _wrap_TradeDataMarket_gui_label_set, NULL}, + { SWIG_prefix "TradeDataMarket_gui_label_get", (swig_wrapper_func) _wrap_TradeDataMarket_gui_label_get, NULL}, + { SWIG_prefix "TradeDataMarket_transaction_id_set", (swig_wrapper_func) _wrap_TradeDataMarket_transaction_id_set, NULL}, + { SWIG_prefix "TradeDataMarket_transaction_id_get", (swig_wrapper_func) _wrap_TradeDataMarket_transaction_id_get, NULL}, + { SWIG_prefix "TradeDataMarket_date_set", (swig_wrapper_func) _wrap_TradeDataMarket_date_set, NULL}, + { SWIG_prefix "TradeDataMarket_date_get", (swig_wrapper_func) _wrap_TradeDataMarket_date_get, NULL}, + { SWIG_prefix "TradeDataMarket_price_set", (swig_wrapper_func) _wrap_TradeDataMarket_price_set, NULL}, + { SWIG_prefix "TradeDataMarket_price_get", (swig_wrapper_func) _wrap_TradeDataMarket_price_get, NULL}, + { SWIG_prefix "TradeDataMarket_amount_sold_set", (swig_wrapper_func) _wrap_TradeDataMarket_amount_sold_set, NULL}, + { SWIG_prefix "TradeDataMarket_amount_sold_get", (swig_wrapper_func) _wrap_TradeDataMarket_amount_sold_get, NULL}, + { SWIG_prefix "TradeDataMarket_ot_dynamic_cast", (swig_wrapper_func) _wrap_TradeDataMarket_ot_dynamic_cast, NULL}, + { SWIG_prefix "TradeDataMarket", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_TradeDataMarket}, + { SWIG_prefix "delete_TradeListMarket", (swig_wrapper_func) _wrap_delete_TradeListMarket, NULL}, + { SWIG_prefix "TradeListMarket_GetTradeDataMarketCount", (swig_wrapper_func) _wrap_TradeListMarket_GetTradeDataMarketCount, NULL}, + { SWIG_prefix "TradeListMarket_GetTradeDataMarket", (swig_wrapper_func) _wrap_TradeListMarket_GetTradeDataMarket, NULL}, + { SWIG_prefix "TradeListMarket_RemoveTradeDataMarket", (swig_wrapper_func) _wrap_TradeListMarket_RemoveTradeDataMarket, NULL}, + { SWIG_prefix "TradeListMarket_AddTradeDataMarket", (swig_wrapper_func) _wrap_TradeListMarket_AddTradeDataMarket, NULL}, + { SWIG_prefix "TradeListMarket_ot_dynamic_cast", (swig_wrapper_func) _wrap_TradeListMarket_ot_dynamic_cast, NULL}, + { SWIG_prefix "TradeListMarket", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_TradeListMarket}, + { SWIG_prefix "delete_OfferDataNym", (swig_wrapper_func) _wrap_delete_OfferDataNym, NULL}, + { SWIG_prefix "OfferDataNym_gui_label_set", (swig_wrapper_func) _wrap_OfferDataNym_gui_label_set, NULL}, + { SWIG_prefix "OfferDataNym_gui_label_get", (swig_wrapper_func) _wrap_OfferDataNym_gui_label_get, NULL}, + { SWIG_prefix "OfferDataNym_valid_from_set", (swig_wrapper_func) _wrap_OfferDataNym_valid_from_set, NULL}, + { SWIG_prefix "OfferDataNym_valid_from_get", (swig_wrapper_func) _wrap_OfferDataNym_valid_from_get, NULL}, + { SWIG_prefix "OfferDataNym_valid_to_set", (swig_wrapper_func) _wrap_OfferDataNym_valid_to_set, NULL}, + { SWIG_prefix "OfferDataNym_valid_to_get", (swig_wrapper_func) _wrap_OfferDataNym_valid_to_get, NULL}, + { SWIG_prefix "OfferDataNym_server_id_set", (swig_wrapper_func) _wrap_OfferDataNym_server_id_set, NULL}, + { SWIG_prefix "OfferDataNym_server_id_get", (swig_wrapper_func) _wrap_OfferDataNym_server_id_get, NULL}, + { SWIG_prefix "OfferDataNym_asset_type_id_set", (swig_wrapper_func) _wrap_OfferDataNym_asset_type_id_set, NULL}, + { SWIG_prefix "OfferDataNym_asset_type_id_get", (swig_wrapper_func) _wrap_OfferDataNym_asset_type_id_get, NULL}, + { SWIG_prefix "OfferDataNym_asset_acct_id_set", (swig_wrapper_func) _wrap_OfferDataNym_asset_acct_id_set, NULL}, + { SWIG_prefix "OfferDataNym_asset_acct_id_get", (swig_wrapper_func) _wrap_OfferDataNym_asset_acct_id_get, NULL}, + { SWIG_prefix "OfferDataNym_currency_type_id_set", (swig_wrapper_func) _wrap_OfferDataNym_currency_type_id_set, NULL}, + { SWIG_prefix "OfferDataNym_currency_type_id_get", (swig_wrapper_func) _wrap_OfferDataNym_currency_type_id_get, NULL}, + { SWIG_prefix "OfferDataNym_currency_acct_id_set", (swig_wrapper_func) _wrap_OfferDataNym_currency_acct_id_set, NULL}, + { SWIG_prefix "OfferDataNym_currency_acct_id_get", (swig_wrapper_func) _wrap_OfferDataNym_currency_acct_id_get, NULL}, + { SWIG_prefix "OfferDataNym_selling_set", (swig_wrapper_func) _wrap_OfferDataNym_selling_set, NULL}, + { SWIG_prefix "OfferDataNym_selling_get", (swig_wrapper_func) _wrap_OfferDataNym_selling_get, NULL}, + { SWIG_prefix "OfferDataNym_scale_set", (swig_wrapper_func) _wrap_OfferDataNym_scale_set, NULL}, + { SWIG_prefix "OfferDataNym_scale_get", (swig_wrapper_func) _wrap_OfferDataNym_scale_get, NULL}, + { SWIG_prefix "OfferDataNym_price_per_scale_set", (swig_wrapper_func) _wrap_OfferDataNym_price_per_scale_set, NULL}, + { SWIG_prefix "OfferDataNym_price_per_scale_get", (swig_wrapper_func) _wrap_OfferDataNym_price_per_scale_get, NULL}, + { SWIG_prefix "OfferDataNym_transaction_id_set", (swig_wrapper_func) _wrap_OfferDataNym_transaction_id_set, NULL}, + { SWIG_prefix "OfferDataNym_transaction_id_get", (swig_wrapper_func) _wrap_OfferDataNym_transaction_id_get, NULL}, + { SWIG_prefix "OfferDataNym_total_assets_set", (swig_wrapper_func) _wrap_OfferDataNym_total_assets_set, NULL}, + { SWIG_prefix "OfferDataNym_total_assets_get", (swig_wrapper_func) _wrap_OfferDataNym_total_assets_get, NULL}, + { SWIG_prefix "OfferDataNym_finished_so_far_set", (swig_wrapper_func) _wrap_OfferDataNym_finished_so_far_set, NULL}, + { SWIG_prefix "OfferDataNym_finished_so_far_get", (swig_wrapper_func) _wrap_OfferDataNym_finished_so_far_get, NULL}, + { SWIG_prefix "OfferDataNym_minimum_increment_set", (swig_wrapper_func) _wrap_OfferDataNym_minimum_increment_set, NULL}, + { SWIG_prefix "OfferDataNym_minimum_increment_get", (swig_wrapper_func) _wrap_OfferDataNym_minimum_increment_get, NULL}, + { SWIG_prefix "OfferDataNym_stop_sign_set", (swig_wrapper_func) _wrap_OfferDataNym_stop_sign_set, NULL}, + { SWIG_prefix "OfferDataNym_stop_sign_get", (swig_wrapper_func) _wrap_OfferDataNym_stop_sign_get, NULL}, + { SWIG_prefix "OfferDataNym_stop_price_set", (swig_wrapper_func) _wrap_OfferDataNym_stop_price_set, NULL}, + { SWIG_prefix "OfferDataNym_stop_price_get", (swig_wrapper_func) _wrap_OfferDataNym_stop_price_get, NULL}, + { SWIG_prefix "OfferDataNym_ot_dynamic_cast", (swig_wrapper_func) _wrap_OfferDataNym_ot_dynamic_cast, NULL}, + { SWIG_prefix "OfferDataNym", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_OfferDataNym}, + { SWIG_prefix "delete_OfferListNym", (swig_wrapper_func) _wrap_delete_OfferListNym, NULL}, + { SWIG_prefix "OfferListNym_GetOfferDataNymCount", (swig_wrapper_func) _wrap_OfferListNym_GetOfferDataNymCount, NULL}, + { SWIG_prefix "OfferListNym_GetOfferDataNym", (swig_wrapper_func) _wrap_OfferListNym_GetOfferDataNym, NULL}, + { SWIG_prefix "OfferListNym_RemoveOfferDataNym", (swig_wrapper_func) _wrap_OfferListNym_RemoveOfferDataNym, NULL}, + { SWIG_prefix "OfferListNym_AddOfferDataNym", (swig_wrapper_func) _wrap_OfferListNym_AddOfferDataNym, NULL}, + { SWIG_prefix "OfferListNym_ot_dynamic_cast", (swig_wrapper_func) _wrap_OfferListNym_ot_dynamic_cast, NULL}, + { SWIG_prefix "OfferListNym", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_OfferListNym}, + { SWIG_prefix "delete_TradeDataNym", (swig_wrapper_func) _wrap_delete_TradeDataNym, NULL}, + { SWIG_prefix "TradeDataNym_gui_label_set", (swig_wrapper_func) _wrap_TradeDataNym_gui_label_set, NULL}, + { SWIG_prefix "TradeDataNym_gui_label_get", (swig_wrapper_func) _wrap_TradeDataNym_gui_label_get, NULL}, + { SWIG_prefix "TradeDataNym_transaction_id_set", (swig_wrapper_func) _wrap_TradeDataNym_transaction_id_set, NULL}, + { SWIG_prefix "TradeDataNym_transaction_id_get", (swig_wrapper_func) _wrap_TradeDataNym_transaction_id_get, NULL}, + { SWIG_prefix "TradeDataNym_completed_count_set", (swig_wrapper_func) _wrap_TradeDataNym_completed_count_set, NULL}, + { SWIG_prefix "TradeDataNym_completed_count_get", (swig_wrapper_func) _wrap_TradeDataNym_completed_count_get, NULL}, + { SWIG_prefix "TradeDataNym_date_set", (swig_wrapper_func) _wrap_TradeDataNym_date_set, NULL}, + { SWIG_prefix "TradeDataNym_date_get", (swig_wrapper_func) _wrap_TradeDataNym_date_get, NULL}, + { SWIG_prefix "TradeDataNym_price_set", (swig_wrapper_func) _wrap_TradeDataNym_price_set, NULL}, + { SWIG_prefix "TradeDataNym_price_get", (swig_wrapper_func) _wrap_TradeDataNym_price_get, NULL}, + { SWIG_prefix "TradeDataNym_amount_sold_set", (swig_wrapper_func) _wrap_TradeDataNym_amount_sold_set, NULL}, + { SWIG_prefix "TradeDataNym_amount_sold_get", (swig_wrapper_func) _wrap_TradeDataNym_amount_sold_get, NULL}, + { SWIG_prefix "TradeDataNym_ot_dynamic_cast", (swig_wrapper_func) _wrap_TradeDataNym_ot_dynamic_cast, NULL}, + { SWIG_prefix "TradeDataNym", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_TradeDataNym}, + { SWIG_prefix "delete_TradeListNym", (swig_wrapper_func) _wrap_delete_TradeListNym, NULL}, + { SWIG_prefix "TradeListNym_GetTradeDataNymCount", (swig_wrapper_func) _wrap_TradeListNym_GetTradeDataNymCount, NULL}, + { SWIG_prefix "TradeListNym_GetTradeDataNym", (swig_wrapper_func) _wrap_TradeListNym_GetTradeDataNym, NULL}, + { SWIG_prefix "TradeListNym_RemoveTradeDataNym", (swig_wrapper_func) _wrap_TradeListNym_RemoveTradeDataNym, NULL}, + { SWIG_prefix "TradeListNym_AddTradeDataNym", (swig_wrapper_func) _wrap_TradeListNym_AddTradeDataNym, NULL}, + { SWIG_prefix "TradeListNym_ot_dynamic_cast", (swig_wrapper_func) _wrap_TradeListNym_ot_dynamic_cast, NULL}, + { SWIG_prefix "TradeListNym", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_TradeListNym}, + { SWIG_prefix "delete_Acct", (swig_wrapper_func) _wrap_delete_Acct, NULL}, + { SWIG_prefix "Acct_gui_label_set", (swig_wrapper_func) _wrap_Acct_gui_label_set, NULL}, + { SWIG_prefix "Acct_gui_label_get", (swig_wrapper_func) _wrap_Acct_gui_label_get, NULL}, + { SWIG_prefix "Acct_acct_id_set", (swig_wrapper_func) _wrap_Acct_acct_id_set, NULL}, + { SWIG_prefix "Acct_acct_id_get", (swig_wrapper_func) _wrap_Acct_acct_id_get, NULL}, + { SWIG_prefix "Acct_server_id_set", (swig_wrapper_func) _wrap_Acct_server_id_set, NULL}, + { SWIG_prefix "Acct_server_id_get", (swig_wrapper_func) _wrap_Acct_server_id_get, NULL}, + { SWIG_prefix "Acct_ot_dynamic_cast", (swig_wrapper_func) _wrap_Acct_ot_dynamic_cast, NULL}, + { SWIG_prefix "Acct", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Acct}, + { SWIG_prefix "delete_BitcoinAcct", (swig_wrapper_func) _wrap_delete_BitcoinAcct, NULL}, + { SWIG_prefix "BitcoinAcct_gui_label_set", (swig_wrapper_func) _wrap_BitcoinAcct_gui_label_set, NULL}, + { SWIG_prefix "BitcoinAcct_gui_label_get", (swig_wrapper_func) _wrap_BitcoinAcct_gui_label_get, NULL}, + { SWIG_prefix "BitcoinAcct_acct_id_set", (swig_wrapper_func) _wrap_BitcoinAcct_acct_id_set, NULL}, + { SWIG_prefix "BitcoinAcct_acct_id_get", (swig_wrapper_func) _wrap_BitcoinAcct_acct_id_get, NULL}, + { SWIG_prefix "BitcoinAcct_server_id_set", (swig_wrapper_func) _wrap_BitcoinAcct_server_id_set, NULL}, + { SWIG_prefix "BitcoinAcct_server_id_get", (swig_wrapper_func) _wrap_BitcoinAcct_server_id_get, NULL}, + { SWIG_prefix "BitcoinAcct_bitcoin_acct_name_set", (swig_wrapper_func) _wrap_BitcoinAcct_bitcoin_acct_name_set, NULL}, + { SWIG_prefix "BitcoinAcct_bitcoin_acct_name_get", (swig_wrapper_func) _wrap_BitcoinAcct_bitcoin_acct_name_get, NULL}, + { SWIG_prefix "BitcoinAcct_ot_dynamic_cast", (swig_wrapper_func) _wrap_BitcoinAcct_ot_dynamic_cast, NULL}, + { SWIG_prefix "BitcoinAcct", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_BitcoinAcct}, + { SWIG_prefix "delete_ServerInfo", (swig_wrapper_func) _wrap_delete_ServerInfo, NULL}, + { SWIG_prefix "ServerInfo_gui_label_set", (swig_wrapper_func) _wrap_ServerInfo_gui_label_set, NULL}, + { SWIG_prefix "ServerInfo_gui_label_get", (swig_wrapper_func) _wrap_ServerInfo_gui_label_get, NULL}, + { SWIG_prefix "ServerInfo_server_id_set", (swig_wrapper_func) _wrap_ServerInfo_server_id_set, NULL}, + { SWIG_prefix "ServerInfo_server_id_get", (swig_wrapper_func) _wrap_ServerInfo_server_id_get, NULL}, + { SWIG_prefix "ServerInfo_server_type_set", (swig_wrapper_func) _wrap_ServerInfo_server_type_set, NULL}, + { SWIG_prefix "ServerInfo_server_type_get", (swig_wrapper_func) _wrap_ServerInfo_server_type_get, NULL}, + { SWIG_prefix "ServerInfo_ot_dynamic_cast", (swig_wrapper_func) _wrap_ServerInfo_ot_dynamic_cast, NULL}, + { SWIG_prefix "ServerInfo", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_ServerInfo}, + { SWIG_prefix "delete_Server", (swig_wrapper_func) _wrap_delete_Server, NULL}, + { SWIG_prefix "Server_gui_label_set", (swig_wrapper_func) _wrap_Server_gui_label_set, NULL}, + { SWIG_prefix "Server_gui_label_get", (swig_wrapper_func) _wrap_Server_gui_label_get, NULL}, + { SWIG_prefix "Server_server_id_set", (swig_wrapper_func) _wrap_Server_server_id_set, NULL}, + { SWIG_prefix "Server_server_id_get", (swig_wrapper_func) _wrap_Server_server_id_get, NULL}, + { SWIG_prefix "Server_server_type_set", (swig_wrapper_func) _wrap_Server_server_type_set, NULL}, + { SWIG_prefix "Server_server_type_get", (swig_wrapper_func) _wrap_Server_server_type_get, NULL}, + { SWIG_prefix "Server_server_host_set", (swig_wrapper_func) _wrap_Server_server_host_set, NULL}, + { SWIG_prefix "Server_server_host_get", (swig_wrapper_func) _wrap_Server_server_host_get, NULL}, + { SWIG_prefix "Server_server_port_set", (swig_wrapper_func) _wrap_Server_server_port_set, NULL}, + { SWIG_prefix "Server_server_port_get", (swig_wrapper_func) _wrap_Server_server_port_get, NULL}, + { SWIG_prefix "Server_ot_dynamic_cast", (swig_wrapper_func) _wrap_Server_ot_dynamic_cast, NULL}, + { SWIG_prefix "Server", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Server}, + { SWIG_prefix "delete_BitcoinServer", (swig_wrapper_func) _wrap_delete_BitcoinServer, NULL}, + { SWIG_prefix "BitcoinServer_gui_label_set", (swig_wrapper_func) _wrap_BitcoinServer_gui_label_set, NULL}, + { SWIG_prefix "BitcoinServer_gui_label_get", (swig_wrapper_func) _wrap_BitcoinServer_gui_label_get, NULL}, + { SWIG_prefix "BitcoinServer_server_id_set", (swig_wrapper_func) _wrap_BitcoinServer_server_id_set, NULL}, + { SWIG_prefix "BitcoinServer_server_id_get", (swig_wrapper_func) _wrap_BitcoinServer_server_id_get, NULL}, + { SWIG_prefix "BitcoinServer_server_type_set", (swig_wrapper_func) _wrap_BitcoinServer_server_type_set, NULL}, + { SWIG_prefix "BitcoinServer_server_type_get", (swig_wrapper_func) _wrap_BitcoinServer_server_type_get, NULL}, + { SWIG_prefix "BitcoinServer_server_host_set", (swig_wrapper_func) _wrap_BitcoinServer_server_host_set, NULL}, + { SWIG_prefix "BitcoinServer_server_host_get", (swig_wrapper_func) _wrap_BitcoinServer_server_host_get, NULL}, + { SWIG_prefix "BitcoinServer_server_port_set", (swig_wrapper_func) _wrap_BitcoinServer_server_port_set, NULL}, + { SWIG_prefix "BitcoinServer_server_port_get", (swig_wrapper_func) _wrap_BitcoinServer_server_port_get, NULL}, + { SWIG_prefix "BitcoinServer_bitcoin_username_set", (swig_wrapper_func) _wrap_BitcoinServer_bitcoin_username_set, NULL}, + { SWIG_prefix "BitcoinServer_bitcoin_username_get", (swig_wrapper_func) _wrap_BitcoinServer_bitcoin_username_get, NULL}, + { SWIG_prefix "BitcoinServer_bitcoin_password_set", (swig_wrapper_func) _wrap_BitcoinServer_bitcoin_password_set, NULL}, + { SWIG_prefix "BitcoinServer_bitcoin_password_get", (swig_wrapper_func) _wrap_BitcoinServer_bitcoin_password_get, NULL}, + { SWIG_prefix "BitcoinServer_ot_dynamic_cast", (swig_wrapper_func) _wrap_BitcoinServer_ot_dynamic_cast, NULL}, + { SWIG_prefix "BitcoinServer", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_BitcoinServer}, + { SWIG_prefix "delete_RippleServer", (swig_wrapper_func) _wrap_delete_RippleServer, NULL}, + { SWIG_prefix "RippleServer_gui_label_set", (swig_wrapper_func) _wrap_RippleServer_gui_label_set, NULL}, + { SWIG_prefix "RippleServer_gui_label_get", (swig_wrapper_func) _wrap_RippleServer_gui_label_get, NULL}, + { SWIG_prefix "RippleServer_server_id_set", (swig_wrapper_func) _wrap_RippleServer_server_id_set, NULL}, + { SWIG_prefix "RippleServer_server_id_get", (swig_wrapper_func) _wrap_RippleServer_server_id_get, NULL}, + { SWIG_prefix "RippleServer_server_type_set", (swig_wrapper_func) _wrap_RippleServer_server_type_set, NULL}, + { SWIG_prefix "RippleServer_server_type_get", (swig_wrapper_func) _wrap_RippleServer_server_type_get, NULL}, + { SWIG_prefix "RippleServer_server_host_set", (swig_wrapper_func) _wrap_RippleServer_server_host_set, NULL}, + { SWIG_prefix "RippleServer_server_host_get", (swig_wrapper_func) _wrap_RippleServer_server_host_get, NULL}, + { SWIG_prefix "RippleServer_server_port_set", (swig_wrapper_func) _wrap_RippleServer_server_port_set, NULL}, + { SWIG_prefix "RippleServer_server_port_get", (swig_wrapper_func) _wrap_RippleServer_server_port_get, NULL}, + { SWIG_prefix "RippleServer_ripple_username_set", (swig_wrapper_func) _wrap_RippleServer_ripple_username_set, NULL}, + { SWIG_prefix "RippleServer_ripple_username_get", (swig_wrapper_func) _wrap_RippleServer_ripple_username_get, NULL}, + { SWIG_prefix "RippleServer_ripple_password_set", (swig_wrapper_func) _wrap_RippleServer_ripple_password_set, NULL}, + { SWIG_prefix "RippleServer_ripple_password_get", (swig_wrapper_func) _wrap_RippleServer_ripple_password_get, NULL}, + { SWIG_prefix "RippleServer_namefield_id_set", (swig_wrapper_func) _wrap_RippleServer_namefield_id_set, NULL}, + { SWIG_prefix "RippleServer_namefield_id_get", (swig_wrapper_func) _wrap_RippleServer_namefield_id_get, NULL}, + { SWIG_prefix "RippleServer_passfield_id_set", (swig_wrapper_func) _wrap_RippleServer_passfield_id_set, NULL}, + { SWIG_prefix "RippleServer_passfield_id_get", (swig_wrapper_func) _wrap_RippleServer_passfield_id_get, NULL}, + { SWIG_prefix "RippleServer_ot_dynamic_cast", (swig_wrapper_func) _wrap_RippleServer_ot_dynamic_cast, NULL}, + { SWIG_prefix "RippleServer", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_RippleServer}, + { SWIG_prefix "delete_LoomServer", (swig_wrapper_func) _wrap_delete_LoomServer, NULL}, + { SWIG_prefix "LoomServer_gui_label_set", (swig_wrapper_func) _wrap_LoomServer_gui_label_set, NULL}, + { SWIG_prefix "LoomServer_gui_label_get", (swig_wrapper_func) _wrap_LoomServer_gui_label_get, NULL}, + { SWIG_prefix "LoomServer_server_id_set", (swig_wrapper_func) _wrap_LoomServer_server_id_set, NULL}, + { SWIG_prefix "LoomServer_server_id_get", (swig_wrapper_func) _wrap_LoomServer_server_id_get, NULL}, + { SWIG_prefix "LoomServer_server_type_set", (swig_wrapper_func) _wrap_LoomServer_server_type_set, NULL}, + { SWIG_prefix "LoomServer_server_type_get", (swig_wrapper_func) _wrap_LoomServer_server_type_get, NULL}, + { SWIG_prefix "LoomServer_server_host_set", (swig_wrapper_func) _wrap_LoomServer_server_host_set, NULL}, + { SWIG_prefix "LoomServer_server_host_get", (swig_wrapper_func) _wrap_LoomServer_server_host_get, NULL}, + { SWIG_prefix "LoomServer_server_port_set", (swig_wrapper_func) _wrap_LoomServer_server_port_set, NULL}, + { SWIG_prefix "LoomServer_server_port_get", (swig_wrapper_func) _wrap_LoomServer_server_port_get, NULL}, + { SWIG_prefix "LoomServer_loom_username_set", (swig_wrapper_func) _wrap_LoomServer_loom_username_set, NULL}, + { SWIG_prefix "LoomServer_loom_username_get", (swig_wrapper_func) _wrap_LoomServer_loom_username_get, NULL}, + { SWIG_prefix "LoomServer_namefield_id_set", (swig_wrapper_func) _wrap_LoomServer_namefield_id_set, NULL}, + { SWIG_prefix "LoomServer_namefield_id_get", (swig_wrapper_func) _wrap_LoomServer_namefield_id_get, NULL}, + { SWIG_prefix "LoomServer_ot_dynamic_cast", (swig_wrapper_func) _wrap_LoomServer_ot_dynamic_cast, NULL}, + { SWIG_prefix "LoomServer", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_LoomServer}, + { SWIG_prefix "delete_ContactNym", (swig_wrapper_func) _wrap_delete_ContactNym, NULL}, + { SWIG_prefix "ContactNym_gui_label_set", (swig_wrapper_func) _wrap_ContactNym_gui_label_set, NULL}, + { SWIG_prefix "ContactNym_gui_label_get", (swig_wrapper_func) _wrap_ContactNym_gui_label_get, NULL}, + { SWIG_prefix "ContactNym_nym_type_set", (swig_wrapper_func) _wrap_ContactNym_nym_type_set, NULL}, + { SWIG_prefix "ContactNym_nym_type_get", (swig_wrapper_func) _wrap_ContactNym_nym_type_get, NULL}, + { SWIG_prefix "ContactNym_nym_id_set", (swig_wrapper_func) _wrap_ContactNym_nym_id_set, NULL}, + { SWIG_prefix "ContactNym_nym_id_get", (swig_wrapper_func) _wrap_ContactNym_nym_id_get, NULL}, + { SWIG_prefix "ContactNym_public_key_set", (swig_wrapper_func) _wrap_ContactNym_public_key_set, NULL}, + { SWIG_prefix "ContactNym_public_key_get", (swig_wrapper_func) _wrap_ContactNym_public_key_get, NULL}, + { SWIG_prefix "ContactNym_memo_set", (swig_wrapper_func) _wrap_ContactNym_memo_set, NULL}, + { SWIG_prefix "ContactNym_memo_get", (swig_wrapper_func) _wrap_ContactNym_memo_get, NULL}, + { SWIG_prefix "ContactNym_GetServerInfoCount", (swig_wrapper_func) _wrap_ContactNym_GetServerInfoCount, NULL}, + { SWIG_prefix "ContactNym_GetServerInfo", (swig_wrapper_func) _wrap_ContactNym_GetServerInfo, NULL}, + { SWIG_prefix "ContactNym_RemoveServerInfo", (swig_wrapper_func) _wrap_ContactNym_RemoveServerInfo, NULL}, + { SWIG_prefix "ContactNym_AddServerInfo", (swig_wrapper_func) _wrap_ContactNym_AddServerInfo, NULL}, + { SWIG_prefix "ContactNym_ot_dynamic_cast", (swig_wrapper_func) _wrap_ContactNym_ot_dynamic_cast, NULL}, + { SWIG_prefix "ContactNym", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_ContactNym}, + { SWIG_prefix "delete_WalletData", (swig_wrapper_func) _wrap_delete_WalletData, NULL}, + { SWIG_prefix "WalletData_GetBitcoinServerCount", (swig_wrapper_func) _wrap_WalletData_GetBitcoinServerCount, NULL}, + { SWIG_prefix "WalletData_GetBitcoinServer", (swig_wrapper_func) _wrap_WalletData_GetBitcoinServer, NULL}, + { SWIG_prefix "WalletData_RemoveBitcoinServer", (swig_wrapper_func) _wrap_WalletData_RemoveBitcoinServer, NULL}, + { SWIG_prefix "WalletData_AddBitcoinServer", (swig_wrapper_func) _wrap_WalletData_AddBitcoinServer, NULL}, + { SWIG_prefix "WalletData_GetBitcoinAcctCount", (swig_wrapper_func) _wrap_WalletData_GetBitcoinAcctCount, NULL}, + { SWIG_prefix "WalletData_GetBitcoinAcct", (swig_wrapper_func) _wrap_WalletData_GetBitcoinAcct, NULL}, + { SWIG_prefix "WalletData_RemoveBitcoinAcct", (swig_wrapper_func) _wrap_WalletData_RemoveBitcoinAcct, NULL}, + { SWIG_prefix "WalletData_AddBitcoinAcct", (swig_wrapper_func) _wrap_WalletData_AddBitcoinAcct, NULL}, + { SWIG_prefix "WalletData_GetRippleServerCount", (swig_wrapper_func) _wrap_WalletData_GetRippleServerCount, NULL}, + { SWIG_prefix "WalletData_GetRippleServer", (swig_wrapper_func) _wrap_WalletData_GetRippleServer, NULL}, + { SWIG_prefix "WalletData_RemoveRippleServer", (swig_wrapper_func) _wrap_WalletData_RemoveRippleServer, NULL}, + { SWIG_prefix "WalletData_AddRippleServer", (swig_wrapper_func) _wrap_WalletData_AddRippleServer, NULL}, + { SWIG_prefix "WalletData_GetLoomServerCount", (swig_wrapper_func) _wrap_WalletData_GetLoomServerCount, NULL}, + { SWIG_prefix "WalletData_GetLoomServer", (swig_wrapper_func) _wrap_WalletData_GetLoomServer, NULL}, + { SWIG_prefix "WalletData_RemoveLoomServer", (swig_wrapper_func) _wrap_WalletData_RemoveLoomServer, NULL}, + { SWIG_prefix "WalletData_AddLoomServer", (swig_wrapper_func) _wrap_WalletData_AddLoomServer, NULL}, + { SWIG_prefix "WalletData_ot_dynamic_cast", (swig_wrapper_func) _wrap_WalletData_ot_dynamic_cast, NULL}, + { SWIG_prefix "WalletData", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_WalletData}, + { SWIG_prefix "delete_ContactAcct", (swig_wrapper_func) _wrap_delete_ContactAcct, NULL}, + { SWIG_prefix "ContactAcct_gui_label_set", (swig_wrapper_func) _wrap_ContactAcct_gui_label_set, NULL}, + { SWIG_prefix "ContactAcct_gui_label_get", (swig_wrapper_func) _wrap_ContactAcct_gui_label_get, NULL}, + { SWIG_prefix "ContactAcct_server_type_set", (swig_wrapper_func) _wrap_ContactAcct_server_type_set, NULL}, + { SWIG_prefix "ContactAcct_server_type_get", (swig_wrapper_func) _wrap_ContactAcct_server_type_get, NULL}, + { SWIG_prefix "ContactAcct_server_id_set", (swig_wrapper_func) _wrap_ContactAcct_server_id_set, NULL}, + { SWIG_prefix "ContactAcct_server_id_get", (swig_wrapper_func) _wrap_ContactAcct_server_id_get, NULL}, + { SWIG_prefix "ContactAcct_asset_type_id_set", (swig_wrapper_func) _wrap_ContactAcct_asset_type_id_set, NULL}, + { SWIG_prefix "ContactAcct_asset_type_id_get", (swig_wrapper_func) _wrap_ContactAcct_asset_type_id_get, NULL}, + { SWIG_prefix "ContactAcct_acct_id_set", (swig_wrapper_func) _wrap_ContactAcct_acct_id_set, NULL}, + { SWIG_prefix "ContactAcct_acct_id_get", (swig_wrapper_func) _wrap_ContactAcct_acct_id_get, NULL}, + { SWIG_prefix "ContactAcct_nym_id_set", (swig_wrapper_func) _wrap_ContactAcct_nym_id_set, NULL}, + { SWIG_prefix "ContactAcct_nym_id_get", (swig_wrapper_func) _wrap_ContactAcct_nym_id_get, NULL}, + { SWIG_prefix "ContactAcct_memo_set", (swig_wrapper_func) _wrap_ContactAcct_memo_set, NULL}, + { SWIG_prefix "ContactAcct_memo_get", (swig_wrapper_func) _wrap_ContactAcct_memo_get, NULL}, + { SWIG_prefix "ContactAcct_public_key_set", (swig_wrapper_func) _wrap_ContactAcct_public_key_set, NULL}, + { SWIG_prefix "ContactAcct_public_key_get", (swig_wrapper_func) _wrap_ContactAcct_public_key_get, NULL}, + { SWIG_prefix "ContactAcct_ot_dynamic_cast", (swig_wrapper_func) _wrap_ContactAcct_ot_dynamic_cast, NULL}, + { SWIG_prefix "ContactAcct", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_ContactAcct}, + { SWIG_prefix "delete_Contact", (swig_wrapper_func) _wrap_delete_Contact, NULL}, + { SWIG_prefix "Contact_gui_label_set", (swig_wrapper_func) _wrap_Contact_gui_label_set, NULL}, + { SWIG_prefix "Contact_gui_label_get", (swig_wrapper_func) _wrap_Contact_gui_label_get, NULL}, + { SWIG_prefix "Contact_contact_id_set", (swig_wrapper_func) _wrap_Contact_contact_id_set, NULL}, + { SWIG_prefix "Contact_contact_id_get", (swig_wrapper_func) _wrap_Contact_contact_id_get, NULL}, + { SWIG_prefix "Contact_email_set", (swig_wrapper_func) _wrap_Contact_email_set, NULL}, + { SWIG_prefix "Contact_email_get", (swig_wrapper_func) _wrap_Contact_email_get, NULL}, + { SWIG_prefix "Contact_memo_set", (swig_wrapper_func) _wrap_Contact_memo_set, NULL}, + { SWIG_prefix "Contact_memo_get", (swig_wrapper_func) _wrap_Contact_memo_get, NULL}, + { SWIG_prefix "Contact_public_key_set", (swig_wrapper_func) _wrap_Contact_public_key_set, NULL}, + { SWIG_prefix "Contact_public_key_get", (swig_wrapper_func) _wrap_Contact_public_key_get, NULL}, + { SWIG_prefix "Contact_GetContactNymCount", (swig_wrapper_func) _wrap_Contact_GetContactNymCount, NULL}, + { SWIG_prefix "Contact_GetContactNym", (swig_wrapper_func) _wrap_Contact_GetContactNym, NULL}, + { SWIG_prefix "Contact_RemoveContactNym", (swig_wrapper_func) _wrap_Contact_RemoveContactNym, NULL}, + { SWIG_prefix "Contact_AddContactNym", (swig_wrapper_func) _wrap_Contact_AddContactNym, NULL}, + { SWIG_prefix "Contact_GetContactAcctCount", (swig_wrapper_func) _wrap_Contact_GetContactAcctCount, NULL}, + { SWIG_prefix "Contact_GetContactAcct", (swig_wrapper_func) _wrap_Contact_GetContactAcct, NULL}, + { SWIG_prefix "Contact_RemoveContactAcct", (swig_wrapper_func) _wrap_Contact_RemoveContactAcct, NULL}, + { SWIG_prefix "Contact_AddContactAcct", (swig_wrapper_func) _wrap_Contact_AddContactAcct, NULL}, + { SWIG_prefix "Contact_ot_dynamic_cast", (swig_wrapper_func) _wrap_Contact_ot_dynamic_cast, NULL}, + { SWIG_prefix "Contact", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_Contact}, + { SWIG_prefix "delete_AddressBook", (swig_wrapper_func) _wrap_delete_AddressBook, NULL}, + { SWIG_prefix "AddressBook_GetContactCount", (swig_wrapper_func) _wrap_AddressBook_GetContactCount, NULL}, + { SWIG_prefix "AddressBook_GetContact", (swig_wrapper_func) _wrap_AddressBook_GetContact, NULL}, + { SWIG_prefix "AddressBook_RemoveContact", (swig_wrapper_func) _wrap_AddressBook_RemoveContact, NULL}, + { SWIG_prefix "AddressBook_AddContact", (swig_wrapper_func) _wrap_AddressBook_AddContact, NULL}, + { SWIG_prefix "AddressBook_ot_dynamic_cast", (swig_wrapper_func) _wrap_AddressBook_ot_dynamic_cast, NULL}, + { SWIG_prefix "AddressBook", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_OTDB_AddressBook}, + {0, 0, 0} +}; + +static swig_var_info swig_variables[] = { + {0,0,0,0} +}; + +static swig_const_info swig_constants[] = { + {0,0,0,0,0,0} +}; + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Acct(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Server(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) (OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Displayable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__OfferDataMarket(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__ServerInfo(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::ServerInfo *) (OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__MarketListTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::MarketList *) x)); +} +static void *_p_OTDB__OfferListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListNym *) x)); +} +static void *_p_OTDB__TradeListNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListNym *) x)); +} +static void *_p_OTDB__RippleServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::RippleServer *) x)); +} +static void *_p_OTDB__LoomServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::LoomServer *) x)); +} +static void *_p_OTDB__ContactNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactNym *) x)); +} +static void *_p_OTDB__TradeDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataMarket *) x)); +} +static void *_p_OTDB__OfferDataMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataMarket *) x)); +} +static void *_p_OTDB__StringMapTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::StringMap *) x)); +} +static void *_p_OTDB__ServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *) ((OTDB::Server *) x)); +} +static void *_p_OTDB__BitcoinServerTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::ServerInfo *)(OTDB::Server *) ((OTDB::BitcoinServer *) x)); +} +static void *_p_OTDB__TradeListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::TradeListMarket *) x)); +} +static void *_p_OTDB__OfferListMarketTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OfferListMarket *) x)); +} +static void *_p_OTDB__AcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Acct *) x)); +} +static void *_p_OTDB__DisplayableTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Displayable *) x)); +} +static void *_p_OTDB__WalletDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::WalletData *) x)); +} +static void *_p_OTDB__ContactAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ContactAcct *) x)); +} +static void *_p_OTDB__BlobTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::Blob *) x)); +} +static void *_p_OTDB__BitcoinAcctTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::Acct *) ((OTDB::BitcoinAcct *) x)); +} +static void *_p_OTDB__OTDBStringTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::OTDBString *) x)); +} +static void *_p_OTDB__MarketDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::MarketData *) x)); +} +static void *_p_OTDB__ServerInfoTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::ServerInfo *) x)); +} +static void *_p_OTDB__ContactTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::Contact *) x)); +} +static void *_p_OTDB__AddressBookTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) ((OTDB::AddressBook *) x)); +} +static void *_p_OTDB__BidDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::BidData *) x)); +} +static void *_p_OTDB__AskDataTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *)(OTDB::OfferDataMarket *) ((OTDB::AskData *) x)); +} +static void *_p_OTDB__OfferDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::OfferDataNym *) x)); +} +static void *_p_OTDB__TradeDataNymTo_p_OTDB__Storable(void *x, int *SWIGUNUSEDPARM(newmemory)) { + return (void *)((OTDB::Storable *) (OTDB::Displayable *) ((OTDB::TradeDataNym *) x)); +} +static swig_type_info _swigt__p_OTCallback = {"_p_OTCallback", "OTCallback *", 0, 0, (void*)&_wrap_class_OTCallback, 0}; +static swig_type_info _swigt__p_OTCaller = {"_p_OTCaller", "OTCaller *", 0, 0, (void*)&_wrap_class_OTCaller, 0}; +static swig_type_info _swigt__p_OTDB__Acct = {"_p_OTDB__Acct", "OTDB::Acct *", 0, 0, (void*)&_wrap_class_OTDB_Acct, 0}; +static swig_type_info _swigt__p_OTDB__AddressBook = {"_p_OTDB__AddressBook", "OTDB::AddressBook *", 0, 0, (void*)&_wrap_class_OTDB_AddressBook, 0}; +static swig_type_info _swigt__p_OTDB__AskData = {"_p_OTDB__AskData", "OTDB::AskData *", 0, 0, (void*)&_wrap_class_OTDB_AskData, 0}; +static swig_type_info _swigt__p_OTDB__BidData = {"_p_OTDB__BidData", "OTDB::BidData *", 0, 0, (void*)&_wrap_class_OTDB_BidData, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinAcct = {"_p_OTDB__BitcoinAcct", "OTDB::BitcoinAcct *", 0, 0, (void*)&_wrap_class_OTDB_BitcoinAcct, 0}; +static swig_type_info _swigt__p_OTDB__BitcoinServer = {"_p_OTDB__BitcoinServer", "OTDB::BitcoinServer *", 0, 0, (void*)&_wrap_class_OTDB_BitcoinServer, 0}; +static swig_type_info _swigt__p_OTDB__Blob = {"_p_OTDB__Blob", "OTDB::Blob *", 0, 0, (void*)&_wrap_class_OTDB_Blob, 0}; +static swig_type_info _swigt__p_OTDB__Contact = {"_p_OTDB__Contact", "OTDB::Contact *", 0, 0, (void*)&_wrap_class_OTDB_Contact, 0}; +static swig_type_info _swigt__p_OTDB__ContactAcct = {"_p_OTDB__ContactAcct", "OTDB::ContactAcct *", 0, 0, (void*)&_wrap_class_OTDB_ContactAcct, 0}; +static swig_type_info _swigt__p_OTDB__ContactNym = {"_p_OTDB__ContactNym", "OTDB::ContactNym *", 0, 0, (void*)&_wrap_class_OTDB_ContactNym, 0}; +static swig_type_info _swigt__p_OTDB__Displayable = {"_p_OTDB__Displayable", "OTDB::Displayable *", 0, 0, (void*)&_wrap_class_OTDB_Displayable, 0}; +static swig_type_info _swigt__p_OTDB__LoomServer = {"_p_OTDB__LoomServer", "OTDB::LoomServer *", 0, 0, (void*)&_wrap_class_OTDB_LoomServer, 0}; +static swig_type_info _swigt__p_OTDB__MarketData = {"_p_OTDB__MarketData", "OTDB::MarketData *", 0, 0, (void*)&_wrap_class_OTDB_MarketData, 0}; +static swig_type_info _swigt__p_OTDB__MarketList = {"_p_OTDB__MarketList", "OTDB::MarketList *", 0, 0, (void*)&_wrap_class_OTDB_MarketList, 0}; +static swig_type_info _swigt__p_OTDB__OTDBString = {"_p_OTDB__OTDBString", "OTDB::OTDBString *", 0, 0, (void*)&_wrap_class_OTDB_OTDBString, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataMarket = {"_p_OTDB__OfferDataMarket", "OTDB::OfferDataMarket *", 0, 0, (void*)&_wrap_class_OTDB_OfferDataMarket, 0}; +static swig_type_info _swigt__p_OTDB__OfferDataNym = {"_p_OTDB__OfferDataNym", "OTDB::OfferDataNym *", 0, 0, (void*)&_wrap_class_OTDB_OfferDataNym, 0}; +static swig_type_info _swigt__p_OTDB__OfferListMarket = {"_p_OTDB__OfferListMarket", "OTDB::OfferListMarket *", 0, 0, (void*)&_wrap_class_OTDB_OfferListMarket, 0}; +static swig_type_info _swigt__p_OTDB__OfferListNym = {"_p_OTDB__OfferListNym", "OTDB::OfferListNym *", 0, 0, (void*)&_wrap_class_OTDB_OfferListNym, 0}; +static swig_type_info _swigt__p_OTDB__RippleServer = {"_p_OTDB__RippleServer", "OTDB::RippleServer *", 0, 0, (void*)&_wrap_class_OTDB_RippleServer, 0}; +static swig_type_info _swigt__p_OTDB__Server = {"_p_OTDB__Server", "OTDB::Server *", 0, 0, (void*)&_wrap_class_OTDB_Server, 0}; +static swig_type_info _swigt__p_OTDB__ServerInfo = {"_p_OTDB__ServerInfo", "OTDB::ServerInfo *", 0, 0, (void*)&_wrap_class_OTDB_ServerInfo, 0}; +static swig_type_info _swigt__p_OTDB__Storable = {"_p_OTDB__Storable", "OTDB::Storable *", 0, 0, (void*)&_wrap_class_OTDB_Storable, 0}; +static swig_type_info _swigt__p_OTDB__Storage = {"_p_OTDB__Storage", "OTDB::Storage *", 0, 0, (void*)&_wrap_class_OTDB_Storage, 0}; +static swig_type_info _swigt__p_OTDB__StringMap = {"_p_OTDB__StringMap", "OTDB::StringMap *", 0, 0, (void*)&_wrap_class_OTDB_StringMap, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataMarket = {"_p_OTDB__TradeDataMarket", "OTDB::TradeDataMarket *", 0, 0, (void*)&_wrap_class_OTDB_TradeDataMarket, 0}; +static swig_type_info _swigt__p_OTDB__TradeDataNym = {"_p_OTDB__TradeDataNym", "OTDB::TradeDataNym *", 0, 0, (void*)&_wrap_class_OTDB_TradeDataNym, 0}; +static swig_type_info _swigt__p_OTDB__TradeListMarket = {"_p_OTDB__TradeListMarket", "OTDB::TradeListMarket *", 0, 0, (void*)&_wrap_class_OTDB_TradeListMarket, 0}; +static swig_type_info _swigt__p_OTDB__TradeListNym = {"_p_OTDB__TradeListNym", "OTDB::TradeListNym *", 0, 0, (void*)&_wrap_class_OTDB_TradeListNym, 0}; +static swig_type_info _swigt__p_OTDB__WalletData = {"_p_OTDB__WalletData", "OTDB::WalletData *", 0, 0, (void*)&_wrap_class_OTDB_WalletData, 0}; +static swig_type_info _swigt__p_OTPacker = {"_p_OTPacker", "OTPacker *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__mapT_std__string_std__string_t = {"_p_std__mapT_std__string_std__string_t", "std::map< std::string,std::string > *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_std__vectorT_unsigned_char_t = {"_p_std__vectorT_unsigned_char_t", "std::vector< unsigned char > *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_OTCallback, + &_swigt__p_OTCaller, + &_swigt__p_OTDB__Acct, + &_swigt__p_OTDB__AddressBook, + &_swigt__p_OTDB__AskData, + &_swigt__p_OTDB__BidData, + &_swigt__p_OTDB__BitcoinAcct, + &_swigt__p_OTDB__BitcoinServer, + &_swigt__p_OTDB__Blob, + &_swigt__p_OTDB__Contact, + &_swigt__p_OTDB__ContactAcct, + &_swigt__p_OTDB__ContactNym, + &_swigt__p_OTDB__Displayable, + &_swigt__p_OTDB__LoomServer, + &_swigt__p_OTDB__MarketData, + &_swigt__p_OTDB__MarketList, + &_swigt__p_OTDB__OTDBString, + &_swigt__p_OTDB__OfferDataMarket, + &_swigt__p_OTDB__OfferDataNym, + &_swigt__p_OTDB__OfferListMarket, + &_swigt__p_OTDB__OfferListNym, + &_swigt__p_OTDB__RippleServer, + &_swigt__p_OTDB__Server, + &_swigt__p_OTDB__ServerInfo, + &_swigt__p_OTDB__Storable, + &_swigt__p_OTDB__Storage, + &_swigt__p_OTDB__StringMap, + &_swigt__p_OTDB__TradeDataMarket, + &_swigt__p_OTDB__TradeDataNym, + &_swigt__p_OTDB__TradeListMarket, + &_swigt__p_OTDB__TradeListNym, + &_swigt__p_OTDB__WalletData, + &_swigt__p_OTPacker, + &_swigt__p_char, + &_swigt__p_std__mapT_std__string_std__string_t, + &_swigt__p_std__vectorT_unsigned_char_t, +}; + +static swig_cast_info _swigc__p_OTCallback[] = { {&_swigt__p_OTCallback, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTCaller[] = { {&_swigt__p_OTCaller, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Acct[] = { {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Acct, 0, 0}, {&_swigt__p_OTDB__Acct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AddressBook[] = { {&_swigt__p_OTDB__AddressBook, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__AskData[] = { {&_swigt__p_OTDB__AskData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BidData[] = { {&_swigt__p_OTDB__BidData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinAcct[] = { {&_swigt__p_OTDB__BitcoinAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__BitcoinServer[] = { {&_swigt__p_OTDB__BitcoinServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Blob[] = { {&_swigt__p_OTDB__Blob, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Contact[] = { {&_swigt__p_OTDB__Contact, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactAcct[] = { {&_swigt__p_OTDB__ContactAcct, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ContactNym[] = { {&_swigt__p_OTDB__ContactNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Displayable[] = { {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Displayable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Displayable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Displayable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__LoomServer[] = { {&_swigt__p_OTDB__LoomServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketData[] = { {&_swigt__p_OTDB__MarketData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__MarketList[] = { {&_swigt__p_OTDB__MarketList, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OTDBString[] = { {&_swigt__p_OTDB__OTDBString, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataMarket[] = { {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__OfferDataMarket, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, 0, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__OfferDataMarket, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferDataNym[] = { {&_swigt__p_OTDB__OfferDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListMarket[] = { {&_swigt__p_OTDB__OfferListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__OfferListNym[] = { {&_swigt__p_OTDB__OfferListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__RippleServer[] = { {&_swigt__p_OTDB__RippleServer, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Server[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__Server, 0, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Server, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Server, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__ServerInfo[] = { {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__ServerInfo, 0, 0}, {&_swigt__p_OTDB__ServerInfo, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storable[] = { {&_swigt__p_OTDB__MarketList, _p_OTDB__MarketListTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactNym, _p_OTDB__ContactNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__LoomServer, _p_OTDB__LoomServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__RippleServer, _p_OTDB__RippleServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Server, _p_OTDB__ServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListNym, _p_OTDB__OfferListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListNym, _p_OTDB__TradeListNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataMarket, _p_OTDB__TradeDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataMarket, _p_OTDB__OfferDataMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Blob, _p_OTDB__BlobTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__StringMap, _p_OTDB__StringMapTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BitcoinServer, _p_OTDB__BitcoinServerTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferListMarket, _p_OTDB__OfferListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeListMarket, _p_OTDB__TradeListMarketTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Displayable, _p_OTDB__DisplayableTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ContactAcct, _p_OTDB__ContactAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__WalletData, _p_OTDB__WalletDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Storable, 0, 0, 0}, {&_swigt__p_OTDB__BitcoinAcct, _p_OTDB__BitcoinAcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OTDBString, _p_OTDB__OTDBStringTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__MarketData, _p_OTDB__MarketDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__ServerInfo, _p_OTDB__ServerInfoTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Contact, _p_OTDB__ContactTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AddressBook, _p_OTDB__AddressBookTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__BidData, _p_OTDB__BidDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__AskData, _p_OTDB__AskDataTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__Acct, _p_OTDB__AcctTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__TradeDataNym, _p_OTDB__TradeDataNymTo_p_OTDB__Storable, 0, 0}, {&_swigt__p_OTDB__OfferDataNym, _p_OTDB__OfferDataNymTo_p_OTDB__Storable, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__Storage[] = { {&_swigt__p_OTDB__Storage, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__StringMap[] = { {&_swigt__p_OTDB__StringMap, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataMarket[] = { {&_swigt__p_OTDB__TradeDataMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeDataNym[] = { {&_swigt__p_OTDB__TradeDataNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListMarket[] = { {&_swigt__p_OTDB__TradeListMarket, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__TradeListNym[] = { {&_swigt__p_OTDB__TradeListNym, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTDB__WalletData[] = { {&_swigt__p_OTDB__WalletData, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_OTPacker[] = { {&_swigt__p_OTPacker, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__mapT_std__string_std__string_t[] = { {&_swigt__p_std__mapT_std__string_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_std__vectorT_unsigned_char_t[] = { {&_swigt__p_std__vectorT_unsigned_char_t, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_OTCallback, + _swigc__p_OTCaller, + _swigc__p_OTDB__Acct, + _swigc__p_OTDB__AddressBook, + _swigc__p_OTDB__AskData, + _swigc__p_OTDB__BidData, + _swigc__p_OTDB__BitcoinAcct, + _swigc__p_OTDB__BitcoinServer, + _swigc__p_OTDB__Blob, + _swigc__p_OTDB__Contact, + _swigc__p_OTDB__ContactAcct, + _swigc__p_OTDB__ContactNym, + _swigc__p_OTDB__Displayable, + _swigc__p_OTDB__LoomServer, + _swigc__p_OTDB__MarketData, + _swigc__p_OTDB__MarketList, + _swigc__p_OTDB__OTDBString, + _swigc__p_OTDB__OfferDataMarket, + _swigc__p_OTDB__OfferDataNym, + _swigc__p_OTDB__OfferListMarket, + _swigc__p_OTDB__OfferListNym, + _swigc__p_OTDB__RippleServer, + _swigc__p_OTDB__Server, + _swigc__p_OTDB__ServerInfo, + _swigc__p_OTDB__Storable, + _swigc__p_OTDB__Storage, + _swigc__p_OTDB__StringMap, + _swigc__p_OTDB__TradeDataMarket, + _swigc__p_OTDB__TradeDataNym, + _swigc__p_OTDB__TradeListMarket, + _swigc__p_OTDB__TradeListNym, + _swigc__p_OTDB__WalletData, + _swigc__p_OTPacker, + _swigc__p_char, + _swigc__p_std__mapT_std__string_std__string_t, + _swigc__p_std__vectorT_unsigned_char_t, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +#ifdef __cplusplus +} +#endif +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned staticly to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int found, init; + + clientdata = clientdata; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + module_head = &swig_module; + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + found=0; + iter=module_head; + do { + if (iter==&swig_module) { + found=1; + break; + } + iter=iter->next; + } while (iter!= module_head); + + /* if the is found in the list, then all is done and we may leave */ + if (found) return; + /* otherwise we must add out module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpeters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + /* ----------------------------------------------------------------------------- + * constants/methods manipulation + * ----------------------------------------------------------------------------- */ + + /* Install Constants */ + + SWIGINTERN void + SWIG_Tcl_InstallConstants(Tcl_Interp *interp, swig_const_info constants[]) { + size_t i; + Tcl_Obj *obj; + + if (!swigconstTableinit) { + Tcl_InitHashTable(&swigconstTable, TCL_STRING_KEYS); + swigconstTableinit = 1; + } + for (i = 0; constants[i].type; i++) { + switch(constants[i].type) { + case SWIG_TCL_POINTER: + obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + break; + case SWIG_TCL_BINARY: + obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); + break; + default: + obj = 0; + break; + } + if (obj) { + SWIG_Tcl_SetConstantObj(interp, constants[i].name, obj); + } + } + } + + /* Create fast method lookup tables */ + + SWIGINTERN void + SWIG_Tcl_InstallMethodLookupTables(void) { + size_t i; + + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = swig_module.type_initial[i]; + if (type->clientdata) { + swig_class* klass = (swig_class*) type->clientdata; + Tcl_InitHashTable(&(klass->hashtable), TCL_STRING_KEYS); + swig_method* meth = klass->methods; + while (meth && meth->name) { + int newEntry; + Tcl_HashEntry* hashentry = Tcl_CreateHashEntry(&(klass->hashtable), meth->name, &newEntry); + Tcl_SetHashValue(hashentry, (ClientData)meth->method); + ++meth; + } + } + } + } + +#ifdef __cplusplus +} +#endif + +/* -----------------------------------------------------------------------------* + * Partial Init method + * -----------------------------------------------------------------------------*/ + +SWIGEXPORT int SWIG_init(Tcl_Interp *interp) { + size_t i; + if (interp == 0) return TCL_ERROR; +#ifdef USE_TCL_STUBS + /* (char*) cast is required to avoid compiler warning/error for Tcl < 8.4. */ + if (Tcl_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { + return TCL_ERROR; + } +#endif +#ifdef USE_TK_STUBS + /* (char*) cast is required to avoid compiler warning/error. */ + if (Tk_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { + return TCL_ERROR; + } +#endif + + Tcl_PkgProvide(interp, (char*)SWIG_name, (char*)SWIG_version); + +#ifdef SWIG_namespace + Tcl_Eval(interp, "namespace eval " SWIG_namespace " { }"); +#endif + + SWIG_InitializeModule((void *) interp); + SWIG_PropagateClientData(); + + for (i = 0; swig_commands[i].name; i++) { + Tcl_CreateObjCommand(interp, (char *) swig_commands[i].name, (swig_wrapper_func) swig_commands[i].wrapper, + swig_commands[i].clientdata, NULL); + } + for (i = 0; swig_variables[i].name; i++) { + Tcl_SetVar(interp, (char *) swig_variables[i].name, (char *) "", TCL_GLOBAL_ONLY); + Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_READS | TCL_GLOBAL_ONLY, + (Tcl_VarTraceProc *) swig_variables[i].get, (ClientData) swig_variables[i].addr); + Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_WRITES | TCL_GLOBAL_ONLY, + (Tcl_VarTraceProc *) swig_variables[i].set, (ClientData) swig_variables[i].addr); + } + + SWIG_Tcl_InstallConstants(interp, swig_constants); + SWIG_Tcl_InstallMethodLookupTables(); + + + SWIG_Tcl_SetConstantObj(interp, "PACK_MESSAGE_PACK", SWIG_From_int(static_cast< int >(OTDB::PACK_MESSAGE_PACK))); + SWIG_Tcl_SetConstantObj(interp, "PACK_PROTOCOL_BUFFERS", SWIG_From_int(static_cast< int >(OTDB::PACK_PROTOCOL_BUFFERS))); + SWIG_Tcl_SetConstantObj(interp, "PACK_TYPE_ERROR", SWIG_From_int(static_cast< int >(OTDB::PACK_TYPE_ERROR))); + SWIG_Tcl_SetConstantObj(interp, "STORE_FILESYSTEM", SWIG_From_int(static_cast< int >(OTDB::STORE_FILESYSTEM))); + SWIG_Tcl_SetConstantObj(interp, "STORE_TYPE_SUBCLASS", SWIG_From_int(static_cast< int >(OTDB::STORE_TYPE_SUBCLASS))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_STRING", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_BLOB", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BLOB))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_STRING_MAP", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_STRING_MAP))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_WALLET_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_WALLET_DATA))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_BITCOIN_ACCT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_ACCT))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_BITCOIN_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BITCOIN_SERVER))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_RIPPLE_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_RIPPLE_SERVER))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_LOOM_SERVER", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_LOOM_SERVER))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_SERVER_INFO", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_SERVER_INFO))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_CONTACT_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_NYM))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_CONTACT_ACCT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT_ACCT))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_CONTACT", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_CONTACT))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_ADDRESS_BOOK", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ADDRESS_BOOK))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_MARKET_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_DATA))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_MARKET_LIST", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_MARKET_LIST))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_BID_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_BID_DATA))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_ASK_DATA", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ASK_DATA))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_OFFER_LIST_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_MARKET))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_TRADE_DATA_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_MARKET))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_TRADE_LIST_MARKET", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_MARKET))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_OFFER_DATA_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_DATA_NYM))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_OFFER_LIST_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_OFFER_LIST_NYM))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_TRADE_DATA_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_DATA_NYM))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_TRADE_LIST_NYM", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_TRADE_LIST_NYM))); + SWIG_Tcl_SetConstantObj(interp, "STORED_OBJ_ERROR", SWIG_From_int(static_cast< int >(OTDB::STORED_OBJ_ERROR))); + return TCL_OK; +} +SWIGEXPORT int Otapi_SafeInit(Tcl_Interp *interp) { + return SWIG_init(interp); +} + diff --git a/testwallet/OTAPI_tcl.h b/testwallet/OTAPI_tcl.h new file mode 100644 index 000000000..e69de29bb diff --git a/testwallet/OTAPI_wrap.h b/testwallet/OTAPI_wrap.h new file mode 100644 index 000000000..d0da99589 --- /dev/null +++ b/testwallet/OTAPI_wrap.h @@ -0,0 +1,31 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef SWIG_otapi_WRAP_H_ +#define SWIG_otapi_WRAP_H_ + +class SwigDirector_OTCallback : public OTCallback, public Swig::Director { + +public: + void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global); + SwigDirector_OTCallback(JNIEnv *jenv); + virtual ~SwigDirector_OTCallback(); + virtual std::string runOne(); + virtual std::string runTwo(); +public: + bool swig_overrides(int n) { + return (n < 2 ? swig_override[n] : false); + } +protected: + bool swig_override[2]; +}; + + +#endif diff --git a/testwallet/OTCallback.cs b/testwallet/OTCallback.cs new file mode 100644 index 000000000..a33ffe34b --- /dev/null +++ b/testwallet/OTCallback.cs @@ -0,0 +1,87 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OTCallback : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal OTCallback(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OTCallback obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OTCallback() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OTCallback(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + } + } + + public OTCallback() : this(otapiPINVOKE.new_OTCallback(), true) { + SwigDirectorConnect(); + } + + public virtual string runOne() { + string ret = (SwigDerivedClassHasMethod("runOne", swigMethodTypes0) ? otapiPINVOKE.OTCallback_runOneSwigExplicitOTCallback(swigCPtr) : otapiPINVOKE.OTCallback_runOne(swigCPtr)); + return ret; + } + + public virtual string runTwo() { + string ret = (SwigDerivedClassHasMethod("runTwo", swigMethodTypes1) ? otapiPINVOKE.OTCallback_runTwoSwigExplicitOTCallback(swigCPtr) : otapiPINVOKE.OTCallback_runTwo(swigCPtr)); + return ret; + } + + private void SwigDirectorConnect() { + if (SwigDerivedClassHasMethod("runOne", swigMethodTypes0)) + swigDelegate0 = new SwigDelegateOTCallback_0(SwigDirectorrunOne); + if (SwigDerivedClassHasMethod("runTwo", swigMethodTypes1)) + swigDelegate1 = new SwigDelegateOTCallback_1(SwigDirectorrunTwo); + otapiPINVOKE.OTCallback_director_connect(swigCPtr, swigDelegate0, swigDelegate1); + } + + private bool SwigDerivedClassHasMethod(string methodName, Type[] methodTypes) { + System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, methodTypes, null); + bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(OTCallback)); + return hasDerivedMethod; + } + + private string SwigDirectorrunOne() { + return runOne(); + } + + private string SwigDirectorrunTwo() { + return runTwo(); + } + + public delegate string SwigDelegateOTCallback_0(); + public delegate string SwigDelegateOTCallback_1(); + + private SwigDelegateOTCallback_0 swigDelegate0; + private SwigDelegateOTCallback_1 swigDelegate1; + + private static Type[] swigMethodTypes0 = new Type[] { }; + private static Type[] swigMethodTypes1 = new Type[] { }; +} diff --git a/testwallet/OTCallback.java b/testwallet/OTCallback.java new file mode 100644 index 000000000..9e17180b2 --- /dev/null +++ b/testwallet/OTCallback.java @@ -0,0 +1,66 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OTCallback { + private long swigCPtr; + protected boolean swigCMemOwn; + + public OTCallback(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + public static long getCPtr(OTCallback obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OTCallback(swigCPtr); + } + swigCPtr = 0; + } + } + + protected void swigDirectorDisconnect() { + swigCMemOwn = false; + delete(); + } + + public void swigReleaseOwnership() { + swigCMemOwn = false; + otapiJNI.OTCallback_change_ownership(this, swigCPtr, false); + } + + public void swigTakeOwnership() { + swigCMemOwn = true; + otapiJNI.OTCallback_change_ownership(this, swigCPtr, true); + } + + public OTCallback() { + this(otapiJNI.new_OTCallback(), true); + otapiJNI.OTCallback_director_connect(this, swigCPtr, swigCMemOwn, true); + } + + public String runOne() { + return (getClass() == OTCallback.class) ? otapiJNI.OTCallback_runOne(swigCPtr, this) : otapiJNI.OTCallback_runOneSwigExplicitOTCallback(swigCPtr, this); + } + + public String runTwo() { + return (getClass() == OTCallback.class) ? otapiJNI.OTCallback_runTwo(swigCPtr, this) : otapiJNI.OTCallback_runTwoSwigExplicitOTCallback(swigCPtr, this); + } + +} diff --git a/testwallet/OTCaller.cs b/testwallet/OTCaller.cs new file mode 100644 index 000000000..b59b80374 --- /dev/null +++ b/testwallet/OTCaller.cs @@ -0,0 +1,72 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OTCaller : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal OTCaller(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OTCaller obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OTCaller() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OTCaller(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + } + } + + public OTCaller() : this(otapiPINVOKE.new_OTCaller(), true) { + } + + public string GetPassword() { + string ret = otapiPINVOKE.OTCaller_GetPassword(swigCPtr); + return ret; + } + + public void delCallback() { + otapiPINVOKE.OTCaller_delCallback(swigCPtr); + } + + public void setCallback(OTCallback cb) { + otapiPINVOKE.OTCaller_setCallback(swigCPtr, OTCallback.getCPtr(cb)); + } + + public bool isCallbackSet() { + bool ret = otapiPINVOKE.OTCaller_isCallbackSet(swigCPtr); + return ret; + } + + public void callOne() { + otapiPINVOKE.OTCaller_callOne(swigCPtr); + } + + public void callTwo() { + otapiPINVOKE.OTCaller_callTwo(swigCPtr); + } + +} diff --git a/testwallet/OTCaller.java b/testwallet/OTCaller.java new file mode 100644 index 000000000..e4de7fec4 --- /dev/null +++ b/testwallet/OTCaller.java @@ -0,0 +1,66 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OTCaller { + private long swigCPtr; + protected boolean swigCMemOwn; + + public OTCaller(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + public static long getCPtr(OTCaller obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OTCaller(swigCPtr); + } + swigCPtr = 0; + } + } + + public OTCaller() { + this(otapiJNI.new_OTCaller(), true); + } + + public String GetPassword() { + return otapiJNI.OTCaller_GetPassword(swigCPtr, this); + } + + public void delCallback() { + otapiJNI.OTCaller_delCallback(swigCPtr, this); + } + + public void setCallback(OTCallback cb) { + otapiJNI.OTCaller_setCallback(swigCPtr, this, OTCallback.getCPtr(cb), cb); + } + + public boolean isCallbackSet() { + return otapiJNI.OTCaller_isCallbackSet(swigCPtr, this); + } + + public void callOne() { + otapiJNI.OTCaller_callOne(swigCPtr, this); + } + + public void callTwo() { + otapiJNI.OTCaller_callTwo(swigCPtr, this); + } + +} diff --git a/testwallet/OTClient.cpp b/testwallet/OTClient.cpp new file mode 100644 index 000000000..c3ec67e47 --- /dev/null +++ b/testwallet/OTClient.cpp @@ -0,0 +1,7878 @@ +/************************************************************************************ + * + * OTClient.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +extern "C" +{ +#include +#include +#include +#include +#include + +} + +#include + +//---------------------------- + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTContract.h" +#include "OTAssetContract.h" +#include "OTServerContract.h" +#include "OTAccount.h" +#include "OTMessage.h" +#include "OTPayload.h" +#include "OTEnvelope.h" +#include "OTItem.h" +#include "OTLedger.h" +#include "OTMint.h" +#include "OTPurse.h" +#include "OTBasket.h" + +#include "OTTransaction.h" +#include "OTCheque.h" + +#include "OTWallet.h" + +#include "OTOffer.h" +#include "OTTrade.h" +#include "OTPaymentPlan.h" + +#include "OTClient.h" +#include "OTLog.h" + + + + +void OTClient::ProcessMessageOut(char *buf, int * pnExpectReply) +{ + m_pConnection->ProcessMessageOut(buf, pnExpectReply); +} + + +void OTClient::ProcessMessageOut(OTMessage & theMessage) +{ + m_pConnection->ProcessMessageOut(theMessage); +} + +bool OTClient::ProcessInBuffer(OTMessage & theServerReply) +{ + return m_pConnection->ProcessInBuffer(theServerReply); +} + + +// DONE: Add finalReceipt to AcceptEntireNymbox(). + +/// Without regard to WHAT those transactions ARE that are in my inbox, +/// just process and accept them all!!! (This is AUTO-ACCEPT functionality +/// built into the test client and not the library itself.) Update: this is +/// becoming standard behavior for the Nymbox (NOT the inbox.) +/// +void OTClient::AcceptEntireNymbox(OTLedger & theNymbox, OTServerConnection & theConnection) +{ + if (theNymbox.GetTransactionCount() < 1) + { + // If there aren't any notices in the nymbox, no point wasting a # to process an empty box. + OTLog::Output(4, "OTClient::AcceptEntireNymbox: Nymbox is empty.\n"); + + return; + } + + // ------------------------------------------------------ + + OTPseudonym * pNym = theConnection.GetNym(); + + OTIdentifier theServerID; + theConnection.GetServerID(theServerID); + + OTString strServerID(theServerID); + + // Contrasting Inbox and Nymbox. + // + // In "AcceptEntireInbox", I have to have a transaction number in order to accept the inbox. + // But I ALSO need to RECEIVE my transaction number THROUGH an inbox, so the server can get + // my signature on that number (that's the only way to hold me responsible for it, AND to + // later prove I'm NOT responsible for it when it's spent, without having to worry about + // saving account history forever, via so-called "destruction of account history.") + // + // So how can I receive a number, if I don't have anymore? My solution is to receive all + // transaction numbers through the NYMBOX, which is associated with Nym instead of asset account. + // That is: you RECEIVE numbers through the Nymbox, and you SPEND numbers through the Inbox. + // + // (You can also receive messages through your nymbox.) This way, I can require a transaction + // number for an INBOX (since asset accounts can have changing balances) but I do NOT have + // to require one for processing the NYMBOX (since users HAVE NO balances.) I can still + // get the signed receipt during this time in order to satisfy destruction of acct history. + // Perfect! + // + // Due to all this, lStoredTransactionNumber will be 0 for now. If I have to assign a number + // to it, then I will (probably the request number) but I will NOT be using a real + // transaction number here, since this is the NYMBOX. + // + long lStoredTransactionNumber=0; + + // the message to the server will contain a ledger to be processed for a specific acct. (in this case no acct, but user ID used twice instead.) + OTLedger processLedger(theNymbox.GetUserID(), theNymbox.GetUserID(), theServerID); + + // bGenerateFile defaults to false on GenerateLedger call, so I left out the false. + processLedger.GenerateLedger(theNymbox.GetUserID(), theServerID, OTLedger::message); // Can't just use one of these. It either has to be read out of a file or + // a string, or it has to be generated. So you construct it, then you either + // call GenerateLedger or LoadInbox, then you call VerifyContractID to make sure + // it loaded securely. (No need to verify if you just generated it.) + + OTTransaction * pAcceptTransaction = OTTransaction::GenerateTransaction(theNymbox.GetUserID(), + theNymbox.GetUserID(), theServerID, + OTTransaction::processNymbox, lStoredTransactionNumber); + + + // This insures that the ledger will handle cleaning up the transaction, so I don't have to delete it later. + processLedger.AddTransaction(*pAcceptTransaction); + + // loop through the transactions in theNymbox, and create corresponding "accept" items + // for each one of the transfer requests. Each of those items will go into a single + // "process nymbox" transaction that I will add to the processledger and thus to the + // outgoing message. + OTTransaction * pTransaction = NULL; + + // theIssuedNym == transaction numbers being added. + // theRemovedNym == transaction numbers being removed. (finalReceipt notices about opening numbers for cron items.) + // + OTPseudonym theIssuedNym, theRemovedNym; + + // For each transaction in the nymbox, if it's in reference to a transaction request, + // then create an "accept" item for that blank transaction, and add it to my own, new, + // "process nymbox" transaction that I'm sending out. + for (mapOfTransactions::iterator ii = theNymbox.GetTransactionMap().begin(); + ii != theNymbox.GetTransactionMap().end(); ++ii) + { + // If this transaction references the item that I'm trying to accept... + if ( pTransaction = (*ii).second ) // if pointer not null + { +// OTString strTransaction(*pTransaction); +// OTLog::vError("TRANSACTION CONTENTS:\n%s\n", strTransaction.Get()); + + OTString strRespTo; + pTransaction->GetReferenceString(strRespTo); +// OTLog::vError("TRANSACTION \"IN REFERENCE TO\" CONTENTS:\n%s\n", strRespTo.Get()); + + + // ------------------------------------------------------------ + // MESSAGE (From Another Nym) + // + if ( (OTTransaction::message == pTransaction->GetType()) ) + { + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptMessage); + + // The above already has OT_ASSERT so, no need to check the pointer for NULL. + + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + pAcceptItem->SetReferenceToNum(pTransaction->GetTransactionNum()); // This is critical. Server needs this to look up the receipt in my nymbox. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + + OTLog::vOutput(2, "Received an encrypted message in your Nymbox:\n%s\n", strRespTo.Get()); + + // Todo: really shouldn't do this until we get a successful REPLY from the server. + // That's when I do a lot of other things. But this is a no-biggie thing. It will almost + // always succeed and in the odd-event that it fails, I'll end up with a duplicate message + // in my mail. So what? + OTMessage * pMessage = new OTMessage; + + OT_ASSERT(NULL != pMessage); + + // The original message that was sent to me (with an encrypted envelope in the payload, + // and with the sender's ID and recipient IDs as m_strNymID and m_strNymID2) is stored + // within strRespTo. Let's load it up into an OTMessage instance, and add it to pNym's mail. + // + if (pMessage->LoadContractFromString(strRespTo)) + { + pNym->AddMail(*pMessage); // Now the Nym is responsible to delete it. It's in his "mail". + OTPseudonym * pSignerNym = pNym; + pNym->SaveSignedNymfile(*pSignerNym); + } + else + { + delete pMessage; // Don't want to leak otherwise. + pMessage = NULL; + } + } // if message + + // ------------------------------------------------------------ + // It's a NEW Transaction Number (I need to sign for it.) + // + else if ( + (OTTransaction::blank == pTransaction->GetType()) // if blank (new; just added) transaction number. + ) + { + // My new transaction agreement needs to reflect all these new transaction numbers + // that I'm signing for (or at least this one in this block) so I add them to this + // temp nym, and then harvest the ones onto it from theNym, and then send those + // numbers in the new transaction agreement. (Removing them immediately after, and + // then only adding them for real if we get a server acknowledgment.) + // + if (pNym->VerifyIssuedNum(strServerID, pTransaction->GetTransactionNum())) + OTLog::Error("Attempted to accept a blank transaction number that I ALREADY HAD...\n"); + else + { + theIssuedNym.AddIssuedNum(strServerID, pTransaction->GetTransactionNum()); + // ----------------------------------------------- + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptTransaction); + + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + pAcceptItem->SetReferenceToNum(pTransaction->GetTransactionNum()); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } + } // else if blank + + // ------------------------------------------------------------ + // It's a Final Receipt (In the Nymbox, this means an opening transaction + // number has been removed from my issued list on the server side.) + // + else if ( + (OTTransaction::finalReceipt == pTransaction->GetType()) // if finalReceipt (just removed) transaction number. + ) + { + // Todo security: make sure this is only possible for finalReceipts, in case of abuse. + // Not only for finalReceipts, but for specific finalReceipt #s that I store a local list of, perhaps + // in my Nym, to track until they are closed. No other number should get through here. + // Otherwise the server could trick you into removing your issued numbers, simply by dropping + // a final receipt for the appropriate number! + // The server already keeps a list on its side to protect it from this possibility, but now it + // appears that the client-side will have to do a similar thing. Sigh. + + + // Since the "in reference to" (the original "opening" transaction#) is supposedly + // already closed, then let's just MAKE SURE of that, since otherwise it'll screw up + // my future balance agreements. (The instant a finalReceipt appears, the "in ref to" # is already gone..) + // + if (pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pTransaction->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pTransaction->GetReferenceToNum()); + + // + // pNym won't actually save unless it actually removes that #. If the #'s already NOT THERE, + // then the removal will fail, and thus it won't bother saving here. + + // -------------------------------------------- + + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptFinalReceipt); + + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + pAcceptItem->SetReferenceToNum(pTransaction->GetTransactionNum()); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } // else if finalReceipt (in Nymbox, this signals that an OPENING number has closed ALREADY. Thus no need to have a "closing process.") + } // if pTransaction + } + + + // If the above processing resulted in us actually accepting certain specific items, + // then let's process the message out to the server. + // + if (pAcceptTransaction->GetItemCount()) + { + OTMessage theMessage; + + if (ProcessUserCommand(OTClient::processNymbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + NULL)) + { + // the message is all set up and ready to go out... it's even signed. + // Except the ledger we're sending, still needs to be added, and then the + // message needs to be re-signed as a result of that. + + theNymbox.ReleaseTransactions(); // Since this function accepts them ALL, the new balance agreement needs to show it as empty. + + // ----------------------------------------- + + // By this point, theIssuedNym contains a list of all the transaction numbers that are in my + // nymbox, and that WILL be ADDED to me once this processNymbox is processed. + // Therefore I need to ADD those items to my issued list (at least temporarily) in order to + // calculate the transaction agreement properly. So I used theIssueNym as a temp variable to store those + // numbers, so I can add them to my Nym and them remove them again after generating the statement. + // + for (int i = 0; i < theIssuedNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theIssuedNym.GetIssuedNum(theServerID, i); + pNym->AddIssuedNum(strServerID, lTemp); // doesn't save. + } + + //********************************************************************************* + // TRANSACTION STATEMENT + // The item is signed and saved within this call as well. No need to do that again. + // + OTItem * pBalanceItem = pNym->GenerateTransactionStatement(*pAcceptTransaction); + + //********************************************************************************* + + // Here I am removing the new numbers again, now that the statement has been generated. + // If the message is successful, then I will need to add them for real. + // + for (int i = 0; i < theIssuedNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theIssuedNym.GetIssuedNum(theServerID, i); + pNym->RemoveIssuedNum(strServerID, lTemp); + } + + // ----------------------------------------- + + if (NULL != pBalanceItem) // This can't be NULL BTW, since there is an OT_ASSERT in Generate call. But I hate to use a pointer without checking it. + pAcceptTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + else + OTLog::Error("This should never happen.\n"); + + // ------------------------------------------------------------ + + // Sign the accept transaction, as well as the message ledger + // that we've just constructed containing it. + pAcceptTransaction->SignContract(*pNym); + pAcceptTransaction->SaveContract(); + + processLedger.SignContract(*pNym); + processLedger.SaveContract(); + + // Extract the ledger into string form and add it as the payload on the message. + OTString strLedger(processLedger); + theMessage.m_ascPayload.SetString(strLedger); + + // Release any other signatures from the message, since I know it + // was signed already in the above call to ProcessUserCommand. + theMessage.ReleaseSignatures(); + + // Sign it and send it out. + theConnection.SignAndSend(theMessage); + // I could have called SignContract() and then theConnection.ProcessMessageOut(message) + // but I used the above function instead. + + } + else + OTLog::Error("Error processing processNymbox command in OTClient::AcceptEntireNymbox\n"); + } +} + + + +// Done: Make sure that transaction numbers being TEMPORARILY REMOVED from Nym (to generate a statement +// or balance agreement) are not put BACK onto the Nym unless they REALLY WERE THERE.... +// +// What might be happening is this: We remove the finalReceipt to generate the statement, but then ADD IT BACK +// again to the Nym unless/until the request was successful. This is normal behavior most of the time. BUT... +// IN THE NYMBOX, the finalReceipt is ONLY A NOTICE, to aid removal, since it was ALREADY REMOVED on the server's +// side! There's no point adding it again -- it's GONE! WORSE: If due to communication error, you never got +// the server's reply -- well it's still on your list on the client side, isn't it? But this time, you don't have +// any convenient notice in your Nymbox informing you that it's supposed to be gone. As far as you know, it's still +// good. It's on your list, right? That's the whole problem. In Nymbox, it's a NOTICE of a PAST EVENT. Just REMOVE +// the issued number AS SOON AS YOU SEE THE NOTICE. This way your transaction statement is sure to be accurate. +// +// This may not be the case for the Inbox (below) but the lesson is still important: Some numbers are removed +// IMMEDIATELY upon notice. Other numbers are removed only when the receipt has been successfully closed, otherwise +// they are added back on again. And furthermore, they are only added back on if they really were found on your +// Nym in the first place. OTHERWISE, a SECURITY WEAKNESS would occur, where the server could TRICK you into adding +// numbers to your list of responsibility, even though they hadn't been there in the first place! You'd just do your +// normal process of removing the number, sending the request, then adding the number back again -- but if it hadn't +// been there in the first place, it'd still be added back again! That's why there needs to be a CLEAR DISTINCTION +// in both functions (above and below) between NEW numbers being added to your list, and numbers being removed +// from your list, and between numbers that were already on your list, numbers that were not already on your list, +// and between numbers being removed from your list, and numbers that were ALREADY REMOVED some time in the past. +// +// DONE: Verify all these places: AcceptEntireNymbox, AcceptEntireInbox, API calls for accepting Inbox, OTClient +// code for @processInbox and @processNymbox, and server code for those also. + + + +/// Without regard to WHAT those transactions ARE that are in my inbox, +/// just process and accept them all!!! (This is AUTO-ACCEPT functionality +/// built into the test client and not the library itself.) +void OTClient::AcceptEntireInbox(OTLedger & theInbox, OTServerConnection & theConnection) +{ + bool bSuccess = false; + + OTPseudonym * pNym = theConnection.GetNym(); + + OTIdentifier theAccountID(theInbox), theServerID; + theConnection.GetServerID(theServerID); + + OTAccount * pAccount = theConnection.GetWallet()->GetAccount(theAccountID); + + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); // Need this for balance agreement (outbox hash) + + OTCleanup theOutboxAngel(pOutbox); // auto cleanup. + + if (NULL == pOutbox) + { + OTLog::Output(0, "OTClient::AcceptEntireInbox: Failed loading outbox!\n"); + return; + } + + // --------------------------------------------- + + if (theInbox.GetTransactionCount() < 1) + { + // If there aren't any transactions in the inbox, no point wasting a # to process an empty box. + OTLog::Output(4, "OTClient::AcceptEntireInbox: no point wasting a transaction number in order to process an empty box\n"); + + return; + } + + OTString strServerID(theServerID); + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber); // Warning: this saves the nym if successful. + + if (!bGotTransNum) + { + OTLog::Output(0, "Error: No transaction numbers are available. Suggest requesting the server for a new one.\n"); + return; + } + + // the message to the server will contain a ledger to be processed for a specific acct. + OTLedger processLedger(theInbox.GetUserID(), theAccountID, theServerID); + + // bGenerateFile defaults to false on GenerateLedger call, so I left out the false. + processLedger.GenerateLedger(theAccountID, theServerID, OTLedger::message); // Can't just use one of these. It either has to be read out of a file or + // a string, or it has to be generated. So you construct it, then you either + // call GenerateLedger or LoadInbox, then you call VerifyContractID to make sure + // it loaded securely. (No need to verify if you just generated it.) + + OTTransaction * pAcceptTransaction = OTTransaction::GenerateTransaction(theInbox.GetUserID(), + theAccountID, theServerID, OTTransaction::processInbox, lStoredTransactionNumber); + + + // This insures that the ledger will handle cleaning up the transaction, so I don't have to delete it later. + processLedger.AddTransaction(*pAcceptTransaction); + + // loop through the transactions in theInbox, and create corresponding "accept" items + // for each one of the transfer requests. Each of those items will go into a single + // "process inbox" transaction that I will add to the processledger and thus to the + // outgoing message. + OTTransaction * pTransaction = NULL; + long lAdjustment = 0; // If I accept any pending transactions, I must take note of any adjustment when I sign the balance agreement. + + // If transaction #s that have been ISSUED to pNym are being REMOVED by this transaction, + // then we use this temporary Nym (theIssuedNym) to store the ones that are being removed, + // so that we can remove them from the Nym, calculate the balance agreement, and then add them + // back on again. (They aren't removed for real until the server "success" reply comes back.) + // + // WARNING: Take care not to add them BACK, unless they really were there in the first place! + // Otherwise you have just been tricked into adding numbers to pNym that weren't even there, + // versus what you thought you were doing (re-adding numbers to pNym that HAD been there, and + // had only been temporarily removed in order to perform a calculation.) + // + // + OTPseudonym theIssuedNym; + + // For each transaction in the inbox, if it's in reference to a transfer request, + // then create an "accept" item for that transfer request, and add it to my own, new, + // "process inbox" transaction that I'm sending out. + for (mapOfTransactions::iterator ii = theInbox.GetTransactionMap().begin(); + ii != theInbox.GetTransactionMap().end(); ++ii) + { + // If this transaction references the item that I'm trying to accept... + if ((pTransaction = (*ii).second) && (pTransaction->GetReferenceToNum()>0)) // if pointer not null AND it refers to some other transaction + { +// OTString strTransaction(*pTransaction); +// OTLog::vError("TRANSACTION CONTENTS:\n%s\n", strTransaction.Get()); + + OTString strRespTo; + pTransaction->GetReferenceString(strRespTo); +// OTLog::vError("TRANSACTION \"IN REFERENCE TO\" CONTENTS:\n%s\n", strRespTo.Get()); + + // Sometimes strRespTo contains an OTPaymentPlan or an OTTrade. + // The rest of the time, it contains an OTItem. + // + // The reason is because in most cases I have the original item + // right there, so I attach it. But with payment plans and trades, + // the original payment plan itself, or trade itself, is being loaded + // by Cron (as a cron receipt) for reference reasons, and thus it is + // the most appropriate object to attach in that case, and also, the + // OTItem is not available in that context, since we aren't even processing + // a message, but rather, we are in Cron, processing a trade or some + // other sort of cron item. + + // ************************************************************************ + + // PAYMENT RECEIPT, MARKET RECEIPT + // + if ((OTTransaction::paymentReceipt == pTransaction->GetType()) || + (OTTransaction::marketReceipt == pTransaction->GetType())) + { + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptCronReceipt); + + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + // Set up the "accept" transaction item to be sent to the server, by referencing + // the transaction number of the receipt. Normally, when accepting a pending + // transaction, I set the "in reference to" to the transaction number of the + // original transfer that I am accepting. + // + // But I cannot do this with a market receipt, or a payment plan receipt, + // since there may be MULTIPLE RECEIPTS REFERENCING THE SAME NUMBER (they will + // all reference the original payment plan / offer.) Thus, in the case of receipts, + // I accept by setting the "in reference to" to the RECEIPT's transaction number, + // since each receipt represents a distinct transaction anyway, and I must + // accept them individually, and that is the number that identifies them uniquely. + + pAcceptItem->SetReferenceToNum(pTransaction->GetTransactionNum()); // This is critical. Server needs this to look up the receipt in my inbox. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // Nothing here to remove via theIssuedNym. In this case, the transaction came from the server. + // Only my ORIGINAL request to enter the payment plan can be removed, and that only happens when the + // finalReceipt is issued, not when a single receipt is removed. Therefore, I can only accept the + // receipt from my inbox, but this moment here doesn't free up any of my issued transaction numbers. +// if (pNym->VerifyIssuedNum(strServerID, pTransaction->GetTransactionNum())) +// theIssuedNym.AddIssuedNum(strServerID, pTransaction->GetTransactionNum()); +// else {error} + + // I don't attach the original payment plan or trade here, + // because I already reference it by transaction num of the receipt, + // and the server can look it up in my inbox from there. + + // This just makes it convenient later. + pAcceptItem->SetAmount(pTransaction->GetReceiptAmount()); // The server will verify this actually matches, or reject the message. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } // if market receipt or payment receipt (cron receipt) + + // ************************************************************************ + + // FINAL RECEIPT, BASKET RECEIPT + // + if ((OTTransaction::finalReceipt == pTransaction->GetType()) || + (OTTransaction::basketReceipt == pTransaction->GetType())) + { + // Since the "in reference to" is supposedly already closed, then let's just + // MAKE SURE of that, since otherwise it'll screw up my future balance agreements. + // (The instant a finalReceipt appears, the "in ref to" is already gone. Let it go.) + // + // todo security: make sure not to actually remove this number unless I double check + // it against a client-side list of open transaction numbers for cron items (expecting + // final receipts.) Unless the number appears on that list, don't remove it. And then, + // remove it from the list as well. The server already has a mechanism like this. + // + if (OTTransaction::finalReceipt == pTransaction->GetType()) + { + if (pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pTransaction->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pTransaction->GetReferenceToNum()); + } + + // + // pNym won't actually save unless it actually removes that #. If the #'s already NOT THERE, + // then the removal will fail, and thus it won't bother saving here. + + + // If I accept the finalReceipt or basketReceipt, that will remove its CLOSING NUM from my issued list. + // (Its "in reference to" num is already closed by now.) + // + // For security, ONLY add the number to theIssuedNym (to indicate it's being removed) if + // it WAS actually already there on the Nym. Otherwise it'll get "re-added" when it wasn't + // there in the first place! + // + if (false == pNym->VerifyIssuedNum(strServerID, pTransaction->GetClosingNum())) + OTLog::vError("OTClient::AcceptEntireInbox: final or basket receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe you need to download a fresh copy of it.)\n", + pTransaction->GetClosingNum()); + + else // Success. + { + theIssuedNym.AddIssuedNum(strServerID, pTransaction->GetClosingNum()); + + OTItem * pAcceptItem = + OTItem::CreateItemFromTransaction(*pAcceptTransaction, + (OTTransaction::finalReceipt == pTransaction->GetType()) ? + OTItem::acceptFinalReceipt : OTItem::acceptBasketReceipt); + + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + pAcceptItem->SetReferenceToNum(pTransaction->GetTransactionNum()); // This is critical. Server needs this to look up the receipt in my inbox. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // This just makes it convenient later. + pAcceptItem->SetAmount(pTransaction->GetReceiptAmount()); + // The server will verify this actually matches, or reject the message. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } + + // ----------------------------------------------- + } // if finalReceipt or basketReceipt + + // ************************************************************************ + + // PENDING (incoming transfer) + // + else if ( + (OTTransaction::pending == pTransaction->GetType()) + ) + { + OTItem * pOriginalItem = OTItem::CreateItemFromString(strRespTo, theServerID, pTransaction->GetReferenceToNum()); + OTCleanup theAngel(pOriginalItem); + + // This item was attached as the "in reference to" item. Perhaps Bob sent it to me. + // Since that item was initiated by him, HIS would be the account ID on it, not mine. + // So I DON'T want to create it with my account ID on it. + if (pOriginalItem) + { + if ( (OTItem::transfer == pOriginalItem->GetType()) && + (OTItem::request == pOriginalItem->GetStatus())) // I'm accepting a transfer that was sent to me. (A .PENDING .TRANSFER .REQUEST) + { + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptPending); + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + // Set up the "accept" transaction item to be sent to the server + // (this item references and accepts another item by its transaction number-- + // But on the server side, it doesn't look for the inbox item with that number. + // Rather, it looks for the inbox item that is "in reference to" that number. Notice + // therefore, my own accept item is below ALSO set to be "in reference to" the number + // of the original item. The server uses this info to find the pending transaction. + OTString strNote("Thanks for that money!"); // this message is from when only transfer worked. + pAcceptItem->SetNote(strNote); + pAcceptItem->SetReferenceToNum(pOriginalItem->GetTransactionNum()); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // This just makes it convenient later. + pAcceptItem->SetAmount(pTransaction->GetReceiptAmount()); // The server will verify this actually matches, or reject the message. + + lAdjustment += (pOriginalItem->GetAmount()); // Bob transferred me 50 clams. If my account was 100, it WILL be 150. Therefore, adjustment is +50. + + // Nothing to remove in this case, since the transfer was initiated by someone else. +// if (pNym->VerifyIssuedNum(strServerID, pTransaction->GetTransactionNum())) +// theIssuedNym.AddIssuedNum(strServerID, pTransaction->GetTransactionNum()); + // else { error } + + // I don't attach the original item here because I already reference it by transaction num, + // and because the server already has it and sent it to me. SO I just need to give the server + // enough info to look it up again. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } + else + { + const int nOriginalType = pOriginalItem->GetType(); + OTLog::vError( "Unrecognized item type (%d) while processing inbox.\n" + "(Only pending transfers, payment receipts, market receipts, " + "cheque receipts, and transfer receipts are operational inbox items at this time.)\n", + nOriginalType); + } + } + else + { + OTLog::vError("Error loading transaction item from string in OTClient::AcceptEntireInbox\n"); + } + } // else if pending + + // ************************************************************************ + + // TRANSFER RECEIPT, CHEQUE RECEIPT + // + else if ( + (OTTransaction::transferReceipt == pTransaction->GetType()) || + (OTTransaction::chequeReceipt == pTransaction->GetType()) + ) + { + OTItem * pOriginalItem = OTItem::CreateItemFromString(strRespTo, theServerID, pTransaction->GetReferenceToNum()); + OTCleanup theAngel(pOriginalItem); + + // This item was attached as the "in reference to" item. Perhaps Bob sent it to me. + // Since that item was initiated by him, HIS would be the account ID on it, not mine. + // So I DON'T want to create it with my account ID on it. + if (pOriginalItem) + { + if ((OTItem::request == pOriginalItem->GetStatus()) + && + // In a real client, the user would pick and choose which items he wanted + // to accept or reject. We, on the other hand, are blindly accepting all of + // these types: + ( + ( + (OTItem::acceptPending == pOriginalItem->GetType()) && // I'm accepting a transfer receipt. + (OTTransaction::transferReceipt == pTransaction->GetType()) + ) + || + ( + (OTItem::depositCheque == pOriginalItem->GetType()) && // I'm accepting a notice that someone cashed my cheque. + (OTTransaction::chequeReceipt == pTransaction->GetType()) + ) + ) + ) + { + // If pOriginalItem is acceptPending, that means I'm accepting the transfer receipt from the server, + // which has the recipient's acceptance inside of it as the original item. This means the transfer that + // *I* originally sent is now finally closed! + // + // If it's a depositCheque, that means I'm accepting the cheque receipt from the server, + // which has the recipient's deposit inside of it as the original item. This means that the cheque that + // *I* originally wrote is now finally closed! + // + // In both cases, the "original item" itself is not from me, but from the recipient! Therefore, + // the number on that item is useless to me (for removing numbers from my own list of issued numbers.) + // Rather, I need to load that original cheque, or pending transfer, from WITHIN the original item, + // in order to get THAT number, to remove it from my issued list. *sigh* + // + if (OTItem::depositCheque == pOriginalItem->GetType()) // We're accepting a chequeReceipt. + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pOriginalItem->GetAttachment(strCheque); + + OTCheque theCheque; // allocated on the stack :-) + + if (false == ((strCheque.GetLength() > 2) && + theCheque.LoadContractFromString(strCheque))) + { + OTLog::vError("ERROR loading cheque from string in OTClient::AcceptEntireInbox:\n%s\n", + strCheque.Get()); + } + else + { + // IF it's actually there on pNym, then schedule it for removal. + // (Otherwise we'd end up improperly re-adding it.) + // + if (false == pNym->VerifyIssuedNum(strServerID, theCheque.GetTransactionNum())) + OTLog::vError("OTClient::AcceptEntireInbox: cheque receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe need to download a fresh copy of it.)\n", + theCheque.GetTransactionNum()); + else + { + theIssuedNym.AddIssuedNum(strServerID, theCheque.GetTransactionNum()); + + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptItemReceipt); + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + // In this case, this reference number is someone else's responsibility, not mine. (Someone ELSE deposited my cheque.) ...But I still reference it. + pAcceptItem->SetReferenceToNum(pOriginalItem->GetTransactionNum()); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + // Server rejects the message if these don't match. + pAcceptItem->SetAmount(pTransaction->GetReceiptAmount()); + + // I don't attach the original item here because I already reference it by transaction num, + // and because the server already has it and sent it to me. SO I just need to give the server + // enough info to look it up again. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } + } + } + // --------------------------------------------------------- + + else if (OTItem::acceptPending == pOriginalItem->GetType()) // We're accepting a transferReceipt. + { + // IF it's actually there on pNym, then schedule it for removal. + // (Otherwise we'd end up improperly re-adding it.) + // + if (false == pNym->VerifyIssuedNum(strServerID, pOriginalItem->GetReferenceToNum())) + OTLog::vError("OTClient::AcceptEntireInbox: transfer receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on my issued list. (So what is this in my inbox, " + "then? Maybe need to download a fresh copy of it.)\n", + pOriginalItem->GetReferenceToNum()); + else + { + theIssuedNym.AddIssuedNum(strServerID, pOriginalItem->GetReferenceToNum()); + + OTItem * pAcceptItem = OTItem::CreateItemFromTransaction(*pAcceptTransaction, OTItem::acceptItemReceipt); + // the transaction will handle cleaning up the transaction item. + pAcceptTransaction->AddItem(*pAcceptItem); + + // In this case, this reference number is someone else's responsibility, not mine. (Someone ELSE deposited my cheque.) ...But I still reference it. + pAcceptItem->SetReferenceToNum(pOriginalItem->GetTransactionNum()); // This is critical. Server needs this to look up the original. + // Don't need to set transaction num on item since the constructor already got it off the owner transaction. + + pAcceptItem->SetAmount(pTransaction->GetReceiptAmount()); + + // I don't attach the original item here because I already reference it by transaction num, + // and because the server already has it and sent it to me. SO I just need to give the server + // enough info to look it up again. + + // sign the item + pAcceptItem->SignContract(*pNym); + pAcceptItem->SaveContract(); + } + } + else + { + OTLog::Error("OTClient::AcceptEntireInbox: Error: wrong pOriginalItem type.\n"); + } + } + else + { + const int nOriginalType = pOriginalItem->GetType(); + OTLog::vError( "Unrecognized item type (%d) while processing inbox.\n" + "(Only pending transfers, payment receipts, market receipts, cheque " + "receipts, and transfer receipts are operational inbox items at this time.)\n", + nOriginalType); + } + } + else + { + OTLog::vError("Error loading transaction item from string in OTClient::AcceptEntireInbox\n"); + } + } // else if transfer receipt or cheque receipt. (item receipt) + + // ************************************************************************ + + } // if pTransaction + + // This will have to go through the nymbox from now on, so I get explicit sign-off on each number. + // if (pTransaction) + // { + // HarvestTransactionNumbers(*pTransaction, *pNym); + // } + } // for -------------------------------------------- + + + // If the above processing resulted in us actually accepting certain specific items, + // then let's process the message out to the server. + // + if (pAcceptTransaction->GetItemCount()) + { + OTMessage theMessage; + OTAssetContract * pAssetContract = theConnection.GetWallet()->GetAssetContract(pAccount->GetAssetTypeID()); + + if (pAccount && ProcessUserCommand(OTClient::processInbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // the message is all set up and ready to go out... it's even signed. + // Except the ledger we're sending, still needs to be added, and then the + // message needs to be re-signed as a result of that. + + theInbox.ReleaseTransactions(); // Since this function accepts them ALL, the new balance agreement needs to show it as empty. + + // ----------------------------------------- + + // By this point, theIssuedNym contains a list of all the transaction numbers that are issued to me, + // but that will NOT be issued to me anymore once this processInbox is processed. + // Therefore I need to REMOVE those items from my issued list (at least temporarily) in order to + // calculate the balance agreement properly. So I used theIssueNym as a temp variable to store those + // numbers, so I can remove them from my Nym and them add them again after generating the statement. + // + for (int i = 0; i < theIssuedNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theIssuedNym.GetIssuedNum(theServerID, i); + pNym->RemoveIssuedNum(strServerID, lTemp); + } + + // ----------------------------------------- + + // BALANCE AGREEMENT + // The item is signed and saved within this call as well. No need to do that again. + OTItem * pBalanceItem = theInbox.GenerateBalanceStatement(lAdjustment, *pAcceptTransaction, *pNym, *pAccount, *pOutbox); + + // ----------------------------------------- + + // Here I am adding these numbers back again, since I removed them to calculate the balance agreement. + // (They won't be removed for real until I receive the server's acknowledgment that those numbers + // really were removed. Until then I have to keep them and use them for my balance agreements.) + for (int i = 0; i < theIssuedNym.GetIssuedNumCount(theServerID); i++) + { + long lTemp = theIssuedNym.GetIssuedNum(theServerID, i); + pNym->AddIssuedNum(strServerID, lTemp); + } + + // ----------------------------------------- + + if (NULL != pBalanceItem) + pAcceptTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + else + OTLog::Error("Should never happen.\n"); + + // ------------------------------------------------------------ + + // Sign the accept transaction, as well as the message ledger + // that we've just constructed containing it. + pAcceptTransaction->SignContract(*pNym); + pAcceptTransaction->SaveContract(); + + processLedger.SignContract(*pNym); + processLedger.SaveContract(); + + // Extract the ledger into string form and add it as the payload on the message. + OTString strLedger(processLedger); + theMessage.m_ascPayload.SetString(strLedger); + + // Release any other signatures from the message, since I know it + // was signed already in the above call to ProcessUserCommand. + theMessage.ReleaseSignatures(); + + // Sign it and send it out. + theConnection.SignAndSend(theMessage); + // I could have called SignContract() and then theConnection.ProcessMessageOut(message) + // but I used the above function instead. + + bSuccess = true; // Otherwise we haven't really burned the transaction num, and need to put it back (below). + } + else + OTLog::Error("Error processing processInbox command in OTClient::AcceptEntireInbox\n"); + } + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + if (false == bSuccess) + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true +} + + + +/// We have received the server reply (ProcessServerReply) which has vetted it and determined that it +/// is legitimate and safe, and that it is a reply to a transaction request. +/// +/// At that point, this function is called to open the reply, go through the transaction responses, +/// and potentially grab any bearer certificates that are inside and save them in a purse somewhere. +/// (And do any other necessary processing on that reply.) +/// +void OTClient::ProcessIncomingTransactions(OTServerConnection & theConnection, OTMessage & theReply) +{ + const OTIdentifier ACCOUNT_ID(theReply.m_strAcctID); + OTIdentifier SERVER_ID; + theConnection.GetServerID(SERVER_ID); + OTPseudonym * pNym = theConnection.GetNym(); + OTIdentifier USER_ID; + pNym->GetIdentifier(USER_ID); + + OTString strServerID(SERVER_ID), + strReceiptID("ID_NOT_SET_YET"); // This will be user ID or acct ID depending on whether trans statement or balance statement. + + OTPseudonym * pServerNym = (OTPseudonym *)(theConnection.GetServerContract()->GetContractPublicNym()); + + // The only incoming transactions that we actually care about are responses to cash + // WITHDRAWALS. (Cause we want to get that money off of the response, not lose it.) + // So let's just check to see if it's a withdrawal... + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + OTString strLedger(theReply.m_ascPayload); + + // The ledger we received from the server was generated there, so we don't + // have to call GenerateLedger. We just load it. + bool bSuccess = theLedger.LoadContractFromString(strLedger); + + if (bSuccess) + bSuccess = theLedger.VerifyAccount((OTPseudonym &)*pServerNym); + + if (!bSuccess) + { + OTLog::Error("ERROR loading ledger from message payload in OTClient::ProcessIncomingTransactions.\n"); + return; + } + + OTLog::Output(3, "Loaded ledger out of message payload.\n"); + + // Loop through ledger transactions, + OTTransaction * pTransaction = NULL; + + for (mapOfTransactions::iterator ii = theLedger.GetTransactionMap().begin(); + ii != theLedger.GetTransactionMap().end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT_MSG(NULL != pTransaction, "NULL transaction pointer in OTServer::UserCmdNotarizeTransactions\n"); + + // Each transaction in the ledger is a server reply to our original transaction request. + // + if (pTransaction->VerifyAccount(*pServerNym)) // if not null && valid transaction reply from server + { + // -------------------------------------- + + // We had to burn a transaction number to run the transaction that the server has now replied to, + // so let's remove that number from our list of responsibility. Whether it was successful or not, + // the server has removed it from our list of responsibility, so we need to remove it on our side as well. + // so that we can properly calculate our balance agreements in the future. + // + // NOTE: not for all types! See the switch statements: + + OTItem::itemType theItemType = OTItem::error_state; + + switch (pTransaction->GetType()) + { + // ---------------------------------------- + case OTTransaction::atDeposit: + theItemType = OTItem::atDeposit; + break; + case OTTransaction::atWithdrawal: + theItemType = OTItem::atWithdrawal; + break; + case OTTransaction::atTransfer: + theItemType = OTItem::atTransfer; + break; + case OTTransaction::atMarketOffer: + theItemType = OTItem::atMarketOffer; + break; + case OTTransaction::atPaymentPlan: + theItemType = OTItem::atPaymentPlan; + break; + case OTTransaction::atCancelCronItem: + theItemType = OTItem::atCancelCronItem; + break; + case OTTransaction::atExchangeBasket: + theItemType = OTItem::atExchangeBasket; + break; + default: + case OTTransaction::atProcessInbox: // not handled here... + continue; + } + + // ---------------------------------------- + + switch (pTransaction->GetType()) + { + case OTTransaction::atDeposit: + ProcessDepositResponse(*pTransaction, theConnection, theReply); + pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true); // bool bSave=true + break; + + // ******************************************************************** + + case OTTransaction::atWithdrawal: + ProcessWithdrawalResponse(*pTransaction, theConnection, theReply); + pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true); // bool bSave=true + break; + + // ******************************************************************** + + case OTTransaction::atExchangeBasket: + pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true); // bool bSave=true + // If the exchangeBasket FAILS, then I put all the transaction numbers BACK on the Nym, + // that had been taken for the exchange (for all the basketReceipts.) + // --------------------------------------- + { + OTItem * pItem = pTransaction->GetItem(theItemType); + + if ((NULL != pItem) && + OTItem::rejection == pItem->GetStatus()) + { + OTString strOriginalItem; + pItem->GetReferenceString(strOriginalItem); + + OTTransactionType * pTempTransType = + strOriginalItem.Exists() ? OTTransactionType::TransactionFactory(strOriginalItem) : NULL; + + OTItem * pOriginalItem = (NULL == pTempTransType) ? NULL : dynamic_cast(pTempTransType); + OTCleanup theItemAngel(pOriginalItem); + + if (NULL != pOriginalItem) + { + OTString strBasket; + OTBasket theRequestBasket; + + pOriginalItem->GetAttachment(strBasket); + + if (strBasket.Exists() && theRequestBasket.LoadContractFromString(strBasket)) + { + for (int i = 0; i < theRequestBasket.Count(); i++) + { + BasketItem * pRequestItem = theRequestBasket.At(i); + + OT_ASSERT(NULL != pRequestItem); + + pNym->AddTransactionNum(*pNym, strServerID, pRequestItem->lClosingTransactionNo, false); // bSave=false + } + pNym->AddTransactionNum(*pNym, strServerID, theRequestBasket.GetClosingNum(), true); // bSave=true + } + else + { + OTLog::Error("(atExchangeBasket) Error loading original basket request in OTClient::ProcessIncomingTransactions\n"); + } + } // if success loading original item. + else + { + OTLog::Error("(atExchangeBasket) Error loading original item from string in OTClient::ProcessIncomingTransactions\n"); + } + } // if exchangeBasket was a success + } + break; + + // ******************************************************************** + + case OTTransaction::atCancelCronItem: + pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true); // bool bSave=true + // Just above, we remove the issued number that was used to initiate the cancelCronItem. (Regardless of success.) + // Below, we remove the issued number that was ON that Cron Item (IF SUCCESS.) + // --------------------------------------- + { + OTItem * pItem = pTransaction->GetItem(theItemType); + + if ((NULL != pItem) && + OTItem::acknowledgement == pItem->GetStatus()) + { // If it was a success cancelling the cron item, then the final receipt has been created, and + // the transaction number is closed out, and only the closing number is left. If that is the case + // then I can remove the transaction number from my issued list, presumably the server already has. + // + OTString strOriginalItem; + pItem->GetReferenceString(strOriginalItem); + + OTTransactionType * pTempTransType = + strOriginalItem.Exists() ? OTTransactionType::TransactionFactory(strOriginalItem) : NULL; + + OTItem * pOriginalItem = (NULL == pTempTransType) ? NULL : dynamic_cast(pTempTransType); + OTCleanup theItemAngel(pOriginalItem); + + if (NULL != pOriginalItem) + { + if (false == pNym->RemoveIssuedNum(*pNym, strServerID, pOriginalItem->GetReferenceToNum(), true)) // bool bSave=true + { + OTLog::Error("(atCancelCronItem) Error removing issued number from user nym in OTClient::ProcessIncomingTransactions\n"); + } + // I don't have to call RemoveTransactionNum for the closing number (though the server does.) Why not? + // Because I already called GetNextTransactionNum() to get it in the first place, so it's already off my + // list of usable transaction numbers here on the client side. + } + else + { + OTLog::Error("(atCancelCronItem) Error loading original item from string in OTClient::ProcessIncomingTransactions\n"); + } + } + } + break; + + // ******************************************************************** + + case OTTransaction::atTransfer: + // Nothing removed here since the transaction number is still in play, in this cases. + // ACTUALLY, if this is a failure, we need to REMOVE from issued list. (It's burned.) + // But if success, the number stays in play until a later time. (So we leave it issued.) + { + OTItem * pItem = pTransaction->GetItem(theItemType); + + if ((NULL != pItem) && + OTItem::rejection == pItem->GetStatus()) + { + // Why do this? Oh I see, this number either gets burned from the attempt, + // or it stays open for a while if success. So here what do we see? The rejection + // burning the transaction number, but leaving it open if success. Perfect. + // + if (false == pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true)) // bool bSave=true + { + OTLog::Error("Error removing issued number from user nym (for a transfer) in OTClient::ProcessIncomingTransactions\n"); + } + } + } + break; + + // ******************************************************************** + + case OTTransaction::atMarketOffer: + case OTTransaction::atPaymentPlan: + + // Nothing removed here since the transaction number is still in play, in these cases. + // ACTUALLY, if these are a failure, we need to REMOVE from issued list. + // But if success, the number stays in play until a later time. + { + OTItem * pItem = pTransaction->GetItem(theItemType); + + if ((NULL != pItem) && + OTItem::rejection == pItem->GetStatus()) + { + // Why do this? Oh I see, this number either gets burned from the attempt, + // or it stays open for a while if success. So here what do we see? The rejection + // burning the transaction number, but leaving it open if success. Perfect. + // + if (false == pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true)) // bool bSave=true + { + OTLog::Error("Error removing issued number from user nym (for a cron item) in OTClient::ProcessIncomingTransactions\n"); + } + // ---------------------------------------------------------- + + // NEXT: Since it was a failure, harvest the extra transaction numbers that were used as CLOSING numbers. + // They can go back on my Nym and be used another day! + // + OTString strOriginalItem; + pItem->GetReferenceString(strOriginalItem); + + OTTransactionType * pTempTransType = + strOriginalItem.Exists() ? OTTransactionType::TransactionFactory(strOriginalItem) : NULL; + + OTItem * pOriginalItem = (NULL == pTempTransType) ? NULL : dynamic_cast(pTempTransType); + OTCleanup theItemAngel(pOriginalItem); + + if (NULL != pOriginalItem) + { + OTString strCronItem; + pOriginalItem->GetAttachment(strCronItem); + + OTCronItem * pCronItem = (strCronItem.Exists() ? OTCronItem::NewCronItem(strCronItem) : NULL); + OTCleanup theCronItemAngel(pCronItem); + + if (NULL != pCronItem) // the original trade or payment plan object. + { + // If the message was a failure, we can add all the extra transaction numbers BACK to the + // Nym, that were being used as CLOSING numbers, and use them later. They aren't burned. + pCronItem->HarvestClosingNumbers(*pNym); // saves. + } + else + { + OTLog::Error("(cron items) Error loading cronitem from original item, from string, in OTClient::ProcessIncomingTransactions\n"); + } + } + else + { + OTLog::Error("(cron items) Error loading original item from string in OTClient::ProcessIncomingTransactions\n"); + } + } // pItem is the server's reply item, and it is a rejection. + } + break; + + default: + // Error + OTLog::vError("OTClient::ProcessIncomingTransactions: wrong transaction type: %s\n", + pTransaction->GetTypeString()); + break; + } + + // atTransfer: If success, KEEP the number on my list of responsibility. If fail, REMOVE it. + // (Do the same for atMarketOffer and atPaymentPlan.) + // atDeposit: Whether success or fail, remove the number from my list of responsibility. + // atWithdrawal: Whether success or fail, remove the number from my list of responsibility. + // atAcceptPending: Whether success or fail, remove the number from my list of responsibility. + + // ----------------------------------------------------------------- + // + // SAVE THE RECEIPT.... + + //OTLog::ReceiptFolder() + const OTString strServerID(SERVER_ID); + OTString strReceiptFilename; //contains: strReceiptID .success, fail, or error. + // --------------------------------------------------------- + + OTItem * pItem = pTransaction->GetItem(OTItem::atBalanceStatement); + + if (NULL == pItem) + { + pItem = pTransaction->GetItem(OTItem::atTransactionStatement); + + if (NULL != pItem) + pNym->GetIdentifier(strReceiptID); // In this case, the receipt ID is the Nym ID + } + else + { + strReceiptID = theReply.m_strAcctID; // If a balance statement, then the receipt ID is the Account ID. + } + + // --------------------------------------------------------- + + OTString strTransaction; + pTransaction->SaveContract(strTransaction); + + if (NULL != pItem) + { + if (pTransaction->GetSuccess()) + strReceiptFilename.Format("%s.success", strReceiptID.Get()); + else + strReceiptFilename.Format("%s.fail", strReceiptID.Get()); + + OTDB::StorePlainString(strTransaction.Get(), OTLog::ReceiptFolder(), + strServerID.Get(), strReceiptFilename.Get()); + } + else // This should never happen... + { + strReceiptFilename.Format("%s.error", strReceiptID.Get()); + + OTLog::vError("Error saving transaction receipt: %s\n", strReceiptFilename.Get()); + + OTDB::StorePlainString(strTransaction.Get(), OTLog::ReceiptFolder(), + strServerID.Get(), strReceiptFilename.Get()); + } + + // No matter what kind of transaction it is, + // let's see if the server gave us some new transaction numbers with it... + // UPDATE: the server will not give me transaction numbers unless I have SIGNED FOR THEM. + // Therefore, they are now dropped into the Nymbox, and that is where they will be. +// HarvestTransactionNumbers(*pTransaction, *pNym); + } + else + { + OTLog::Output(0, "Failed verifying server ownership of this transaction.\n"); + } + } +} + + +// Usually a transaction from the server includes some new transaction numbers. +// Use this function to harvest them. +void OTClient::HarvestTransactionNumbers(OTTransaction & theTransaction, OTPseudonym & theNym) +{ + // loop through the ALL items that make up this transaction and check to see if a response to deposit. + OTItem * pItem = NULL; + + // if pointer not null, and it's a withdrawal, and it's an acknowledgement (not a rejection or error) + for (listOfItems::iterator ii = theTransaction.GetItemList().begin(); ii != theTransaction.GetItemList().end(); ++ii) + { + if ((pItem = *ii) && (OTItem::atTransaction == pItem->GetType())) + { + if (OTItem::acknowledgement == pItem->GetStatus()) + { + OTLog::Output(0, "SUCCESS -- Received new transaction number(s) from Server for storage.\n"); + + OTString strAttachment; + pItem->GetAttachment(strAttachment); + if (strAttachment.GetLength()) + { + OTPseudonym thePseudonym; + + if (thePseudonym.LoadFromString(strAttachment)) + { + theNym.HarvestTransactionNumbers(pItem->GetPurportedServerID(), theNym, thePseudonym); + } + } + } + else + { + OTLog::Output(0, "FAILURE -- Server refuses to send transaction num.\n"); // in practice will never occur. + } + } + } +} + + + +void OTClient::ProcessDepositResponse(OTTransaction & theTransaction, OTServerConnection & theConnection, OTMessage & theReply) +{ + const OTIdentifier ACCOUNT_ID(theReply.m_strAcctID); + OTIdentifier SERVER_ID; + theConnection.GetServerID(SERVER_ID); + OTPseudonym * pNym = theConnection.GetNym(); + OTIdentifier USER_ID; + pNym->GetIdentifier(USER_ID); +// OTWallet * pWallet = theConnection.GetWallet(); + + // loop through the ALL items that make up this transaction and check to see if a response to deposit. + OTItem * pItem = NULL; + + // if pointer not null, and it's a withdrawal, and it's an acknowledgement (not a rejection or error) + for (listOfItems::iterator ii = theTransaction.GetItemList().begin(); ii != theTransaction.GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + if (OTItem::atDeposit == pItem->GetType()) + { + if (OTItem::acknowledgement == pItem->GetStatus()) + { + OTLog::Output(0, "SUCCESS -- Server acknowledges deposit.\n"); + } + else + { + OTLog::Output(0, "FAILURE -- Server rejects deposit.\n"); + } + + } + } +} + + + + +/// It's definitely a withdrawal, we just need to iterate through the items in the transaction and +/// grab any cash tokens that are inside, to save inside a purse. Also want to display any vouchers. +void OTClient::ProcessWithdrawalResponse(OTTransaction & theTransaction, OTServerConnection & theConnection, OTMessage & theReply) +{ + const OTIdentifier ACCOUNT_ID(theReply.m_strAcctID); + OTIdentifier SERVER_ID; + theConnection.GetServerID(SERVER_ID); + + OTString strServerID(SERVER_ID); + + OTPseudonym * pNym = theConnection.GetNym(); + OTIdentifier USER_ID; + pNym->GetIdentifier(USER_ID); + + const OTString strUserID(USER_ID); + + OTWallet * pWallet = theConnection.GetWallet(); + OTPseudonym * pServerNym = (OTPseudonym *)(theConnection.GetServerContract()->GetContractPublicNym()); + + // loop through the ALL items that make up this transaction and check to see if a response to withdrawal. + OTItem * pItem = NULL; + + // if pointer not null, and it's a withdrawal, and it's an acknowledgement (not a rejection or error) + for (listOfItems::iterator ii = theTransaction.GetItemList().begin(); ii != theTransaction.GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT(NULL != pItem); + + // If we got a reply to a voucher withdrawal, we'll just display the the voucher + // on the screen (if the server sent us one...) + if ((OTItem::atWithdrawVoucher == pItem->GetType()) && + (OTItem::acknowledgement == pItem->GetStatus())) + { + OTString strVoucher; + pItem->GetAttachment(strVoucher); + + OTCheque theVoucher; + if (theVoucher.LoadContractFromString(strVoucher)) + { + OTLog::vOutput(0, "\nReceived voucher from server:\n\n%s\n\n", strVoucher.Get()); + } + } + + // ---------------------------------------------------------------------------------------- + + // If the item is a response to a cash withdrawal, we want to save the coins into a purse + // somewhere on the computer. That's cash! Gotta keep it safe. + + else if ((OTItem::atWithdrawal == pItem->GetType()) && + (OTItem::acknowledgement == pItem->GetStatus())) + { + OTString strPurse; + pItem->GetAttachment(strPurse); + + OTPurse thePurse(SERVER_ID); + + if (thePurse.LoadContractFromString(strPurse)) + { + // When we made the withdrawal request, we saved that purse pointer in the + // wallet so that we could get to the private coin unblinding data when we + // needed it (now). + OTPurse * pRequestPurse = pWallet->GetPendingWithdrawal(); + OTToken * pToken = NULL; + OTToken * pOriginalToken = NULL; + + OTString strAssetID(thePurse.GetAssetID()); + + // ----------------------------------------------------------------- + + OTMint theMint(strServerID, strAssetID); + + // ----------------------------------------------------------------- + + // Unlike the purse which we read out of a message, + // now we try to open a purse as a file on the client side, + // keyed by Asset ID. (The client should already have one + // purse file for each asset type, if he already has cash.) + // + // We don't want to just overwrite that file. So instead, we + // try to load that purse first, then add the token, then save it + // again. + OTPurse theWalletPurse(thePurse); + // TODO verify the wallet purse when loaded. My signature should be the last thing on it. + + // TODO: I don't check this for failure. If the file doesn't exist, + // we are still going to save the purse there regardless. + // HOWEVER need to make sure the wallet software has good backup + // strategy. In the event that tokens are overwritten here, it + // shouldn't be a problem since they would be in the archive somewhere. + + theWalletPurse.LoadPurse(strServerID.Get(), strUserID.Get(), strAssetID.Get()); +// if Load, theWalletPurse.VerifySignature(); + + + // ------------------------------------------------------------- + + bool bSuccess = false; + + if ((NULL != pRequestPurse) && (NULL != pServerNym) && + theMint.LoadMint() && theMint.VerifyMint(*pServerNym)) + while (pToken = thePurse.Pop(*pNym)) + { + pOriginalToken = pRequestPurse->Pop(*pNym); + + if (NULL == pOriginalToken) + { + OTLog::vError("ERROR, processing withdrawal response, but couldn't find original token:%s\n", strPurse.Get()); + } + else if (OTToken::signedToken == pToken->GetState()) + { + OTLog::Output(1, "Retrieved signed token from purse, and have corresponding withdrawal request in wallet. Unblinding...\n\n"); + + if (pToken->ProcessToken(*pNym, theMint, *pOriginalToken)) + { + // Now that it's processed, let's save it again. + pToken->ReleaseSignatures(); + pToken->SignContract(*pNym); + pToken->SaveContract(); + + bSuccess = true; + + // add it to the existing client-side purse for storing tokens of that asset type + theWalletPurse.Push(*pNym, *pToken); + } + else + { + bSuccess = false; + if (pToken) + { + delete pToken; + pToken = NULL; + } + // The while loop starts by allocating a pOriginalToken, so I want to + // delete it for each iteration and keep things clean. + if (pOriginalToken) + { + delete pOriginalToken; + pOriginalToken = NULL; + } + break; + } + } + + // The while loop starts by allocating a pToken, so I want to + // delete it for each iteration and keep things clean. + if (pToken) + { + delete pToken; + pToken = NULL; + } + // The while loop starts by allocating a pOriginalToken, so I want to + // delete it for each iteration and keep things clean. + if (pOriginalToken) + { + delete pOriginalToken; + pOriginalToken = NULL; + } + } // while (pToken = thePurse.Pop(*pNym)) + + if (bSuccess) + { + // Sign it, save it. + theWalletPurse.ReleaseSignatures(); // Might as well, they're no good anyway once the data has changed. + theWalletPurse.SignContract(*pNym); + theWalletPurse.SavePurse(strServerID.Get(), strUserID.Get(), strAssetID.Get()); + + OTLog::Output(1, "SUCCESSFULLY UNBLINDED token, and added the cash to the local purse, and saved.\n"); + } + } // if (thePurse.LoadContractFromString(strPurse)) + } + } // for +} + + + +/// We have just received a message from the server. +/// Find out what it is and do the appropriate processing. +/// Perhaps we just tried to create an account -- this could be +/// our new account! Let's make sure we receive it and save it +/// to disk somewhere. +/// +/// PS... The Client TAKES OWNERSHIP of this message (adding it +/// to a message buffer) and will store it until the buffer is +/// flushed, or until the messages are popped back off later for +/// processing by the client API. +/// THEREFORE -- theReply MUST be allocated on the heap, and is +/// only passed in as a reference here in order to make sure it's real. +/// +bool OTClient::ProcessServerReply(OTMessage & theReply) +{ + OTServerConnection & theConnection = (*m_pConnection); + + OTIdentifier ACCOUNT_ID(theReply.m_strAcctID), SERVER_ID; + theConnection.GetServerID(SERVER_ID); + + OTPseudonym * pNym = theConnection.GetNym(); + OTIdentifier USER_ID; + pNym->GetIdentifier(USER_ID); + + OTPseudonym * pServerNym = (OTPseudonym *)(theConnection.GetServerContract()->GetContractPublicNym()); + + + // Just like the server verifies all messages before processing them, + // so does the client need to verify the signatures against each message + // and verify the various contract IDs and signatures. + if (!theReply.VerifySignature(*pServerNym)) + { + OTLog::Error("Error: Server reply signature failed to verify in OTClient::ProcessServerReply\n"); + + OTMessage * pMessage = &theReply; // I'm responsible to cleanup this object. + + delete pMessage; + pMessage = NULL; + + return false; + } + + // Here, the Client takes ownership of the message (so make sure it's heap-allocated.) + m_MessageBuffer.AddToList(theReply); + + + // Once that process is done, everything below that line, in this function, + // will be able to assume there is a verified Nym available, and a Server Contract, + // and an asset contract where applicable, and an account where applicable. + // + // Until that code is written, I do not have those things available to me. + // + // Furthermore also need to verify the payloads... + // If "Command Responding To" was not actually signed by me, and I wasn't + // expecting the new account request, then I do NOT want to sign it. + // + // Also if the new account is not signed by the server, I don't want to sign + // it either. Need to check for all these things. Right now just proof of concept. + + // Also, assuming all the verification shit is done here, I will have the Nym + // Wait a second, I think I have the Nym already cause there's a pointer on + // the server connection that was passed in here... + + if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getRequest")) + { + long lNewRequestNumber = atol(theReply.m_strRequestNum.Exists() ? theReply.m_strRequestNum.Get() : "0"); + + // so the proper request number is sent next time, we take the one that + // the server just sent us, and we ask the wallet to save it somewhere safe + // (like in the nymfile) + + // In the future, I will have to write a function on the wallet that actually + // takes the reply, looks up the associated nym in the wallet, verifies + // that it was EXPECTING a response to GetRequest, (cause otherwise it won't + // know which one to update) and then updates the request number there. + // In the meantime there is only one connection, and it already has a pointer to + // the Nym, so I'll just tell it to update the request number that way for now. + + theConnection.OnServerResponseToGetRequestNumber(lNewRequestNumber); + + return true; + } + if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@checkUser")) + { + const OTString strNymID2(theReply.m_strNymID2), strPubkey(theReply.m_strNymPublicKey.Get()); + + // ---------------------------------- + + OTString strPath = strNymID2.Get(); + + // ---------------------------------- + // Next we save the public key in the pubkeys folder... + + OTPseudonym thePubkeyNym(strNymID2); + + if (thePubkeyNym.SetPublicKey(strPubkey) && thePubkeyNym.VerifyPseudonym()) + { + if (thePubkeyNym.SavePublicKey(strPath)) + OTLog::vOutput(0, "@checkUser: Success saving public key file for Nym: %s\n", strNymID2.Get()); + } + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@notarizeTransactions")) + { + OTLog::Output(0, "Received server response to notarize Transactions message.\n"); + // OTLog::vOutput(0, "Received server response to notarize Transactions message:\n%s\n", strReply.Get()); + + ProcessIncomingTransactions(theConnection, theReply); + + + // This block assumes that the above "@notarizeTransactions", being successful, probably changed + // the account balance. A nice GUI would probably interpret the reply and edit the local files + // to update them to match (since it was successful). In fact, the above call to ProcessIncomingTransactions + // does some of that sort of stuff already, at least for issued numbers on the nym. For now, I'm taking + // the easy way out: I added a build option that just re-downloads those files (below) whenever they + // probably changed. If the below getAccount is successful, that will similarly trigger getOutbox, which + // triggers getInbox, which triggers processInbox, which triggers getAccount, so technically it could go + // in a circle for a while :P I'm firing off these messages like how a nice client GUI might do it. + // Basically just to make the test client easier to use, and possibly to make the API easier for developers + // as well (We'll see.) +#if defined (TEST_CLIENT) + { + OTMessage theMessage; + OTAccount * pAccount = NULL; + + if ( (NULL != (pAccount = m_pWallet->GetAccount(ACCOUNT_ID))) && + ProcessUserCommand(OTClient::getAccount, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getAccount command in OTClient::ProcessServerReply @notarizeTransactions\n"); + } +#endif + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getTransactionNum")) + { + OTLog::Output(0, "Received server response to Get Transaction Num message.\n"); +// OTLog::vOutput(0, "Received server response to Get Transaction Num message:\n%s\n", strReply.Get()); + + // RIGHT HERE: This will need to fire off a getNymbox, and @getNymbox will fire off a + // processNymbox, in the same way that getInbox now fires off a processInbox. + // Basically it will automatically turn around here since the ultimate goal is to + // get those transactions out of the Nymbox (that used to be passed here directly, + // but no longer since balance agreement has now been implemented.) + +#if defined (TEST_CLIENT) + OTMessage theMessage; + + static int nLayersDeep = 0; // This creates a quasi-loop to grab 10 more transaction numbers (but not process Nymbox until all 10 are requested first...) + + if ((nLayersDeep < 10) && (pNym->GetTransactionNumCount(SERVER_ID) < 10)) // If I have less than 10 transaction numbers available, grab 10 more. + { + nLayersDeep++; + + if (ProcessUserCommand(OTClient::getTransactionNum, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + NULL)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getTransactionNum command in OTClient::ProcessServerReply\n"); + + } + else if (ProcessUserCommand(OTClient::getNymbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + NULL)) + { + nLayersDeep = 0; + + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getNymbox command in OTClient::ProcessServerReply\n"); +#endif + return true; + } + + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getNymbox")) + { + OTString strReply(theReply); + + OTLog::Output(0, "Received server response to Get Nymbox message.\n"); + // OTLog::vOutput(0, "Received server response to Get Nymbox message:\n%s\n", strReply.Get()); + + // base64-Decode the server reply's payload into strInbox + OTString strNymbox(theReply.m_ascPayload); + +// OTLog::vError("NYMBOX CONTENTS:\n%s\n", strInbox.Get()); + + // Load the ledger object from that string. + OTLedger theNymbox(USER_ID, USER_ID, SERVER_ID); + + + // I receive the nymbox, verify the server's signature, then RE-SIGN IT WITH MY OWN + // SIGNATURE, then SAVE it to local storage. So any FUTURE checks of this nymbox + // would require MY signature, not the server's, to verify. But in this one spot, + // just before saving, I need to verify the server's first. + // UPDATE: Keeping the server's signature, and just adding my own. + if (theNymbox.LoadContractFromString(strNymbox) && theNymbox.VerifyAccount(*pServerNym)) + { + theNymbox.ReleaseSignatures(); // Now I'm keeping the server signature, and just adding my own. + theNymbox.SignContract(*pNym); // UPDATE: Releasing the signature again, since Receipts are now fully functional. + theNymbox.SaveContract(); // Thus we can prove the Nymbox using the last signed transaction receipt. This means + theNymbox.SaveNymbox(); // the receipt is our proof, and the nymbox becomes just an intermediary file that is + // downloaded occasionally (like checking for new email) but no trust is risked since the dl'd + // file is always verified against the receipt! + + // (Accepting the entire nymbox automatically-- sending a signed message right + // back to the server accepting whatever was inside this ledger, without giving the user + // the opportunity to examine and reject those nymbox items.) + // + // Since nymbox is only messages and transaction numbers, no reason not to automate this + // and save the API developers some grief. + + if (OTTransaction::VerifyTransactionReceipt(*pServerNym, *pNym, SERVER_ID)) + { +//#if defined (TEST_CLIENT) + AcceptEntireNymbox(theNymbox, theConnection); // Perhaps just Verify Contract so it verifies signature too, and ServerID too if I override it and add that... +//#endif + OTLog::vOutput(0, "===> ** LAST SIGNED TRANSACTION RECEIPT *VERIFIED* against latest nym!\n\n"); + } + else + { + OTLog::vOutput(0, "===> ** LAST SIGNED TRANSACTION RECEIPT *FAILED* against latest nym.\n" + "(IF THE ACCOUNT IS NEW, i.e. it's never transacted before, then there IS NOT YET ANY RECEIPT, so this error is normal.)\n"); + +//#if defined (TEST_CLIENT) + AcceptEntireNymbox(theNymbox, theConnection); // TODO -- Figure out how, if I want to handle this differently in the GUI itself. +//#endif + } + + + OTLog::SleepMilliseconds(OTLog::GetLatencyReceiveMs()); // I'm putting this here to make sure enough time passed, since updating transaction numbers. + // might remove this later. GUI was popping the wrong reply because the right one hadn't come in yet. This delay here gives time for replies. + // The bug was the one where, upon creating the third market offer, it failed, because balance agreement was failing. + } + else + { + OTLog::vError("OTClient::ProcessServerReply: Error loading or verifying nymbox:\n\n%s\n", strNymbox.Get()); + } + + return true; + } + // ------------------------------------------------------------------------ + + /* + if (m_strCommand.Compare("@processNymbox")) + { + m_xmlUnsigned.Concatenate("<%s\n" // Command + " success=\"%s\"\n" + " nymID=\"%s\"\n" + " serverID=\"%s\"" + " >\n\n", + m_strCommand.Get(), + (m_bSuccess ? "true" : "false"), + m_strNymID.Get(), + m_strServerID.Get() + ); + + if (m_ascInReferenceTo.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascInReferenceTo.Get()); + + // I would check if this was empty, but it should never be empty... + // famous last words. + if (m_ascPayload.GetLength()) + m_xmlUnsigned.Concatenate("\n%s\n\n", m_ascPayload.Get()); + + m_xmlUnsigned.Concatenate("\n\n", m_strCommand.Get()); + + } // ------------------------------------------------------------------------ + */ + + // IN EITHER of these cases, the number of transaction numbers on my Nym has probably changed. + // But the server acknowledgment here confirms it, so I should remove any issued numbers, + // save the nym, etc. + // + else if (theReply.m_bSuccess && + ( theReply.m_strCommand.Compare("@processInbox") || + theReply.m_strCommand.Compare("@processNymbox") ) + ) + { + OTString strServerID(SERVER_ID), strReply(theReply); + + OTLog::vOutput(0, "Received server response to %s.\n", theReply.m_strCommand.Get()); +// OTLog::vOutput(0, "Received server response to Get Inbox message:\n%s\n", strReply.Get()); + + // If the server acknowledges either of the above commands, then my transaction + // numbers have changed. I need to read the numbers from my last transaction agreement + // (which should be saved in this server reply) and make sure to update my nym accordingly. + // + OTString strOriginalMessage; + if (theReply.m_ascInReferenceTo.Exists()) + theReply.m_ascInReferenceTo.GetString(strOriginalMessage); + + OTMessage theOriginalMessage; + + if (strOriginalMessage.Exists() && + theOriginalMessage.LoadContractFromString(strOriginalMessage) && + theOriginalMessage.VerifySignature(*pNym) + ) + { + OTString strLedger, strReplyLedger; + + if (theReply.m_strCommand.Compare("@processNymbox")) + ACCOUNT_ID = USER_ID; // For Nymbox, UserID *is* AcctID. + + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID), + theReplyLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + + theOriginalMessage.m_ascPayload.GetString(strLedger); + theReply.m_ascPayload.GetString(strReplyLedger); + + if (strLedger.Exists() && + strReplyLedger.Exists() && + theLedger.LoadContractFromString(strLedger) && + theReplyLedger.LoadContractFromString(strReplyLedger)) + { + // atAcceptItemReceipt: Whether success or fail, remove the number used from list of responsibility. + // ALSO, if success, remove the number from the original cheque or the original transfer request. + // + // Other options are not handled here, but they ARE handled elsewhere (above). They are: + // + // atDeposit: Whether success or fail, remove the number from my list of responsibility. + // atWithdrawal: Whether success or fail, remove the number from my list of responsibility. + // atAcceptPending: Whether success or fail, remove the number from my list of responsibility. + // atTransfer: If success, KEEP the number on my issued list. (Remove when transfer receipt is accepted.) + // If failure, REMOVE the number from my issued list. (Use a new one next time.) + // atMarketOffer: If success, KEEP the number on my issued list. (Removed when final receipt is created.) + // If failure, REMOVE the number from my issued list. (Use a new one next time.) + // atCancelCronItem: Whether success or fail, remove the number from my list of responsibility. + // atExchangeBasket: Whether success or fail, remove the number from my list of responsibility. + + OTTransaction * pTransaction = NULL; + OTTransaction * pReplyTransaction = NULL; + + if (theReply.m_strCommand.Compare("@processInbox")) // We're processing the SERVER's REPLY to our processInbox request. + { + pTransaction = theLedger.GetTransaction(OTTransaction::processInbox); + pReplyTransaction = theReplyLedger.GetTransaction(OTTransaction::atProcessInbox); + + if (NULL != pTransaction) + { + // pNym->RemoveTransactionNum() happened whenever I first fired off the processInbox request. + // Now let's remove that number from our ISSUED list of responsibility, since we got a server reply... + // <====> Whatever trans num I used to process inbox is now OFF my issued list on server side! + // (Therefore remove here too, to match..) + // + pNym->RemoveIssuedNum(*pNym, strServerID, pTransaction->GetTransactionNum(), true); // bool bSave=true + + // -------------------------------------------- + + if (NULL != pReplyTransaction) + { + // Load the inbox. + OTLedger theInbox(USER_ID, ACCOUNT_ID, SERVER_ID); + + // I JUST had this loaded if I sent acceptWhatever just instants ago, (which I am now processing the reply for.) + // Therefore I'm just ASSUMING here that it loads successfully here, since it worked an instant ago. Todo. + OT_ASSERT_MSG(theInbox.LoadInbox(), "Was trying to load Inbox."); + + // ------------------------------------- + // Next, loop through the reply items for each "process inbox" item that I must have previously sent. + // For each, if successful, remove from inbox. + // For item receipts, if successful, also remove the appropriate trans# + // from my issued list of transaction numbers (like above.) + + for (listOfItems::iterator ii = pReplyTransaction->GetItemList().begin(); + ii != pReplyTransaction->GetItemList().end(); ++ii) + { + OTItem * pReplyItem = *ii; + + OT_ASSERT_MSG(NULL != pReplyItem, "OTClient::ProcessServerReply: Pointer should not have been NULL."); + +// OTLog::Error(" *** TOP OF LOOP of Reply items, one presumably for each processInbox that I sent previously.\n"); + + OTItem::itemType theItemType = OTItem::error_state; + + switch (pReplyItem->GetType()) + { + case OTItem::atAcceptPending: + theItemType = OTItem::acceptPending; + break; + case OTItem::atAcceptCronReceipt: + theItemType = OTItem::acceptCronReceipt; + break; + case OTItem::atAcceptItemReceipt: + theItemType = OTItem::acceptItemReceipt; + break; + + // ------------------------ + case OTItem::atRejectPending: // turn down the money! + theItemType = OTItem::rejectPending; + continue; // unused + case OTItem::atDisputeCronReceipt: // dispute a market trade or payment for a payment plan + theItemType = OTItem::disputeCronReceipt; + continue; // unused + case OTItem::atDisputeItemReceipt: // dispute a cheque receipt or transfer receipt. + theItemType = OTItem::disputeItemReceipt; + continue; // unused + + // ------------------------ + + case OTItem::atAcceptFinalReceipt: + theItemType = OTItem::acceptFinalReceipt; + break; + + case OTItem::atAcceptBasketReceipt: + theItemType = OTItem::acceptBasketReceipt; + break; + + // ------------------------ + + case OTItem::atDisputeFinalReceipt: + theItemType = OTItem::disputeFinalReceipt; + continue; // unused + case OTItem::atDisputeBasketReceipt: + theItemType = OTItem::disputeBasketReceipt; + continue; // unused + // ------------------------ + + // We don't care about these here. + // + case OTItem::atBalanceStatement: + theItemType = OTItem::balanceStatement; + continue; + case OTItem::atTransactionStatement: + theItemType = OTItem::transactionStatement; + continue; + + // FYI, on server side, it does not bother to process an item, + // if the balance statement or transaction statement has not succeeded. + // + // Thus, if the ITEM ITSELF has succeeded, that means the balance or + // transaction statement MUST have succeeded! Because server wouldn't have + // even bothered to process the item otherwise. + // + // There still might be some future application in doing something with these + // statements when they come in. + + // ----------------------------------------------------- + + default: + { + const int nReplyItemType = pReplyItem->GetType(); + + OTString strTheType; + pReplyItem->GetTypeString(strTheType); + + OTLog::vError("*** Unexpected reply item type (%d) in @processInbox, while processing server reply: %s \n", + nReplyItemType, strTheType.Get()); + continue; + } + } // SWITCH + + // ------------------------------------------------------------------------------------ + + // The below actions are only necessary if pReplyItem was a SUCCESS. + // (Otherwise we skip them...) + // + OTString strTempTypeString; + pReplyItem->GetTypeString(strTempTypeString); + + if (OTItem::acknowledgement != pReplyItem->GetStatus()) + { + OTLog::vOutput(1, "@processInbox reply item %s: status == FAILED\n", strTempTypeString.Get()); + continue; + } + // else + OTLog::vOutput(1, "@processInbox reply item %s: status == SUCCESS\n", strTempTypeString.Get()); + + // ------------------------------------------------------------------------------------ + + // WTF IS THIS? There could be 3 acceptPendings, 5 acceptCronReceipts, 3 acceptFinalReceipts, etc + // in a single ProcessInbox transaction. Therefore this "get by type" will NOT fly in this case. + // (Fixing this now to look it up by ID instead of type.) + // + //OTItem * pItem = pTransaction->GetItem(theItemType); + // + // Can't do this either: + // OTItem * pItem = pTransaction->GetItemInRefTo(pReplyItem->GetReferenceToNum()); + // + // (pReplyItem->GetReferenceToNum() contains the processInbox transaction# of pItem, not + // the inbox receipt # that pItem is in reference to.) + // + // pTransaction is the processInbox transaction request that I sent. + // (The items within it all share its same transaction number, but they are IN REFERENCE TO + // the inbox receipts that they accept/reject.) + // pReplyTransaction is the server's reply to that. + // pReplyItem is the current item when iterating through pReplyTransaction. + // pItem is the corresponding REQUEST item from pTransaction, that pReplyItem is responding to. + // + // Therefore: I need to load the original item from pReplyItem's reference string (it's bundled in there). + // THEN I will get the "in reference to" number from THAT (which is the inbox Receipt #). + // THEN I will use that number to look up the SAME original item from pTransaction. + // The last step isn't technically necessary, but may be useful for security. + // + // Sheesh! + + OTString strProcessInboxItem; + pReplyItem->GetReferenceString(strProcessInboxItem); + + OTItem * pProcessInboxItem = OTItem::CreateItemFromString(strProcessInboxItem, SERVER_ID, pReplyItem->GetReferenceToNum()); + OTCleanup theProcessInboxItemGuardian(pProcessInboxItem); // So I don't have to clean it up later. No memory leaks. + + // pProcessInboxItem is already a copy of the correct processInbox item that I need. But still, it's a copy that the SERVER + // sent me. So I'm going to use it to get the reference number that I need, in order to look up MY copy of the item. + // + OTItem * pItem = + (pProcessInboxItem != NULL) ? pTransaction->GetItemInRefTo(pProcessInboxItem->GetReferenceToNum()) : NULL; + + if (NULL == pItem) + { + OTLog::Error("Unable to find original item in original processInbox transaction request, based on reply item.\n"); + continue; + } + + // If this happens, it means the item we found in our original process inbox transaction, which matched the + // "in reference to" number that we expected from the copy of that original item we loaded from within the + // pReplyItem that's supposedly responding to it, does not have the same TYPE that we would have expected it to + // have, based on the intelligence in the above switch statement. + // + if (pItem->GetType() != theItemType) + { // (Possible types for pItem: acceptItemReceipt, acceptPending, acceptCronReceipt, acceptFinalReceipt, acceptBasketReceipt.) + OTLog::Error("Wrong original item TYPE, on reply item's copy of original item, " + "than what was expected based on reply item's type.\n"); + continue; + } + + // Todo here: any other verification of pItem against pProcessInboxItem, which are supposedly copies of the same item. + + // FYI, pItem->GetReferenceToNum() is the ID of the receipt that's in the inbox. + // + // ------------------------------------------------------------------------------------ + + OTTransaction * pServerTransaction = NULL; + + OTLog::vOutput(1, "Checking client-side inbox for expected pending or receipt transaction: %ld... \n", + pItem->GetReferenceToNum()); // temp remove + + switch (pReplyItem->GetType()) { + case OTItem::atAcceptPending: + case OTItem::atAcceptItemReceipt: + pServerTransaction = theInbox.GetPendingTransaction(pItem->GetReferenceToNum()); + break; + // ----------------------- + case OTItem::atAcceptCronReceipt: + case OTItem::atAcceptFinalReceipt: + case OTItem::atAcceptBasketReceipt: + pServerTransaction = theInbox.GetTransaction(pItem->GetReferenceToNum()); + break; + + default: + { + const int nReplyItemType = pReplyItem->GetType(); + + OTString strTheType; + pReplyItem->GetTypeString(strTheType); + + OTLog::vError("*** Unexpected reply item type (%d) in @processInbox, while processing server reply: %s\n", + nReplyItemType, strTheType.Get()); + break; // will return just below, where it checks pServerTransaction for NULL. + } + } + + if (NULL == pServerTransaction) + { + OTLog::Error("Unable to find the server's receipt, in my inbox, that " + "my original processInbox's item was referring to.\n"); + continue; + } + + // ------------------------------------------------------------------------------------ + + switch (pReplyItem->GetType()) // All of these need to remove something from the client-side inbox. (Which happens below this switch.) + { // Some also need to remove an issued transaction number from pNym. + case OTItem::atAcceptPending: + + break; + + // --------------------------------------------------------------- + // In the case of item receipt (not cron receipt or pending) I need to + // remove the issued num from my list of responsibility. (Since I finally + // accepted the receipt and closed it out.) + // + // (Basically closing out the original transfer I must have sent, or cheque I must have written.) + case OTItem::atAcceptItemReceipt: // <================================================== + { + // What number do I remove here? the user is accepting a transfer receipt, which + // is in reference to the recipient's acceptPending. THAT item is in reference to + // my original transfer (or contains a cheque with my original number.) (THAT's the # I need.) + // + OTString strOriginalItem; + pServerTransaction->GetReferenceString(strOriginalItem); + + OTItem * pOriginalItem = OTItem::CreateItemFromString(strOriginalItem, SERVER_ID, pServerTransaction->GetReferenceToNum()); + OTCleanup theOrigItemGuardian(pOriginalItem); // So I don't have to clean it up later. No memory leaks. + + if (NULL != pOriginalItem) + { + // If pOriginalItem is acceptPending, that means I am accepting the transfer receipt from the server, (from my inbox), + // which has the recipient's acceptance inside of my transfer as the original item. This means the transfer that + // I originally sent is now finally closed! + // + // If it's a depositCheque, that means I am accepting the cheque receipt from the server, (from my inbox) + // which has the recipient's deposit inside of it as the original item. This means that the cheque that + // I originally wrote is now finally closed! + // + // In both cases, the "original item" itself is not from me, but from the recipient! Therefore, + // the number on that item is useless for removing numbers from my list of issued numbers. + // Rather, I need to load that original cheque, or pending transfer, from WITHIN the original item, + // in order to get THAT number, to remove it from my issued list. + // + if (OTItem::depositCheque == pOriginalItem->GetType()) // I am accepting a CHEQUE RECEIPT, which has a depositCheque (from the recipient) as the original item within. + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pOriginalItem->GetAttachment(strCheque); + + OTCheque theCheque; // allocated on the stack :-) + + if (false == ((strCheque.GetLength() > 2) && + theCheque.LoadContractFromString(strCheque))) + { + OTLog::vError("ERROR loading cheque from string in OTClient::ProcessServerReply:\n%s\n", + strCheque.Get()); + } + else // Since I wrote the cheque, and I am now accepting the cheque receipt, I can now be cleared + // for that issued number. (Because the server reply said SUCCESS accepting the chequeReceipt.) + { + pNym->RemoveIssuedNum(*pNym, strServerID, theCheque.GetTransactionNum(), true); // bool bSave=true + } + } + //-------------- + // I am accepting a TRANSFER RECEIPT, which has an acceptPending inside FROM THE RECIPIENT, + // as the original item within, (which is in reference to my outoing original transfer.) + else if (OTItem::acceptPending == pOriginalItem->GetType()) + { + pNym->RemoveIssuedNum(*pNym, strServerID, pOriginalItem->GetReferenceToNum(), true); // bool bSave=true + } + else + { + OTString strOriginalItemType; + pOriginalItem->GetTypeString(strOriginalItemType); + OTLog::vError("OTClient::ProcessServerReply: Original item has wrong type, while accepting item receipt:\n%s\n", + strOriginalItemType.Get()); + } + } + else + { + OTLog::vError("OTClient::ProcessServerReply: Unable to load original item from string while accepting item receipt:\n%s\n", + strOriginalItem.Get()); + } + } // OTItem::atAcceptItemReceipt. + + break; + + // ------------------------------------------------------------------------------------- + + // Cron Receipt: We do not remove the original trans# until the Cron job is entirely + // complete. (Many Cron receipts may breeze through here before that happens.) + // + case OTItem::atAcceptCronReceipt: + { + // ------------------------------------------------------------------------------------ + // If it's a CRON receipt, find out if it's from a MARKET TRADE, and if so, + // add it to my local list of Market Trades, for the GUI to use on the market panel. + // + OTItem * pServerItem = pServerTransaction->GetItem(OTItem::marketReceipt); // paymentPlan is also POSSIBLE here. + + if (NULL != pServerItem) + { + OTString strOffer, strTrade; + pServerItem->GetAttachment(strOffer); // contains updated offer. + pServerItem->GetNote(strTrade); // contains updated trade. + + OTOffer theOffer; + OTTrade theTrade; + + bool bLoadOfferFromString = theOffer.LoadContractFromString(strOffer); + bool bLoadTradeFromString = theTrade.LoadContractFromString(strTrade); + + // -------------------------------------------------- + + if (bLoadOfferFromString && bLoadTradeFromString) + { + OTDB::TradeDataNym * pData = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_TRADE_DATA_NYM)); + OT_ASSERT(NULL != pData); + OTCleanup theDataAngel(*pData); + + /* + std::stringstream ss; + ss << theTrade.GetTransactionNum(); + pData->transaction_id = ss.str(); ss.str(""); */ + + pData->transaction_id = to_string(theTrade.GetTransactionNum()); + pData->completed_count = to_string(theTrade.GetCompletedCount()); + + const long & lPriceLimit = theOffer.GetPriceLimit(); + const long & lFinishedSoFar = theOffer.GetFinishedSoFar(); + + pData->price = to_string(lPriceLimit); // This isn't what it actually sold for -- it just shows the price limit on this offer. (I don't have better data, yet.) + pData->amount_sold = to_string(lFinishedSoFar); // This isn't the amount sold on this trade -- instead it shows the total amount finished for the overall offer. + + // -------------------------------------------------- + // save to local storage... + // + OTString strUserID(USER_ID); + + OTDB::TradeListNym * pList = dynamic_cast(OTDB::QueryObject(OTDB::STORED_OBJ_TRADE_LIST_NYM, + OTLog::NymFolder(), + "trades", // todo stop hardcoding. + strServerID.Get(), + strUserID.Get())); + if (NULL == pList) + { + OTLog::vOutput(2, "Creating storage list of trade receipts for Nym: %s\n", strUserID.Get()); + pList = dynamic_cast + (OTDB::CreateObject(OTDB::STORED_OBJ_TRADE_LIST_NYM)); + } + + OT_ASSERT(NULL != pList); + + OTCleanup theListAngel(*pList); + + if ((false == pList->AddTradeDataNym(*pData)) || + (false == OTDB::StoreObject(*pList, + OTLog::NymFolder(), + "trades", // todo stop hardcoding. + strServerID.Get(), + strUserID.Get()))) + OTLog::vError("OTClient::ProcessServerReply: Failed adding trade data for nym, " + "or storing list of trades.\n Server ID: %s \n Nym ID: %s \n", + strServerID.Get(), strUserID.Get()); + } + } + //else + // OTLog::Error("OTClient::ProcessServerReply: " + // "Expected marketReceipt item in transaction in inbox."); + } // OTItem::atAcceptCronReceipt + + break; + + // ------------------------------------------------------------------------------------ + + case OTItem::atAcceptFinalReceipt: + { + OTLog::vOutput(1, "OTClient::ProcessServerReply: Successfully removed finalReceipt with closing num: %ld\n", + pServerTransaction->GetClosingNum()); + pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetClosingNum(), true); // bool bSave=true + + // ----------------- + // This should have already been done by this point, but I'm putting it here just in case, + // while debugging: + // + if (pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pServerTransaction->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pServerTransaction->GetReferenceToNum()); + + } // OTItem::atAcceptFinalReceipt + + break; + + + // ------------------------------------------------------------------------------------ + + case OTItem::atAcceptBasketReceipt: + { + OTLog::vOutput(2, "OTClient::ProcessServerReply: Successfully removed basketReceipt with closing num: %ld\n", + pServerTransaction->GetClosingNum()); + pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetClosingNum(), true); // bool bSave=true + } // OTItem::atAcceptBasketReceipt + + break; + + // --------------------------------------------------------------- + + default: + { + // Error + pReplyItem->GetTypeString(strTempTypeString); + OTLog::vError("OTClient::ProcessServerReply: wrong reply item transaction type: %s\n", + strTempTypeString.Get()); + } + break; + } // switch replyItem type + + // This happens for ALL of the above cases. + // + theInbox.RemoveTransaction(pServerTransaction->GetTransactionNum()); + + } // for loop (reply items) + // --------------------------------------- + // Remove from Inbox + // + theInbox.ReleaseSignatures(); + theInbox.SignContract(*pNym); + theInbox.SaveContract(); + theInbox.SaveInbox(); + } // if pReplyTransaction + } // if pTransaction + + } + // ********************************************************************************* + // + else // process Nymbox. // We're processing the SERVER's REPLY to our processNymbox request. + { + pTransaction = theLedger.GetTransaction(OTTransaction::processNymbox); + pReplyTransaction = theReplyLedger.GetTransaction(OTTransaction::atProcessNymbox); + + // We did NOT have to burn a transaction number to process the Nymbox, so we don't + // have to remove it from the list of responsibility, like we do above. + // The reason is because the Nymbox cannot be used for financial transactions, since + // it is associated with a user acct (instead of asset account.) + // THIS IS ACTUALLY the WHOLE POINT of the Nymbox: If it required a transaction number + // to process the Nymbox, and you use the Nymbox to get transaction numbers, then how + // can you ever get a new number if you run out? You need a number to get a number? + // + // That makes no logical sense. Therefore, the Nymbox provides a way to get new transaction + // numbers WITHOUT HAVING TO BURN ONE TO DO IT. You still have to do a transaction statement + // to do it (sign off on the ones that you actually do have), but you can still process + // the Nymbox even if you have zero transaction numbers, whereas with the inbox for an asset + // account, you cannot process it until you burn a transaction number to do so. And if you + // don't have any transaction numbers to do that with, that's fine: you just get a new one + // via your nymbox. This is the original reason that I added nymboxes in the first place. + // + // SIMILARLY, when a transaction number is REMOVED from our list via the Nymbox, it's only + // a NOTIFICATION. The Nymbox cannot actually REMOVE your transaction numbers, but it CAN + // be used to drop a notice informing you that one was removed. (Usually by a recurring + // transaction, such as a market offer, where you had already provided the closing number in + // advance, and you expected that it could be closed at anytime.) + // + // ------------------------------------------------------------------ + // + if ((NULL != pTransaction) && (NULL != pReplyTransaction)) + { + // HARVEST TRANSACTION NUMBERS (Nymbox only) + // + OTItem * pStatementItem = pTransaction->GetItem(OTItem::transactionStatement); + + // We found it! + if (NULL == pStatementItem) + { + OTLog::vOutput(0, "Strange... found transaction in ledger in %s, but didn't find a transactionStatement item within.\n", + theReply.m_strCommand.Get()); + } + else if (!pReplyTransaction->GetSuccess()) + { + OTLog::vOutput(0, "Found the receipt you're talking about, in ledger in %s, but the Server's Reply transaction says FAILED.\n", + theReply.m_strCommand.Get()); + } + else + { + OTString strMessageNym; + OTPseudonym theMessageNym; + + pStatementItem->GetAttachment(strMessageNym); + + if (strMessageNym.Exists() && theMessageNym.LoadFromString(strMessageNym)) + { + // Success! + // Whatever Trans#'s I accepted when I processed my nymbox, I now + // harvest them onto my Nym for use. (Couldn't be sure until server replied "success".) + // + // Contrast this with the numbers removed. In the case of Nymbox, I cannot + // remove numbers, only receive notice that a number was already removed. + // Therefore, I might as well remove it on my side also, as soon as I see that + // notice (and approve of it.) There's no need juggling it in that case -- it's + // already gone. (Therefore it's already been done by the time we're in this + // function reading the server's reply. Removals for Nymbox happen in Finalize for + // processNymbox, and in AcceptEntireNymbox.) + // Below however, are additions, not removals, so we don't add them until the + // server has DEFINITELY responded in the affirmative (here): + // + pNym->HarvestIssuedNumbers(pStatementItem->GetPurportedServerID(), + *pNym, theMessageNym, true); // bSave=true + } + else + { + OTLog::vOutput(0, "Strange... found transaction item in ledger in %s, but didn't find theMessageNym within.\n", + theReply.m_strCommand.Get()); + } + } + + // ******************************************************************************* + // + // REMOVE VARIOUS ITEMS FROM THE LOCAL NYMBOX (THEIR TIME IS DONE.) + + // Load the Nymbox. + OTLedger theNymbox(USER_ID, USER_ID, SERVER_ID); + + // I JUST had this loaded if I sent acceptWhatever just instants ago, (which I am now processing the reply for.) + // Therefore I'm just ASSUMING here that it loads successfully here, since it worked an instant ago. Todo. + OT_ASSERT_MSG(theNymbox.LoadNymbox(), "Was trying to load Nymbox."); + + // ------------------------------------- + // Next, loop through the reply items for each "process nymbox" item that I must have previously sent. + // For each, if successful, remove from inbox. + // For item receipts, if successful, also remove the appropriate trans# + // from my issued list of transaction numbers (like above.) + + for (listOfItems::iterator ii = pReplyTransaction->GetItemList().begin(); + ii != pReplyTransaction->GetItemList().end(); ++ii) + { + OTItem * pReplyItem = *ii; + + OT_ASSERT_MSG(NULL != pReplyItem, "OTClient::ProcessServerReply: Pointer should not have been NULL."); + + OTItem::itemType theItemType = OTItem::error_state; + + switch (pReplyItem->GetType()) + { + case OTItem::atAcceptFinalReceipt: // for inbox this is a closing issued number being removed from your list. + theItemType = OTItem::acceptFinalReceipt;// but for Nymbox, this is only a notification that it already happened previously. + break; + case OTItem::atAcceptMessage: + theItemType = OTItem::acceptMessage; + break; + case OTItem::atAcceptTransaction: + theItemType = OTItem::acceptTransaction; + break; + // ------------------------ + + // FYI, on server side, it does not bother to process an item, + // if the balance statement or transaction statement has not succeeded. + // + // Thus, if the ITEM ITSELF has succeeded, that means the balance or + // transaction statement MUST have succeeded! Because server wouldn't have + // even bothered to process the item otherwise. + // + // There still might be some future application in doing something with these + // statements when they come in. + + // ----------------------------------------------------- + + case OTItem::atTransactionStatement: + theItemType = OTItem::transactionStatement; // We just continue; when this happens, and skip this one. + continue; // The transaction statement itself is already handled before this for loop. + + default: + { + OTString strTempTypeString; + pReplyItem->GetTypeString(strTempTypeString); + OTLog::vError("Unexpected replyItem:type while processing Nymbox: %s \n", + strTempTypeString.Get()); + continue; + } + } // SWITCH + + // ------------------------------------------------------------------------------------ + + + // The below actions are only necessary if pReplyItem was a SUCCESS. + // (Otherwise we skip them...) + // + OTString strTempTypeString; + pReplyItem->GetTypeString(strTempTypeString); + + if (OTItem::acknowledgement != pReplyItem->GetStatus()) + { + OTLog::vOutput(1, "@processNymbox reply item %s: status == FAILED\n", strTempTypeString.Get()); + continue; + } + // else + OTLog::vOutput(1, "@processNymbox reply item %s: status == SUCCESS\n", strTempTypeString.Get()); + + // ------------------------------------------------------------------------------------ + + // + // pReplyItem->GetReferenceToNum() contains the process transaction# of pItem (0, in + // a transaction statement, since it usually has no transaction number of its own), not + // the inbox receipt # that pItem is in reference to. + // + // pTransaction is the processNymbox transaction request that I sent. + // (The items within it all share its same transaction number, but they are IN REFERENCE TO + // the Nymbox receipts that they accept/reject.) + // pReplyTransaction is the server's reply to that. + // pReplyItem is the current item when iterating through pReplyTransaction. + // pItem is the corresponding REQUEST item from pTransaction, that pReplyItem is responding to. + // + // Therefore: I need to load the original item from pReplyItem's reference string (it's bundled in there). + // THEN I will get the "in reference to" number from THAT (which is the nymbox Receipt #). + // THEN I will use that number to look up the SAME original item from pTransaction. + // The last step isn't technically necessary, but may be useful for security. + // + // Sheesh! + + OTString strProcessNymboxItem; + pReplyItem->GetReferenceString(strProcessNymboxItem); + + OTItem * pProcessNymboxItem = OTItem::CreateItemFromString(strProcessNymboxItem, + SERVER_ID, + 0 /* 0 is the "transaction number"*/); // todo stop hardcoding. + + OTCleanup theProcessNymboxItemGuardian(pProcessNymboxItem); // So I don't have to clean it up later. No memory leaks. + + // pProcessNymboxItem is already a copy of the correct processNymbox item that I need. + // But still, it's a copy that the SERVER sent me. So I'm going to use it to get the + // reference number that I need, in order to look up MY copy of the item. + // + OTItem * pItem = + (pProcessNymboxItem != NULL) ? pTransaction->GetItemInRefTo(pProcessNymboxItem->GetReferenceToNum()) : NULL; + + if (NULL == pItem) + { + OTLog::Error("Unable to find original item in original processNymbox transaction request, based on reply item.\n"); + continue; + } + + // If this happens, it means the item we found in our original process Nymbox transaction, which matched the + // "in reference to" number that we expected from the copy of that original item we loaded from within the + // pReplyItem that's supposedly responding to it, does not have the same TYPE that we would have expected it to + // have, based on the intelligence in the above switch statement. + // + if (pItem->GetType() != theItemType) + { // (Possible types for pItem: acceptMessage, acceptTransactions, acceptFinalReceipt.) + OTLog::Error("Wrong original item TYPE, on reply item's copy of original item, than what was expected based on reply item's type.\n"); + continue; + } + + // Todo here: any other verification of pItem against pProcessNymboxItem, which are supposedly copies of the same item. + + // FYI, pItem->GetReferenceToNum() is the ID of the receipt that's in the Nymbox. + // + // ------------------------------------------------------------------------------------ + + OTTransaction * pServerTransaction = NULL; + + OTLog::vOutput(1, "Checking client-side Nymbox for expected Nymbox item: %ld... \n", + pItem->GetReferenceToNum()); // temp remove + + switch (pReplyItem->GetType()) { + case OTItem::atAcceptMessage: + case OTItem::atAcceptTransaction: + case OTItem::atAcceptFinalReceipt: + pServerTransaction = theNymbox.GetTransaction(pItem->GetReferenceToNum()); + break; + + default: + { + OTString strTempTypeString; + pReplyItem->GetTypeString(strTempTypeString); + OTLog::vError("Unexpected replyItem:type while processing Nymbox: %s \n", + strTempTypeString.Get()); + break; + } + } + + if (NULL == pServerTransaction) + { + OTLog::Error("Unable to find the server's receipt, in my Nymbox, that my original processNymbox's item was referring to.\n"); + continue; + } + + // ------------------------------------------------------------------------------------ + + // All of these need to remove something from the client-side Nymbox. (Which happens below this switch.) + // + switch (pReplyItem->GetType()) + { // Some also need to remove an issued transaction number from pNym. + case OTItem::atAcceptMessage: + case OTItem::atAcceptTransaction: + break; + // I don't think we need to do anything here... + + case OTItem::atAcceptFinalReceipt: + OTLog::vOutput(2, "OTClient::ProcessServerReply: Successfully removed finalReceipt " + "from Nymbox with opening num: %ld\n", + pServerTransaction->GetReferenceToNum()); + + if (pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pServerTransaction->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pServerTransaction->GetReferenceToNum()); + + // BUG: RemoveIssuedNum shouldn't be here. In Nymbox, finalReceipt is only a notice, and I shoulda + // removed the number the instant that I saw it. (Back when processing the Nymbox, before even + // calculating the request.) Therefore, this is moved to AcceptEntireNymbox and Finalize for Process Inbox. + // +// pNym->RemoveIssuedNum(*pNym, strServerID, pServerTransaction->GetReferenceToNum(), true); // bool bSave=true + break; + + default: + { + OTString strTempTypeString; + pReplyItem->GetTypeString(strTempTypeString); + OTLog::vError("Unexpected replyItem:type while processing Nymbox: %s \n", + strTempTypeString.Get()); + continue; + } + } // switch replyItem type + + // Remove from theNymbox + // This happens for ALL of the above cases. + // + theNymbox.RemoveTransaction(pServerTransaction->GetTransactionNum()); + } // for loop (reply items) + + // --------------------------------------- + + // All done? Let's save up... + // + theNymbox.ReleaseSignatures(); + theNymbox.SignContract(*pNym); + theNymbox.SaveContract(); + theNymbox.SaveNymbox(); + } // pTransaction and pReplyTransaction are both NOT NULL. + // ------------------------------------------------------------------ + } + + // ******************************************************************************* + // + // The below happens BOTH for Inbox AND Nymbox. + + if ((NULL != pTransaction) && (NULL != pReplyTransaction)) + { + // ----------------------------------------------------------------- + // + // SAVE THE RECEIPT.... + + OTString strServerID(SERVER_ID); + + OTString strReceiptID("NOT_SET_YET"); + + OTItem * pReplyItem = pReplyTransaction->GetItem(OTItem::atBalanceStatement); + + if (NULL == pReplyItem) + { + pReplyItem = pReplyTransaction->GetItem(OTItem::atTransactionStatement); + + if (NULL != pReplyItem) + pNym->GetIdentifier(strReceiptID); // In this case, the receipt ID is the Nym ID + } + else + { + strReceiptID = theReply.m_strAcctID; // If a balance statement, then the receipt ID is the Account ID. + } + + // --------------------------------------------------------- + + OTString strReceiptFilename; + + if (NULL != pReplyItem) + { + if (pReplyTransaction->GetSuccess()) + strReceiptFilename.Format("%s.success", strReceiptID.Get()); + else + strReceiptFilename.Format("%s.fail", strReceiptID.Get()); + + OTString strTransaction; + pReplyTransaction->SaveContract(strTransaction); // <=========== Save that receipt! + + OTDB::StorePlainString(strTransaction.Get(), OTLog::ReceiptFolder(), + strServerID.Get(), strReceiptFilename.Get()); + + // ------------------------------------------------- + + // If this was a successful processInbox, then I go ahead and getAccount again, since it's probably changed. + // Careful in case this might infinite loop :P + +#if defined (TEST_CLIENT) + if ((OTItem::acknowledgement == pReplyItem->GetStatus()) && + (theReply.m_strCommand.Compare("@processInbox"))) + { + OTMessage theMessage; + OTAccount * pAccount = NULL; + + if ( (NULL != (pAccount = m_pWallet->GetAccount(ACCOUNT_ID))) && + ProcessUserCommand(OTClient::getAccount, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getAccount command in OTClient::ProcessServerReply\n"); + } +#endif + } + else // This should never happen... + { + strReceiptFilename.Format("%s.error", strReceiptID.Get()); + + OTLog::vError("OTClient::ProcessServerReply: Error saving transaction receipt: %s%s%s\n", + strServerID.Get(), OTLog::PathSeparator(), strReceiptFilename.Get()); + + OTString strTransaction; + pReplyTransaction->SaveContract(strTransaction); // <=========== Save that receipt! + + OTDB::StorePlainString(strTransaction.Get(), OTLog::ReceiptFolder(), + strServerID.Get(), strReceiptFilename.Get()); + } + } + else + { + OTLog::vOutput(0, "Strange... found ledger in %s, but didn't find the right transaction type within.\n", + theReply.m_strCommand.Get()); + } + } + else + { + OTLog::vOutput(0, "Strange... received server acknowledgment to %s, but found no ledger within.\n", + theReply.m_strCommand.Get()); + } + } + else + { + OTLog::Output(0, "Strange... received server acknowledgment but 'in reference to' message was blank.\n"); + } + + return true; + } + + + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getInbox")) + { + const OTString strServerID(SERVER_ID); + OTString strReply(theReply); + + OTLog::Output(0, "Received server response to Get Inbox message.\n"); +// OTLog::vOutput(0, "Received server response to Get Inbox message:\n%s\n", strReply.Get()); + + // base64-Decode the server reply's payload into strInbox + OTString strInbox(theReply.m_ascPayload); + +// OTLog::vError("INBOX CONTENTS:\n%s\n", strInbox.Get()); + + // Load the ledger object from that string. + OTLedger theInbox(USER_ID, ACCOUNT_ID, SERVER_ID); + + + // TEMP DEBUG + +// OTString strTemp1(USER_ID); +// OTString strTemp2(ACCOUNT_ID); +// OTString strTemp3(SERVER_ID); +// +// OTLog::vError("@getInbox: USER: %s ACCT: %s SERVER: %s \n", strTemp1.Get(), strTemp2.Get(), strTemp3.Get()); + + // I receive the inbox, verify the server's signature, then RE-SIGN IT WITH MY OWN + // SIGNATURE, then SAVE it to local storage. So any FUTURE checks of this inbox + // would require MY signature, not the server's, to verify. But in this one spot, + // just before saving, I need to verify the server's first. + // UPDATE: Keeping the server's signature, and just adding my own. + if (theInbox.LoadContractFromString(strInbox) && theInbox.VerifyAccount(*pServerNym)) + { + // If I have Transaction #35 signed out, and I use it to start a market offer (or any other cron item) + // then it's always possible that a finalReceipt will pop into my Inbox while I'm asleep, closing + // that transaction #. The server officially believes 35 is closed. Unfortunately, I still have it signed + // out, on my side anyway, because I didn't know the finalReceipt came in. + // + // THEREFORE, WHEN A FINAL RECEIPT COMES IN, I NEED TO REMOVE ITS "in reference to" NUMBER FROM MY + // ISSUED LIST. Here is clearly the best place for that: + // + for (mapOfTransactions::iterator iiii = theInbox.GetTransactionMap().begin(); + iiii != theInbox.GetTransactionMap().end(); ++iiii) + { + OTTransaction * pTempTrans = (*iiii).second; + OT_ASSERT(NULL != pTempTrans); + + // TODO security: Keep a client-side list of issued #s for finalReceipts. That way, + // I'll be smart enough here not to actually remove just any number, unless it's actually + // on my list of final receipts. (The server does a similar thing already.) + // + if (OTTransaction::finalReceipt == pTempTrans->GetType()) + { + OTLog::vOutput(2, "*** Removing opening issued number (%ld), since finalReceipt found when getting asset account inbox. ***\n", + pTempTrans->GetReferenceToNum()); + + if (pNym->RemoveIssuedNum(*pNym, strServerID, pTempTrans->GetReferenceToNum(), true)) // bool bSave=true + OTLog::vOutput(1, "**** Due to finding a finalReceipt, REMOVING OPENING NUMBER FROM NYM: %ld \n", + pTempTrans->GetReferenceToNum()); + else + OTLog::vOutput(1, "**** Noticed a finalReceipt, but Opening Number %ld had ALREADY been removed from nym. \n", + pTempTrans->GetReferenceToNum()); + +// pNym->RemoveIssuedNum(*pNym, strServerID, pTempTrans->GetReferenceToNum(), true); // bSave = true; + + } // We also do this in AcceptEntireNymbox + } + + // ----------------------------------------------- + + theInbox.ReleaseSignatures(); // Now I'm keeping the server signature, and just adding my own. // This is back. Why? Because we have receipts functional now. + theInbox.SignContract(*pNym); + theInbox.SaveContract(); + theInbox.SaveInbox(); + + + // Obviously a real client will never do something as foolish as this below... + // (Accepting the entire inbox automatically--literally sending a signed message right + // back to the server accepting whatever was inside this ledger, without giving the user + // the opportunity to examine and reject those inbox items.) + // This could empty your account! But of course for testing, I want to get the inbox + // and process it at the same time, since I already know what all the transactions are + // supposed to be. + + if (OTTransaction::VerifyBalanceReceipt(*pServerNym, *pNym, + SERVER_ID, + ACCOUNT_ID)) + { +#if defined (TEST_CLIENT) + // New: In test client, get account results in get outbox, which results in get inbox. + // Normally getInbox then results in processInbox (involving a new balance agreement) + // therefore, we now VERIFY the newly-downloaded outbox, account, and inbox against + // the last signed receipt, before doing so!! The Nym is verified too, but it should + // stay in sync, as should the outbox (?). The account and inbox, however, may change on + // the server side, and need to be re-downloaded to client side. When that happens, + // we end up RIGHT HERE, so this is the best place to verify the last signed receipt(s) + // against those new files to make sure they pass muster. + // + AcceptEntireInbox(theInbox, theConnection); +#endif + OTLog::vOutput(0, "===> ** LAST SIGNED BALANCE RECEIPT *VERIFIED* against latest nym, account, outbox, and/or inbox!\n\n"); + } + else + { + OTLog::vOutput(0, "===> ** LAST SIGNED BALANCE RECEIPT *FAILED* against latest nym, account, outbox, and/or inbox.\n" + "(IF THE ACCOUNT IS NEW, i.e. it's never transacted before, then there IS NOT YET ANY RECEIPT, so this error is normal.)\n"); + +#if defined (TEST_CLIENT) + AcceptEntireInbox(theInbox, theConnection); +#endif + } + } + else + { + OTLog::vError("Error loading or verifying inbox:\n\n%s\n", strInbox.Get()); + } + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getOutbox")) + { + OTString strReply(theReply); + + OTLog::Output(0, "Received server response to Get Outbox message.\n"); + // OTLog::vOutput(0, "Received server response to Get Outbox message:\n%s\n", strReply.Get()); + + // base64-Decode the server reply's payload into strOutbox + OTString strOutbox(theReply.m_ascPayload); + + // OTLog::vError("OUTBOX CONTENTS:\n%s\n", strOutbox.Get()); + + // Load the ledger object from that string. + OTLedger theOutbox(USER_ID, ACCOUNT_ID, SERVER_ID); + + + // I receive the outbox, verify the server's signature, then RE-SIGN IT WITH MY OWN + // SIGNATURE, then SAVE it to local storage. So any FUTURE checks of this outbox + // would require MY signature, not the server's, to verify. But in this one spot, + // just before saving, I need to verify the server's first. + // UPDATE: keeping the server's signature, and just adding my own. + if (theOutbox.LoadContractFromString(strOutbox) && theOutbox.VerifyAccount(*pServerNym)) + { + theOutbox.ReleaseSignatures(); // UPDATE: keeping the server's signature, and just adding my own. + theOutbox.SignContract(*pNym); // ANOTHER UPDATE: Removing signature again, since we have receipts functional now. + theOutbox.SaveContract(); + theOutbox.SaveOutbox(); + +#if defined (TEST_CLIENT) + OTMessage theMessage; + OTAccount * pAccount = NULL; + + if ( (NULL != (pAccount = m_pWallet->GetAccount(ACCOUNT_ID))) && + ProcessUserCommand(OTClient::getInbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getInbox command in OTClient::ProcessServerReply\n"); +#endif + } + else + { + OTLog::vError("Error loading or verifying outbox:\n\n%s\n", strOutbox.Get()); + } + + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getContract")) + { + // base64-Decode the server reply's payload into strContract + OTString strContract(theReply.m_ascPayload); + + OTString strFoldername(OTLog::ContractFolder()); + OTString strFilename; // In this case the filename isn't actually used, since SaveToContractFolder will + // handle setting up the filename and overwrite it anyway. But I still prefer to set it + // up correctly, rather than pass a blank. I'm just funny like that. + strFilename = theReply.m_strAssetID.Get(); + + OTAssetContract * pContract = new OTAssetContract(theReply.m_strAssetID, strFoldername, + strFilename, theReply.m_strAssetID); + + OT_ASSERT(NULL != pContract); + + // Check the server signature on the contract here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. +// if (pContract->LoadContract() && pContract->VerifyContract()) + if (pContract->LoadContractFromString(strContract) && pContract->VerifyContract()) + { + // Next make sure the wallet has this contract on its list... + OTWallet * pWallet; + + if (pWallet = theConnection.GetWallet()) + { + pWallet->AddAssetContract(*pContract); + pContract = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pContract) + { + delete pContract; + pContract = NULL; + } + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getMint")) + { + // base64-Decode the server reply's payload into strMint + OTString strMint(theReply.m_ascPayload); + + // Load the mint object from that string... + OTMint theMint(theReply.m_strServerID, theReply.m_strAssetID); + + // TODO check the server signature on the mint here... + if (theMint.LoadContractFromString(strMint)) + { + OTLog::Output(0, "Saving mint file to disk...\n"); + theMint.SaveMint(); + } + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getMarketList")) + { + OTString strMarketDatafile; + strMarketDatafile.Format("%s", "market_data.bin"); + + // ---------------------------------------------------- + + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + // -------------------------------- + // The reply is a SUCCESS, and the COUNT is 0 (empty list was returned.) + // Since it was a success, but the list was empty, then we need to erase + // the data file. (So when the file is loaded from storage, it will correctly + // display an empty list on the screen, instead of a list of outdated items.) + // + if (theReply.m_lDepth == 0) + { + bool bSuccessErase = pStorage->EraseValueByKey(OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + strMarketDatafile.Get()); // "markets//market_data.bin" + if (!bSuccessErase) + OTLog::vError("Error erasing market list from market folder: %s \n", strMarketDatafile.Get()); + + return true; + } + + // -------------------------------- + + OTPayload thePayload; + + if ((theReply.m_ascPayload.GetLength() <= 2) || (false == theReply.m_ascPayload.GetData(thePayload))) + { + OTLog::Error("ProcessServerReply: unable to decode ascii-armored payload in @getMarketList reply.\n"); + return true; + } + + // ------------------------------------------------------------- + // Unpack the market list... + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // make sure buffer is deleted. + + pBuffer->SetData(static_cast(thePayload.GetPayloadPointer()), thePayload.GetSize()); + + // ----------------------------- + + OTDB::MarketList * pMarketList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_MARKET_LIST)); + OTCleanup theListAngel(*pMarketList); + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pMarketList); + + // ---------------------- + + if (false == bUnpacked) + { + OTLog::Error("Process Server Reply: Failed unpacking data for @getMarketList.\n"); + return true; + } + + // -------------------------------------------------------- + + + bool bSuccessStore = pStorage->StoreObject(*pMarketList, + OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + strMarketDatafile.Get()); // "markets//market_data.bin" + if (!bSuccessStore) + OTLog::vError("Error storing market list to market folder: %s \n", strMarketDatafile.Get()); + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getMarketOffers")) + { + const OTString & strMarketID = theReply.m_strNymID2; // market ID stored here. + + OTString strOfferDatafile; + strOfferDatafile.Format("%s.bin", strMarketID.Get()); + + // --------------------------------------- + + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + // -------------------------------- + // The reply is a SUCCESS, and the COUNT is 0 (empty list was returned.) + // Since it was a success, but the list was empty, then we need to erase + // the data file. (So when the file is loaded from storage, it will correctly + // display an empty list on the screen, instead of a list of outdated items.) + // + if (theReply.m_lDepth == 0) + { + bool bSuccessErase = pStorage->EraseValueByKey(OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + "offers", // "markets//offers" // todo stop hardcoding. + strOfferDatafile.Get()); // "markets//offers/.bin" + if (!bSuccessErase) + OTLog::vError("Error erasing offers list from market folder: %s \n", strOfferDatafile.Get()); + + return true; + } + + // -------------------------------- + + OTPayload thePayload; + + if ((theReply.m_ascPayload.GetLength() <= 2) || (false == theReply.m_ascPayload.GetData(thePayload))) + { + OTLog::Error("ProcessServerReply: unable to decode ascii-armored payload in @getMarketOffers reply.\n"); + return true; + } + + // ------------------------------------------------------------- + // Unpack the market list... + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // make sure buffer is deleted. + + pBuffer->SetData(static_cast(thePayload.GetPayloadPointer()), thePayload.GetSize()); + + // ----------------------------- + + OTDB::OfferListMarket * pOfferList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_OFFER_LIST_MARKET)); + OTCleanup theListAngel(*pOfferList); + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pOfferList); + + // -------------------------------------------------------- + + if (false == bUnpacked) + { + OTLog::Error("Failed unpacking data for process server reply, @getMarketOffers.\n"); + return true; + } + + // -------------------------------------------------------- + + bool bSuccessStore = pStorage->StoreObject(*pOfferList, + OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + "offers", // "markets//offers" // todo stop hardcoding. + strOfferDatafile.Get()); // "markets//offers/.bin" + if (!bSuccessStore) + OTLog::vError("Error storing %s to market folder.\n", strOfferDatafile.Get()); + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getMarketRecentTrades")) + { + const OTString & strMarketID = theReply.m_strNymID2; // market ID stored here. + + OTString strTradeDatafile; + strTradeDatafile.Format("%s.bin", strMarketID.Get()); + + // ------------------------------------------------------------- + + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + // -------------------------------- + // The reply is a SUCCESS, and the COUNT is 0 (empty list was returned.) + // Since it was a success, but the list was empty, then we need to erase + // the data file. (So when the file is loaded from storage, it will correctly + // display an empty list on the screen, instead of a list of outdated items.) + // + if (theReply.m_lDepth == 0) + { + bool bSuccessErase = pStorage->EraseValueByKey(OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + "recent", // "markets//recent" // todo stop hardcoding. + strTradeDatafile.Get()); // "markets//recent/.bin" + if (!bSuccessErase) + OTLog::vError("Error erasing recent trades list from market folder: %s \n", strTradeDatafile.Get()); + + return true; + } + + // -------------------------------- + + OTPayload thePayload; + + if ((theReply.m_ascPayload.GetLength() <= 2) || (false == theReply.m_ascPayload.GetData(thePayload))) + { + OTLog::Error("ProcessServerReply: unable to decode ascii-armored payload in @getMarketRecentTrades reply.\n"); + return true; + } + + // ------------------------------------------------------------- + // Unpack the market list... + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // make sure buffer is deleted. + + pBuffer->SetData(static_cast(thePayload.GetPayloadPointer()), thePayload.GetSize()); + + // ----------------------------- + + OTDB::TradeListMarket * pTradeList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_TRADE_LIST_MARKET)); + OTCleanup theListAngel(*pTradeList); + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pTradeList); + + // -------------------------------------------------------- + + if (false == bUnpacked) + { + OTLog::Error("Failed unpacking data for process server reply, @getMarketRecentTrades.\n"); + return true; + } + + // -------------------------------------------------------- + + bool bSuccessStore = pStorage->StoreObject(*pTradeList, + OTLog::MarketFolder(), // "markets" + theReply.m_strServerID.Get(), // "markets/" + "recent", // "markets//recent" // todo stop hardcoding. + strTradeDatafile.Get()); // "markets//recent/.bin" + if (!bSuccessStore) + OTLog::vError("Error storing %s to market folder.\n", strTradeDatafile.Get()); + + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getNym_MarketOffers")) + { + OTString strOfferDatafile; + strOfferDatafile.Format("%s.bin", theReply.m_strNymID.Get()); + + // ------------------------------------------------------------- + + OTDB::Storage * pStorage = OTDB::GetDefaultStorage(); + OT_ASSERT(NULL != pStorage); + + // -------------------------------- + // The reply is a SUCCESS, and the COUNT is 0 (empty list was returned.) + // Since it was a success, but the list was empty, then we need to erase + // the data file. (So when the file is loaded from storage, it will correctly + // display an empty list on the screen, instead of a list of outdated items.) + // + if (theReply.m_lDepth == 0) + { + bool bSuccessErase = pStorage->EraseValueByKey(OTLog::NymFolder(), // "nyms" + theReply.m_strServerID.Get(), // "nyms/" + "offers", // "nyms//offers" // todo stop hardcoding. + strOfferDatafile.Get()); // "nyms//offers/.bin" + if (!bSuccessErase) + OTLog::vError("Error erasing offers list from nyms folder: %s \n", strOfferDatafile.Get()); + + return true; + } + + // -------------------------------- + + OTPayload thePayload; + + if ((theReply.m_ascPayload.GetLength() <= 2) || (false == theReply.m_ascPayload.GetData(thePayload))) + { + OTLog::Error("ProcessServerReply: unable to decode ascii-armored payload in @getNym_MarketOffers reply.\n"); + return true; + } + + // ------------------------------------------------------------- + // Unpack the nym's offer list... + + OTDB::OTPacker * pPacker = pStorage->GetPacker(); // No need to check for failure, since this already ASSERTS. No need to cleanup either. + + // ----------------------------- + + OTDB::PackedBuffer * pBuffer = pPacker->CreateBuffer(); // Need to clean this up. + OT_ASSERT(NULL != pBuffer); + OTCleanup theBufferAngel(*pBuffer); // make sure buffer is deleted. + + pBuffer->SetData(static_cast(thePayload.GetPayloadPointer()), thePayload.GetSize()); + + // ----------------------------- + + OTDB::OfferListNym * pOfferList = dynamic_cast(OTDB::CreateObject(OTDB::STORED_OBJ_OFFER_LIST_NYM)); + OTCleanup theListAngel(*pOfferList); + + bool bUnpacked = pPacker->Unpack(*pBuffer, *pOfferList); + + // -------------------------------------------------------- + + if (false == bUnpacked) + { + OTLog::Error("Failed unpacking data for process server reply, @getNym_MarketOffers.\n"); + return true; + } + + // -------------------------------------------------------- + + bool bSuccessStore = pStorage->StoreObject(*pOfferList, + OTLog::NymFolder(), // "nyms" + theReply.m_strServerID.Get(), // "nyms/" + "offers", // "nyms//offers" // todo stop hardcoding. + strOfferDatafile.Get()); // "nyms//offers/.bin" + if (!bSuccessStore) + OTLog::vError("Error storing %s to nyms folder.\n", strOfferDatafile.Get()); + + return true; + } + + // ---------------------------------------------------------------------------------- + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@deleteUserAccount")) + { + OTString strOriginalMessage; + if (theReply.m_ascInReferenceTo.Exists()) + theReply.m_ascInReferenceTo.GetString(strOriginalMessage); + + OTMessage theOriginalMessage; + + const OTString strServerID(SERVER_ID); + + if (strOriginalMessage.Exists() && + theOriginalMessage.LoadContractFromString(strOriginalMessage) && + theOriginalMessage.VerifySignature(*pNym) && + theOriginalMessage.m_strNymID.Compare(theReply.m_strNymID) && + theOriginalMessage.m_strCommand.Compare("deleteUserAccount") + ) + { + // O-kayy!! + + // ------------------------------------------------ + while (pNym->GetTransactionNumCount(SERVER_ID) > 0) + { + long lTemp = pNym->GetTransactionNum(SERVER_ID, 0); // index 0 + pNym->RemoveTransactionNum(strServerID, lTemp); // doesn't save. + } + // ------------------------------------------------ + while (pNym->GetIssuedNumCount(SERVER_ID) > 0) + { + long lTemp = pNym->GetIssuedNum(SERVER_ID, 0); // index 0 + pNym->RemoveIssuedNum(strServerID, lTemp); // doesn't save. + } + // ------------------------------------------------ + pNym->UnRegisterAtServer(strServerID); // Remove request number for that server. + // ------------------------------------------------ + + // SAVE the updated Nym to local storage. + // + OTPseudonym & extraNym = *pNym; + pNym->SaveSignedNymfile(extraNym); + + OTLog::vOutput(0, "Successfully DELETED Nym from Server: removed request number, plus all issued and transaction numbers " + "for Nym %s for Server %s.\n", theReply.m_strNymID.Get(), strServerID.Get()); + } + else + OTLog::vError("The server just for some reason tried to trick me into erasing my issued " + "and transaction numbers for Nym %s, Server %s.\n", theReply.m_strNymID.Get(), strServerID.Get()); + + return true; + } + // ---------------------------------------------------------------------------------- + + // ---------------------------------------------------------------------------------- + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@deleteAssetAccount")) + { + OTString strOriginalMessage; + if (theReply.m_ascInReferenceTo.Exists()) + theReply.m_ascInReferenceTo.GetString(strOriginalMessage); + + OTMessage theOriginalMessage; + + const OTString strServerID(SERVER_ID); + + if (strOriginalMessage.Exists() && + theOriginalMessage.LoadContractFromString(strOriginalMessage) && + theOriginalMessage.VerifySignature(*pNym) && + theOriginalMessage.m_strNymID.Compare(theReply.m_strNymID) && + theOriginalMessage.m_strAcctID.Compare(theReply.m_strAcctID) && + theOriginalMessage.m_strCommand.Compare("deleteAssetAccount") + ) + { + // O-kayy!! + + const OTIdentifier theAccountID(theReply.m_strAcctID); + + OTAccount * pDeletedAcct = m_pWallet->GetAccount(theAccountID); + + if (NULL != pDeletedAcct) + { + pDeletedAcct->MarkForDeletion(); + // --------------------------------- + pDeletedAcct->ReleaseSignatures(); + pDeletedAcct->SignContract(*pNym); + pDeletedAcct->SaveContract(); + pDeletedAcct->SaveAccount(); + // (The account still exists in storage, but has been MARKED FOR DELETION.) + + // --------------------------------- + // Remove the account from the wallet: + // + if (m_pWallet->RemoveAccount(theAccountID)) + { + m_pWallet->SaveWallet(); + } + // --------------------------------- + } + + OTLog::vOutput(0, "Successfully DELETED Asset Acct %s from Server: %s.\n", + theReply.m_strAcctID.Get(), strServerID.Get()); + } + else + OTLog::vError("The server just for some reason tried to trick me into erasing my account %s on Server %s.\n", + theReply.m_strAcctID.Get(), strServerID.Get()); + + return true; + } + // ---------------------------------------------------------------------------------- + + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@issueAssetType")) + { + if (theReply.m_ascPayload.GetLength()) + { + OTAccount * pAccount = NULL; + + // this decodes the ascii-armor payload where the new account file + // is stored, and returns a normal string in strAcctContents. + OTString strAcctContents(theReply.m_ascPayload); + + // TODO check return value + pAccount = new OTAccount(USER_ID, ACCOUNT_ID, SERVER_ID); + + if (pAccount->LoadContractFromString(strAcctContents) && pAccount->VerifyAccount(*pServerNym)) + { + // (2) Sign the Account + pAccount->SignContract(*pNym); + pAccount->SaveContract(); + + // (3) Save the Account to file + pAccount->SaveAccount(); + + // Need to consider other security considerations. + // What if I wasn't EXPECTING a @issueAssetType message? + // Well actually, in that case, the server wouldn't have a + // copy of my request to send back to me, would he? So I should + // check that request to make sure it's good. + // Also maybe should check to see if I was expecting this message + // in the first place. + + m_pWallet->AddAccount(*pAccount); + m_pWallet->SaveWallet(); + +#if defined (TEST_CLIENT) + OTMessage theMessage; + + if (ProcessUserCommand(OTClient::getOutbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getOutbox command in OTClient::ProcessServerReply @issueAssetType\n"); +#endif + + + return true; + } + else + { + delete pAccount; + pAccount = NULL; + } + + } + } + + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@getAccount")) + { + // base64-Decode the server reply's payload into strAccount + OTString strAccount(theReply.m_ascPayload); + +// OTLog::vError( "ACCOUNT CONTENTS:\n%s\n", strAccount.Get()); + + // Load the account object from that string. + OTAccount * pAccount = new OTAccount(USER_ID, ACCOUNT_ID, SERVER_ID); + + // TODO check the server signature on the account here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. + if (pAccount && pAccount->LoadContractFromString(strAccount) && pAccount->VerifyAccount(*pServerNym)) + { + OTLog::Output(0, "Saving updated account file to disk...\n"); + pAccount->ReleaseSignatures(); // So I don't get the annoying failure to verify message from the server's signature. + // Will eventually end up keeping the signature, however, just for reasons of proof. + // UPDATE (above) I now release signatures again since we have receipts functional. As long as receipt has server's signature, it can prove the others. + pAccount->SignContract(*pNym); + pAccount->SaveContract(); + pAccount->SaveAccount(); + + // Next let's make sure the wallet's copy of this account is replaced with the new one... + OTWallet * pWallet; + + if (pWallet = theConnection.GetWallet()) + { + pWallet->AddAccount(*pAccount); + pWallet->SaveWallet(); + + // -------------------------------------------------- + +#if defined (TEST_CLIENT) + OTMessage theMessage; + + if (ProcessUserCommand(OTClient::getOutbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getOutbox command in OTClient::ProcessServerReply @getAccount\n"); +#endif + // -------------------------------------------------- + + pAccount = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pAccount) + { + delete pAccount; + pAccount = NULL; + } + return true; + } + else if (theReply.m_bSuccess && theReply.m_strCommand.Compare("@createAccount")) + { + if (theReply.m_ascPayload.GetLength()) + { + OTAccount * pAccount = NULL; + + // this decodes the ascii-armor payload where the new account file + // is stored, and returns a normal string in strAcctContents. + OTString strAcctContents(theReply.m_ascPayload); + + pAccount = new OTAccount(USER_ID, ACCOUNT_ID, SERVER_ID); + + if (pAccount && pAccount->LoadContractFromString(strAcctContents) && pAccount->VerifyAccount(*pServerNym)) + { + // (2) Sign the Account + pAccount->ReleaseSignatures(); // So I don't get the annoying failure to verify message from the server's signature. + // Will eventually end up keeping the signature, however, just for reasons of proof. + // UPDATE (above) we are releasing these now, for good, since server's signature is not needed. Receipts are functional now, + pAccount->SignContract(*pNym); // and the last receipt IS signed by the server, and it can be used to verify the nym, account, inbox, and outbox. Nifty! + pAccount->SaveContract(); + + // (3) Save the Account to file + pAccount->SaveAccount(); + + // Need to consider other security considerations. + // What if I wasn't EXPECTING a @createAccount message? + // Well actually, in that case, the server wouldn't have a + // copy of my request to send back to me, would he? So I should + // check that request to make sure it's good. + // Also maybe should check to see if I was expecting this message + // in the first place. + + m_pWallet->AddAccount(*pAccount); + m_pWallet->SaveWallet(); + +#if defined (TEST_CLIENT) + OTMessage theMessage; + + if (ProcessUserCommand(OTClient::getOutbox, theMessage, + *pNym, +// *(pAssetContract), + *(theConnection.GetServerContract()), + pAccount)) + { + // Sign it and send it out. + theConnection.ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getOutbox command in OTClient::ProcessServerReply @createAccount\n"); +#endif + return true; + } + else { + delete pAccount; + pAccount = NULL; + } + + } + } + else + { + + } + return false; +} + + + + + +/// This function sets up "theMessage" so that it is ready to be sent out to the server. +/// If you want to set up a checkServerID command and send it to the server, then +/// you just call this to get the OTMessage object all set up and ready to be sent. +bool OTClient::ProcessUserCommand(OTClient::OT_CLIENT_CMD_TYPE requestedCommand, + OTMessage & theMessage, + OTPseudonym & theNym, +// OTAssetContract & theContract, + OTServerContract & theServer, + OTAccount * pAccount/*=NULL*/, + long lTransactionAmount/*=0*/, + OTAssetContract * pMyAssetContract/*=NULL*/, + OTIdentifier * pHisNymID/*=NULL*/, + OTIdentifier * pHisAcctID/*=NULL*/) +{ + // This is all preparatory work to get the various pieces of data together -- only + // then can we put those pieces into a message. + OTIdentifier CONTRACT_ID; + OTString strNymID, strContractID, strServerID, strNymPublicKey, strAccountID; + long lRequestNumber = 0; + + theNym.GetIdentifier(strNymID); + theServer.GetIdentifier(strServerID); + + const OTIdentifier SERVER_ID(strServerID); + + if (NULL != pAccount) + { + pAccount->GetIdentifier(strAccountID); + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + } + + // -------------------------------------------------------------------- + + theNym.GetPublicKey().GetPublicKey(strNymPublicKey); + + bool bSendCommand = false; + + if (OTClient::checkServerID == requestedCommand) + { +// OTLog::vOutput(0, "(User has instructed to send a checkServerID command to the server...)\n"); + + // (1) set up member variables + theMessage.m_strCommand = "checkServerID"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strNymPublicKey = strNymPublicKey; + + // (2) Sign the Message + // When a message is signed, it updates its m_xmlUnsigned contents to + // the values in the member variables + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::createUserAccount == requestedCommand) + { +// OTLog::vOutput(0, "(User has instructed to send a createUserAccount command to the server...)\n"); + + // (1) set up member variables + theMessage.m_strCommand = "createUserAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strNymPublicKey = strNymPublicKey; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::getRequest == requestedCommand) + { + // OTLog::vOutput(0, "(User has instructed to send a getRequest command to the server...)\n"); + + // (1) set up member variables + theMessage.m_strCommand = "getRequest"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + // ************************************************************************************** + // EVERY COMMAND BELOW THIS POINT (THEY ARE ALL OUTGOING TO THE SERVER) MUST INCLUDE THE + // CORRECT REQUEST NUMBER, OR BE REJECTED BY THE SERVER. + // + // The same commands must also increment the local counter of the request number by calling theNym.IncrementRequestNum + // Otherwise it will get out of sync, and future commands will start failing (until it is resynchronized with + // a getRequest message to the server, which replies with the latest number. The code on this side that processes + // that server reply is already smart enough to update the local nym's copy of the request number when it is received. + // In this way, the client becomes resynchronized and the next command will work again. But it's better to increment the + // counter properly. + // PROPERLY == every time you actually get the request number from a nym and use it to make a server request, + // then you should therefore also increment that counter. If you call GetCurrentRequestNum AND USE IT WITH THE SERVER, + // then make sure you call IncrementRequestNum immediately after. Otherwise future commands will start failing. + // + // This is all because the server requres a new request number (last one +1) with each request. This is in + // order to thwart would-be attackers who cannot break the crypto, but try to capture encrypted messages and + // send them to the server twice. Better that new requests requre new request numbers :-) + + else if (OTClient::deleteUserAccount == requestedCommand) + { + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + +// OTLog::vOutput(0, "(User has instructed to send a deleteUserAccount command to the server...)\n"); + + // (1) set up member variables + theMessage.m_strCommand = "deleteUserAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::sendUserMessage == requestedCommand) // SEND USER MESSAGE + { + OTLog::Output(0, "Please enter a NymID (for recipient): "); + + // User input. + // I need a second NymID, so I allow the user to enter it here. + OTString strNymID2; + strNymID2.OTfgets(std::cin); + + // ----------------------------------- + + OTLog::Output(0, "Enter recipient's public key:\n> "); + + OTASCIIArmor theArmoredText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + if (NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) + { + theArmoredText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (strlen(decode_buffer)>1); + + // ---------------------------------------- + + decode_buffer[0] = '\0'; + OTString strPlaintext; + + OTLog::Output(0, "Please enter a plaintext message, terminate with ~ on a new line:\n> "); + + do { + fgets(decode_buffer, sizeof(decode_buffer), stdin); + + if (decode_buffer[0] != '~') + { + strPlaintext.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + } while (decode_buffer[0] != '~'); + + // ----------------------------------- + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + +// OTLog::vError("DEBUG: Sending request number: %ld\n", lRequestNumber); + + // (1) set up member variables + theMessage.m_strCommand = "sendUserMessage"; + theMessage.m_strNymID = strNymID; + theMessage.m_strNymID2 = strNymID2; + theMessage.m_strServerID = strServerID; + + OTEnvelope theEnvelope; + OTAsymmetricKey thePubkey; + + if (theArmoredText.Exists() && !thePubkey.SetPublicKey(theArmoredText)) + { + OTLog::Output(0, "Failed setting public key.\n"); + } + else if (strPlaintext.Exists() && + theEnvelope.Seal(thePubkey, strPlaintext) && + theEnvelope.GetAsciiArmoredData(theMessage.m_ascPayload)) + { + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) + bSendCommand = true; + + // ----------------------------------- + // store a copy in the outmail. + // (not encrypted, since the Nymfile will be encrypted anyway. + // + OTMessage * pMessage = new OTMessage; + + OT_ASSERT(NULL != pMessage); + + pMessage->m_strCommand = "outmailMessage"; + pMessage->m_strNymID = strNymID; + pMessage->m_strNymID2 = strNymID2; + pMessage->m_strServerID = strServerID; + pMessage->m_strRequestNum.Format("%ld", lRequestNumber); + + pMessage->m_ascPayload.SetString(strPlaintext); + + pMessage->SignContract(theNym); + pMessage->SaveContract(); + + theNym.AddOutmail(*pMessage); // Now the Nym is responsible to delete it. It's in his "outmail". + + OTPseudonym & extraNym = theNym; + theNym.SaveSignedNymfile(extraNym); + } + else + { + OTLog::Output(0, "Failed sealing envelope.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::checkUser == requestedCommand) // CHECK USER + { + OTLog::Output(0, "Please enter a NymID: "); + + // User input. + // I need a second NymID, so I allow the user to enter it here. + OTString strNymID2; + strNymID2.OTfgets(std::cin); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + +// OTLog::vError("DEBUG: Sending request number: %ld\n", lRequestNumber); + + // (1) set up member variables + theMessage.m_strCommand = "checkUser"; + theMessage.m_strNymID = strNymID; + theMessage.m_strNymID2 = strNymID2; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + // The standard "contract" key inside the new currency contract must be the same key + // used by the Nym who is signing the requests to issue the currency. + else if (OTClient::issueAssetType == requestedCommand) // ISSUE ASSET TYPE + { + OTString strSourceContract; + + OTLog::Output(0, "Please enter currency contract, terminate with ~ on a new line:\n> "); + char decode_buffer[200]; + + do { + fgets(decode_buffer, sizeof(decode_buffer), stdin); + + if (decode_buffer[0] != '~') + { + strSourceContract.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + } while (decode_buffer[0] != '~'); + + /* + // While debugging, sometimes I just want it to read the source contract directly out of a test file. + // So I use this code, instead of the above code, when I am doing that, to set strSourceContract's value... + // + + OTString strTempPath; + strTempPath.Format("%s%s%s%s%s", OTLog::Path(), OTLog::PathSeparator(), "sample-contract", OTLog::PathSeparator(), "tokens.xml"); + std::ifstream in(strTempPath.Get(), std::ios::binary); + + std::ifstream in(strTempPath.Get(), std::ios::binary); + + if (in.fail()) + { + OTLog::vError("Error opening file WHILE DEBUGGING: %s\n", strTempPath.Get()); + } + OT_ASSERT(!in.fail()); + + std::stringstream buffer; + buffer << in.rdbuf(); + + std::string contents(buffer.str()); + + strSourceContract = contents.c_str(); + */ + + // ------------------------------------------------------------------- + + OTAssetContract theAssetContract; + + if (theAssetContract.LoadContractFromString(strSourceContract)) + { + // In some places the ID is already set, and I'd verify it here. + // But in this place, I am adding it and generating the ID from the string. + OTIdentifier newID; + theAssetContract.CalculateContractID(newID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "issueAssetType"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + newID.GetString(theMessage.m_strAssetID); // I've calculated the ID, and now put it on the message... + OTString strAssetContract(theAssetContract); + theMessage.m_ascPayload.SetString(strAssetContract); + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + + // ------------------------------------ + // Save the contract to local storage and add to wallet. + + OTString strFoldername(OTLog::ContractFolder()); + OTString strFilename(theMessage.m_strAssetID.Get()); // In this case the filename isn't actually used, since SaveToContractFolder will + // handle setting up the filename and overwrite it anyway. But I still prefer to set it + // up correctly, rather than pass a blank. I'm just funny like that. + + OTAssetContract * pContract = new OTAssetContract(theMessage.m_strAssetID, strFoldername, + strFilename, theMessage.m_strAssetID); + OT_ASSERT(NULL != pContract); + + // Check the server signature on the contract here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. + // if (pContract->LoadContract() && pContract->VerifyContract()) + if (pContract->LoadContractFromString(strSourceContract) && pContract->VerifyContract()) + { + // Next make sure the wallet has this contract on its list... + OTWallet * pWallet = NULL; + + if (NULL != (pWallet = m_pWallet)) + { + pWallet->AddAssetContract(*pContract); // this saves both the contract and the wallet. + pContract = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pContract) + { + delete pContract; + pContract = NULL; + } + } + } + + // ------------------------------------------------------------------------ + + // DONE: This will have to be changed from a simple message, to a transaction, + // BECAUSE IT CHANGES ACCOUNT BALANCES, and thus requires balance agreement for all affected accounts! + + else if (OTClient::exchangeBasket == requestedCommand) // EXCHANGE BASKET + { + const OTIdentifier USER_ID(theNym); + + OTString strBasketInfo, strNymID(USER_ID); + OTString str_BASKET_CONTRACT_ID, str_MAIN_ACCOUNT_ID, strTemp; + + // FIRST get the Asset Type ID for the basket + OTLog::Output(0, "Enter the basket's Asset Type ID (aka Contract ID): "); + str_BASKET_CONTRACT_ID.OTfgets(std::cin); + + // FIRST get the Asset Type ID for the basket + OTLog::Output(0, "Enter an ACCOUNT ID of yours for an account that has the same asset type: "); + str_MAIN_ACCOUNT_ID.OTfgets(std::cin); + OTIdentifier MAIN_ACCOUNT_ID(str_MAIN_ACCOUNT_ID); + + // which direction is the exchange? + OTString strDirection; + OTLog::Output(0, "Are you exchanging in or out? [in]: "); + strDirection.OTfgets(std::cin); + + const bool bDirection = (strDirection.Compare("in") || strDirection.Compare("In")); + + // load up the asset contract + OTString strFoldername(OTLog::ContractFolder()); + OTString strContractPath(str_BASKET_CONTRACT_ID.Get()); + OTAssetContract * pContract = new OTAssetContract(str_BASKET_CONTRACT_ID, strFoldername, + strContractPath, str_BASKET_CONTRACT_ID); + OT_ASSERT(NULL != pContract); + OTCleanup theAssetContractAngel(*pContract); + + if (pContract->LoadContract() && pContract->VerifyContract()) + { + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I just verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + // We need a transaction number just to send this thing. Plus, we need a number for + // each sub-account to the basket, as well as the basket's main account. + // That is: 1 + theBasket.Count() + 1 + + if (theNym.GetTransactionNumCount(SERVER_ID) < (2 + theBasket.Count())) + { + OTLog::Output(0, "Trying to exchange basket: you don't have enough transaction numbers to perform the exchange.\n"); + } + else + { + long lStoredTransactionNumber=0; + bool bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber); // this saves + + if (bGotTransNum) + { + // Create a transaction + OTTransaction * pTransaction = + OTTransaction::GenerateTransaction (USER_ID, MAIN_ACCOUNT_ID, SERVER_ID, OTTransaction::exchangeBasket, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::exchangeBasket); + + // This pItem is where the Basket Info will be stored. (So it ends up on receipts...) + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // ---------------------------------------------------- + // GET / LOAD the ACCOUNT / INBOX /OUTBOX for the MAIN ACCOUNT + + OTAccount * pMainAccount = m_pWallet->GetAccount(MAIN_ACCOUNT_ID); + OT_ASSERT(NULL != pMainAccount); // todo. better than nothing for now. + + OTLedger * pInbox = pMainAccount->LoadInbox(theNym); + OTLedger * pOutbox = pMainAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + // Set up the Request Basket! ------------------------------ + else + { + int nTransferMultiple = 0; + + OTBasket theRequestBasket(theBasket.Count(), theBasket.GetMinimumTransfer()); + + theRequestBasket.SetExchangingIn(bDirection); + // -------------------------------------------------- + // Show the minimum transfer amount to the customer and ask him to choose a multiple for the transfer + OTLog::vOutput(0, "The minimum transfer amount for this basket is %ld. You may only exchange in multiples of it.\n" + "Choose any multiple [1]: ", theBasket.GetMinimumTransfer()); + strTemp.OTfgets(std::cin); + nTransferMultiple = atoi(strTemp.Get()); + strTemp.Release(); + if (nTransferMultiple <= 0) + nTransferMultiple = 1; + + theRequestBasket.SetTransferMultiple(nTransferMultiple); + + // NOTE: I'm not checking this call for success... + // But, I DID check the count beforehand, and I know there are enough numbers. + // + long lClosingTransactionNo = 0; + theNym.GetNextTransactionNum(theNym, strServerID, lClosingTransactionNo); // this saves + + theRequestBasket.SetClosingNum(lClosingTransactionNo); // For the basketReceipt (Closing Transaction Num) for main account. + + // ----------------------------------------------------------- + + // Then loop through the BasketItems... + for (int i = 0; i < theBasket.Count(); i++) + { + // pItem-> contains SUB_CONTRACT_ID, SUB_ACCOUNT_ID, and lMinimumTransferAmount. + BasketItem * pItem = theBasket.At(i); + + // ...and for each one, ask the user to enter his corresponding account ID. + // IT MUST BE THE SAME ASSET TYPE AS THE BASKET ITEM, SO SHOW USER THE ASSET ID! + OTString str_SUB_CONTRACT_ID(pItem->SUB_CONTRACT_ID); + OTLog::vOutput(0, "\nBasket currency type (Asset Type) #%d is:\n%s\n\nPlease enter your own " + "existing Account ID of the same asset type: ", + i+1, str_SUB_CONTRACT_ID.Get()); + OTString str_TEMP_ACCOUNT_ID; + str_TEMP_ACCOUNT_ID.OTfgets(std::cin); + OTIdentifier TEMP_ACCOUNT_ID(str_TEMP_ACCOUNT_ID); + + + // TODO (later) Load up the user's account at this point to make sure it even exists. + // Then check the asset type on that account against pItem->SUB_CONTRACT_ID and make sure they match. + // The server will definitely have to do this anyway. The client can skip it, but the command + // won't work unless the user enters this data properly. UI will have to do a popup here if something is wrong. + + + // As this is happening, we're creating ANOTHER basket object (theRequestBasket), with items that + // contain MY account IDs. + // The minimum transfer amounts on the new basket are set based on a multiple of the original. + // (I already set the multiple just above this loop.) + + // NOTE: I'm not checking this call for success... + // But, I DID check the count beforehand, and I know there are enough numbers. + // + long lSubClosingTransactionNo = 0; // For the basketReceipt (closing transaction num) for the sub account. + theNym.GetNextTransactionNum(theNym, strServerID, lSubClosingTransactionNo); // this saves + // ------------------------------------------------------------------------------------- + theRequestBasket.AddRequestSubContract(pItem->SUB_CONTRACT_ID, TEMP_ACCOUNT_ID, lSubClosingTransactionNo); + } + + // Make sure the server knows where to put my new basket currency once the exchange is done. + theRequestBasket.SetRequestAccountID(MAIN_ACCOUNT_ID); + + // Export the OTBasket object into a string, add it as + // a payload on my request, and send to server. + theRequestBasket.SignContract(theNym); + theRequestBasket.SaveContract(strBasketInfo); + + //*********************************************************************** + + pItem->SetAttachment(strBasketInfo); + + // sign the item. save it. + // + pItem->SignContract(theNym); + pItem->SaveContract(); + + //*********************************************************************** + + // --------------------------------------------- + // BALANCE AGREEMENT! + // + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(0, // Change in balance is 0. (The accounts will all be changed, + *pTransaction, theNym, *pMainAccount, *pOutbox); // but basketReceipts will be used to account for it.) + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, MAIN_ACCOUNT_ID, SERVER_ID); + theLedger.GenerateLedger(MAIN_ACCOUNT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = str_MAIN_ACCOUNT_ID; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // OTString DEBUGSTR; + // theMessage.SaveContract(DEBUGSTR); + // + // OTLog::vError("DEBUG Transaction message:\n%s\n", DEBUGSTR.Get()); + + bSendCommand = true; + } // Inbox loaded. + } // successfully got first transaction number. + else + { + OTLog::Error("SUPPOSEDLY transaction numbers were available, but the call failed...\n"); + } + + } // theNym apparently has enough transaction numbers to exchange the basket. + + // ---------------------------------------------------------------- + + } // loaded Basket Info from string. + else { + OTLog::Output(0, "Error loading basket info from asset contract. Are you SURE this is a basket currency?\n"); + } + } + else { + OTLog::vOutput(0, "Failure loading or verifying %s\n", strContractPath.Get()); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::issueBasket == requestedCommand) // ISSUE BASKET + { + OTString strTemp, strBasketInfo; + + // Collect NUMBER OF CONTRACTS for the basket. + OTLog::Output(0, "How many different asset types will compose this new basket? [2]: "); + strTemp.OTfgets(std::cin); + int nBasketCount = atoi(strTemp.Get()); + if (0 >= nBasketCount) + nBasketCount = 2; + + // Collect the MINIMUM TRANSFER AMOUNT for the basket. Default 100. + OTLog::Output(0, "If your basket has a minimum transfer amount of 100, you might have 2 or 3 sub-currencies,\n" + "with the first being a minimum of 2 gold, the second being a minimum of 50 dollars, and the\n" + "third being a minimum of 30 silver. In this example, 100 units of the basket currency is\n" + "transferrable in or out of the basket currency, in return for 2 gold, 50 dollars, and 30 silver.\n" + "As those are only the *minimum* amounts, you could also transfer (in or out) in *any* multiple of\n" + "those numbers.\n\n"); + OTLog::Output(0, "What is the minimum transfer amount for the basket currency itself? [100]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + long lMinimumTransferAmount = atoi(strTemp.Get()); + if (0 == lMinimumTransferAmount) + lMinimumTransferAmount = 100; + + // ADD THESE VALUES TO A BASKET OBJECT HERE SO I CAN RE-USE lMinimumTransferAmount for the loop below. + OTBasket theBasket(nBasketCount, lMinimumTransferAmount); + + // Collect all the contract IDs for the above contracts + for (int i = 0; i < nBasketCount; i++) + { + OTLog::vOutput(0, "Enter contract ID # %d: ", i+1); + strTemp.Release(); strTemp.OTfgets(std::cin); + + OTIdentifier SUB_CONTRACT_ID(strTemp.Get()); + + // After each ID, collect the minimum transfer amount for EACH contract. + OTLog::Output(0, "Enter minimum transfer amount for that asset type: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + + lMinimumTransferAmount = atol(strTemp.Get()); + + // ADD THE CONTRACT ID TO A LIST TO BE SENT TO THE SERVER. + // ADD THE MINIMUM TRANSFER AMOUNT TO THE SAME OBJECT + theBasket.AddSubContract(SUB_CONTRACT_ID, lMinimumTransferAmount); + + // The object storing these should also have a space for storing + // the account ID that will go with each one. The server will add + // the Account ID when the reserve accounts are generated. + // + // (The basket issuer account will contain sub-accounts for the + // reserves, which are stored there and 100% redeemable at all times.) + } + + // Export the OTBasket object into a string, add it as + // a payload on message, and send to server. + theBasket.SignContract(theNym); + theBasket.SaveContract(strBasketInfo); + + // The user signs and saves the contract, but once the server gets it, + // the server releases signatures and signs it, calculating the hash from the result, + // in order to form the ID. + // + // The result is the same as any other currency contract, but with the server's signature + // on it (and thus it must store the server's public key). The server handles all + // transactions in and out of the basket currency based upon the rules set up by the user. + // + // The user who created the currency has no more control over it. The server reserves the + // right to exchange out to the various users and close the basket. + + // AT SOME POINT, strBasketInfo has been populated with the relevant data. + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "issueBasket"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + theMessage.m_ascPayload.SetString(strBasketInfo); + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + + } + + // ------------------------------------------------------------------------ + + else if (OTClient::createAccount == requestedCommand) // CREATE ACCOUNT + { + OTLog::Output(0, "Please enter an asset type (contract ID): "); + // User input. + // I need a from account + OTString strAssetID; + strAssetID.OTfgets(std::cin); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "createAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetID;// the hash of the contract is the AssetID + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::notarizeTransfer == requestedCommand) // NOTARIZE TRANSFER + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (FROM acct): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to transfer without a 'FROM' account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ----------------------------------------------------- + + OTString strRecipientAcct; + + if (NULL == pHisAcctID) + { + OTLog::Output(0, "Enter Recipient's asset account ID (no partial IDs here): "); + + // User input. + // I need a from account + strRecipientAcct.OTfgets(std::cin); + + if (strRecipientAcct.GetLength() < 2) + return false; + } + else + { + pHisAcctID->GetString(strRecipientAcct); + } + + OTIdentifier HIS_ACCT_ID(strRecipientAcct); + + // ---------------------------------------------- + OTString strAmount; + if (0 == lTransactionAmount) + { + OTLog::Output(0, "Please enter an amount: "); + // User input. + // I need an amount + strAmount.OTfgets(std::cin); + } + + const long lTotalAmount = (0 == lTransactionAmount) ? // If nothing was passed in, then use atol(strAmount), + (atol(strAmount.Exists() ? strAmount.Get() : "0")) : lTransactionAmount; // otherwise lTransactionAmount. + // ---------------------------------------------- + + OTIdentifier ACCT_FROM_ID(strFromAcct), USER_ID(theNym); + + long lStoredTransactionNumber=0; + bool bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber); // this saves + +// int GetTransactionNumCount(const OTIdentifier & theServerID); // count + + if (bGotTransNum) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM_ID, SERVER_ID, OTTransaction::transfer, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::transfer, &HIS_ACCT_ID); + + pItem->SetAmount(lTotalAmount); + + OTString strNote("Just testing the notes...blah blah blah blah blah blah"); + pItem->SetNote(strNote); + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + // BALANCE AGREEMENT + + else + { + // Need to setup a dummy outbox transaction (to mimic the one that will be on the server side when this pending transaction is actually put into the real outbox.) + // When the server adds its own, and then compares the two, they should both show the same pending transaction, in order for this balance agreement to be valid.. + // Otherwise the server would have to refuse it for being inaccurate (server can't sign something inaccurate!) So I throw a dummy on there before generating balance statement. + + OTTransaction * pOutboxTransaction = OTTransaction::GenerateTransaction(*pOutbox, OTTransaction::pending, + 1/*todo pick some number that everyone agrees doesn't matter, like 1. The referring-to is the important + number in this case, and perhaps server should update this value too before signing and returning.*/); // todo use a constant instead of '1' + + OT_ASSERT(NULL != pOutboxTransaction); // for now. + + OTString strItem(*pItem); + pOutboxTransaction->SetReferenceString(strItem); // So the GenerateBalanceStatement function below can get the other info off this item (like amount, etc) + pOutboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + +// pOutboxTransaction->SignContract(theNym); // Unnecessary to sign/save, since this is just a dummy data for verification +// pOutboxTransaction->SaveContract(); // purposes, and isn't being serialized anywhere. + + pOutbox->AddTransaction(*pOutboxTransaction); // no need to cleanup pOutboxTransaction since pOutbox will handle it now. + + // --------------------------------------------- + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(atol(strAmount.Get())*(-1), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // OTString DEBUGSTR; + // theMessage.SaveContract(DEBUGSTR); + // + // OTLog::vError("DEBUG Transaction message:\n%s\n", DEBUGSTR.Get()); + + bSendCommand = true; + } + + } + else + { + OTLog::Output(0, "No transaction numbers were available. Suggest requesting the server for one.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::setAssetName == requestedCommand) // SET ASSET CONTRACT NAME (wallet label only) + { + OT_ASSERT(NULL != m_pWallet); + + OTLog::Output(0, "Please enter an Asset Type ID: "); + // User input. + // I need a server ID + OTString strContractID; + strContractID.OTfgets(std::cin); + + const OTIdentifier theTargetID(strContractID); + + OTAssetContract * pTargetContract = m_pWallet->GetAssetContract(theTargetID); + + if (NULL != pTargetContract) + { + OTLog::Output(0, "Enter the new client-side \"name\" label for that asset type: "); + // User input. + // I need a name + OTString strNewName; + strNewName.OTfgets(std::cin); + + pTargetContract->SetName(strNewName); + + m_pWallet->SaveWallet(); // Only 'cause the server's name is stored here. + } + else + { + OTLog::Output(0, "No Asset Contract found with that ID. Try 'load'.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::setServerName == requestedCommand) // SET SERVER CONTRACT NAME (wallet label only) + { + OT_ASSERT(NULL != m_pWallet); + + OTLog::Output(0, "Please enter a Server ID: "); + // User input. + // I need a server ID + OTString strContractID; + strContractID.OTfgets(std::cin); + + const OTIdentifier theTargetID(strContractID); + + OTServerContract * pTargetContract = m_pWallet->GetServerContract(theTargetID); + + if (NULL != pTargetContract) + { + OTLog::Output(0, "Enter the new client-side \"name\" label for that transaction server: "); + // User input. + // I need a name + OTString strNewName; + strNewName.OTfgets(std::cin); + + pTargetContract->SetName(strNewName); + + m_pWallet->SaveWallet(); // Only 'cause the server's name is stored here. + } + else + { + OTLog::Output(0, "No Server Contract found with that ID. Try 'load'.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::setNymName == requestedCommand) // SET NYM NAME (wallet label only) + { + OT_ASSERT(NULL != m_pWallet); + + OTLog::Output(0, "Please enter a Nym ID: "); + // User input. + // I need a nym ID + OTString strNymID; + strNymID.OTfgets(std::cin); + + const OTIdentifier theTargetNymID(strNymID); + + OTPseudonym * pTargetNym = m_pWallet->GetNymByID(theTargetNymID); + + if (NULL != pTargetNym) + { + OTLog::Output(0, "Enter the new client-side \"name\" label for that Nym: "); + // User input. + // I need a name + OTString strNewName; + strNewName.OTfgets(std::cin); + + OTString strOldName(pTargetNym->GetNymName()); // just in case. + +// std::cout << "DEBUG 1 " << std::endl; + + pTargetNym->SetNymName(strNewName); + +// std::cout << "DEBUG 2 " << std::endl; + + if (pTargetNym->SaveSignedNymfile(theNym)) // theNym is signer on this file. + { + +// std::cout << "DEBUG 3 " << std::endl; + + m_pWallet->SaveWallet(); // Only 'cause the nym's name is stored here, too. +// std::cout << "DEBUG 4 " << std::endl; + + } + else + pTargetNym->SetNymName(strOldName); + +// std::cout << "DEBUG 5 " << std::endl; + + } + else + { + OTLog::Output(0, "No Nym found with that ID. Try 'load'.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::setAccountName == requestedCommand) // SET ACCOUNT NAME (wallet label only) + { + OT_ASSERT(NULL != m_pWallet); + + OTLog::Output(0, "Please enter an asset account ID: "); + // User input. + // I need an account + OTString strAcctID; + strAcctID.OTfgets(std::cin); + + if (strAcctID.GetLength() < 2) + return false; + + const OTIdentifier theAccountID(strAcctID); + + OTAccount * pTheAccount = m_pWallet->GetAccount(theAccountID); + + if (NULL != pTheAccount) + { + OTLog::Output(0, "Enter the new client-side \"name\" label for that Account: "); + // User input. + // I need a name + OTString strNewName; + strNewName.OTfgets(std::cin); + + pTheAccount->SetName(strNewName); + pTheAccount->ReleaseSignatures(); + + pTheAccount->SignContract(theNym); + pTheAccount->SaveAccount(); + + m_pWallet->SaveWallet(); + } + else + { + OTLog::Output(0, "No account found with that ID. Try 'load'.\n"); + } + } + + // ------------------------------------------------------------------------ + + else if (OTClient::getNymbox == requestedCommand) // GET NYMBOX + { + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getNymbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::getInbox == requestedCommand) // GET INBOX + { + // -------------------------------- + + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (to get its INBOX): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to download Inbox without an account ID. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ------------------------------------ + + OTString strAcctID; + OTIdentifier theAccountID; + + pAccount->GetIdentifier(theAccountID); + theAccountID.GetString(strAcctID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getInbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::getOutbox == requestedCommand) // GET OUTBOX + { + // -------------------------------- + + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (to get its OUTBOX): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to download outbox without account ID. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ------------------------------------ + + OTString strAcctID; + OTIdentifier theAccountID; + + pAccount->GetIdentifier(theAccountID); + theAccountID.GetString(strAcctID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getOutbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::processNymbox == requestedCommand) // PROCESS NYMBOX + { + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "processNymbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + + else if (OTClient::processInbox == requestedCommand) // PROCESS INBOX + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (to PROCESS its INBOX): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to process inbox without account ID. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ------------------------------------ + + OTString strAcctID; + OTIdentifier theAccountID; + + pAccount->GetIdentifier(theAccountID); + theAccountID.GetString(strAcctID); + + + // Normally processInbox command is sent with a transaction ledger + // in the payload, accepting or rejecting various transactions in + // my inbox. + // If pAccount was passed in, that means somewhere else in the code + // a ledger is being added to this message after this point, and it + // is being re-signed and sent out. + // That's why you don't see a ledger being constructed and added to + // the payload here. Because it's being done somewhere else, and that + // same place is what passed the account pointer in here. + // I only put this block here for now because I'd rather have it with + // all the others. + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "processInbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + + else if (OTClient::getAccount == requestedCommand) // GET ACCOUNT + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (to download its intermediary file): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to download account without account ID. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ------------------------------------ + + OTString strAcctID; + OTIdentifier theAccountID; + + pAccount->GetIdentifier(theAccountID); + theAccountID.GetString(strAcctID); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + + else if (OTClient::getContract == requestedCommand) // GET CONTRACT + { + OTLog::Output(0, "Please enter an asset type ID: "); + // User input. + // I need an account + OTString strAssetID; + strAssetID.OTfgets(std::cin); + + if (strAssetID.GetLength() < 2) + return false; + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getContract"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + // ------------------------------------------------------------------------ + + + else if (OTClient::getMint == requestedCommand) // GET MINT + { + OTLog::Output(0, "Please enter an asset type ID: "); + // User input. + // I need an account + OTString strAssetID; + strAssetID.OTfgets(std::cin); + + if (strAssetID.GetLength() < 2) + return false; + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getMint"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + + // ------------------------------------------------------------------------ + + + + else if (OTClient::notarizeDeposit == requestedCommand) // NOTARIZE DEPOSIT + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID to deposit your tokens to: "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to deposit tokens without an account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + const OTIdentifier ACCT_FROM_ID(strFromAcct), USER_ID(theNym); + + OTPurse thePurse(SERVER_ID, CONTRACT_ID); + + const OTPseudonym * pServerNym = theServer.GetContractPublicNym(); + + long lStoredTransactionNumber=0; + bool bGotTransNum = false; + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + } + + else if (!(bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber))) + { + OTLog::Output(0, "No Transaction Numbers were available. Try requesting the server for a new one.\n"); + } + + else if (pServerNym) + { + bool bSuccess = false; + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM_ID, SERVER_ID, + OTTransaction::deposit, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::deposit); + + OTString strNote("Deposit this cash, please!"); + pItem->SetNote(strNote); + + OTLog::Output(0, "How many tokens would you like to deposit? "); + OTString strTokenCount; + strTokenCount.OTfgets(std::cin); + const int nTokenCount = atoi(strTokenCount.Get()); + + for (int nTokenIndex = 1; nTokenIndex <= nTokenCount; nTokenIndex++) + { + OTLog::vOutput(0, "Please enter plaintext token # %d; terminate with ~ on a new line:\n> ", nTokenIndex); + OTString strToken; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strToken.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + // Create the relevant token request with same server/asset ID as the purse. + // the purse does NOT own the token at this point. the token's constructor + // just uses it to copy some IDs, since they must match. + OTToken theToken(thePurse); + + if (theToken.LoadContractFromString(strToken)) // TODO verify the token contract + { + // TODO need 2-recipient envelopes. My request to the server is encrypted to the server's nym, + // but it should be encrypted to my Nym also, so both have access to decrypt it. + + // Now the token is ready, let's add it to a purse + // By pushing theToken into thePurse with *pServerNym, I encrypt it to pServerNym. + // So now only the server Nym can decrypt that token and pop it out of that purse. + if (false == theToken.ReassignOwnership(theNym, *pServerNym)) + { + OTLog::Error("Error re-assigning ownership of token (to server.)\n"); + bSuccess = false; + break; + } + else + { + OTLog::Output(3, "Success re-assigning ownership of token (to server.)\n"); + + bSuccess = true; + + theToken.ReleaseSignatures(); + theToken.SignContract(theNym); + theToken.SaveContract(); + + thePurse.Push(*pServerNym, theToken); + + long lTemp = pItem->GetAmount(); + pItem->SetAmount(lTemp + theToken.GetDenomination()); + } + } + else + { + OTLog::Error("Error loading token from string.\n"); + } + } // for + + if (bSuccess) + { + thePurse.SignContract(theNym); + thePurse.SaveContract(); // I think this one is unnecessary. + + // Save the purse into a string... + OTString strPurse; + thePurse.SaveContract(strPurse); + + // Add the purse string as the attachment on the transaction item. + pItem->SetAttachment(strPurse); // The purse is contained in the reference string. + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(pItem->GetAmount(), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); // I can't pass strLedger into this constructor because I want to encode it + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } // bSuccess + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + + delete pItem; pItem = NULL; + delete pTransaction;pTransaction = NULL; + } + } // if (pServerNym) + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } // else if (OTClient::notarizeDeposit == requestedCommand) // NOTARIZE DEPOSIT + + // ------------------------------------------------------------------------ + + + else if (OTClient::notarizePurse == requestedCommand) // NOTARIZE PURSE (deposit) + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID: "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to deposit without an account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // --------------------------------------------------------- + + // "from acct" is the acct we are depositing this cash to. aka MyAcct. + const OTIdentifier ACCT_FROM_ID(strFromAcct), USER_ID(theNym); + + OTPurse thePurse(SERVER_ID, CONTRACT_ID); + + const OTPseudonym * pServerNym = theServer.GetContractPublicNym(); + + // --------------------------------------------- + + OTPurse theSourcePurse(thePurse); + + OTString strAssetTypeID; + + bool bUseThePurseInStorage = false; // deposit the purse stored in local storage, versus one supplied on stdin. + + // If no asset contract was passed in, then --mypurse was not specified. Therefore, + // we can get the purse from the user, and verify that it has the same asset type ID + // as pAccount does. (No need to ask for the type.) + // + // But if an asset contract WAS passed in, then we will assume (for now) that the purse + // from local storage will be used, of that same type, and thus no need to ask for the type. + // + if (NULL == pMyAssetContract) + { + bUseThePurseInStorage = false; + OTString strSourcePurse; + + OTLog::Output(0, "Please enter a plaintext purse (of the same asset type as the account), \n" + "and terminate with a ~ (tilde character) on a new line:\n> "); + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strSourcePurse.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + if (false == theSourcePurse.LoadContractFromString(strSourcePurse)) + { + OTLog::Output(0, "Failure trying to load purse from string provided by user.\n"); + return false; + } + + // todo verify signature? + + theSourcePurse.GetAssetID().GetString(strAssetTypeID); + } + else + { + bUseThePurseInStorage = true; + pMyAssetContract->GetIdentifier(strAssetTypeID); + + bool bLoadedSourcePurse = theSourcePurse.LoadPurse(strServerID.Get(), strNymID.Get(), strAssetTypeID.Get()); + + if (false == bLoadedSourcePurse) + { + OTLog::vOutput(0, "Deposit purse: Failure trying to load purse from local storage:\n" + "Server %s Nym %s Asset Type %s\n", + strServerID.Get(), strNymID.Get(), strAssetTypeID.Get()); + return false; + } + else + OTLog::vOutput(0, "WARNING: This operation is very low-level. Once you deposit the purse in local storage,\n" + "you need to erase the purse file from local storage, since the tokens within it are\n" + "all spent. (Otherwise, when you withdraw again, good tokens would be mixed in with\n" + "the spent ones, and then you'll have to sit there depositing them one-by-one, in order\n" + "to sort it all out.\n (So just use the GUI and save yourself the trouble.)\n\n" + "Deposit purse: using purse from local storage.\n Server %s Nym %s Asset Type %s\n", + strServerID.Get(), strNymID.Get(), strAssetTypeID.Get()); + + theSourcePurse.GetAssetID().GetString(strAssetTypeID); + } + + // By this point, theSourcePurse is DEFINITELY good, + // and strAssetTypeID contains its ID. + const OTIdentifier ASSET_TYPE_ID(strAssetTypeID); + + if (ASSET_TYPE_ID != CONTRACT_ID) + { + OTLog::Output(0, "Asset ID on purse didn't match asset ID on account. \n" + "Try: --myacct ACCT_ID (to specify a different account.)\n" + "To use the purse in local storage, try: --mypurse ASSET_TYPE_ID\n" + "FYI, if you PREFER to provide the purse from user input, OT *will* ask you to\n" + "input a purse when doing this, just as long as --mypurse is NOT provided. (And\n" + "that includes the defaultmypurse value stored in ~/.ot/command-line-ot.opt)\n\n"); + return false; + } + + // By this point, I have theSourcePurse loaded, whether from local storage or from + // the command-line, and I know that it has the same asset type as pAccount. + // + // ---------------------------------------------------------- + + long lStoredTransactionNumber=0; + bool bGotTransNum = false; + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + } + + else if (!(bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber))) + { + OTLog::Output(0, "No Transaction Numbers were available. Try requesting the server for a new one.\n"); + } + else if (NULL != pServerNym) + { + bool bSuccess = false; + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM_ID, SERVER_ID, + OTTransaction::deposit, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::deposit); + + OTString strNote("Deposit this cash, please!"); + pItem->SetNote(strNote); + + while (!theSourcePurse.IsEmpty()) + { + OTToken * pToken = theSourcePurse.Pop(theNym); + OTCleanup theTokenAngel(pToken); + + if (pToken) + { + // TODO need 2-recipient envelopes. My request to the server is encrypted to the server's nym, + // but it should be encrypted to my Nym also, so both have access to decrypt it. + // TODO: AHH OR I could just put a copy of everything into a SINGLE-recipient envelope made out to ME!! + // + + // Now the token is ready, let's add it to a purse + // By pushing theToken into thePurse with *pServerNym, I encrypt it to pServerNym. + // So now only the server Nym can decrypt that token and pop it out of that purse. + if (false == pToken->ReassignOwnership(theNym, *pServerNym)) + { + OTLog::Error("Error re-assigning ownership of token (to server.)\n"); + bSuccess = false; + break; + } + else + { + OTLog::Output(3, "Success re-assigning ownership of token (to server.)\n"); + + bSuccess = true; + + pToken->ReleaseSignatures(); + pToken->SignContract(theNym); + pToken->SaveContract(); + + thePurse.Push(*pServerNym, *pToken); // <================ + + long lTemp = pItem->GetAmount(); + pItem->SetAmount(lTemp + pToken->GetDenomination()); // <================== + } + } + else + { + OTLog::Error("Error loading token from purse.\n"); + bSuccess = false; + break; + } + } + + if (bSuccess) + { + thePurse.SignContract(theNym); + thePurse.SaveContract(); // I think this one is unnecessary. + + // Save the purse into a string... + OTString strPurse; + thePurse.SaveContract(strPurse); + + // Add the purse string as the attachment on the transaction item. + pItem->SetAttachment(strPurse); // The purse is contained in the reference string. + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(pItem->GetAmount(), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); // I can't pass strLedger into this constructor because I want to encode it + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } // bSuccess + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + + delete pItem; pItem = NULL; + delete pTransaction;pTransaction = NULL; + } + } // if (pServerNym) + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } // else if (OTClient::notarizePurse == requestedCommand) // NOTARIZE PURSE + + // ------------------------------------------------------------------------ + + + else if (OTClient::notarizeCheque == requestedCommand) // DEPOSIT CHEQUE + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an asset Account ID (to deposit to): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to deposit without an account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + const OTIdentifier ACCT_FROM_ID(strFromAcct), USER_ID(theNym); + + OTCheque theCheque(SERVER_ID, CONTRACT_ID); + + OTLog::Output(0, "Please enter plaintext cheque, terminate with ~ on a new line:\n> "); + OTString strCheque; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer) - 1 + + do { + decode_buffer[0] = 0; // Make sure it's starting out fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer) - 1, stdin)) && + (decode_buffer[0] != '~')) + { + strCheque.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + long lStoredTransactionNumber=0; + bool bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber); + + if (!bGotTransNum) + { + OTLog::Output(0, "No Transaction Numbers were available. Try requesting the server for a new one.\n"); + } + else if (theCheque.LoadContractFromString(strCheque)) + { + if (theCheque.HasRecipient() && (theCheque.GetRecipientUserID() != USER_ID)) + { + const OTString strRecipientNym(theCheque.GetRecipientUserID()); + OTLog::vOutput(0, "This cheque is made out to the Nym: %s (and that is NOT you, so you can't deposit it!)\n You are: %s \n", + strRecipientNym.Get(), strNymID.Get()); + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else // the cheque is blank, or is made out to me. + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM_ID, SERVER_ID, + OTTransaction::deposit, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::depositCheque); + + OTString strNote("Deposit this cheque, please!"); + pItem->SetNote(strNote); + + strCheque.Release(); + theCheque.SaveContract(strCheque); + + // Add the cheque string as the attachment on the transaction item. + pItem->SetAttachment(strCheque); // The cheque is contained in the reference string. + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else + { + // BALANCE AGREEMENT + // --------------------------------------------- + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(theCheque.GetAmount(), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } // inbox/outbox loaded + } // the cheque is blank, or is made out to me + } // cheque loaded + else // cheque failed to load + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } // else if (OTClient::notarizeCheque == requestedCommand) // DEPOSIT CHEQUE + + + // ------------------------------------------------------------------------ + + else if (OTClient::withdrawVoucher == requestedCommand) // WITHDRAW VOUCHER + { + OT_ASSERT(NULL != m_pWallet); + + // -------------------------------- + + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "This is like a banker's cheque, aka cashier's cheque.\n" + "Please enter an asset Account ID (FROM acct): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to purchase voucher without a 'FROM' account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // --------------------------------------------------------- + + OTString strRecipientNym; + + if (NULL == pHisNymID) + { + OTLog::Output(0, "Enter Recipient's Nym ID (full ID -- no partials here.) Blank IS allowed: "); + + // User input. + // I need a from account + strRecipientNym.OTfgets(std::cin); + +// if (strRecipientNym.GetLength() < 2) // blank cheques are allowed. +// return false; + } + else + { + pHisNymID->GetString(strRecipientNym); + } + + // Todo add partial lookups here from wallet and/or address book. + + const OTIdentifier MY_NYM_ID(theNym); + + const OTIdentifier HIS_NYM_ID(strRecipientNym); + + // ---------------------------------------------- + OTString strAmount; + if (0 == lTransactionAmount) + { + OTLog::Output(0, "Please enter an amount: "); + // User input. + // I need an amount + strAmount.OTfgets(std::cin); + } + + const long lTotalAmount = (0 == lTransactionAmount) ? // If nothing was passed in, then use atol(strAmount), + (atol(strAmount.Exists() ? strAmount.Get() : "0")) : lTransactionAmount; // otherwise lTransactionAmount. + // ---------------------------------------------- + + long lStoredTransactionNumber=0; + bool bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber); + + if (bGotTransNum) + { + // ----------------------------------------------------------------------- + // Memo + OTLog::Output(0, "Enter a memo for your check: "); + OTString strChequeMemo; + strChequeMemo.OTfgets(std::cin); + + // ----------------------------------------------------------------------- + + // Expiration (ignored by server -- it sets its own for its vouchers.) + const time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + const time_t VALID_TO = VALID_FROM + 15552000; // 6 months. + + // ----------------------------------------------------------------------- + // The server only uses the memo, amount, and recipient from this cheque when it + // constructs the actual voucher. + OTCheque theRequestVoucher(SERVER_ID, CONTRACT_ID); + bool bIssueCheque = theRequestVoucher.IssueCheque(lTotalAmount, lStoredTransactionNumber,// server actually ignores this and supplies its own transaction number for any voucher. + VALID_FROM, VALID_TO, ACCOUNT_ID, MY_NYM_ID, strChequeMemo, + (strRecipientNym.GetLength() > 2) ? &(HIS_NYM_ID) : NULL); + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (bIssueCheque) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (MY_NYM_ID, ACCOUNT_ID, SERVER_ID, + OTTransaction::withdrawal, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::withdrawVoucher); + pItem->SetAmount(lTotalAmount); + OTString strNote("Withdraw Voucher: "); + pItem->SetNote(strNote); + + // Add the voucher request string as the attachment on the transaction item. + OTString strVoucher; + theRequestVoucher.SignContract(theNym); + theRequestVoucher.SaveContract(); + theRequestVoucher.SaveContract(strVoucher); + pItem->SetAttachment(strVoucher); // The voucher request is contained in the reference string. + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + // BALANCE AGREEMENT + + // The item is signed and saved within this call as well. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(lTotalAmount*(-1), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(MY_NYM_ID, ACCOUNT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCOUNT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } + else + { + OTLog::Output(0, "No Transaction Numbers were available. Suggest requesting the server for a new one.\n"); + } + } + + // ------------------------------------------------------------------------ + + /* + bool ProcessUserCommand(OT_CLIENT_CMD_TYPE requestedCommand, + OTMessage & theMessage, + OTPseudonym & theNym, + // OTAssetContract & theContract, + OTServerContract & theServer, + OTAccount * pAccount=NULL, + long lTransactionAmount = 0, + OTAssetContract * pMyAssetContract=NULL, + OTAccount * pHisAcct=NULL, + OTPseudonym * pHisNym=NULL); + */ + + else if (OTClient::notarizeWithdrawal == requestedCommand) // NOTARIZE WITHDRAWAL + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an Asset Account ID: "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to withdraw without account. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // ---------------------------------------------- + + OTString strAmount; + if (0 == lTransactionAmount) + { + OTLog::Output(0, "Please enter an amount: "); + // User input. + // I need an amount + strAmount.OTfgets(std::cin); + } + + const long lTotalAmount = (0 == lTransactionAmount) ? // If nothing was passed in, then use atol(strAmount), + (atol(strAmount.Exists() ? strAmount.Get() : "0")) : lTransactionAmount; // otherwise lTransactionAmount. + long lAmount = lTotalAmount; // Used in calculating the denominations of tokens needed for the withdrawal. + + const OTIdentifier ACCT_FROM_ID(strFromAcct), USER_ID(theNym); + + long lStoredTransactionNumber=0; + bool bGotTransNum = false; + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(theNym); + OTLedger * pOutbox = pAccount->LoadOutbox(theNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + } + + else if (bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber)) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM_ID, SERVER_ID, + OTTransaction::withdrawal, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::withdrawal); + pItem->SetAmount(lTotalAmount); + OTString strNote("Gimme cash!"); + pItem->SetNote(strNote); + + const OTPseudonym * pServerNym = theServer.GetContractPublicNym(); + + // ----------------------------------------------------------------- + + OTMint theMint(strServerID, strContractID); + + if (pServerNym && + theMint.LoadMint() && + theMint.VerifyMint((OTPseudonym&)*pServerNym)) + { + OTPurse * pPurse = new OTPurse(SERVER_ID, CONTRACT_ID); + OTPurse * pPurseMyCopy = new OTPurse(SERVER_ID, CONTRACT_ID); + + // Create all the necessary tokens for the withdrawal amount. + // Push copies of each token into a purse to be sent to the server, + // as well as a purse to be kept for unblinding when we receive the + // server response. (Coin private unblinding keys are not sent to + // the server, obviously.) + long lTokenAmount = 0; + while (lTokenAmount = theMint.GetLargestDenomination(lAmount)) + { + lAmount -= lTokenAmount; + + // Create the relevant token request with same server/asset ID as the purse. + // the purse does NOT own the token at this point. the token's constructor + // just uses it to copy some IDs, since they must match. + OTToken theToken(*pPurse); + + // GENERATE new token, sign it and save it. + theToken.GenerateTokenRequest(theNym, theMint, lTokenAmount); + theToken.SignContract(theNym); + theToken.SaveContract(); + + // Now the proto-token is generated, let's add it to a purse + // By pushing theToken into pPurse with *pServerNym, I encrypt it to pServerNym. + // So now only the server Nym can decrypt that token and pop it out of that purse. + pPurse->Push(*pServerNym, theToken); + + // I'm saving my own copy of all this, encrypted to my nym + // instead of the server's, so I can get to my private coin data. + // The server's copy of theToken is already Pushed, so I can re-use + // the variable now for my own purse. + theToken.ReleaseSignatures(); + theToken.SetSavePrivateKeys(); // This time it will save the private keys when I sign it + theToken.SignContract(theNym); + theToken.SaveContract(); + + pPurseMyCopy->Push(theNym, theToken); // Now my copy of the purse has a version of the token, + } + + pPurse->SignContract(theNym); + pPurse->SaveContract(); // I think this one is unnecessary. + + // Save the purse into a string... + OTString strPurse; + pPurse->SaveContract(strPurse); + + // Add the purse string as the attachment on the transaction item. + pItem->SetAttachment(strPurse); // The purse is contained in the reference string. + + + pPurseMyCopy->SignContract(theNym); // encrypted to me instead of the server, and including + pPurseMyCopy->SaveContract(); // the private keys for unblinding the server response. + // This thing is neat and tidy. The wallet can just save it as an ascii-armored string as a + // purse field inside the wallet file. It doesn't do that for now (TODO) but it easily could. + + + // Add the purse to the wallet + // (We will need it to look up the private coin info for unblinding the token, + // when the response comes from the server.) + m_pWallet->AddPendingWithdrawal(*pPurseMyCopy); + + delete pPurse; + pPurse = NULL; // We're done with this one. + pPurseMyCopy = NULL; // The wallet owns my copy now and will handle cleaning it up. + + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(lTotalAmount*(-1), *pTransaction, theNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } + else + { + OTLog::Output(0, "No Transaction Numbers were available. Suggest requesting the server for a new one.\n"); + } + + } + + // ------------------------------------------------------------------------ + + else if (OTClient::getTransactionNum == requestedCommand) // GET TRANSACTION NUM + { + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "getTransactionNum"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + + // ------------------------------------------------------------------------ + + + else if (OTClient::marketOffer == requestedCommand) // PUT AN OFFER ON A MARKET + { + if (theNym.GetTransactionNumCount(strServerID) < 3) + { + OTLog::Output(0, "You need at least 3 transaction numbers to do this (You don't have enough.)\n"); + } + else + { + long lStoredTransactionNumber=0, lClosingTransactionNoAssetAcct=0, lClosingTransactionNoCurrencyAcct=0; + bool bGotTransNum = theNym.GetNextTransactionNum(theNym, strServerID, lStoredTransactionNumber, false); + bool bGotClosingNumAssetAcct = theNym.GetNextTransactionNum(theNym, strServerID, lClosingTransactionNoAssetAcct, false); + bool bGotClosingNumCurrencyAcct = theNym.GetNextTransactionNum(theNym, strServerID, lClosingTransactionNoCurrencyAcct, true); + + if (!bGotTransNum || !bGotClosingNumAssetAcct || !bGotClosingNumCurrencyAcct) + { + OTLog::Output(0, "Strange... had enough transcation numbers, but error trying to get one (or both.)\n"); + + if (bGotTransNum) + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, false); + + if (bGotClosingNumAssetAcct) + theNym.AddTransactionNum(theNym, strServerID, lClosingTransactionNoAssetAcct, false); + + if (bGotClosingNumCurrencyAcct) + theNym.AddTransactionNum(theNym, strServerID, lClosingTransactionNoCurrencyAcct, false); + + if (bGotTransNum || bGotClosingNumAssetAcct || bGotClosingNumCurrencyAcct) + theNym.SaveSignedNymfile(theNym); + } + else + { + OTString str_ASSET_TYPE_ID, str_CURRENCY_TYPE_ID, str_ASSET_ACCT_ID, str_CURRENCY_ACCT_ID; + + // FIRST get the Asset Type ID + OTLog::Output(0, "Enter the Asset Type ID of the market you want to trade in: "); + str_ASSET_TYPE_ID.OTfgets(std::cin); + + // THEN GET AN ACCOUNT ID FOR THAT ASSET TYPE + OTLog::Output(0, "Enter an ACCOUNT ID of yours for an account of the same asset type: "); + str_ASSET_ACCT_ID.OTfgets(std::cin); + + // NEXT get the Currency Type ID (which is also an asset type ID, FYI.) + // The trader just chooses one of them to be the "asset" and the other, the "currency". + OTLog::Output(0, "Enter the Currency Type ID of the market you want to trade in: "); + str_CURRENCY_TYPE_ID.OTfgets(std::cin); + + // THEN GET AN ACCOUNT ID FOR THAT CURRENCY TYPE + OTLog::Output(0, "Enter an ACCOUNT ID of yours, for an account of that same currency type: "); + str_CURRENCY_ACCT_ID.OTfgets(std::cin); + + + // Get a few long integers that we need... + + OTString strTemp; + long lTotalAssetsOnOffer = 0, + lMinimumIncrement = 0, + lPriceLimit = 0, + lMarketScale = 1; + + // ------------------------------------------------------------------- + + OTLog::Output(0, "What is the market granularity (or 'scale')? [1]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + lMarketScale = atol(strTemp.Get()); + + if (lMarketScale < 1) + lMarketScale = 1; + + // ------------------------------------------------------------------- + + OTLog::Output(0, "What is the minimum increment per trade? (will be multiplied by the scale) [1]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + lMinimumIncrement = atol(strTemp.Get()); + + lMinimumIncrement *= lMarketScale; + + // In case they entered 0. + if (lMinimumIncrement < 1) + lMinimumIncrement = lMarketScale; + + // ------------------------------------------------------------------- + + OTLog::Output(0, "How many assets total do you have available for sale or purchase?\n" + "(Will be multiplied by minimum increment) [1]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + lTotalAssetsOnOffer = atol(strTemp.Get()); + + lTotalAssetsOnOffer *= lMinimumIncrement; + + if (lTotalAssetsOnOffer < 1) + lTotalAssetsOnOffer = lMinimumIncrement; + + + + while (1) + { + OTLog::vOutput(0, "The Market Scale is: %ld\n" + "What is your price limit, in currency, PER SCALE of assets?\n" + "That is, what is the lowest amount of currency you'd sell for, (if selling)\n" + "Or the highest amount you'd pay (if you are buying).\nAgain, PER SCALE: ", + lMarketScale); + strTemp.Release(); strTemp.OTfgets(std::cin); + lPriceLimit = atol(strTemp.Get()); + + if (lPriceLimit < 1) + OTLog::Output(0, "Price must be at least 1.\n\n"); + else + break; + } + + // which direction is the offer? Buy or sell? + bool bBuyingOrSelling; + OTString strDirection; + OTLog::Output(0, "Are you in the market to buy the asset type, or to sell? [buy]: "); + strDirection.OTfgets(std::cin); + + if (strDirection.Compare("sell") || strDirection.Compare("Sell")) + bBuyingOrSelling = true; + else + bBuyingOrSelling = false; + + + OTIdentifier USER_ID(strNymID), + ASSET_TYPE_ID(str_ASSET_TYPE_ID), CURRENCY_TYPE_ID(str_CURRENCY_TYPE_ID), + ASSET_ACCT_ID(str_ASSET_ACCT_ID), CURRENCY_ACCT_ID(str_CURRENCY_ACCT_ID); + + + OTOffer theOffer(SERVER_ID, ASSET_TYPE_ID, CURRENCY_TYPE_ID, lMarketScale); + + + bool bCreateOffer = theOffer.MakeOffer(bBuyingOrSelling, // True == SELLING, False == BUYING + lPriceLimit, // Per Minimum Increment... + lTotalAssetsOnOffer, // Total assets available for sale or purchase. + lMinimumIncrement, // The minimum increment that must be bought or sold for each transaction + lStoredTransactionNumber); // Transaction number matches on transaction, item, offer, and trade. + + if (bCreateOffer) + { + bCreateOffer = theOffer.SignContract(theNym); + + if (bCreateOffer) + bCreateOffer = theOffer.SaveContract(); + } + + OTTrade theTrade(SERVER_ID, + ASSET_TYPE_ID, ASSET_ACCT_ID, + USER_ID, + CURRENCY_TYPE_ID, CURRENCY_ACCT_ID); + + + bool bIssueTrade = theTrade.IssueTrade(theOffer); + + if (bIssueTrade) + { + theTrade.AddClosingTransactionNo(lClosingTransactionNoAssetAcct); + theTrade.AddClosingTransactionNo(lClosingTransactionNoCurrencyAcct); + + bIssueTrade = theTrade.SignContract(theNym); + + if (bIssueTrade) + bIssueTrade = theTrade.SaveContract(); + } + + + if (bCreateOffer && bIssueTrade) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ASSET_ACCT_ID, SERVER_ID, + OTTransaction::marketOffer, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::marketOffer, + &CURRENCY_ACCT_ID); // the "To" account (normally used for a TRANSFER transaction) is used here + // storing the Currency Acct ID. The Server will expect the Trade object bundled + // within this item to have an Asset Acct ID and "Currency" Acct ID that match + // those on this Item. Otherwise it will reject the offer. + + OT_ASSERT(NULL != pItem); + + OTString strTrade; + theTrade.SaveContract(strTrade); + + // Add the trade string as the attachment on the transaction item. + pItem->SetAttachment(strTrade); // The trade is contained in the attachment string. (The offer is within the trade.) + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // TRANSACTION AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pStatementItem = theNym.GenerateTransactionStatement(*pTransaction); + + if (NULL != pStatementItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pStatementItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ASSET_ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ASSET_ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = str_ASSET_ACCT_ID; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + + if (false == bSendCommand) + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lStoredTransactionNumber, false); // bSave=true + theNym.AddTransactionNum(theNym, strServerID, lClosingTransactionNoAssetAcct, false); // bSave=true + theNym.AddTransactionNum(theNym, strServerID, lClosingTransactionNoCurrencyAcct, true); // bSave=true + } + } // Got Transaction Num + } + } // else if (OTClient::marketOffer == requestedCommand) // MARKET OFFER + + + // ------------------------------------------------------------------------ + + else if (OTClient::signContract == requestedCommand) // Sign a CONTRACT. (Sends no message to server.) + { + OTLog::Output(0, "Is the contract properly escaped already? [y/n]: "); + // User input. + // I need a from account, Yes even in a deposit, it's still the "From" account. + // The "To" account is only used for a transfer. (And perhaps for a 2-way trade.) + OTString strEscape; + strEscape.OTfgets(std::cin); + + char cEscape='n'; + bool bEscaped = strEscape.At(0, cEscape); + + if (bEscaped) + { + if ('N' == cEscape || 'n' == cEscape) + bEscaped = false; + } + + OTLog::Output(0, "Please enter an unsigned asset contract; terminate with ~ on a new line:\n> "); + OTString strContract; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + if (!bEscaped && decode_buffer[0] == '-') + { + strContract.Concatenate("- "); + } + strContract.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTAssetContract theContract; + theContract.CreateContract(strContract, theNym); + + // re-using strContract here for output this time. + strContract.Release(); + theContract.SaveContract(strContract); + + OTLog::Output(0, ".\n..\n...\n....\n.....\n......\n.......\n........\n.........\n\n" + "NEW CONTRACT:\n\n"); + + std::cout << strContract.Get() << std::endl; + + // ------------------------------------------------------------------------ + + return false; + } + else if (OTClient::writeCheque == requestedCommand) // Write a CHEQUE. (Sends no message to server.) + { + OTString strFromAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "Please enter an Asset Account ID (to draw the cheque from): "); + // User input. + // I need a from account + strFromAcct.OTfgets(std::cin); + + if (strFromAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strFromAcct.Get())) + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to write cheque without account to draw from. On comand line, try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strFromAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + const OTIdentifier ACCOUNT_ID(strFromAcct); + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // --------------------------------------------------------- + + OTString strRecipientNym; + + if (NULL == pHisNymID) + { + OTLog::Output(0, "Enter Recipient's Nym ID (full ID -- no partials here.) Blank IS allowed: "); + + // User input. + // I need a from account + strRecipientNym.OTfgets(std::cin); + +// if (strRecipientNym.GetLength() < 2) // blank cheques are allowed. +// return false; + } + else + { + pHisNymID->GetString(strRecipientNym); + } + + // Todo add partial lookups here from wallet and/or address book. + + const OTIdentifier MY_NYM_ID(theNym); + + const OTIdentifier HIS_NYM_ID(strRecipientNym); + + // ---------------------------------------------- + OTString strAmount; + if (0 == lTransactionAmount) + { + OTLog::Output(0, "Please enter an amount: "); + // User input. + // I need an amount + strAmount.OTfgets(std::cin); + } + + const long lTotalAmount = (0 == lTransactionAmount) ? // If nothing was passed in, then use atol(strAmount), + (atol(strAmount.Exists() ? strAmount.Get() : "0")) : lTransactionAmount; // otherwise lTransactionAmount. + // ---------------------------------------------- + + // To write a cheque, we need to burn one of our transaction numbers. (Presumably the wallet + // is also storing a couple of these, since they are needed to perform any transaction.) + // + // I don't have to contact the server to write a cheque -- as long as I already have a transaction + // number I can use to write it. Otherwise I'd have to ask the server to send me one first. + + long lTransactionNumber=0; + + if (false == theNym.GetNextTransactionNum(theNym, strServerID, lTransactionNumber)) + { + OTLog::Output(0, "Cheques are written offline, but you still need a transaction number\n" + "(and you have none, currently.) Try using 'n' to request another transaction number.\n"); + return false; + } + + + OTCheque theCheque(pAccount->GetRealServerID(), pAccount->GetAssetTypeID()); + + // ----------------------------------------------------------------------- + + // Memo + OTLog::Output(0, "Enter a memo for your check: "); + OTString strChequeMemo; + strChequeMemo.OTfgets(std::cin); + + // ----------------------------------------------------------------------- + + // Valid date range (in seconds) + OTLog::Output(0, + " 6 minutes == 360 Seconds\n" + "10 minutes == 600 Seconds\n" + "1 hour == 3600 Seconds\n" + "1 day == 86400 Seconds\n" + "30 days == 2592000 Seconds\n" + "3 months == 7776000 Seconds\n" + "6 months == 15552000 Seconds\n\n" + ); + + long lExpirationInSeconds = 3600; + OTLog::vOutput(0, "How many seconds before cheque expires? (defaults to 1 hour: %ld): ", lExpirationInSeconds); + OTString strTemp; + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + lExpirationInSeconds = atol(strTemp.Get()); + + + // ----------------------------------------------------------------------- + + time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + + OTLog::vOutput(0, "Cheque may be cashed STARTING date (defaults to now, in seconds) [%ld]: ", VALID_FROM); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 2) + VALID_FROM = atol(strTemp.Get()); + + + const time_t VALID_TO = VALID_FROM + lExpirationInSeconds; // now + 3600 + + // ----------------------------------------------------------------------- + + bool bIssueCheque = theCheque.IssueCheque(lTotalAmount, lTransactionNumber, VALID_FROM, VALID_TO, + ACCOUNT_ID, MY_NYM_ID, strChequeMemo, + (strRecipientNym.GetLength() > 2) ? &(HIS_NYM_ID) : NULL); // blank cheques are allowed. + + if (bIssueCheque) + { + theCheque.SignContract(theNym); + theCheque.SaveContract(); + + OTString strCheque(theCheque); + + OTLog::Output(0, "\n\nOUTPUT (writeCheque):\n\n\n"); + // OTLog::Output actually goes to stderr, whereas the cout below is actually sent to standard output. + std::cout << strCheque.Get() << std::endl; + } + else + { + OTLog::Output(0, "Failed trying to issue the cheque!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + theNym.AddTransactionNum(theNym, strServerID, lTransactionNumber, true); // bSave=true + } + + return false; + } + + // ------------------------------------------------------------------------ + + else if (OTClient::proposePaymentPlan == requestedCommand) // Propose a payment plan (sends no message to server.) + { + OTString strMerchantAcct; + + if (NULL == pAccount) + { + OTLog::Output(0, "You are the Merchant, proposing this payment plan so your customer can confirm it.\n" + "After this command, use 'confirm' (customer) to confirm it, and then activate it using\n" + "'plan' (customer) from the OT prompt, or '--activateplan' from the command line.\n\n" + "Enter the Merchant's (your) Asset Account ID that the payments will go to: "); + // User input. + // I need a from account + strMerchantAcct.OTfgets(std::cin); + + if (strMerchantAcct.GetLength() < 2) + return false; + + const OTIdentifier ACCOUNT_ID(strMerchantAcct); + + if (pAccount = m_pWallet->GetAccount(ACCOUNT_ID)) + { + pAccount->GetIdentifier(strMerchantAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else if (pAccount = m_pWallet->GetAccountPartialMatch(strMerchantAcct.Get())) + { + pAccount->GetIdentifier(strMerchantAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + else + { + OTLog::Error("Unable to propose payment plan without account to pay to. Try adding: --myacct ACCOUNT_ID\n"); + return false; + } + } + else + { + pAccount->GetIdentifier(strMerchantAcct); + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + const OTIdentifier MY_ACCT_ID(strMerchantAcct); + + if (pAccount->GetPurportedServerID() != SERVER_ID) + { + OTLog::Error("OTClient::ProcessUserCommand: pAccount->GetPurportedServerID() doesn't match SERVER_ID.\n" + "(Try adding: --server SERVER_ID)\n"); + return false; + } + + // pAccount is the MERCHANT's (recipient) account. CONTRACT_ID is its ASSET_TYPE. + // strContractID is the string version of that. And strMerchantAcct is the string + // version of pAccount's ID. + // theNym, FYI, is the Merchant's Nym. + + // ----------------------------------------------------- + + OTString strCustomerAcct; + + if (NULL == pHisAcctID) + { + OTLog::Output(0, "Enter Customer's Asset Account ID that payments will come FROM (no partials): "); + + // User input. + // I need a from account + strCustomerAcct.OTfgets(std::cin); + + if (strCustomerAcct.GetLength() < 2) + return false; + } + else + { + pHisAcctID->GetString(strCustomerAcct); + } + + const OTIdentifier HIS_ACCT_ID(strCustomerAcct); + + // HIS_ACCT_ID is the Customer's asset account id. + // strCustomerAcct is the OTString version of that. + // ----------------------------------------------------- + + OTString strCustomerNym; + + if (NULL == pHisNymID) + { + OTLog::Output(0, "Enter Customer's Nym ID (full ID -- no partials here): "); + + // User input. + // I need a from account + strCustomerNym.OTfgets(std::cin); + + if (strCustomerNym.GetLength() < 2) + return false; + } + else + { + pHisNymID->GetString(strCustomerNym); + } + + // Todo add partial lookups here from wallet and/or address book. + + const OTIdentifier MY_NYM_ID(theNym); + + const OTIdentifier HIS_NYM_ID(strCustomerNym); + + // HIS_NYM_ID is the Customer's nym id. MY_NYM_ID is the Merchant's. + // strCustomerNym is the OTString version of HIS_NYM_ID. + // ----------------------------------------------------- + + OTString strConsideration, strTemp; + + OTLog::Output(0, "Enter a memo describing consideration for the payment plan: "); + strConsideration.OTfgets(std::cin); + + // To write a payment plan, like a cheque, we need to burn one of our transaction numbers. (Presumably + // the wallet is also storing a couple of these, since they are needed to perform any transaction.) + // + // I don't have to contact the server to write a payment plan -- as long as I already have a transaction + // number I can use to write it. Otherwise I'd have to ask the server to send me one first. + + if (theNym.GetTransactionNumCount(strServerID) < 2) + { + OTLog::Output(0, "Payment Plans are written offline, but you still need a 2 transaction numbers\n" + "(and you don't, currently.) Try using 'n' to request another transaction number.\n"); + return false; + } + + // ----------------------------------------------------------------------- + + /* + OTPaymentPlan( const OTIdentifier & SERVER_ID, const OTIdentifier & ASSET_ID, + const OTIdentifier & SENDER_ACCT_ID, const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & RECIPIENT_ACCT_ID, const OTIdentifier & RECIPIENT_USER_ID); + + */ + OTPaymentPlan thePlan(pAccount->GetRealServerID(), pAccount->GetAssetTypeID(), + HIS_ACCT_ID, HIS_NYM_ID, + MY_ACCT_ID, MY_NYM_ID); + + // ----------------------------------------------------------------------- + + // Valid date range (in seconds) + OTLog::Output(0, + " 6 minutes == 360 Seconds\n" + "10 minutes == 600 Seconds\n" + "1 hour == 3600 Seconds\n" + "1 day == 86400 Seconds\n" + "30 days == 2592000 Seconds\n" + "3 months == 7776000 Seconds\n" + "6 months == 15552000 Seconds\n\n" + ); + + long lExpirationInSeconds = 86400; + OTLog::vOutput(0, "How many seconds before payment plan expires? (defaults to 1 day: %ld): ", + lExpirationInSeconds); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + lExpirationInSeconds = atol(strTemp.Get()); + + + // ----------------------------------------------------------------------- + + time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + + OTLog::vOutput(0, "Payment plan becomes valid for processing STARTING date\n" + "(defaults to now, in seconds) [%ld]: ", VALID_FROM); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 2) + VALID_FROM = atol(strTemp.Get()); + + const time_t VALID_TO = VALID_FROM + lExpirationInSeconds; // now + 86400 + + // ************************************************************************ + // This pulls two transaction numbers off of pMerchantNym. + // (So we have to put them back if there is some early failure and crap-out...) + // + bool bSuccessSetAgreement = thePlan.SetProposal(theNym, strConsideration, VALID_FROM, VALID_TO); + + if (!bSuccessSetAgreement) + { + OTLog::Output(0, "Failed trying to set the proposal!\n"); + + return false; + } + // ************************************************************************ + + bool bSuccessSetInitialPayment = true; // the default, in case user chooses not to even have this payment. + bool bSuccessSetPaymentPlan = true; // the default, in case user chooses not to have a payment plan + + OTLog::Output(0, "What is the Initial Payment Amount, if any? [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + long lInitialPayment = atol(strTemp.Get()); + + if (lInitialPayment > 0) + { + time_t PAYMENT_DELAY = 60; // 60 seconds. + + OTLog::vOutput(0, "From the Start Date forward, how long until the Initial Payment should charge?\n" + "(defaults to one minute, in seconds) [%d]: ", PAYMENT_DELAY); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_DELAY = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + bSuccessSetInitialPayment = thePlan.SetInitialPayment(lInitialPayment, PAYMENT_DELAY); + } + + if (!bSuccessSetInitialPayment) + { + OTLog::Output(0, "Failed trying to set the initial payment!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + thePlan.HarvestClosingNumbers(theNym); // puts the relevant numbers back onto Nym. + + return false; + } + + // ----------------------------------------------------------------------- + + OTLog::Output(0, "What is the regular payment amount, if any? [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + long lRegularPayment = atol(strTemp.Get()); + + if (lRegularPayment > 0) // If there are regular payments. + { + // ----------------------------------------------------------------------- + + time_t PAYMENT_DELAY = 120; // 120 seconds. + + OTLog::vOutput(0, "From the Start Date forward, how long until the Regular Payments start?\n" + "(defaults to two minutes, in seconds) [%d]: ", PAYMENT_DELAY); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_DELAY = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + time_t PAYMENT_PERIOD = 30; // 30 seconds. + + OTLog::vOutput(0, "Once payments begin, how much time should elapse between each payment?\n" + "(defaults to thirty seconds) [%d]: ", PAYMENT_PERIOD); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_PERIOD = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + time_t PLAN_LENGTH = 0; // 0 seconds (for no max length). + + OTLog::vOutput(0, "From start date, do you want the plan to expire after a certain maximum time?\n" + "(defaults to 0 for no) [%d]: ", PLAN_LENGTH); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + PLAN_LENGTH = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + OTLog::Output(0, "Should there be some maximum number of payments? (Zero for no maximum.) [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + int nMaxPayments = atoi(strTemp.Get()); + + bSuccessSetPaymentPlan = thePlan.SetPaymentPlan(lRegularPayment, PAYMENT_DELAY, + PAYMENT_PERIOD, PLAN_LENGTH, nMaxPayments); + } + + if (!bSuccessSetPaymentPlan) + { + OTLog::Output(0, "Failed trying to set the payment plan!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + thePlan.HarvestClosingNumbers(theNym); // puts the relevant numbers back onto Nym. + + return false; + } + + thePlan.SignContract(theNym); + thePlan.SaveContract(); + + OTString strPlan(thePlan); + + OTLog::Output(0, "\n\n(Make sure to have your Customer 'confirm' the payment plan, before he activates it at " + "the server using the 'plan' command in the OT prompt, or --activateplan at the command-line):\n\n"); + + std::cout << strPlan.Get() << std::endl; + + return false; // sends no server message in this case. + } + + // ------------------------------------------------------------------------ + + else if (OTClient::confirmPaymentPlan == requestedCommand) // Confirm a payment plan (sends no message to server.) + { + OTLog::Output(0, "(You are the customer, confirming a payment plan that the merchant has just sent you.)\n\n"); + + // ----------------------------------------------- + + OTPaymentPlan thePlan; + + OTLog::Output(0, "Please enter plaintext payment plan. Terminate with ~ on a new line:\n> "); + OTString strPlan; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strPlan.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + + if (!thePlan.LoadContractFromString(strPlan)) + { + OTLog::Output(0, "Unable to load payment plan from string.\n"); + return false; + } + + // ----------------------------------------------------------------------- + + OTPseudonym * pCustomerNym = m_pWallet->GetNymByID(thePlan.GetSenderUserID()); + + if (NULL == pCustomerNym) + { + OTLog::Output(0, "The customer Nym on this payment plan (you, supposedly) wasn't found in the wallet. Try 'load'.\n"); + return false; + } + + // ----------------------------------------------------------------------- + + OTPseudonym * pMerchantNym = m_pWallet->GetNymByID(thePlan.GetRecipientUserID()); + + if (NULL == pMerchantNym) + { + OTLog::Output(0, "Merchant Nym wasn't found in the wallet. Try 'load'.\n"); + // TODO add lookups from address book here as well? + return false; + } + + // ----------------------------------------------------------------------- + + if (false == thePlan.Confirm(*pMerchantNym, *pCustomerNym)) + { + OTLog::Output(0, "Error while confirming payment plan. Sorry.\n"); + return false; + } + + thePlan.SignContract(*pCustomerNym); + thePlan.SaveContract(); + + OTString strOutput(thePlan); + + OTLog::Output(0, "\n\nMake sure to submit the payment plan to the server, to activate it:\n\n"); + + // The above OTLog::Output() actually outputs to stderr (cerr). That's on purpose. + // But the below output actually outputs to stdout, which is also on purpose. + // + std::cout << strOutput.Get() << std::endl; + + return false; // no server message being sent, in this case. + } + + // ------------------------------------------------------------------------ + + else if (OTClient::paymentPlan == requestedCommand) // Activate a PAYMENT PLAN + { + const OTIdentifier USER_ID(theNym); + + OTPaymentPlan thePlan; + + OTLog::Output(0, "Please enter plaintext payment plan. Terminate with ~ on a new line:\n> "); + OTString strPlan; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strPlan.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + + if (thePlan.LoadContractFromString(strPlan)) + { + const OTIdentifier ACCOUNT_ID(thePlan.GetSenderAcctID()); + + OTAccount * pSenderAccount = m_pWallet->GetAccount(ACCOUNT_ID); + + if (NULL == pSenderAccount) + { + OTLog::Output(0, "There is no account loaded on this wallet with that sender acct ID, sorry.\n"); + } + if ((NULL != pAccount) && (pSenderAccount != pAccount)) + { + OTLog::Output(0, "This Payment Plan is already confirmed, yet now you try to activate it, and you \n" + "have supplied a different account ID than the one that originally confirmed it.\n" + "Perhaps it's just an unfortunate default in your ~/.ot/command-line-ot.opt file.\n" + "Be explicit, and use: --myacct \n"); + } + else + { + OTString strFromAcct(ACCOUNT_ID); + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCOUNT_ID, SERVER_ID, + OTTransaction::paymentPlan, thePlan.GetTransactionNum()); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::paymentPlan); + + strPlan.Release(); + thePlan.SaveContract(strPlan); + + // Add the payment plan string as the attachment on the transaction item. + pItem->SetAttachment(strPlan); // The payment plan is contained in the reference string. + + // sign the item + pItem->SignContract(theNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // TRANSACTION AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pStatementItem = theNym.GenerateTransactionStatement(*pTransaction); + + if (NULL != pStatementItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pStatementItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(theNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCOUNT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(theNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(theNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } // pAccount not NULL + } // thePlan.LoadContractFromString() + else + { + OTLog::Output(0, "Unable to load payment plan from string. Sorry.\n"); + } + + } // else if (OTClient::paymentPlan == requestedCommand) // PAYMENT PLAN + + + // ------------------------------------------------------------------------ + + /* + else if (OTClient::withdrawTest == requestedCommand) // TEST OF TOKEN BLINDING. NOT PART OF THE REAL PROTOCOL. + { + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + theNym.GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + theNym.IncrementRequestNum(strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "debitAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strContractID;// the hash of the contract is the AssetID + + // (2) Sign the Message + OTContract & aSigningDoc = theMessage; + aSigningDoc.SignContract(theNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + bSendCommand = true; + } + */ + // ------------------------------------------------------------------------ + + else + { + //gDebugLog.Write("unknown user command in ProcessMessage in main.cpp"); + // OTLog::Output(0, "Unknown user command in OTClient::ProcessUserCommand.\n"); + OTLog::Output(0, "\n"); + } + + return bSendCommand; +} + + +/// used for testing. +/// Once the wallet is loaded, we are assuming there is at least one server +/// contract in the wallet, and we are asking the wallet to look it up, +/// find the hostname and port inside that contract, and establish a connection +/// to the server. +/// +/// Whereas in a nice user interface, you would loop through all the servers in +/// the wallet and display them in a nice list on the screen, and the user could +/// just click on one, and you would just call Wallet.Connect(ServerID) and do your thing. +bool OTClient::ConnectToTheFirstServerOnList(OTPseudonym & theNym, + OTString & strCA_FILE, OTString & strKEY_FILE, OTString & strKEY_PASSWORD) +{ + OTIdentifier SERVER_ID; + OTString SERVER_NAME; + + if (m_pWallet && m_pWallet->GetServer(0, SERVER_ID, SERVER_NAME)) + { + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (NULL != pServer) + return m_pConnection->Connect(theNym, *pServer, strCA_FILE, strKEY_FILE, strKEY_PASSWORD); + } + + return false; +} + +/// Used in RPC mode (instead of Connect.) +/// Whenever a message needs to be processed, this function is called first, in lieu +/// of Connect(), so that the right pointers and IDs are in place for OTClient to do its thing. +bool OTClient::SetFocusToServerAndNym(OTServerContract & theServerContract, OTPseudonym & theNym, OT_CALLBACK_MSG pCallback) +{ + OT_ASSERT(NULL != pCallback); + + return m_pConnection->SetFocus(theNym, theServerContract, pCallback); +} + + +/// Need to call this before using. +bool OTClient::InitClient(OTWallet & theWallet) +{ + // already done + if (m_bInitialized) + return false; + + m_bInitialized = true; + + // SSL gets initialized in the OTServerConnection, so no need to do it here twice. + // BUT warning: don't load any private keys until this happens, or that won't work. +// SSL_library_init(); +// SSL_load_error_strings(); // These happen here: + m_pConnection = new OTServerConnection(theWallet, *this); + m_pWallet = &theWallet; + + // openssl initialization + ERR_load_crypto_strings(); // Todo deal with error logging mechanism later. + OpenSSL_add_all_algorithms(); // Is this really necessary to make these function calls? I'll leave it. + + + OTLog::ConfirmOrCreateFolder(OTLog::NymFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::AccountFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::ReceiptFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::NymboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::InboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::OutboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::CertFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::ContractFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::MintFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::PurseFolder()); + + return true; +} + + +OTClient::OTClient() +{ + m_pConnection = NULL; + m_pWallet = NULL; + + m_bInitialized = false; +} + +OTClient::~OTClient() +{ + if (NULL != m_pConnection) + { + delete m_pConnection; + m_pConnection = NULL; + } + + // openssl cleanup + CRYPTO_cleanup_all_ex_data(); + RAND_cleanup(); + EVP_cleanup(); + ERR_free_strings(); + ERR_remove_state(0); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testwallet/OTClient.h b/testwallet/OTClient.h new file mode 100644 index 000000000..e45a70b99 --- /dev/null +++ b/testwallet/OTClient.h @@ -0,0 +1,358 @@ +/************************************************************************************ + * + * OTClient.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __OTCLIENT_H__ +#define __OTCLIENT_H__ + +class OTPseudonym; +class OTAssetContract; +class OTServerContract; +class OTAccount; +class OTPayload; +class OTMessage; +class OTServerConnection; +class OTLedger; +class OTTransaction; +class OTWallet; + +#include "OTServerConnection.h" +#include "OTMessageBuffer.h" + +// This class represents the "test client" +// +// I have it separate from the wallet because I would like to be +// able to use the wallet in a "nice client" too, so I'm forcing +// the separation to keep it designed that way. +// + +class OTClient +{ +private: + OTWallet * m_pWallet; + + OTMessageBuffer m_MessageBuffer; + +public: + enum OT_CLIENT_CMD_TYPE + { + checkServerID, // Your public key is sent along with this message so the server can reply to + // you even without your being a registered user. Other than these top two commands, + // all other commands can only be executed by registered users. + // + // The server ID is a hash of the server contract. The signature on the contract + // can be verified by a public key that appears in a standard section of any server + // contract. The URL/port information is also derived from the contract. + // + // Simply by importing the server contract into your wallet, you are able to connect + // to it and encrypt all of your communications to it. + // + // Thus, the check server ID command really just confirms what you should already know... + // Your wallet still wants to see that the server agrees with the server ID, and that + // the server is able to read messages that were encrypted to the public key in the + // contract, and that the server is able to sign all of its future correspondence with + // the same public key. + // + // It is the server operator's responsibility to secure the domain name and web host + // that users will connect to when they import the contract, as well as the private + // key that matches the public key from the contract. + + createUserAccount, // Create user account on a specific server, with public key. User ID will be hash of said public key. + deleteUserAccount, // Delete user account from a specific server. + + checkUser, // Request a user's public key based on User ID included with the request. + // (If you want to send him cash or a check, your wallet will encrypt portions + // of the tokens, etc, to the Nym of the recipient.) + + sendUserMessage, // Send a message to another user, encrypted to his public key and dropped into his nymbox. + + getRequest, // Get the next request number from the server (for this user). Most requests must be + // accompanied by a request number, which increments for each Nym with each request. + + issueAssetType, // Upload a currency contract to the server and create an asset ID from a hash of that. + // contract. Also creates an issuer account for that asset ID. This ONLY works if public + // key of the user matches the contract key found in the currency contract, AND if the + // contract is signed by the same key. + + createAccount, // Create an asset account for a certain serverID, UserID, and Asset Type ID. + // These accounts are where users actually store their digital assets of various + // types. Account files are stored on user's computer, signed by notary server. + // Server also maintains its own copy. Users can create an unlimited number of accounts + // for any asset type that they choose. + + issueBasket, // Create a basket account, which is like an issuer account, but based on a basket of + // other asset types. This way, users can trade with what is apparently a single currency, + // when in fact the issuence is delegated and distributed across multiple issuers. + + exchangeBasket, // Use this to exchange assets in and out of a basket currency. + + getTransactionNum, // Every transaction requires a transaction number. If your wallet doesn't have one, + // then here it can request the server to send one over. (Or several.) + + getNymbox, // Grab a copy of my nymbox (contains messages and new transaction numbers) + + getInbox, // Grab a copy of my inbox from the server so I can decide what to do with it. + + getOutbox, // Grab a copy of my outbox from the server so I can decide what to do with it. + + processNymbox, // Instruct the server what to do with the various items sitting in my nymbox. (per user) + + processInbox, // Instruct the server what to do with the various items sitting in my inbox. (per asset acct) + + getAccount, // Grab the server's copy of my asset account file, in case mine is lost. + + getContract, // Grab the server's copy of any asset contract. Input is the asset type ID. + + getMint, // Grab the server's copy of any mint based on Asset ID. (For blinded tokens.) + + // ------------------------------------------------------------------------------ + + writeCheque, // Write a cheque. (Actually sends no message to the server -- returns false.) + + signContract, // Sign a contract. (Sends no message to the server.) + + proposePaymentPlan, // (Merchant) Propose a payment plan. (Sends no message to the server.) + + confirmPaymentPlan, // (Customer) Confirm a payment plan. (Sends no message to the server.) + + // ------------------------------------------------------------------------------ + + notarizeTransfer, // Request the server to transfer from one account to another. + + notarizeWithdrawal, // Request the server to withdraw from an asset account and return digital cash tokens to the wallet. + + withdrawVoucher, // Request the server to withdraw from an asset account and issue a voucher (cashier's cheque) + + notarizeDeposit, // Request the server to accept some digital cash and deposit it to an asset account. + + notarizePurse, // Same as the above, but sends an entire purse of tokens at once instead of sending individual tokens. + + notarizeCheque, // Deposit like the above, but deposits a cheque instead of cash tokens. + + // ------------------------------------------------------------------------------ + + marketOffer, // Create an Offer object and add it to one of the server's Market objects. + // This will also create a Trade object and add it to the server's Cron object. + // (The Trade provides the payment authorization for the Offer, as well as the rules + // for processing and expiring it.) + + paymentPlan, // Send a payment plan to the server (request to activate one onto yourself, basically.) + // The test client will ask you to input the plan, which you must already have (like a cheque). + // The Payee must create it and sign it, then he sends it to the Payer, who uses this command + // to sign it and submit it to the server. + // ------------------------------------------------------------------------------ + + setAccountName, // For setting the client-side label on an asset account. + + setNymName, // For setting the client-side label on a Nym. + + setServerName, // For setting the client-side label on a server contract. + + setAssetName, // For setting the client-side label on an asset contract. + + // ------------------------------------------------------------------------------ + + badID + }; + + // Right now this wallet just supports a SINGLE server connection. + // Eventually it will be a whole list of server connections. + // For now one is good enough for testing. + // All commands for the server will be sent here. + // + // Here was the problem, you see: You can't attach the connection to the Nym, + // because the same Nym might have connections to different servers. And you can't + // attach it to the server contract, because the user might access that server + // through multiple nym accounts on the same server. + // So I decided the wallet should manage the connections, and when new connections + // are made, the serverconnection object will be given a pointer at that time to + // the server and nym for that connection. That way the two are always available + // for processing the commands. + + OTServerConnection * m_pConnection; + + inline OTMessageBuffer & GetMessageBuffer() { return m_MessageBuffer; } + + + inline bool IsConnected() { return m_pConnection->IsConnected(); } + + // For RPC mode + bool SetFocusToServerAndNym(OTServerContract & theServerContract, OTPseudonym & theNym, OT_CALLBACK_MSG pCallback); + + // For the test client in SSL / TCP mode. + bool ConnectToTheFirstServerOnList(OTPseudonym & theNym, + OTString & strCA_FILE, OTString & strKEY_FILE, OTString & strKEY_PASSWORD); + + // Eventually, the wallet will have a LIST of these server connections, + // and any use of the connection will first require to look up the right one + // on that list, based on ID. This will return a pointer, and then you do the + // same call you normally did from there. + + OTClient(); + ~OTClient(); + + bool InitClient(OTWallet & theWallet); // Need to call this before using. + bool m_bInitialized; // this will be false until InitClient() is called. + + // ------------------------------------------------------------ + // These functions manipulate the internal m_pConnection member: + void ProcessMessageOut(char *buf, int * pnExpectReply); + void ProcessMessageOut(OTMessage & theMessage); + bool ProcessInBuffer(OTMessage & theServerReply); + + // ------------------------------------------------------------ + // These functions are for command processing: + + bool ProcessUserCommand(OT_CLIENT_CMD_TYPE requestedCommand, + OTMessage & theMessage, + OTPseudonym & theNym, +// OTAssetContract & theContract, + OTServerContract & theServer, + OTAccount * pAccount=NULL, + long lTransactionAmount = 0, + OTAssetContract * pMyAssetContract=NULL, + OTIdentifier * pHisNymID=NULL, + OTIdentifier * pHisAcctID=NULL); + + bool ProcessServerReply(OTMessage & theReply); + + void ProcessIncomingTransactions(OTServerConnection & theConnection, OTMessage & theReply); + void ProcessWithdrawalResponse(OTTransaction & theTransaction, OTServerConnection & theConnection, OTMessage & theReply); + void ProcessDepositResponse(OTTransaction & theTransaction, OTServerConnection & theConnection, OTMessage & theReply); + + + void AcceptEntireInbox(OTLedger & theInbox, OTServerConnection & theConnection); + void AcceptEntireNymbox(OTLedger & theNymbox, OTServerConnection & theConnection); + + void HarvestTransactionNumbers(OTTransaction & theTransaction, OTPseudonym & theNym); + +}; + +#endif // __OTCLIENT_H__ diff --git a/testwallet/OTDBString.cs b/testwallet/OTDBString.cs new file mode 100644 index 000000000..f963e07f7 --- /dev/null +++ b/testwallet/OTDBString.cs @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OTDBString : Storable { + private HandleRef swigCPtr; + + internal OTDBString(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.OTDBString_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OTDBString obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OTDBString() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OTDBString(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string m_string { + set { + otapiPINVOKE.OTDBString_m_string_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OTDBString_m_string_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static OTDBString ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.OTDBString_ot_dynamic_cast(Storable.getCPtr(pObject)); + OTDBString ret = (cPtr == IntPtr.Zero) ? null : new OTDBString(cPtr, false); + return ret; + } + +} diff --git a/testwallet/OTDBString.java b/testwallet/OTDBString.java new file mode 100644 index 000000000..a99b7c7f1 --- /dev/null +++ b/testwallet/OTDBString.java @@ -0,0 +1,51 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OTDBString extends Storable { + private long swigCPtr; + + public OTDBString(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.OTDBString_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(OTDBString obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OTDBString(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + public void setM_string(String value) { + otapiJNI.OTDBString_m_string_set(swigCPtr, this, value); + } + + public String getM_string() { + return otapiJNI.OTDBString_m_string_get(swigCPtr, this); + } + + public static OTDBString ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.OTDBString_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new OTDBString(cPtr, false); + } + +} diff --git a/testwallet/OTServerConnection.cpp b/testwallet/OTServerConnection.cpp new file mode 100644 index 000000000..613ebd2dd --- /dev/null +++ b/testwallet/OTServerConnection.cpp @@ -0,0 +1,1658 @@ +/************************************************************************************ + * + * OTServerConnection.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include + +extern "C" +{ +#ifdef _WIN32 +#include +#define strcasecmp _stricmp +#else +#include +#endif + +#include "SSL-Example/SFSocket.h" +} + +#include "OTStorage.h" + +#include "OTServerConnection.h" + +#include "OTIdentifier.h" +#include "OTDataCheck.h" +#include "OTPayload.h" +#include "OTWallet.h" +#include "OTPseudonym.h" +#include "OTMessage.h" +#include "OTMessageBuffer.h" +#include "OTWallet.h" +#include "OTClient.h" +#include "OTEnvelope.h" + +#include "OTLog.h" + + + +int allow_debug = 1; + +/* + union u_header + { + BYTE buf[OT_CMD_HEADER_SIZE]; + struct { + BYTE type_id; // 1 byte + BYTE command_id; // 1 byte + BYTE filler[2]; + uint32_t size; // 4 bytes to describe size of payload + BYTE checksum; // 1 byte + } fields; // total of 9 bytes + }; + */ + +void SetupHeader( u_header & theCMD, int nTypeID, int nCmdID, OTPayload & thePayload) +{ + uint32_t lSize = thePayload.GetSize(); // outputting in normal byte order, but sent to network in network byte order. + + theCMD.fields.type_id = nTypeID; + theCMD.fields.command_id= nCmdID; +// theCMD.fields.size = thePayload.GetSize(); + theCMD.fields.size = htonl(lSize); // think this is causing problems.. maybe not... + theCMD.fields.checksum = CalcChecksum(theCMD.buf, OT_CMD_HEADER_SIZE-1); + + + BYTE byChecksum = (BYTE)theCMD.fields.checksum; + int nChecksum = byChecksum; + + OTLog::vOutput(4, "OT_CMD_HEADER_SIZE: %d -- CMD TYPE: %d -- CMD NUM: %d -- (followed by 2 bytes of filler)\n" + "PAYLOAD SIZE: %d -- CHECKSUM: %d\n", OT_CMD_HEADER_SIZE, + nTypeID, nCmdID, lSize, nChecksum); + + OTLog::vOutput(5, "First 9 bytes are: %d %d %d %d %d %d %d %d %d\n", +// "sizeof(int) is %d, sizeof(long) is %d, sizeof(short) is %d, sizeof(uint32_t) is %d.\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4], theCMD.buf[5], theCMD.buf[6], theCMD.buf[7], theCMD.buf[8] +// sizeof(int), sizeof(long), sizeof(short), sizeof(uint32_t) + ); +} + + +bool OTServerConnection::s_bInitialized = false; + +void OTServerConnection::Initialize() +{ + // We've already been initialized. We can just return + if (s_bInitialized) + { + return; + } + + // This is the first time this function has run. + s_bInitialized = true; // set this to true so the function can't run again. It only runs the first time. + + // Initialize SSL -- MUST happen before any Private keys are loaded, if you want it to work. + SFSocketGlobalInit(); +} + + +// Connect is used for SSL mode, but SetFocus is used for XmlRpc mode. +// Everytime you send a message, it is a new connection -- and could be to +// a different server! So it's important to switch focus each time so we +// have the right server contract, etc. +// +bool OTServerConnection::SetFocus(OTPseudonym & theNym, OTServerContract & theServerContract, OT_CALLBACK_MSG pCallback) +{ + OT_ASSERT(NULL != pCallback); // We need the callback for processing out messages to the server (in RPC Mode)... + + // We're already connected! You can't use SetFocus if you're in connection mode (TCP instead of HTTP.) + if (IsConnected()) + return false; + + // This call initializes OpenSSL (only the first time it's called.) + Initialize(); + + // The Client keeps an internal ServerConnection at all times. + // In SSL/TCP mode, you connect, and stay connected. But in RPC + // mode, you must call SetFocus before each time you prepare or + // process any server-related messages. Why? Since the Client normally + // expects the connection to already be made, and therefore expects + // to have access to the Nym and Server Contract (and server ID, etc) + // available since those pointers are normally set during Connect(). + // Since we no longer connect in RPC mode, we must still make sure those + // pointers are ready by calling SetFocus before they might end up being used. + // Each time you send a new message, it might be to a different server or + // from a different nym. That's fine -- just call SetFocus() before you do it. + m_pNym = &theNym; + m_pServerContract = &theServerContract; + m_pCallback = pCallback; // This is what we get instead of a socket, when we're in RPC mode. + m_bFocused = true; + + return true; +} + +bool OTServerConnection::Connect(OTPseudonym & theNym, OTServerContract & theServerContract, + OTString & strCA_FILE, OTString & strKEY_FILE, OTString & strKEY_PASSWORD) +{ + // We're already connected! + if (IsConnected()) + return false; + + // Make sure all the socket stuff is initialized and set up. + Initialize(); + + // You can't just pass in a hostname and port. + // Instead, you pass in the Nym and Contract, and *I'll* look up all that stuff. + OTString strHostname; + int nPort = 0; + + if (false == theServerContract.GetConnectInfo(strHostname, nPort)) + { + OTLog::Output(0, "Failed retrieving connection info from server contract.\n"); + return false; + } + + SFSocket * socket; + + // Alloc Socket + socket = SFSocketAlloc(); + + OT_ASSERT_MSG(NULL != socket, "SFSocketAlloc Failed\n"); + + // Initialize SSL client Socket + if (SFSocketInit(socket, strCA_FILE.Get(), NULL, strKEY_FILE.Get(), strKEY_PASSWORD.Get(), NULL) < 0) { + OTLog::Error("Init Failed\n"); + return false; + } + + // TODO: Note, I had to go intside this function and comment out the Cert-checking portion + // in order to get this program running. + // So I need to go back and revisit that later, but at least now we have client/server. + + // Connect to Host + if (SFSocketConnectToHost(socket, strHostname.Get(), nPort) < 0) { + OTLog::Output(0, "Connect to Host Failed\n"); + return false; + } + + m_pSocket = socket; + m_pNym = &theNym; + m_pServerContract = &theServerContract; + + return true; +} + + + +// When the server sends a reply back with our new request number, we +// need to update our records accordingly. +// +// This function is meant to be called when that happens, so that we +// can do just that. +// +void OTServerConnection::OnServerResponseToGetRequestNumber(long lNewRequestNumber) +{ + if (m_pNym && m_pServerContract) + { + OTLog::vOutput(0, "Received new request number from the server: %ld. Updating Nym records...\n", + lNewRequestNumber); + + OTString strServerID; + m_pServerContract->GetIdentifier(strServerID); + m_pNym->OnUpdateRequestNum(*m_pNym, strServerID, lNewRequestNumber); + } + else { + OTLog::Error("Expected m_pNym or m_pServerContract to be not null in " + "OTServerConnection::OnServerResponseToGetRequestNumber.\n"); + } +} + + +bool OTServerConnection::GetServerID(OTIdentifier & theID) +{ + if (m_pServerContract) + { + m_pServerContract->GetIdentifier(theID); + return true; + } + return false; +} + +// When a certain Nym opens a certain account on a certain server, +// that account is put onto a list of accounts inside the wallet. +// Therefore, a certain Nym's connection to a certain server will +// occasionally require access to those accounts. Therefore the +// server connection object needs to have a pointer to the wallet. +// There might be MORE THAN ONE connection per wallet, or only one, +// but either way the connections need a pointer to the wallet +// they are associated with, so they can access those accounts. +OTServerConnection::OTServerConnection(OTWallet & theWallet, OTClient & theClient, SFSocket * pSock) +{ + m_pSocket = pSock; + m_pCallback = NULL; + m_bFocused = false; + m_pNym = NULL; + m_pServerContract = NULL; + m_pWallet = &theWallet; + m_pClient = &theClient; +} + +OTServerConnection::OTServerConnection(OTWallet & theWallet, OTClient & theClient) +{ + m_pSocket = NULL; + m_pCallback = NULL; + m_bFocused = false; + m_pNym = NULL; + m_pServerContract = NULL; + m_pWallet = &theWallet; + m_pClient = &theClient; +} + +OTServerConnection::~OTServerConnection() +{ + if (m_pSocket) + { + // Close and Release Socket Resources + SFSocketRelease(m_pSocket); + } +} + + +// This function returns true if we received a full and proper reply from the server. +// theServerReply will contain that message after a successful call to this function. +// TCP / SSL mode. +bool OTServerConnection::ProcessInBuffer(OTMessage & theServerReply) +{ + int err; + uint32_t nread; + u_header theCMD; + + OT_ASSERT(NULL != m_pSocket); + + // clear the header + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + for (nread = 0; nread < OT_CMD_HEADER_SIZE; nread += err) + { + err = SFSocketRead(m_pSocket, theCMD.buf + nread, OT_CMD_HEADER_SIZE - nread); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 is a disconnect. error is error. otherwise err contains bytes read. +#else + if (err <= 0) +#endif + { + break; + } + } + + if (OT_CMD_HEADER_SIZE == nread) + { + OTLog::vOutput(4, "\n**************************************************************\n" + "===> Processing header from server reply. First 5 bytes are: %d %d %d %d %d...\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4]); + + + return ProcessReply(theCMD, theServerReply); + } + + return false; +} + +// ProcessInBuffer calls this function, once it has verified the header, +// this function gets the payload. If successful, returns true and theServerReply +// will contain the OTMessage that was received. +// It also flushes the pipe in the event of any errors. (TCP / SSL mode) +bool OTServerConnection::ProcessReply(u_header & theCMD, OTMessage & theServerReply) +{ + bool bSuccess = false; + + OT_ASSERT(NULL != m_pSocket); + + OTLog::vOutput(4, "\n****************************************************************\n" + "===> Processing header from server response.\nFirst 9 bytes are: %d %d %d %d %d %d %d %d %d...\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4],theCMD.buf[5], theCMD.buf[6], theCMD.buf[7], theCMD.buf[8]); + + + if( theCMD.fields.type_id == CMD_TYPE_1 ) + { + OTLog::Output(3, "Received a Type 1 Command...\n"); + + if( IsChecksumValid( theCMD.buf, OT_CMD_HEADER_SIZE ) ) + { + OTLog::Output(3, "Checksum is valid! Processing payload.\n"); + + if (true == ProcessType1Cmd(theCMD, theServerReply )) + bSuccess = true; + } + else { + OTLog::Error("Invalid checksum - Type 1 Command\n"); + } + } + else + { + //gDebugLog.Write("Unknown command type"); + int nCMDType = theCMD.fields.type_id; + OTLog::vError("Unknown command type: %d\n", nCMDType); + } + + + // I added this for error correction. In the event that there are errors, + // just clean out whatever is in the pipe and throw it away. + // Should probably send an Error message back, as well. + if (bSuccess == false) + { + int err = 0, nread = 0; + + char buffer[1024]; + int sizeJunkData = 1020; // We'll make this a bit smaller than the buffer, for safety reasons. + + while (1) + { + err = SFSocketRead(m_pSocket, buffer, sizeJunkData); + + if (err > 0) // _WIN32 + nread += err; + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 means disconnect. error means error. >0 means bytes read. +#else + if (err <= 0) +#endif + break; + } + + OTLog::vError("Transmission error--therefore have flushed the pipe, discarding %d bytes.\n", nread); + } + + return bSuccess; +} + + + +// If this function returns a true, that means theServerReply now contains a valid message +// from the server. (So something should be done with it.) +bool OTServerConnection::ProcessType1Cmd(u_header & theCMD, OTMessage & theServerReply) +{ + // At this point, the checksum has already validated. + // Might as well get the PAYLOAD next. + int err; + uint32_t nread; + + OT_ASSERT(NULL != m_pSocket); + + // Make sure our byte-order is correct here. + theCMD.fields.size = ntohl(theCMD.fields.size); // think this is causing problems... maybe not... + + OTPayload thePayload; + thePayload.SetPayloadSize(theCMD.fields.size); + + for (nread = 0; nread < theCMD.fields.size; nread += err) + { + err = SFSocketRead(m_pSocket, (unsigned char *)thePayload.GetPayloadPointer() + nread, theCMD.fields.size - nread); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == 0) // 0 means disconnect. error means error. otherwise, err contains bytes read. +#else + if (err <= 0) +#endif + break; + } + + // ------------------------------------------------------------ + + switch (theCMD.fields.command_id) { + case TYPE_1_CMD_1: + OTLog::Output(3, "Received TYPE 1 CMD 1, an OTMessage.\n"); + break; + case TYPE_1_CMD_2: + OTLog::vOutput(3, "Received TYPE 1 CMD 2, an OTEnvelope containing an OTMessage.\n"); + break; + default: + break; + } + + // ------------------------------------------------------------ + + if (theCMD.fields.size == 0) + { + OTLog::Error("(The payload was a 0 size.)\n"); + return true; + } + else if (nread < theCMD.fields.size) + { + OTLog::vError("Number of bytes read (%d) did NOT match size in header (%d).\n", + nread, theCMD.fields.size); + return false; + } + else + { + OTLog::vOutput(4, "Loaded a payload, size: %d\n", theCMD.fields.size); + } + // ------------------------------------------------------------ + + + // a signed OTMessage + if (TYPE_1_CMD_1 == theCMD.fields.command_id) + { +#ifdef _WIN32 + if (OTPAYLOAD_GetMessage(thePayload, theServerReply)) +#else + if (thePayload.GetMessage(theServerReply)) +#endif + { + OTLog::Output(4, "Successfully retrieved payload message...\n"); + + if (theServerReply.ParseRawFile()) + { + OTLog::Output(4, "Successfully parsed payload message.\n"); + + OTPseudonym * pServerNym = NULL; + + if (m_pServerContract && (pServerNym = (OTPseudonym *)m_pServerContract->GetContractPublicNym())) + { + if (theServerReply.VerifySignature((const OTPseudonym &)*pServerNym)) + { + OTLog::Output(0, "VERIFIED -- this message was signed by the Server.\n"); + } + else { + OTLog::Output(0, "Signature verification failed on this message, proportedly from the Server.\n"); + return false; + } + } + else { + OTLog::Output(0, "No server contract loaded, or could not load public key from server contract.\n"); + return false; + } + + return true; + } + else { + OTLog::Error("Error parsing message.\n"); + return false; + } + + } + else { + OTLog::Error("Error retrieving message from payload.\n"); + return false; + } + + } + + // A base64-encoded envelope, encrypted, and containing a signed message. + else if (TYPE_1_CMD_2 == theCMD.fields.command_id) + { + OTEnvelope theEnvelope; + if (thePayload.GetEnvelope(theEnvelope)) + { + OTLog::Output(3, "===> Received encrypted envelope. (Server reply.) Decrypting...\n"); + + OTString strEnvelopeContents; + + // Decrypt the Envelope. + if (m_pNym && theEnvelope.Open(*m_pNym, strEnvelopeContents)) + { + // All decrypted, now let's load the results into an OTMessage. + // No need to call theMessage.ParseRawFile() after, since + // LoadContractFromString handles it. + // + if (theServerReply.LoadContractFromString(strEnvelopeContents)) + { + OTLog::Output(4, "Success decrypting the message out of the envelope and parsing it.\n"); + + OTPseudonym * pServerNym = NULL; + + if (m_pServerContract && (pServerNym = (OTPseudonym *)m_pServerContract->GetContractPublicNym())) + { + if (theServerReply.VerifySignature((const OTPseudonym &)*pServerNym)) + { + OTLog::Output(0, "VERIFIED -- this message was signed by the Server.\n"); +// OTLog::vOutput(0, "VERIFIED -- this message was signed by the Server:\n%s\n", strEnvelopeContents.Get()); + } + else + { + OTLog::Output(0, "Signature verification failed on this message, purportedly from the Server.\n"); + return false; + } + } + else { + OTLog::Error("No server contract loaded, or could not load public key from server contract.\n"); + return false; + } + + return true; + } + else + { + OTLog::Error("Error loading message from envelope contents.\n"); + return false; + } + } + else { + OTLog::Error("Unable to open envelope.\n"); + return false; + } + } + else { + OTLog::Error("Error retrieving message from payload.\n"); + return false; + } + + } + + else { + OTLog::Error("Error retrieving message from payload. Unknown type.\n"); + return false; + } + + return true; + +} + + + + +bool OTServerConnection::SignAndSend(OTMessage & theMessage) +{ + if (m_pNym && + m_pWallet && + (IsConnected() || IsFocused()) && + theMessage.SignContract(*m_pNym) && + theMessage.SaveContract()) + { + ProcessMessageOut(theMessage); + return true; + } + + return false; +} + + + + +void OTServerConnection::ProcessMessageOut(OTMessage & theMessage) +{ + int err; + uint32_t nwritten; + + u_header theCMD; + OTPayload thePayload; + + + OT_ASSERT(IsConnected() || IsFocused()); + + // clear the header + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + // Here is where we set up the Payload (so we have the size ready before the header goes out) + // This is also where we have turned on the encrypted envelopes }:-) + OTEnvelope theEnvelope; // All comms should be encrypted in one of these envelopes. + + // Testing encrypted envelopes... + const OTPseudonym * pServerNym = NULL; + + if (m_pServerContract && + (NULL != (pServerNym = m_pServerContract->GetContractPublicNym()))) + { + OTString strEnvelopeContents; + // Save the ready-to-go message into a string. + theMessage.SaveContract(strEnvelopeContents); + + // Seal the string up into an encrypted Envelope + theEnvelope.Seal(*pServerNym, strEnvelopeContents); + + // From here on out, theMessage is disposable. OTPayload takes over. + // OTMessage doesn't care about checksums and headers. + thePayload.SetEnvelope(theEnvelope); + + // Now that the payload is ready, we'll set up the header. + SetupHeader(theCMD, CMD_TYPE_1, TYPE_1_CMD_2, thePayload); + } + // else, for whatever reason, we just send an UNencrypted message... (This shouldn't happen anymore...) TODO remove. + else { + thePayload.SetMessage(theMessage); + + // Now that the payload is ready, we'll set up the header. + SetupHeader(theCMD, CMD_TYPE_1, TYPE_1_CMD_1, thePayload); + } + + // --------------------------------------------------------- + + if (IsFocused()) // RPC / HTTP mode... ---------- + { + OT_ASSERT(NULL != m_pCallback); + OT_ASSERT(NULL != m_pServerContract); + + // Call the callback here. + (*m_pCallback)(*m_pServerContract, theEnvelope); // We don't use the payload in RPC mode, just the envelope. RPC does the rest. + OTLog::Output(0, "Message sent via ZMQ...\n\n"); + } + else // TCP / SSL mode... ----------- + { + int nHeaderSize = OT_CMD_HEADER_SIZE; + + for (nwritten = 0; nwritten < nHeaderSize; nwritten += err) + { + err = SFSocketWrite(m_pSocket, theCMD.buf + nwritten, nHeaderSize - nwritten); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 is disonnect. error is error. >0 is bytes written. +#else + if (err <= 0) +#endif + break; + } + + // At this point, we have sent the header across the pipe. + // Next we write the payload... + + uint32_t nPayloadSize = thePayload.GetSize(); + + for (nwritten = 0; nwritten < nPayloadSize; nwritten += err) + { + err = SFSocketWrite(m_pSocket, (unsigned char *)thePayload.GetPayloadPointer() + nwritten, nPayloadSize - nwritten); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 is disonnect. error is error. >0 is bytes written. +#else + if (err <= 0) +#endif + break; + } + OTLog::Output(0, "Message sent via TCP / SSL...\n\n"); + } + + // At this point, we have sent the envelope to the server. +} + + + +// This function interprets test input (so should have been in test client?) +// then it uses that to send a message to server. +// The buf passed in is simply data collected by fgets from stdin. +void OTServerConnection::ProcessMessageOut(char *buf, int * pnExpectReply) +{ + bool bSendCommand = false; + bool bSendPayload = false; + + OTMessage theMessage; + + bool bHandledIt = false; + + int err; + uint32_t nwritten; + u_header theCMD; + + + OT_ASSERT(IsConnected() || IsFocused()); + + + // clear the header + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + + // Simple rule here: In each of the below if statements, + // YOU MUST set up the header bytes HERE! + // OR you must set the boolean bSendCommand TO TRUE!! + // It must be one or the other in each block. + // If you set to true, code at the bottom will calculate header + // for you. If you fail to do this, the header is now uncalculated either way. + // Don't send uncalculated headers to the server unless doing it on purpose for TESTING. + + if (buf[0] == '1') + { + bHandledIt = true; + + theCMD.fields.type_id = CMD_TYPE_1; + theCMD.fields.command_id = TYPE_1_CMD_1; + theCMD.fields.size = 0; + theCMD.fields.checksum = CalcChecksum(theCMD.buf, OT_CMD_HEADER_SIZE-1); + + int nChecksum = theCMD.fields.checksum; + + OTLog::vOutput(0, "(User has instructed to send a size %d, TYPE 1 COMMAND to the server...)\n CHECKSUM: %d\n", + OT_CMD_HEADER_SIZE, nChecksum); + bSendCommand = true; + } + else if (buf[0] == '2') + { + bHandledIt = true; + + theCMD.fields.type_id = 12; + theCMD.fields.command_id = 3; + theCMD.fields.size = 98; + theCMD.fields.checksum = CalcChecksum(theCMD.buf, OT_CMD_HEADER_SIZE-1); + + OTLog::vOutput(0, "(User has instructed to send a size %d, **malformed command** to the server...)\n", OT_CMD_HEADER_SIZE+3); + bSendCommand = true; + } + // Empty OTMessage including signed XML, but no other commands + else if (buf[0] == '3') + { + OTLog::vOutput(0, "(User has instructed to create a signed XML message and send it to the server...)\n"); + bHandledIt = true; + + // Normally you'd update the member variables here, before signing it. + // But this is just an empty OTMessage. + + // When a message is signed, it updates its m_xmlUnsigned contents to the values in the members variables + m_pWallet->SignContractWithFirstNymOnList(theMessage); + + // SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + theMessage.SaveContract(); + + bSendCommand = true; + bSendPayload = true; + } + + + // Above are various test messages. + + // ------------------------------------------------------------------------------ + + // ------------------------------------------------------------------------------ + + // This section for commands that involve building full XML messages, + // that is, most of the real implementation of the transaction protocol. + + // If we can match the user's request to a client command, + // AND theClient object is able to process that request into + // a payload, THEN we create the header and send it all down the pipe. + + if (false == bHandledIt && m_pNym && m_pServerContract) + { + // check server ID command + if (buf[0] == 'c') + { + OTLog::vOutput(0, "(User has instructed to send a checkServerID command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::checkServerID, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing checkServerID command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // register new user account + else if (buf[0] == 'r') + { + OTLog::Output(0, "(User has instructed to send a createUserAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::createUserAccount, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing createUserAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // ALL MESSAGES BELOW THIS POINT SHOULD ATTACH A REQUEST NUMBER IF THEY EXPECT THE SERVER TO PROCESS THEM. + // (Handled inside ProcessUserCommand) + + // checkUser + else if (buf[0] == 'u') + { + OTLog::Output(0, "(User has instructed to send a checkUser command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::checkUser, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing checkUser command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // register new asset account + else if (buf[0] == 'a') + { + OTLog::Output(0, "(User has instructed to send a createAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::createAccount, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing createAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // issue a new asset type + else if (!strcmp(buf, "issue\n")) + { + OTLog::Output(0, "(User has instructed to send an issueAssetType command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::issueAssetType, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing issueAssetType command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // issue a new basket asset type + else if (!strcmp(buf, "basket\n")) + { + OTLog::Output(0, "(User has instructed to send an issueBasket command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::issueBasket, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing issueBasket command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // exchange in/out of a basket currency + else if (!strcmp(buf, "exchange\n")) + { + OTLog::Output(0, "(User has instructed to send an exchangeBasket command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::exchangeBasket, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing exchangeBasket command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // make an offer and put it onto a market. + else if (!strcmp(buf, "offer\n")) + { + OTLog::Output(0, "(User has instructed to send a marketOffer command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::marketOffer, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing marketOffer command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // set asset contract's name + else if (!strcmp(buf, "setassetname\n")) + { + OTLog::Output(0, "(User has instructed to set an Asset Contract's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::setAssetName, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message sent. + // bSendPayload = true; + } + // ------------------------------------------------------------------------ + } + + // set server contract's name + else if (!strcmp(buf, "setservername\n")) + { + OTLog::Output(0, "(User has instructed to set a Server Contract's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::setServerName, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message sent. + // bSendPayload = true; + } + // ------------------------------------------------------------------------ + } + + // set nym name + else if (!strcmp(buf, "setnymname\n")) + { + OTLog::Output(0, "(User has instructed to set a Nym's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::setNymName, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message sent. + // bSendPayload = true; + } + // ------------------------------------------------------------------------ + } + + // set account name + else if (!strcmp(buf, "setaccountname\n")) + { + OTLog::Output(0, "(User wants to set an Asset Account's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::setAccountName, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message sent. + // bSendPayload = true; + } + // ------------------------------------------------------------------------ + } + + // sendUserMessage + else if (buf[0] == 's') + { + OTLog::Output(0, "(User has instructed to send a sendUserMessage command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::sendUserMessage, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing sendUserMessage command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get nymbox + else if (buf[0] == 'y') + { + OTLog::Output(0, "(User has instructed to send a getNymbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getNymbox, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getNymbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get inbox + else if (buf[0] == 'i') + { + OTLog::Output(0, "(User has instructed to send a getInbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getInbox, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getInbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get outbox + else if (buf[0] == 'o') + { + OTLog::Output(0, "(User has instructed to send a getOutbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getOutbox, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getOutbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + + // deposit cheque + else if (buf[0] == 'q') + { + OTLog::Output(0, "User has instructed to deposit a cheque...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::notarizeCheque, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing deposit cheque command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // withdraw voucher + else if (buf[0] == 'v') + { + OTLog::Output(0, "User has instructed to withdraw a voucher (like a cashier's cheque)...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::withdrawVoucher, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing withdraw voucher command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // withdraw cash + else if (buf[0] == 'w') + { + OTLog::Output(0, "(User has instructed to withdraw cash...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::notarizeWithdrawal, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing withdraw command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // deposit tokens + else if (buf[0] == 'd') + { + OTLog::Output(0, "(User has instructed to deposit cash tokens...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::notarizeDeposit, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing deposit command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // activate payment plan + else if (!strcmp(buf, "plan\n")) + { + OTLog::Output(0, "User has instructed to activate a payment plan...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::paymentPlan, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing payment plan command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // deposit purse + else if (buf[0] == 'p') + { + OTLog::Output(0, "(User has instructed to deposit a purse containing cash...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::notarizePurse, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing deposit command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get account + else if (!strcmp(buf, "test\n")) + { + OTLog::vOutput(0, "(User has instructed to perform a test...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pNym) + { + OTString strMessage("Well well well, this is just a little bit of plaintext.\nNotice there are NO NEWLINES at the start.\n" + "I'm just trying to make it as long as i can, so that\nI can test the envelope and armor functionality.\n"); + + OTLog::vOutput(0, "MESSAGE:\n------>%s<--------\n", strMessage.Get()); + + OTASCIIArmor ascMessage(strMessage); + + OTLog::vOutput(0, "ASCII ARMOR:\n------>%s<--------\n", ascMessage.Get()); + + OTEnvelope theEnvelope; + theEnvelope.Seal(*m_pNym, strMessage); + + ascMessage.Release(); + + theEnvelope.GetAsciiArmoredData(ascMessage); + + OTLog::vOutput(0, "ENCRYPTED PLAIN TEXT AND THEN ASCII ARMOR:\n------>%s<--------\n", ascMessage.Get()); + + strMessage.Release(); + + OTEnvelope the2Envelope(ascMessage); + the2Envelope.Open(*m_pNym, strMessage); + + OTLog::vOutput(0, "DECRYPTED PLAIN TEXT:\n------>%s<--------\n", strMessage.Get()); + + OTEnvelope the3Envelope; + the3Envelope.Seal(*m_pNym, strMessage.Get()); + + ascMessage.Release(); + + the3Envelope.GetAsciiArmoredData(ascMessage); + + OTLog::vOutput(0, "RE-ENCRYPTED PLAIN TEXT AND THEN ASCII ARMOR:\n------>%s<--------\n", ascMessage.Get()); + + strMessage.Release(); + + OTEnvelope the4Envelope(ascMessage); + the4Envelope.Open(*m_pNym, strMessage); + + OTLog::vOutput(0, "RE-DECRYPTED PLAIN TEXT:\n------>%s<--------\n", strMessage.Get()); + + OTEnvelope the5Envelope; + the5Envelope.Seal(*m_pNym, strMessage.Get()); + + ascMessage.Release(); + + the3Envelope.GetAsciiArmoredData(ascMessage); + + OTLog::vOutput(0, "RE-RE-ENCRYPTED PLAIN TEXT AND THEN ASCII ARMOR:\n------>%s<--------\n", ascMessage.Get()); + + strMessage.Release(); + + OTEnvelope the6Envelope(ascMessage); + the6Envelope.Open(*m_pNym, strMessage); + + OTLog::vOutput(0, "RE-RE-DECRYPTED PLAIN TEXT:\n------>%s<--------\n", strMessage.Get()); + + } + + // ------------------------------------------------------------------------ + } + + // get account + else if (!strcmp(buf, "get\n")) + { + OTLog::Output(0, "(User has instructed to send a getAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getAccount, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get contract + else if (!strcmp(buf, "getcontract\n")) + { + OTLog::Output(0, "(User has instructed to send a getContract command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getContract, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getContract command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + + // sign contract + else if (!strcmp(buf, "signcontract\n")) + { + OTLog::Output(0, "Is the contract properly escaped already? [y/n]: "); + // User input. + // I need a from account, Yes even in a deposit, it's still the "From" account. + // The "To" account is only used for a transfer. (And perhaps for a 2-way trade.) + OTString strEscape; + strEscape.OTfgets(std::cin); +// strEscape.OTfgets(std::cin); + + char cEscape='n'; + bool bEscaped = strEscape.At(0, cEscape); + + if (bEscaped) + { + if ('N' == cEscape || 'n' == cEscape) + bEscaped = false; + } + + OTLog::Output(0, "Please enter an unsigned asset contract; terminate with ~ on a new line:\n> "); + OTString strContract; + char decode_buffer[200]; // Safe since we only read sizeof(decode_buffer)-1 + + do { + decode_buffer[0] = 0; // Make it fresh. + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + if (!bEscaped && decode_buffer[0] == '-') + { + strContract.Concatenate("- "); + } + strContract.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTAssetContract theContract; + theContract.CreateContract(strContract, *m_pNym); + + // re-using strContract here for output this time. + strContract.Release(); + theContract.SaveContract(strContract); + + OTLog::vOutput(0, ".\n..\n...\n....\n.....\n......\n.......\n........\n.........\n\n" + "NEW CONTRACT:\n\n%s\n", strContract.Get()); + // ------------------------------------------------------------------------ + } + + // get mint + else if (!strcmp(buf, "getmint\n")) + { + OTLog::Output(0, "(User has instructed to send a getMint command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getMint, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getMint command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // notarize transfer + else if (buf[0] == 't') + { + OTLog::Output(0, "(User has instructed to send a Transfer command (Notarize Transactions) to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::notarizeTransfer, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing notarizeTransactions command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // getRequest + else if (buf[0] == 'g') + { + OTLog::Output(0, "(User has instructed to send a getRequest command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getRequest, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getRequest command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // getTransactionNum + else if (buf[0] == 'n') + { + // I just coded (here) for myself a secret option (for testing)... + // Optionally instead of JUST 'n', I can put n , (without brackets) and + // this code will add that number to my list of issued and transaction numbers. + // I already have the ability to clear the list, so now I can add numbers to it as well. + // (Which adds to both lists.) + // I can also remove a number from the transaction list but LEAVE it on the issued list, + // for example by writing a cheque and throwing it away. + // + // This code is for testing and allows me to find and patch any problems without + // having to re-create my data each time -- speeds up debugging. + // + long lTransactionNumber = ((strlen(buf) > 2) ? atol(&(buf[2])) : 0); + + if (lTransactionNumber > 0) + { + OTString strServerID; + m_pServerContract->GetIdentifier(strServerID); + + m_pNym->AddTransactionNum(*m_pNym, strServerID, lTransactionNumber, true); // bool bSave=true + + OTLog::vOutput(0, "Transaction number %ld added to both lists (on client side.)\n", + lTransactionNumber); + } + + else + { + OTLog::Output(0, "(User has instructed to send a getTransactionNum command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (m_pClient->ProcessUserCommand(OTClient::getTransactionNum, theMessage, + *m_pNym, *m_pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + bSendPayload = true; + } + else + OTLog::vError("Error processing getTransactionNum command in ProcessMessage: %c\n", buf[0]); + } + + // ------------------------------------------------------------------------ + } + + else + { + if( allow_debug ) + { + //gDebugLog.Write("unknown user command in ProcessMessage in main.cpp"); + OTLog::Output(0, "\n"); + // OTLog::vError( "unknown user command in ProcessMessage in main.cpp: %d\n", buf[0]); + } + return; + } + } //if (false == bHandledIt && m_pNym && m_pServerContract) + + else if (false == bHandledIt) + { + // OTLog::Error( "Your command was unrecognized or required resources that were not loaded.\n"); + OTLog::Output(0, "\n"); + } + + if (bSendCommand && bSendPayload) + { + // Voila -- it's sent. (If there was a payload involved.) + ProcessMessageOut(theMessage); + } // Otherwise... if it's a "header only" ... + else if (bSendCommand && IsConnected()) // I only write to a socket if I'm in socket mode... + { + int nHeaderSize = OT_CMD_HEADER_SIZE; + + // TODO: REMOVE THIS. FOR TESTING ONLY (testing malformed headers, and headers without payloads...) + if (buf[0] == '2') { + nHeaderSize += 3; + } + + for (nwritten = 0; nwritten < nHeaderSize; nwritten += err) + { + err = SFSocketWrite(m_pSocket, theCMD.buf + nwritten, nHeaderSize - nwritten); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 is disonnect. error is error. >0 is bytes written. +#else + if (err <= 0) +#endif + break; + } + + int n0 = theCMD.buf[0], n1 = theCMD.buf[1], n2 = theCMD.buf[2], n3 = theCMD.buf[3], n4 = theCMD.buf[4], n5 = theCMD.buf[5], n6 = theCMD.buf[6]; + + OTLog::vOutput(4, "Sent: %d %d %d %d %d %d %d\n", n0, n1, n2, n3, n4, n5, n6); + } + // At this point, we have sent the header across the pipe. +} + + + diff --git a/testwallet/OTServerConnection.h b/testwallet/OTServerConnection.h new file mode 100644 index 000000000..7961a34f4 --- /dev/null +++ b/testwallet/OTServerConnection.h @@ -0,0 +1,255 @@ +/************************************************************************************ + * + * OTServerConnection.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#ifndef __OT_SERVERCONNECTION_H__ +#define __OT_SERVERCONNECTION_H__ + +extern "C" +{ +#include + +#include "SSL-Example/SFSocket.h" +} + +extern "C" +{ +#define TYPE_1_CMD_1 1 +#define TYPE_1_CMD_2 2 +#define TYPE_1_CMD_3 3 +#define TYPE_1_CMD_4 4 + +#define CMD_TYPE_1 1 + +#define OT_CMD_HEADER_SIZE 9 + +typedef unsigned char BYTE; +typedef unsigned short USHORT; + +union u_header +{ + BYTE buf[OT_CMD_HEADER_SIZE]; + struct { + BYTE type_id; // 1 byte + BYTE command_id; // 1 byte + BYTE filler[2]; // 2 extra bytes here so the size begins on a 4-byte boundary + uint32_t size; // 4 bytes to describe size of payload + BYTE checksum; // 1 byte + } fields; // total of 9 bytes +}; + +} + + +class OTMessage; +class OTEnvelope; + +#include "OTMessageBuffer.h" +#include "OTPseudonym.h" +#include "OTServerContract.h" + + + +//----------------------------------------------------------------- +// CALLBACK +// +// Here's the callback, for processing out messages via different +// transport schemes (like RPC). Ultimate I suppose any transport could work.... +// All it needs is the server contract and the envelope containing the message. +typedef void (*OT_CALLBACK_MSG)(OTServerContract & theServerContract, OTEnvelope & theEnvelope); + +//----------------------------------------------------------------- + +// Update: The actual connection information is now read out of the server contract!! +//#define HOSTNAME "localhost" +//#define PORT 7085 + +class OTPseudonym; +class OTAccount; +class OTWallet; +class OTString; +class OTClient; + +class OTServerConnection +{ + static void Initialize(); + static bool s_bInitialized; + + OTMessageBuffer m_listIn; + OTMessageBuffer m_listOut; + + SFSocket * m_pSocket; // For TCP / SSL mode. + + bool m_bFocused; // For RPC / HTTP mode. + OT_CALLBACK_MSG m_pCallback; // -------------------- + + OTPseudonym * m_pNym; + OTServerContract * m_pServerContract; + OTWallet * m_pWallet; + OTClient * m_pClient; + +public: + OTServerConnection(OTWallet & theWallet, OTClient & theClient); + OTServerConnection(OTWallet & theWallet, OTClient & theClient, SFSocket * pSock); + ~OTServerConnection(); + + bool GetServerID(OTIdentifier & theID); + + inline OTPseudonym * GetNym() { return m_pNym; } + inline OTServerContract * GetServerContract() { return m_pServerContract; } + inline OTWallet * GetWallet() { return m_pWallet; } + + inline bool IsConnected() { return ((NULL == m_pSocket)?false:true); } // for socket mode -- TCP / SSL + inline bool IsFocused() { return m_bFocused; } // for request/response mode -- RPC / HTTP + + // SetFocus() is for RPC / HTTP mode. + bool SetFocus(OTPseudonym & theNym, OTServerContract & theServerContract, OT_CALLBACK_MSG pCallback); + + // Connect() is for TCP / SSL mode. + bool Connect(OTPseudonym & theNym, OTServerContract & theServerContract, + OTString & strCA_FILE, OTString & strKEY_FILE, OTString & strKEY_PASSWORD); + + void OnServerResponseToGetRequestNumber(long lNewRequestNumber); + + void ProcessMessageOut(char *buf, int * pnExpectReply); + void ProcessMessageOut(OTMessage & theMessage); + + bool ProcessInBuffer(OTMessage & theServerReply); + bool ProcessReply(u_header & theCMD, OTMessage & theServerReply); + bool ProcessType1Cmd(u_header & theCMD, OTMessage & theServerReply); + + // Assuming we are connected, then we have the nym for signing and we + // have the connection for sending. + bool SignAndSend(OTMessage & theMessage); + +}; + +#endif // __OT_SERVERCONNECTION_H__ diff --git a/testwallet/OfferDataMarket.cs b/testwallet/OfferDataMarket.cs new file mode 100644 index 000000000..f75acf320 --- /dev/null +++ b/testwallet/OfferDataMarket.cs @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OfferDataMarket : Displayable { + private HandleRef swigCPtr; + + internal OfferDataMarket(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.OfferDataMarket_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OfferDataMarket obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OfferDataMarket() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OfferDataMarket(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.OfferDataMarket_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataMarket_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.OfferDataMarket_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataMarket_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price_per_scale { + set { + otapiPINVOKE.OfferDataMarket_price_per_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataMarket_price_per_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string available_assets { + set { + otapiPINVOKE.OfferDataMarket_available_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataMarket_available_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string minimum_increment { + set { + otapiPINVOKE.OfferDataMarket_minimum_increment_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataMarket_minimum_increment_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static OfferDataMarket ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.OfferDataMarket_ot_dynamic_cast(Storable.getCPtr(pObject)); + OfferDataMarket ret = (cPtr == IntPtr.Zero) ? null : new OfferDataMarket(cPtr, false); + return ret; + } + +} diff --git a/testwallet/OfferDataMarket.java b/testwallet/OfferDataMarket.java new file mode 100644 index 000000000..92f660d13 --- /dev/null +++ b/testwallet/OfferDataMarket.java @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OfferDataMarket extends Displayable { + private long swigCPtr; + + public OfferDataMarket(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.OfferDataMarket_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(OfferDataMarket obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OfferDataMarket(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } + + public void setGui_label(String value) { + otapiJNI.OfferDataMarket_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.OfferDataMarket_gui_label_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.OfferDataMarket_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.OfferDataMarket_transaction_id_get(swigCPtr, this); + } + + public void setPrice_per_scale(String value) { + otapiJNI.OfferDataMarket_price_per_scale_set(swigCPtr, this, value); + } + + public String getPrice_per_scale() { + return otapiJNI.OfferDataMarket_price_per_scale_get(swigCPtr, this); + } + + public void setAvailable_assets(String value) { + otapiJNI.OfferDataMarket_available_assets_set(swigCPtr, this, value); + } + + public String getAvailable_assets() { + return otapiJNI.OfferDataMarket_available_assets_get(swigCPtr, this); + } + + public void setMinimum_increment(String value) { + otapiJNI.OfferDataMarket_minimum_increment_set(swigCPtr, this, value); + } + + public String getMinimum_increment() { + return otapiJNI.OfferDataMarket_minimum_increment_get(swigCPtr, this); + } + + public static OfferDataMarket ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.OfferDataMarket_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new OfferDataMarket(cPtr, false); + } + +} diff --git a/testwallet/OfferDataNym.cs b/testwallet/OfferDataNym.cs new file mode 100644 index 000000000..866cefd6b --- /dev/null +++ b/testwallet/OfferDataNym.cs @@ -0,0 +1,250 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OfferDataNym : Displayable { + private HandleRef swigCPtr; + + internal OfferDataNym(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.OfferDataNym_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OfferDataNym obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OfferDataNym() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OfferDataNym(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.OfferDataNym_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string valid_from { + set { + otapiPINVOKE.OfferDataNym_valid_from_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_valid_from_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string valid_to { + set { + otapiPINVOKE.OfferDataNym_valid_to_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_valid_to_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.OfferDataNym_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string asset_type_id { + set { + otapiPINVOKE.OfferDataNym_asset_type_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_asset_type_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string asset_acct_id { + set { + otapiPINVOKE.OfferDataNym_asset_acct_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_asset_acct_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string currency_type_id { + set { + otapiPINVOKE.OfferDataNym_currency_type_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_currency_type_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string currency_acct_id { + set { + otapiPINVOKE.OfferDataNym_currency_acct_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_currency_acct_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public bool selling { + set { + otapiPINVOKE.OfferDataNym_selling_set(swigCPtr, value); + } + get { + bool ret = otapiPINVOKE.OfferDataNym_selling_get(swigCPtr); + return ret; + } + } + + public string scale { + set { + otapiPINVOKE.OfferDataNym_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price_per_scale { + set { + otapiPINVOKE.OfferDataNym_price_per_scale_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_price_per_scale_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.OfferDataNym_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string total_assets { + set { + otapiPINVOKE.OfferDataNym_total_assets_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_total_assets_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string finished_so_far { + set { + otapiPINVOKE.OfferDataNym_finished_so_far_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_finished_so_far_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string minimum_increment { + set { + otapiPINVOKE.OfferDataNym_minimum_increment_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_minimum_increment_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string stop_sign { + set { + otapiPINVOKE.OfferDataNym_stop_sign_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_stop_sign_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string stop_price { + set { + otapiPINVOKE.OfferDataNym_stop_price_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.OfferDataNym_stop_price_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static OfferDataNym ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.OfferDataNym_ot_dynamic_cast(Storable.getCPtr(pObject)); + OfferDataNym ret = (cPtr == IntPtr.Zero) ? null : new OfferDataNym(cPtr, false); + return ret; + } + +} diff --git a/testwallet/OfferDataNym.java b/testwallet/OfferDataNym.java new file mode 100644 index 000000000..c2726a662 --- /dev/null +++ b/testwallet/OfferDataNym.java @@ -0,0 +1,188 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OfferDataNym extends Displayable { + private long swigCPtr; + + public OfferDataNym(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.OfferDataNym_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(OfferDataNym obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OfferDataNym(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private OfferListNym containerRefOfferListNym; + // ---------------- + protected void addReference(OfferListNym theContainer) { // This is Java code + containerRefOfferListNym = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.OfferDataNym_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.OfferDataNym_gui_label_get(swigCPtr, this); + } + + public void setValid_from(String value) { + otapiJNI.OfferDataNym_valid_from_set(swigCPtr, this, value); + } + + public String getValid_from() { + return otapiJNI.OfferDataNym_valid_from_get(swigCPtr, this); + } + + public void setValid_to(String value) { + otapiJNI.OfferDataNym_valid_to_set(swigCPtr, this, value); + } + + public String getValid_to() { + return otapiJNI.OfferDataNym_valid_to_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.OfferDataNym_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.OfferDataNym_server_id_get(swigCPtr, this); + } + + public void setAsset_type_id(String value) { + otapiJNI.OfferDataNym_asset_type_id_set(swigCPtr, this, value); + } + + public String getAsset_type_id() { + return otapiJNI.OfferDataNym_asset_type_id_get(swigCPtr, this); + } + + public void setAsset_acct_id(String value) { + otapiJNI.OfferDataNym_asset_acct_id_set(swigCPtr, this, value); + } + + public String getAsset_acct_id() { + return otapiJNI.OfferDataNym_asset_acct_id_get(swigCPtr, this); + } + + public void setCurrency_type_id(String value) { + otapiJNI.OfferDataNym_currency_type_id_set(swigCPtr, this, value); + } + + public String getCurrency_type_id() { + return otapiJNI.OfferDataNym_currency_type_id_get(swigCPtr, this); + } + + public void setCurrency_acct_id(String value) { + otapiJNI.OfferDataNym_currency_acct_id_set(swigCPtr, this, value); + } + + public String getCurrency_acct_id() { + return otapiJNI.OfferDataNym_currency_acct_id_get(swigCPtr, this); + } + + public void setSelling(boolean value) { + otapiJNI.OfferDataNym_selling_set(swigCPtr, this, value); + } + + public boolean getSelling() { + return otapiJNI.OfferDataNym_selling_get(swigCPtr, this); + } + + public void setScale(String value) { + otapiJNI.OfferDataNym_scale_set(swigCPtr, this, value); + } + + public String getScale() { + return otapiJNI.OfferDataNym_scale_get(swigCPtr, this); + } + + public void setPrice_per_scale(String value) { + otapiJNI.OfferDataNym_price_per_scale_set(swigCPtr, this, value); + } + + public String getPrice_per_scale() { + return otapiJNI.OfferDataNym_price_per_scale_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.OfferDataNym_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.OfferDataNym_transaction_id_get(swigCPtr, this); + } + + public void setTotal_assets(String value) { + otapiJNI.OfferDataNym_total_assets_set(swigCPtr, this, value); + } + + public String getTotal_assets() { + return otapiJNI.OfferDataNym_total_assets_get(swigCPtr, this); + } + + public void setFinished_so_far(String value) { + otapiJNI.OfferDataNym_finished_so_far_set(swigCPtr, this, value); + } + + public String getFinished_so_far() { + return otapiJNI.OfferDataNym_finished_so_far_get(swigCPtr, this); + } + + public void setMinimum_increment(String value) { + otapiJNI.OfferDataNym_minimum_increment_set(swigCPtr, this, value); + } + + public String getMinimum_increment() { + return otapiJNI.OfferDataNym_minimum_increment_get(swigCPtr, this); + } + + public void setStop_sign(String value) { + otapiJNI.OfferDataNym_stop_sign_set(swigCPtr, this, value); + } + + public String getStop_sign() { + return otapiJNI.OfferDataNym_stop_sign_get(swigCPtr, this); + } + + public void setStop_price(String value) { + otapiJNI.OfferDataNym_stop_price_set(swigCPtr, this, value); + } + + public String getStop_price() { + return otapiJNI.OfferDataNym_stop_price_get(swigCPtr, this); + } + + public static OfferDataNym ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.OfferDataNym_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new OfferDataNym(cPtr, false); + } + +} diff --git a/testwallet/OfferListMarket.cs b/testwallet/OfferListMarket.cs new file mode 100644 index 000000000..e8f596bde --- /dev/null +++ b/testwallet/OfferListMarket.cs @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OfferListMarket : Storable { + private HandleRef swigCPtr; + + internal OfferListMarket(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.OfferListMarket_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OfferListMarket obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OfferListMarket() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OfferListMarket(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetBidDataCount() { + uint ret = otapiPINVOKE.OfferListMarket_GetBidDataCount(swigCPtr); + return ret; + } + + public BidData GetBidData(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.OfferListMarket_GetBidData(swigCPtr, nIndex); + BidData ret = (cPtr == IntPtr.Zero) ? null : new BidData(cPtr, false); + return ret; + } + + public bool RemoveBidData(uint nIndexBidData) { + bool ret = otapiPINVOKE.OfferListMarket_RemoveBidData(swigCPtr, nIndexBidData); + return ret; + } + + public bool AddBidData(BidData disownObject) { + bool ret = otapiPINVOKE.OfferListMarket_AddBidData(swigCPtr, BidData.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public uint GetAskDataCount() { + uint ret = otapiPINVOKE.OfferListMarket_GetAskDataCount(swigCPtr); + return ret; + } + + public AskData GetAskData(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.OfferListMarket_GetAskData(swigCPtr, nIndex); + AskData ret = (cPtr == IntPtr.Zero) ? null : new AskData(cPtr, false); + return ret; + } + + public bool RemoveAskData(uint nIndexAskData) { + bool ret = otapiPINVOKE.OfferListMarket_RemoveAskData(swigCPtr, nIndexAskData); + return ret; + } + + public bool AddAskData(AskData disownObject) { + bool ret = otapiPINVOKE.OfferListMarket_AddAskData(swigCPtr, AskData.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static OfferListMarket ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.OfferListMarket_ot_dynamic_cast(Storable.getCPtr(pObject)); + OfferListMarket ret = (cPtr == IntPtr.Zero) ? null : new OfferListMarket(cPtr, false); + return ret; + } + +} diff --git a/testwallet/OfferListMarket.java b/testwallet/OfferListMarket.java new file mode 100644 index 000000000..04cbe96ea --- /dev/null +++ b/testwallet/OfferListMarket.java @@ -0,0 +1,196 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OfferListMarket extends Storable { + private long swigCPtr; + + public OfferListMarket(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.OfferListMarket_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(OfferListMarket obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OfferListMarket(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefBidData(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + BidData refActualElement = GetBidData(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BidData)) + continue; + + BidData tempRef = (BidData)(theObject); + + if ((BidData.getCPtr(tempRef) == BidData.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefBidData(BidData element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BidData)) + continue; + + BidData tempRef = (BidData)(theObject); + + if ((BidData.getCPtr(tempRef) == BidData.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + BidData tempLocalRef = element; + elementList.add(tempLocalRef); + return BidData.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefAskData(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + AskData refActualElement = GetAskData(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof AskData)) + continue; + + AskData tempRef = (AskData)(theObject); + + if ((AskData.getCPtr(tempRef) == AskData.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefAskData(AskData element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof AskData)) + continue; + + AskData tempRef = (AskData)(theObject); + + if ((AskData.getCPtr(tempRef) == AskData.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + AskData tempLocalRef = element; + elementList.add(tempLocalRef); + return AskData.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetBidDataCount() { return otapiJNI.OfferListMarket_GetBidDataCount(swigCPtr, this); } + + public BidData GetBidData(long nIndex) { + long cPtr = otapiJNI.OfferListMarket_GetBidData(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new BidData(cPtr, false); + } + + public boolean RemoveBidData(long nIndexBidData) { + return otapiJNI.OfferListMarket_RemoveBidData(swigCPtr, this, removeRefBidData(nIndexBidData)); + } + + public boolean AddBidData(BidData disownObject) { + return otapiJNI.OfferListMarket_AddBidData(swigCPtr, this, BidData.getCPtr(disownObject), disownObject); + } + + public long GetAskDataCount() { return otapiJNI.OfferListMarket_GetAskDataCount(swigCPtr, this); } + + public AskData GetAskData(long nIndex) { + long cPtr = otapiJNI.OfferListMarket_GetAskData(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new AskData(cPtr, false); + } + + public boolean RemoveAskData(long nIndexAskData) { + return otapiJNI.OfferListMarket_RemoveAskData(swigCPtr, this, removeRefAskData(nIndexAskData)); + } + + public boolean AddAskData(AskData disownObject) { + return otapiJNI.OfferListMarket_AddAskData(swigCPtr, this, AskData.getCPtr(disownObject), disownObject); + } + + public static OfferListMarket ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.OfferListMarket_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new OfferListMarket(cPtr, false); + } + +} diff --git a/testwallet/OfferListNym.cs b/testwallet/OfferListNym.cs new file mode 100644 index 000000000..d7f4d73b3 --- /dev/null +++ b/testwallet/OfferListNym.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class OfferListNym : Storable { + private HandleRef swigCPtr; + + internal OfferListNym(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.OfferListNym_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(OfferListNym obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~OfferListNym() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_OfferListNym(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetOfferDataNymCount() { + uint ret = otapiPINVOKE.OfferListNym_GetOfferDataNymCount(swigCPtr); + return ret; + } + + public OfferDataNym GetOfferDataNym(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.OfferListNym_GetOfferDataNym(swigCPtr, nIndex); + OfferDataNym ret = (cPtr == IntPtr.Zero) ? null : new OfferDataNym(cPtr, false); + return ret; + } + + public bool RemoveOfferDataNym(uint nIndexOfferDataNym) { + bool ret = otapiPINVOKE.OfferListNym_RemoveOfferDataNym(swigCPtr, nIndexOfferDataNym); + return ret; + } + + public bool AddOfferDataNym(OfferDataNym disownObject) { + bool ret = otapiPINVOKE.OfferListNym_AddOfferDataNym(swigCPtr, OfferDataNym.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static OfferListNym ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.OfferListNym_ot_dynamic_cast(Storable.getCPtr(pObject)); + OfferListNym ret = (cPtr == IntPtr.Zero) ? null : new OfferListNym(cPtr, false); + return ret; + } + +} diff --git a/testwallet/OfferListNym.java b/testwallet/OfferListNym.java new file mode 100644 index 000000000..d7e103a58 --- /dev/null +++ b/testwallet/OfferListNym.java @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class OfferListNym extends Storable { + private long swigCPtr; + + public OfferListNym(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.OfferListNym_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(OfferListNym obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_OfferListNym(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefOfferDataNym(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + OfferDataNym refActualElement = GetOfferDataNym(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof OfferDataNym)) + continue; + + OfferDataNym tempRef = (OfferDataNym)(theObject); + + if ((OfferDataNym.getCPtr(tempRef) == OfferDataNym.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefOfferDataNym(OfferDataNym element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof OfferDataNym)) + continue; + + OfferDataNym tempRef = (OfferDataNym)(theObject); + + if ((OfferDataNym.getCPtr(tempRef) == OfferDataNym.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + OfferDataNym tempLocalRef = element; + elementList.add(tempLocalRef); + return OfferDataNym.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetOfferDataNymCount() { return otapiJNI.OfferListNym_GetOfferDataNymCount(swigCPtr, this); } + + public OfferDataNym GetOfferDataNym(long nIndex) { + long cPtr = otapiJNI.OfferListNym_GetOfferDataNym(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new OfferDataNym(cPtr, false); + } + + public boolean RemoveOfferDataNym(long nIndexOfferDataNym) { + return otapiJNI.OfferListNym_RemoveOfferDataNym(swigCPtr, this, removeRefOfferDataNym(nIndexOfferDataNym)); + } + + public boolean AddOfferDataNym(OfferDataNym disownObject) { + return otapiJNI.OfferListNym_AddOfferDataNym(swigCPtr, this, OfferDataNym.getCPtr(disownObject), disownObject); + } + + public static OfferListNym ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.OfferListNym_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new OfferListNym(cPtr, false); + } + +} diff --git a/testwallet/OpenTransactions.cpp b/testwallet/OpenTransactions.cpp new file mode 100644 index 000000000..7d5d62e23 --- /dev/null +++ b/testwallet/OpenTransactions.cpp @@ -0,0 +1,7384 @@ +/***************************************************************** + * + * OpenTransactions.cpp (a high-level API) + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + +#include +#include + +#if defined (OT_ZMQ_MODE) +#include +#endif + +extern "C" +{ +#ifdef _WIN32 +//#include +#else +#include +#endif + +#include "SSL-Example/SFSocket.h" +} + + +#include "SimpleIni.h" + + +// ----------------------- + +#include "OTString.h" + +#include "OTStorage.h" + +#include "OTPseudonym.h" + +#include "OTClient.h" +#include "OTServerConnection.h" +#include "OTServerContract.h" +#include "OTMessage.h" +#include "OTWallet.h" +#include "OTEnvelope.h" +#include "OTCheque.h" +#include "OTPaymentPlan.h" +#include "OTAccount.h" +#include "OTTransaction.h" +#include "OTMint.h" +#include "OTToken.h" +#include "OTPurse.h" +#include "OTLedger.h" +#include "OTLog.h" +#include "OTMessage.h" +#include "OTMessageBuffer.h" +#include "OTBasket.h" +#include "OTOffer.h" +#include "OTTrade.h" +#include "OTMarket.h" + +#include "OpenTransactions.h" + + +// used for testing. +OTPseudonym *g_pTemporaryNym=NULL; + + +extern OT_API g_OT_API; + +// ------------------------------------------------------------------------- +// When the server and client (this API being a client) are built in XmlRpc/HTTP +// mode, then a callback must be provided for passing the messages back and forth +// with the server. (Provided below.) +// +// IMPORTANT: If you ever wanted to use a different transport mechanism, it would +// be as easy as adding your own version of this callback function, but having it +// use your own transport mechanism instead of the xmlrpc in this example. +// Of course, the server would also have to support this transport layer... + +#if defined(OT_ZMQ_MODE) + +// If you build in tcp/ssl mode, this file will build even if you don't have this library. +// But if you build in xml/rpc/http mode, +//#ifdef _WIN32 +//#include "timxmlrpc.h" // XmlRpcC4Win +//#else +//#include "XmlRpc.h" // xmlrpcpp +//using namespace XmlRpc; +//#endif + +// The Callback so OT can give us messages to send using our xmlrpc transport. +// Whenever OT needs to pop a message on over to the server, it calls this so we +// can do the work here. +// +//typedef bool (*OT_CALLBACK_MSG)(OTPayload & thePayload); +// + +zmq::context_t OT_API::s_ZMQ_Context(1); + + +void OT_API::TransportCallback(OTServerContract & theServerContract, OTEnvelope & theEnvelope) +{ + int nServerPort = 0; + OTString strServerHostname; + + OT_ASSERT_MSG((NULL != g_OT_API.GetClient()) && + (NULL != g_OT_API.GetClient()->m_pConnection) && + (NULL != g_OT_API.GetClient()->m_pConnection->GetNym()), + "OT_API::TransportCallback: Important things are NULL that shouldn't be."); + + if (false == theServerContract.GetConnectInfo(strServerHostname, nServerPort)) + { + OTLog::Error("Failed retrieving connection info from server contract.\n"); + return; + } + + OTASCIIArmor ascEnvelope(theEnvelope); + + if (ascEnvelope.Exists()) + { + //  Prepare our context and socket + zmq::context_t & context = s_ZMQ_Context; + zmq::socket_t socket(context, ZMQ_REQ); + + OTString strConnectPath; strConnectPath.Format("tcp://%s:%d", strServerHostname.Get(), nServerPort); + socket.connect(strConnectPath.Get()); + +// OTPayload thePayload; +// thePayload.SetEnvelope(theEnvelope); + + zmq::message_t request(ascEnvelope.GetLength()); + memcpy((void*)request.data(), ascEnvelope.Get(), ascEnvelope.GetLength()); + + int nSendTries = 0; + bool bSuccessSending = false; + + // If failure sending, re-tries 5 times, with 200 ms delay between each. (Maximum of 1 second.) + // + while ((nSendTries++ < 5) && (false == (bSuccessSending = socket.send(request, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(200); // todo stop hardcoding. (For now I needed non-blocking so this is much better than before.) + + + // Here's our connection... + /* +#if defined (linux) + XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort, 0); // serverhost, port. +#elif defined (_WIN32) + XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort, "fellowtraveler"); // serverhost, port, value that crashes if NULL. +#else + XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort); // serverhost, port. +#endif + */ + // ----------------------------------------------------------- + // + // Call the OT_XML_RPC method (thus passing the message to the server.) + // +// XmlRpcValue oneArg, result; // oneArg contains the outgoing message; result will contain the server reply. +// oneArg[0] = ascEnvelope.Get(); // Here's where I set the envelope string, as the only argument for the rpc call. + +// if (theXmlRpcClient.execute("OT_XML_RPC", oneArg, result)) // The actual call to the server. (Hope my envelope string isn't too long for this...) + + if (bSuccessSending) + { + //  Get the reply. + zmq::message_t reply; + + int nReceiveTries = 0; + bool bSuccessReceiving = false; + + // If failure receiving, re-tries 25 times, with 200 ms delay between each. (Maximum of 5 seconds.) + // + while ((nReceiveTries++ < 25) && (false == (bSuccessReceiving = socket.recv(&reply, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(200); // todo stop hardcoding. (And probably change how I send/receive, but for now I needed non-blocking...) + +// std::string str_Result; +// str_Result.reserve(reply.size()); +// str_Result.append(static_cast(reply.data()), reply.size()); + + if (bSuccessReceiving) + { + OTASCIIArmor ascServerReply; + ascServerReply.MemSet(static_cast(reply.data()), reply.size()); + +// OTPayload theRecvPayload; +// theRecvPayload.SetPayloadSize(reply.size()); +// memcpy((void*)theRecvPayload.GetPayloadPointer(), reply.data(), reply.size()); + + // -------------------------- + + OTString strServerReply; + OTEnvelope theServerEnvelope; + + if (theServerEnvelope.SetAsciiArmoredData(ascServerReply)) + { + bool bOpened = theServerEnvelope.Open(*(g_OT_API.GetClient()->m_pConnection->GetNym()), strServerReply); + + OTMessage * pServerReply = new OTMessage; + OT_ASSERT_MSG(NULL != pServerReply, "Error allocating memory in the OT API."); + + if (bOpened && strServerReply.Exists() && pServerReply->LoadContractFromString(strServerReply)) + { + // Now the fully-loaded message object (from the server, this time) can be processed by the OT library... + g_OT_API.GetClient()->ProcessServerReply(*pServerReply); // the Client takes ownership and will handle cleanup. + } + else + { + delete pServerReply; + pServerReply = NULL; + OTLog::Error("Error loading server reply from string after call to 'OT_API::TransportCallback'\n"); + } + } + } + else + { + OTLog::Error("Failed trying to receive message from server.\n"); + } + } + else + { + OTLog::Error("Failed trying to send message to server.\n"); + } + } +} + +#endif // (OT_ZMQ_MODE) +// ------------------------------------------------------------------------- + + + + +// The API begins here... + + +OT_API::OT_API() : m_pWallet(NULL), m_pClient(NULL), m_bInitialized(false), + m_pstrStoragePath(NULL), m_pstrWalletFilename(NULL) +{ + +} + +OT_API::~OT_API() +{ + if (NULL != m_pWallet) + delete m_pWallet; + if (NULL != m_pClient) + delete m_pClient; + if (NULL != m_pstrStoragePath) + delete m_pstrStoragePath; + if (NULL != m_pstrWalletFilename) + delete m_pstrWalletFilename; + + m_pWallet = NULL; + m_pClient = NULL; + + m_pstrStoragePath = NULL; + m_pstrWalletFilename = NULL; +} + + +// Load the configuration file. +// +bool OT_API::LoadConfigFile(const OTString & strMainPath) +{ + OTString strFilepath; + strFilepath.Format("%s%s%s%s%s", OTLog::Path(), OTLog::PathSeparator(), "..", + OTLog::PathSeparator(), "client.cfg"); // todo: stop hardcoding. + + { + CSimpleIniA ini; // We're assuming this file is on the path. + SI_Error rc = ini.LoadFile(strFilepath.Get()); + + if (rc >=0) + { + // --------------------------------------------- + // LOGFILE + { + // Read a value from file: (category, key ) + const char * pVal1 = ini.GetValue("logging", "logfile_path"); // todo stop hardcoding. + + if (NULL != pVal1) + { + OTString strOutput; + + OTLog::TransformFilePath(pVal1, strOutput); + + if (strOutput.Exists()) + { + OTLog::vOutput(0, "Setting logfile to: %s\n", strOutput.Get()); + OTLog::SetLogfile(strOutput.Get()); + } + } + else + OTLog::vOutput(0, "Current logfile is: %s\n", OTLog::Logfile()); + // --------------------------------------------- + // LOG LEVEL + // + const char * pVal2 = ini.GetValue("logging", "log_level"); // todo stop hardcoding. + + if (NULL != pVal2) + { + OTLog::vOutput(0, "Setting log level to: %d\n", atoi(pVal2)); + OTLog::SetLogLevel(atoi(pVal2)); + } + else + OTLog::vOutput(0, "Current log level is: %d\n", OTLog::GetLogLevel()); + } + // --------------------------------------------- + // LATENCY (SENDING) + { + const char * pVal = ini.GetValue("latency", "send_no_tries"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency send_no_tries to: %d\n", atoi(pVal)); + OTLog::SetLatencySendNoTries(atoi(pVal)); + } + } + { + const char * pVal = ini.GetValue("latency", "send_ms"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency send_ms to: %d\n", atoi(pVal)); + OTLog::SetLatencySendMs(atoi(pVal)); + } + } + // ------------------------------------------------ + // LATENCY (RECEIVING) + { + const char * pVal = ini.GetValue("latency", "receive_no_tries"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency receive_no_tries to: %d\n", atoi(pVal)); + OTLog::SetLatencyReceiveNoTries(atoi(pVal)); + } + } + { + const char * pVal = ini.GetValue("latency", "receive_ms"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency receive_ms to: %d\n", atoi(pVal)); + OTLog::SetLatencyReceiveMs(atoi(pVal)); + } + } + // ---------------------------------------------------------------- + } + else + OTLog::vError("Failed loading the ini file: %s\n", strFilepath.Get()); + } + + return true; +} + + + +// Call this once per instance of OT_API. +bool OT_API::Init(OTString & strClientPath) +{ + // TODO: Main path needs to be stored in OT_API global, not OTLog static. + // This way, you can have multiple instances of OT_API, + // Each with their own main path. This is necessary. + // Now that the OT_API class exists might be time to take + // folders away from OTLog and move it all over. Ugh. + // OR!! Maybe just code a mechanism so OTLog tracks the instances of OT_API. + + OT_ASSERT_MSG(strClientPath.Exists(), "Empty path passed to OT_API::Init"); + + OT_ASSERT_MSG(false == m_bInitialized, "OTAPI was already initialized, please do not call it twice."); + // --------------------------------------- + + OTString strPATH_OUTPUT; + + OTLog::TransformFilePath(strClientPath.Get(), strPATH_OUTPUT); + + + // At some point, remove this, since each instance of OT API should eventually store its OWN path. + OTLog::SetMainPath(strPATH_OUTPUT.Get()); // This currently does NOT support multiple instances of OT_API. :-( + // ------------------------------------- + + LoadConfigFile(strPATH_OUTPUT); + + // ------------------------------------- + + m_pWallet = new OTWallet; + m_pClient = new OTClient; + + m_pstrStoragePath = new OTString; + m_pstrWalletFilename = new OTString; + + OT_ASSERT_MSG(NULL != m_pWallet, "Error allocating memory for m_pWallet in OT_API::Init"); + OT_ASSERT_MSG(NULL != m_pClient, "Error allocating memory for m_pClient in OT_API::Init"); + OT_ASSERT_MSG(NULL != m_pstrStoragePath, "Error allocating memory for m_pstrStoragePath in OT_API::Init"); + OT_ASSERT_MSG(NULL != m_pstrWalletFilename, "Error allocating memory for m_pstrWalletFilename in OT_API::Init"); + + // Keep this though. + SetStoragePath(strPATH_OUTPUT); // sets m_pstrStoragePath + + m_bInitialized = m_pClient->InitClient(*m_pWallet); + + if (m_bInitialized) + { + std::string strPath = strPATH_OUTPUT.Get(); + + // This way, everywhere else I can use the default storage context (for now) and it will work + // everywhere I put it. (Because it's now set up...) + bool bDefaultStore = OTDB::InitDefaultStorage(OTDB_DEFAULT_STORAGE, OTDB_DEFAULT_PACKER, strPath); // notice no wallet filename is passed here... InitDefaultStorage() will thus get called again... + + if (bDefaultStore) + return true; + } + + return false; +} + + + +// Call this once per run of the software. Static. +// TODO: add a boolean variable to enforce this, and then +// just call it from the above function. Currently this only +// even works because the below function is empty, and there +// may be Windows problems in the TCP version for the API builds. +// (No big deal -- none of them will use TCP anyway...) +// +bool OT_API::InitOTAPI() +{ +#ifdef _WIN32 + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD( 2, 2 ); + int err = WSAStartup( wVersionRequested, &wsaData ); +#endif + + // TODO: probably put all the OpenSSL init stuff here now. We'll see. + + // TODO in the case of Windows, figure err into this return val somehow. + return true; +} + + +// "wallet.xml" (path set above.) +bool OT_API::LoadWallet(const OTString & strFilename) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + OT_ASSERT(strFilename.Exists()); + OT_ASSERT(NULL != m_pWallet); + + // ---------------------------- + // Grab the old name for safe keeping.. + + OTString strOldName; + const char * szOldFilename = GetWalletFilename(); + + if (NULL != szOldFilename) + strOldName.Set(szOldFilename); + else + { + strOldName.Set("wallet.xml"); // todo stop hardcoding this DEFAULT VALUE. + } + + // ---------------------------- + // set to new name. + + SetWalletFilename(strFilename); + + // ------------------------------------------ + + std::string strDataFolderPath = GetStoragePath(); + std::string strWalletFilename = GetWalletFilename(); + + // This way, everywhere else I can use the default storage context (for now) and it will work + // everywhere I put it. (Because it's now set up...) + bool bSuccessInitDefault = OTDB::InitDefaultStorage(OTDB_DEFAULT_STORAGE, OTDB_DEFAULT_PACKER, strDataFolderPath, strWalletFilename); + + + bool bSuccess = m_pWallet->LoadWallet(GetWalletFilename()); + + if (false == bSuccess) + SetWalletFilename(strOldName); + + return bSuccess; +} + + +int OT_API::GetNymCount() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetNymCount(); +} + +int OT_API::GetServerCount() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetServerCount(); +} + +int OT_API::GetAssetTypeCount() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetAssetTypeCount(); +} + +int OT_API::GetAccountCount() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetAccountCount(); +} + +bool OT_API::GetNym(int iIndex, OTIdentifier & NYM_ID, OTString & NYM_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetNym(iIndex, NYM_ID, NYM_NAME); +} + +bool OT_API::GetServer(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetServer(iIndex, THE_ID, THE_NAME); +} + +bool OT_API::GetAssetType(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetAssetType(iIndex, THE_ID, THE_NAME); +} + +bool OT_API::GetAccount(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + return m_pWallet->GetAccount(iIndex, THE_ID, THE_NAME); +} + +// ---------------------------------------------------------- + + +OTPseudonym * OT_API::GetNym(const OTIdentifier & NYM_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetNymByID(NYM_ID); + + return NULL; +} + +OTServerContract * OT_API::GetServer(const OTIdentifier & THE_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetServerContract(THE_ID); + + return NULL; +} + +OTAssetContract * OT_API::GetAssetType(const OTIdentifier & THE_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetAssetContract(THE_ID); + + return NULL; +} + +OTAccount * OT_API::GetAccount(const OTIdentifier & THE_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetAccount(THE_ID); + + return NULL; +} + +// --------------------------------------------------------------------------- + +OTPseudonym * OT_API::GetNymByIDPartialMatch(const std::string PARTIAL_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetNymByIDPartialMatch(PARTIAL_ID); + + return NULL; +} + +OTServerContract * OT_API::GetServerContractPartialMatch(const std::string PARTIAL_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetServerContractPartialMatch(PARTIAL_ID); + + return NULL; +} + +OTAssetContract * OT_API::GetAssetContractPartialMatch(const std::string PARTIAL_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetAssetContractPartialMatch(PARTIAL_ID); + + return NULL; +} + +OTAccount * OT_API::GetAccountPartialMatch(const std::string PARTIAL_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL != pWallet) + return pWallet->GetAccountPartialMatch(PARTIAL_ID); + + return NULL; +} + + +// returns a new nym (with key pair) and files created. (Or NULL.) +// +// CALLER is responsible to delete! +// +OTPseudonym * OT_API::CreateNym() +{ + OTPseudonym * pNym = new OTPseudonym; + + OT_ASSERT(NULL != pNym); + + if (false == pNym->GenerateNym()) + { + delete pNym; + return NULL; + } + + return pNym; +} + + + + + +// The Asset Type's Name is basically just a client-side label. +// This function lets you change it. +// +// Returns success, true or false. +// +bool OT_API::SetAssetType_Name(const OTIdentifier & ASSET_ID, + const OTString & STR_NEW_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTAssetContract * pContract = GetAssetType(ASSET_ID); + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "No wallet loaded.\n"); + } + else if (NULL == pContract) + { + OTString strOutput(ASSET_ID); + OTLog::vOutput(0, "No asset contract found with the ID: %s\n", strOutput.Get()); + } + // Might want to put some more data validation on the name? + else if (!STR_NEW_NAME.Exists()) + { + OTLog::vOutput(0, "Bad name: %s\n", STR_NEW_NAME.Get()); + } + else + { + pContract->SetName(STR_NEW_NAME); + + return pWallet->SaveWallet(); // Only cause the name is actually stored here. + } + + return false; +} + + + +// The Server's Name is basically just a client-side label. +// This function lets you change it. +// +// Returns success, true or false. +// +bool OT_API::SetServer_Name(const OTIdentifier & SERVER_ID, + const OTString & STR_NEW_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTServerContract * pContract = GetServer(SERVER_ID); + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "No wallet loaded.\n"); + } + else if (NULL == pContract) + { + OTString strOutput(SERVER_ID); + OTLog::vOutput(0, "No server contract found with the ID: %s\n", strOutput.Get()); + } + // Might want to put some more data validation on the name? + else if (!STR_NEW_NAME.Exists()) + { + OTLog::vOutput(0, "Bad name: %s\n", STR_NEW_NAME.Get()); + } + else + { + pContract->SetName(STR_NEW_NAME); + + return pWallet->SaveWallet(); // Only cause the name is actually stored here. + } + + return false; +} + + + +bool OT_API::IsNym_RegisteredAtServer(const OTIdentifier & NYM_ID, const OTIdentifier & SERVER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTPseudonym * pNym = GetNym(NYM_ID); + + if (NULL == pNym) + { + OTString strOutput(NYM_ID); + OTLog::vOutput(0, "No user found with Nym ID: %s\n", strOutput.Get()); + } + else + { + const OTString strServerID(SERVER_ID); + + return pNym->IsRegisteredAtServer(strServerID); + } + + return false; +} + + + +// The Nym's Name is basically just a client-side label. +// This function lets you change it. +// +// Returns success, true or false. +// +bool OT_API::SetNym_Name(const OTIdentifier & NYM_ID, + const OTIdentifier & SIGNER_NYM_ID, + const OTString & NYM_NEW_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTPseudonym * pNym = GetNym(NYM_ID); + OTPseudonym * pSignerNym = GetNym(SIGNER_NYM_ID); + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "No wallet loaded.\n"); + } + else if (NULL == pNym) + { + OTString strOutput(NYM_ID); + OTLog::vOutput(0, "No user found with Nym ID: %s\n", strOutput.Get()); + } + else if (NULL == pSignerNym) + { + OTString strOutput(SIGNER_NYM_ID); + OTLog::vOutput(0, "No user found with Signer Nym ID: %s\n", + strOutput.Get()); + } + // Might want to put some more data validation on the name? + else if (!NYM_NEW_NAME.Exists()) + { + OTLog::vOutput(0, "Bad name: %s\n", NYM_NEW_NAME.Get()); + } + else + { + OTString strOldName(pNym->GetNymName()); // just in case. + + pNym->SetNymName(NYM_NEW_NAME); + + if (pNym->SaveSignedNymfile(*pSignerNym)) + { + return pWallet->SaveWallet(); // Only cause the nym's name is stored here, too. + } + else + pNym->SetNymName(strOldName); + } + + return false; +} + + +// The Asset Account's Name is basically just a client-side label. +// This function lets you change it. +// +// Returns success, true or false. +// +bool OT_API::SetAccount_Name(const OTIdentifier & ACCT_ID, + const OTIdentifier & SIGNER_NYM_ID, + const OTString & ACCT_NEW_NAME) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTAccount * pAccount = GetAccount(ACCT_ID); + OTPseudonym * pSignerNym = GetNym(SIGNER_NYM_ID); + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "No wallet loaded.\n"); + } + else if (NULL == pAccount) + { + OTString strOutput(ACCT_ID); + OTLog::vOutput(0, "No asset account found with ID: %s\n", strOutput.Get()); + } + else if (NULL == pSignerNym) + { + OTString strOutput(SIGNER_NYM_ID); + OTLog::vOutput(0, "No user found with Signer Nym ID: %s\n", strOutput.Get()); + } + else if (!pAccount->VerifyAccount(*pSignerNym)) + { + OTString strOutput1(SIGNER_NYM_ID); + OTString strOutput2(ACCT_ID); + OTLog::vOutput(0, "The signing nym fails to verify on the account.\n" + " Nym: %s\n Account: %s\n", strOutput1.Get(), strOutput2.Get()); + } + else if (!ACCT_NEW_NAME.Exists()) // Any other validation to do on the name? + { + OTLog::vOutput(0, "Bad name attempted change.(asset account): %s\n", ACCT_NEW_NAME.Get()); + } + else + { + OTLog::Output(0, "Saving updated account file to disk...\n"); + + pAccount->SetName(ACCT_NEW_NAME); + pAccount->ReleaseSignatures(); + + if (pAccount->SignContract(*pSignerNym)) + { + if (pAccount->SaveAccount()) + return pWallet->SaveWallet(); // Only cause the account's name is stored here, too. + } + } + + return false; +} + + + + +// CALLER is responsible to delete this Nym! +// +OTPseudonym * OT_API::LoadPublicNym(const OTIdentifier & NYM_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTPseudonym * pNym = new OTPseudonym(NYM_ID); + + OT_ASSERT_MSG(NULL != pNym, "Error allocating memory in the OT API."); + + // First load the public key + if (false == pNym->LoadPublicKey()) + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure loading Nym public key in OT_API::LoadPublicNym: %s\n", + strNymID.Get()); + } + else if (false == pNym->VerifyPseudonym()) + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure verifying Nym public key in OT_API::LoadPublicNym: %s\n", + strNymID.Get()); + } + else if (false == pNym->LoadSignedNymfile(*pNym)) + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure loading signed NymFile in OT_API::LoadPublicNym: %s\n", + strNymID.Get()); + } + else // success + { + return pNym; + } + + delete pNym; + pNym = NULL; + + return NULL; +} + + +// CALLER is responsible to delete the Nym that's returned here! +// +OTPseudonym * OT_API::LoadPrivateNym(const OTIdentifier & NYM_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTPseudonym * pNym = new OTPseudonym(NYM_ID); + + OT_ASSERT_MSG(NULL != pNym, "Error allocating memory in the OT API."); + + if (pNym->Loadx509CertAndPrivateKey()) + { + if (pNym->VerifyPseudonym()) + { + if (pNym->LoadSignedNymfile(*pNym)) + { + return pNym; + } + else + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure calling LoadSignedNymfile in OT_API::LoadPrivateNym: %s\n", + strNymID.Get()); + } + } + else + { + OTString strNymID(NYM_ID); + OTLog::vError("Failure verifying Nym public key in OT_API::LoadPrivateNym: %s\n", + strNymID.Get()); + } + } + else + { + // Error loading x509CertAndPrivateKey. + OTString strNymID(NYM_ID); + OTLog::vError("Failure calling Loadx509CertAndPrivateKey in OT_API::LoadPrivateNym: %s\n", + strNymID.Get()); + } + + delete pNym; + pNym = NULL; + + return NULL; +} + + + +// WRITE CHEQUE +// +// Returns an OTCheque pointer, or NULL. +// (Caller responsible to delete.) +// +OTCheque * OT_API::WriteCheque(const OTIdentifier & SERVER_ID, + const long & CHEQUE_AMOUNT, + const time_t & VALID_FROM, + const time_t & VALID_TO, + const OTIdentifier & SENDER_ACCT_ID, + const OTIdentifier & SENDER_USER_ID, + const OTString & CHEQUE_MEMO, + const OTIdentifier * pRECIPIENT_USER_ID/*=NULL*/) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(SENDER_USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(SENDER_USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return NULL; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(SENDER_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(SENDER_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "Writing a cheque, server ID passed in didn't match the one on the account.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "User is not the owner of the account / tried to write a cheque.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "Bad signature or Account ID / tried to write a cheque.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + pWallet->AddAccount(*pAccount); + + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::WriteCheque\n"); + return NULL; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "User is not the owner of the account / tried to write a cheque.\n"); + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "Bad signature or Account ID / tried to write a cheque.\n"); + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + // pAccount is good, and no need to clean it up. + // ----------------------------------------------------- + + // To write a cheque, we need to burn one of our transaction numbers. (Presumably the wallet + // is also storing a couple of these, since they are needed to perform any transaction.) + // + // I don't have to contact the server to write a cheque -- as long as I already have a transaction + // number I can use to write it with. (Otherwise I'd have to ask the server to send me one first.) + // + OTString strServerID(SERVER_ID); + long lTransactionNumber=0; // Notice I use the server ID on the ACCOUNT. + + if (false == pNym->GetNextTransactionNum(*pNym, strServerID, lTransactionNumber)) + { + OTLog::Output(0, "User attempted to write a cheque, but had no transaction numbers.\n"); + return NULL; + } + + // At this point, I know that lTransactionNumber contains one I can use. + + // ----------------------------------------------------- + + OTCheque * pCheque = new OTCheque(pAccount->GetRealServerID(), + pAccount->GetAssetTypeID()); + + OT_ASSERT_MSG(NULL != pCheque, "Error allocating memory in the OT API."); + + // At this point, I know that pCheque is a good pointer that I either + // have to delete, or return to the caller. + + // ----------------------------------------------------- + + bool bIssueCheque = pCheque->IssueCheque(CHEQUE_AMOUNT, + lTransactionNumber, + VALID_FROM, VALID_TO, + SENDER_ACCT_ID, + SENDER_USER_ID, + CHEQUE_MEMO, + pRECIPIENT_USER_ID); + if (false == bIssueCheque) + { + OTLog::Error("OTCheque::IssueCheque failed in OT_API::WriteCheque.\n"); + + delete pCheque; pCheque = NULL; + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, true); // bSave=true + + return NULL; + } + + pCheque->SignContract(*pNym); + pCheque->SaveContract(); + + return pCheque; +} + + + + + + + + + +// PROPOSE PAYMENT PLAN (MERCHANT calls this function) +// +// Returns an OTPaymentPlan pointer, or NULL. +// (Caller responsible to delete.) +// +// The process (finally) is: +// +// 1) Payment plan is written, and signed, by the recipient. (Merchant.) +// 2) He sends it to the sender, who signs it and submits it. (Payer / Customer.) +// 3) The server loads the recipient nym to verify the transaction +// number. The sender also had to burn a transaction number (to +// submit it) so now, both have verified trns#s in this way. +// +//---------------------- +// +// Payment Plan Delay, and Payment Plan Period, both default to 30 days (if you pass 0.) +// Payment Plan Length, and Payment Plan Max Payments, both default to 0, which means +// no maximum length and no maximum number of payments. +// +// WARNING: the OTPaymentPlan object being returned, contains 2 transaction numbers of the Recipient. +// If you delete that object without actually activating it, make sure you retrieve those transaction +// numbers first, and add them BACK to the Recipient's Nym!! +// +// Furthermore, recipient should keep a COPY of this proposal after making it, +// so that he can retrieve the transaction numbers from it, for the same reason. +// +OTPaymentPlan * OT_API::ProposePaymentPlan(const OTIdentifier & SERVER_ID, + // ---------------------------------------- + const time_t & VALID_FROM, // Default (0) == NOW + const time_t & VALID_TO, // Default (0) == no expiry / cancel anytime + // ---------------------------------------- + const OTIdentifier & SENDER_ACCT_ID, + const OTIdentifier & SENDER_USER_ID, + // ---------------------------------------- + const OTString & PLAN_CONSIDERATION, // Like a memo. + // ---------------------------------------- + const OTIdentifier & RECIPIENT_ACCT_ID, + const OTIdentifier & RECIPIENT_USER_ID, + // ---------------------------------------- // If it's above zero, the initial + const long & INITIAL_PAYMENT_AMOUNT, // amount will be processed after + const time_t & INITIAL_PAYMENT_DELAY, // delay (seconds from now.) + // ---------------------------------------- // AND SEPARATELY FROM THIS... + const long & PAYMENT_PLAN_AMOUNT, // The regular amount charged, + const time_t & PAYMENT_PLAN_DELAY, // which begins occuring after delay + const time_t & PAYMENT_PLAN_PERIOD, // (seconds from now) and happens + // ----------------------------------------// every period, ad infinitum, until + time_t PAYMENT_PLAN_LENGTH /*=0*/, // after the length (in seconds) + int PAYMENT_PLAN_MAX_PAYMENTS /*=0*/ // expires, or after the maximum + ) // number of payments. These last +{ // two arguments are optional. + // ----------------------------------------------------- + + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(RECIPIENT_USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(RECIPIENT_USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return NULL; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(RECIPIENT_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(RECIPIENT_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::ProposePaymentPlan: server ID passed in didn't " + "match the one on the account.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + pWallet->AddAccount(*pAccount); + // ----------------------------------------------------- + } + else + { + OTLog::Error("OT_API::ProposePaymentPlan: Error loading Asset Account.\n"); + return NULL; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::ProposePaymentPlan: Merchant is not the owner of the recipient account in.\n"); + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::ProposePaymentPlan: Bad signature or Account ID when calling VerifyAccount().\n"); + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + OTPaymentPlan * pPlan = new OTPaymentPlan(SERVER_ID, + pAccount->GetAssetTypeID(), + SENDER_ACCT_ID, + SENDER_USER_ID, + RECIPIENT_ACCT_ID, + RECIPIENT_USER_ID); + + OT_ASSERT_MSG(NULL != pPlan, "Error allocating memory in the OT API."); + + // At this point, I know that pPlan is a good pointer that I either + // have to delete, or return to the caller. CLEANUP WARNING! + // ----------------------------------------------------- + + bool bSuccessSetProposal = + pPlan->SetProposal(*pNym, PLAN_CONSIDERATION, VALID_FROM, VALID_TO); + + // ************************************************ + // WARNING!!!! SetProposal() burns TWO transaction numbers for RECIPIENT. (*pNym) + // BELOW THIS POINT, if you have an error, then you must retrieve those numbers from + // the plan, and set them BACK on pNym before you return!!! + // ------------------------------------------------ + + if (!bSuccessSetProposal) + { + const OTString strServerID(SERVER_ID); + OTLog::Output(0, "OT_API::ProposePaymentPlan: Failed trying to set the proposal.\n"); + // IF FAILED, ADD TRANSACTION NUMBER(s) BACK TO LIST OF AVAILABLE NUMBERS. + for (int i = 0; i < pPlan->GetRecipientCountClosingNumbers(); i++) + { + long lNumber = pPlan->GetRecipientClosingTransactionNoAt(i); + pNym->AddTransactionNum(*pNym, + strServerID, + lNumber, + // The below line of code means "Only SAVE TO STORAGE on the LAST ITERATION." + (i == ( pPlan->GetRecipientCountClosingNumbers()-1)) ? true : false); // bSave + } + delete pPlan; pPlan = NULL; + return NULL; + } + + // ----------------------------------------------------------------------- + bool bSuccessSetInitialPayment = true; // the default, in case user chooses not to even have this payment. + bool bSuccessSetPaymentPlan = true; // the default, in case user chooses not to have a payment plan + // ----------------------------------------------------------------------- + + if ((INITIAL_PAYMENT_AMOUNT > 0) && (INITIAL_PAYMENT_DELAY >= 0)) + { + // The Initial payment delay is measured in seconds, starting from the "Creation Date". + bSuccessSetInitialPayment = pPlan->SetInitialPayment(INITIAL_PAYMENT_AMOUNT, INITIAL_PAYMENT_DELAY); + } + if (!bSuccessSetInitialPayment) + { + const OTString strServerID(SERVER_ID); + OTLog::Output(0, "OT_API::ProposePaymentPlan: Failed trying to set the initial payment.\n"); + // IF FAILED, ADD TRANSACTION NUMBER(s) BACK TO LIST OF AVAILABLE NUMBERS. + for (int i = 0; i < pPlan->GetRecipientCountClosingNumbers(); i++) + { + long lNumber = pPlan->GetRecipientClosingTransactionNoAt(i); + pNym->AddTransactionNum(*pNym, + strServerID, + lNumber, + // The below line of code means "Only SAVE TO STORAGE on the LAST ITERATION." + (i == ( pPlan->GetRecipientCountClosingNumbers()-1)) ? true : false); // bSave + } + delete pPlan; pPlan = NULL; + return NULL; + } + // ----------------------------------------------------------------------- + + // + // " 6 minutes == 360 Seconds\n" + // "10 minutes == 600 Seconds\n" + // "1 hour == 3600 Seconds\n" + // "1 day == 86400 Seconds\n" + // "30 days == 2592000 Seconds\n" + // "3 months == 7776000 Seconds\n" + // "6 months == 15552000 Seconds\n\n" + // + + if (PAYMENT_PLAN_AMOUNT > 0) // If there are regular payments. + { + // ----------------------------------------------------------------------- + + // The payment plan delay is measured in seconds, starting from the "Creation Date". + time_t PAYMENT_DELAY = LENGTH_OF_MONTH_IN_SECONDS; // Defaults to 30 days, measured in seconds (if you pass 0.) + + if (PAYMENT_PLAN_DELAY > 0) + PAYMENT_DELAY = PAYMENT_PLAN_DELAY; + + // ----------------------------------------------------------------------- + + time_t PAYMENT_PERIOD = LENGTH_OF_MONTH_IN_SECONDS; // Defaults to 30 days, measured in seconds (if you pass 0.) + + if (PAYMENT_PLAN_PERIOD > 0) + PAYMENT_PERIOD = PAYMENT_PLAN_PERIOD; + + // ----------------------------------------------------------------------- + + time_t PLAN_LENGTH = 0; // Defaults to 0 seconds (for no max length). + + if (PAYMENT_PLAN_LENGTH > 0) + PLAN_LENGTH = PAYMENT_PLAN_LENGTH; + + // ----------------------------------------------------------------------- + + int nMaxPayments = 0; // Defaults to 0 maximum payments (for no maximum). + + if (PAYMENT_PLAN_MAX_PAYMENTS > 0) + nMaxPayments = PAYMENT_PLAN_MAX_PAYMENTS; + + // ----------------------------------------------------------------------- + + bSuccessSetPaymentPlan = pPlan->SetPaymentPlan(PAYMENT_PLAN_AMOUNT, + PAYMENT_DELAY, PAYMENT_PERIOD, + PLAN_LENGTH, nMaxPayments); + } + + if (!bSuccessSetPaymentPlan) + { + const OTString strServerID(SERVER_ID); + OTLog::Output(0, "OT_API::ProposePaymentPlan: Failed trying to set the payment plan.\n"); + // IF FAILED, ADD TRANSACTION NUMBER(s) BACK TO LIST OF AVAILABLE NUMBERS. + for (int i = 0; i < pPlan->GetRecipientCountClosingNumbers(); i++) + { + long lNumber = pPlan->GetRecipientClosingTransactionNoAt(i); + pNym->AddTransactionNum(*pNym, + strServerID, + lNumber, + // The below line of code means "Only SAVE TO STORAGE on the LAST ITERATION." + (i == ( pPlan->GetRecipientCountClosingNumbers()-1)) ? true : false); // bSave + } + delete pPlan; pPlan = NULL; + return NULL; + } + // ------------------------------------------------ + + pPlan->SignContract(*pNym); // Here we have saved the MERCHANT's VERSION. + pPlan->SaveContract(); // A copy of this will be attached to the CUSTOMER's version as well. + + return pPlan; +} + + + + + + + + +// CONFIRM PAYMENT PLAN (CUSTOMER) +// +// Returns an OTPaymentPlan pointer, or NULL. +// (Caller responsible to delete.) +// +// The process (currently) is: +// +// 1) Payment plan is written, and signed, by the recipient. (Merchant.) +// 2) He sends it to the sender, who signs it and submits it. (Payer / Customer.) +// 3) The server loads the recipient nym to verify the transaction +// number. The sender also had to burn a transaction number (to +// submit it) so now, both have verified trns#s in this way. +// +//---------------------- +// +bool OT_API::ConfirmPaymentPlan(const OTIdentifier & SERVER_ID, + // ---------------------------------------- + const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & SENDER_ACCT_ID, + // ---------------------------------------- + const OTIdentifier & RECIPIENT_USER_ID, + // ---------------------------------------- + OTPaymentPlan & thePlan) +{ + // ----------------------------------------------------- + + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return false; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(SENDER_USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(SENDER_USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return false; + + pWallet->AddNym(*pNym); + } + // ---------------------------------------- + + OTPseudonym * pMerchantNym = this->LoadPublicNym(RECIPIENT_USER_ID); + OTCleanup theNymAngel(pMerchantNym); + + if (NULL == pMerchantNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no Merchant with the recipient's NymID (in local storage.)\n"); + return false; + } + + // By this point, pNym is a good pointer, and is on the wallet. + // pMerchantNym is also good, and has an angel. (No need to cleanup either of them.) + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(SENDER_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(SENDER_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::ConfirmPaymentPlan: server ID passed in didn't " + "match the one on the account.\n"); + delete pAccount; pAccount = NULL; + return false; + } + + pWallet->AddAccount(*pAccount); + // ----------------------------------------------------- + } + else + { + OTLog::Error("OT_API::ConfirmPaymentPlan: Error loading Asset Account.\n"); + return false; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::ConfirmPaymentPlan: User is not the owner of the account.\n"); + return false; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::ConfirmPaymentPlan: Bad signature or Account ID.\n"); + return false; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + // From Cron Item: + // + // int GetCountClosingNumbers() const; + // long GetClosingTransactionNoAt(int nIndex) const; + // void AddClosingTransactionNo(const long & lClosingTransactionNo); + + // ******************************************************* + + // The "Creation Date" of the agreement is re-set here. + bool bConfirmed = thePlan.Confirm(*pMerchantNym, *pNym); + // + // WARNING: The call to "Confirm()" uses TWO transaction numbers from pNym! + // If you don't end up actually USING this payment plan, then you need to retrieve + // those numbers and Add them back to pNym again. + // A nice client will store a copy of any payment plans until they are closed out, or canceled, + // or whatever. + // ANY FAILURES BELOW THIS POINT need to be smart enough to retrieve those numbers before returning. + // + if (!bConfirmed) + { + OTLog::Output(0, "OT_API::ConfirmPaymentPlan: Failed trying to confirm the agreement.\n"); + const OTString strServerID(SERVER_ID); + + // The main thePlan.GetTransactionNum() contains the main transaction number + // for the whole plan, which belongs to pNym, so we'll grab that here as well. + long lTransactionNumber = thePlan.GetTransactionNum(); + if (lTransactionNumber > 0) + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, false); // bSave=false, assuming the loop below runs at least once. + + // IF FAILED, ADD TRANSACTION NUMBER(s) BACK TO LIST OF AVAILABLE NUMBERS. + for (int i = 0; i < thePlan.GetCountClosingNumbers(); i++) + { + long lNumber = thePlan.GetClosingTransactionNoAt(i); + pNym->AddTransactionNum(*pNym, + strServerID, + lNumber, + (i == (thePlan.GetCountClosingNumbers()-1)) ? true : false); // bSave + // There's only supposed to be one number here (the closing number) + // But I copied the loop from above and it seems more capable for the future. + } + + return false; + } + + // ----------------------------------------------------------------------- + + thePlan.SignContract(*pNym); // Here we have saved the CUSTOMER's version, + thePlan.SaveContract(); // which contains a copy of the merchant's version. + + return true; +} + + + + + + +// Note: replaced by ProposePaymentPlan and ConfirmPaymentPlan. +// +// WRITE PAYMENT PLAN +// +// Returns an OTPaymentPlan pointer, or NULL. +// (Caller responsible to delete.) +// +// The process (currently) is: +// 1) Payment Plan is written by the sender (this function.) +// 2) This is necessary because the transaction number must be on +// the sender's nym when he submits it to the server. +// 3) Also, the sender must be the one to submit it. +// 4) Recipient must sign it beforehand, so it must be sent to +// recipient and then sent BACK to sender for submittal. +// +// THAT SUCKS! Here's what it should do: +// +// 1) Payment plan is written, and signed, by the recipient. +// 2) He sends it to the sender, who signs it and submits it. +// 3) The server loads the recipient nym to verify the transaction +// number. The sender also had to burn a transaction number (to +// submit it) so now, both have verified trns#s in this way. +// +// ==> Unfortunately, the current code is described by the first +// process above, not the second one. However, I think the API is +// the same either way -- just need to fix the server to support +// EITHER sender OR recipient being able to submit (it should simply +// check BOTH of them for the transaction number... +// We'll get there... +// +//---------------------- +// +// Payment Plan Delay, and Payment Plan Period, both default to 30 days (if you pass 0.) +// Payment Plan Length, and Payment Plan Max Payments, both default to 0, which means +// no maximum length and no maximum number of payments. +/* +OTPaymentPlan * OT_API::WritePaymentPlan(const OTIdentifier & SERVER_ID, + // ---------------------------------------- + const time_t & VALID_FROM, // Default (0) == NOW + const time_t & VALID_TO, // Default (0) == no expiry / cancel anytime + // ---------------------------------------- + const OTIdentifier & SENDER_ACCT_ID, + const OTIdentifier & SENDER_USER_ID, + // ---------------------------------------- + const OTString & PLAN_CONSIDERATION, // Like a memo. + // ---------------------------------------- + const OTIdentifier & RECIPIENT_ACCT_ID, + const OTIdentifier & RECIPIENT_USER_ID, + // ---------------------------------------- // If it's above zero, the initial + const long & INITIAL_PAYMENT_AMOUNT, // amount will be processed after + const time_t & INITIAL_PAYMENT_DELAY, // delay (seconds from now.) + // ---------------------------------------- // AND SEPARATELY FROM THIS... + const long & PAYMENT_PLAN_AMOUNT, // The regular amount charged, + const time_t & PAYMENT_PLAN_DELAY, // which begins occuring after delay + const time_t & PAYMENT_PLAN_PERIOD, // (seconds from now) and happens + // ----------------------------------------// every period, ad infinitum, until + time_t PAYMENT_PLAN_LENGTH =0, // after the length (in seconds) + int PAYMENT_PLAN_MAX_PAYMENTS =0 // expires, or after the maximum + ) // number of payments. These last +{ // two arguments are optional. + // ----------------------------------------------------- + + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(SENDER_USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(SENDER_USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return NULL; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(SENDER_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(SENDER_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::WritePaymentPlan: server ID passed in didn't match the one on the account.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + pWallet->AddAccount(*pAccount); + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::WritePaymentPlan\n"); + return NULL; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "User is not the owner of the account in OT_API::WritePaymentPlan.\n"); + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "Bad signature or Account ID in OT_API::WritePaymentPlan.\n"); + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + // To write a payment plan, we need to burn one of our transaction numbers. + // (Presumably the wallet is also storing a couple of these, since they are + // needed to perform any transaction.) + // + // I don't have to contact the server to write a payment plan, + // as long as I already have a transaction number I can use to + // write it with. (Otherwise I'd have to ask the server to send + // me one first.) + // + OTString strServerID(SERVER_ID); + long lTransactionNumber=0; // Notice I use the server ID on the ACCOUNT. + + if (false == pNym->GetNextTransactionNum(*pNym, strServerID, lTransactionNumber)) + { + OTLog::Output(0, "OT_API::WritePaymentPlan: Failure, out of transaction numbers.\n"); + return NULL; + } + + // At this point, I know that lTransactionNumber contains one I can use. + + // ----------------------------------------------------- + + OTPaymentPlan * pPlan = new OTPaymentPlan(pAccount->GetRealServerID(), + pAccount->GetAssetTypeID(), + pAccount->GetRealAccountID(), pAccount->GetUserID(), + RECIPIENT_ACCT_ID, RECIPIENT_USER_ID); + + OT_ASSERT_MSG(NULL != pPlan, "Error allocating memory in the OT API."); + + // At this point, I know that pPlan is a good pointer that I either + // have to delete, or return to the caller. CLEANUP WARNING! + + // ----------------------------------------------------- + // From Cron Item: + // + // int GetCountClosingNumbers() const; + // long GetClosingTransactionNoAt(int nIndex) const; + // void AddClosingTransactionNo(const long & lClosingTransactionNo); + + // ---------------------------------------- + + // The "Creation Date" of the agreement is set here. + bool bSuccessSetAgreement = pPlan->SetAgreement(lTransactionNumber, PLAN_CONSIDERATION, VALID_FROM, VALID_TO); + + if (!bSuccessSetAgreement) + { + OTLog::Output(0, "Failed trying to set the agreement in OT_API::WritePaymentPlan.\n"); + + delete pPlan; pPlan = NULL; + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, true); // bSave=true + + return NULL; + } + + // ----------------------------------------------------------------------- + + bool bSuccessSetInitialPayment = true; // the default, in case user chooses not to even have this payment. + bool bSuccessSetPaymentPlan = true; // the default, in case user chooses not to have a payment plan + + // ----------------------------------------------------------------------- + + if ((INITIAL_PAYMENT_AMOUNT > 0) && (INITIAL_PAYMENT_DELAY >= 0)) + { + // The Initial payment delay is measured in seconds, starting from the "Creation Date". + bSuccessSetInitialPayment = pPlan->SetInitialPayment(INITIAL_PAYMENT_AMOUNT, INITIAL_PAYMENT_DELAY); + } + + if (!bSuccessSetInitialPayment) + { + OTLog::Output(0, "Failed trying to set the initial payment in OT_API::WritePaymentPlan.\n"); + + delete pPlan; pPlan = NULL; + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, true); // bSave=true + + return NULL; + } + + // ----------------------------------------------------------------------- + +// +// " 6 minutes == 360 Seconds\n" +// "10 minutes == 600 Seconds\n" +// "1 hour == 3600 Seconds\n" +// "1 day == 86400 Seconds\n" +// "30 days == 2592000 Seconds\n" +// "3 months == 7776000 Seconds\n" +// "6 months == 15552000 Seconds\n\n" +// + + if (PAYMENT_PLAN_AMOUNT > 0) // If there are regular payments. + { + // ----------------------------------------------------------------------- + + // The payment plan delay is measured in seconds, starting from the "Creation Date". + time_t PAYMENT_DELAY = LENGTH_OF_MONTH_IN_SECONDS; // Defaults to 30 days, measured in seconds (if you pass 0.) + + if (PAYMENT_PLAN_DELAY > 0) + PAYMENT_DELAY = PAYMENT_PLAN_DELAY; + + // ----------------------------------------------------------------------- + + time_t PAYMENT_PERIOD = LENGTH_OF_MONTH_IN_SECONDS; // Defaults to 30 days, measured in seconds (if you pass 0.) + + if (PAYMENT_PLAN_PERIOD > 0) + PAYMENT_PERIOD = PAYMENT_PLAN_PERIOD; + + // ----------------------------------------------------------------------- + + time_t PLAN_LENGTH = 0; // Defaults to 0 seconds (for no max length). + + if (PAYMENT_PLAN_LENGTH > 0) + PLAN_LENGTH = PAYMENT_PLAN_LENGTH; + + // ----------------------------------------------------------------------- + + int nMaxPayments = 0; // Defaults to 0 maximum payments (for no maximum). + + if (PAYMENT_PLAN_MAX_PAYMENTS > 0) + nMaxPayments = PAYMENT_PLAN_MAX_PAYMENTS; + + // ----------------------------------------------------------------------- + + bSuccessSetPaymentPlan = pPlan->SetPaymentPlan(PAYMENT_PLAN_AMOUNT, + PAYMENT_DELAY, PAYMENT_PERIOD, + PLAN_LENGTH, nMaxPayments); + } + + if (!bSuccessSetPaymentPlan) + { + OTLog::Output(0, "Failed trying to set the payment plan in OT_API::WritePaymentPlan\n"); + + delete pPlan; pPlan = NULL; + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lTransactionNumber, true); // bSave=true + + return NULL; + } + + pPlan->SignContract(*pNym); + pPlan->SaveContract(); + + return pPlan; +} +*/ + + + + +// LOAD PURSE +// +// Returns an OTPurse pointer, or NULL. +// (Caller responsible to delete.) +// +OTPurse * OT_API::LoadPurse(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, + const OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + const OTString strServerID(SERVER_ID); + const OTString strUserID(USER_ID); + const OTString strAssetTypeID(ASSET_ID); + + // ----------------------------------------------------------------- + + OTPurse * pPurse = new OTPurse(SERVER_ID, ASSET_ID); + + OT_ASSERT_MSG(NULL != pPurse, "Error allocating memory in the OT API."); // responsible to delete or return pPurse below this point. + + if (pPurse->LoadPurse(strServerID.Get(), strUserID.Get(), strAssetTypeID.Get())) + return pPurse; + + delete pPurse; + pPurse = NULL; + + return NULL; +} + + +bool OT_API::SavePurse(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, + const OTIdentifier & USER_ID, + OTPurse & THE_PURSE) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + const OTString strServerID(SERVER_ID); + const OTString strUserID(USER_ID); + const OTString strAssetTypeID(ASSET_ID); + + // ----------------------------------------------------------------- + + if (THE_PURSE.SavePurse(strServerID.Get(), strUserID.Get(), strAssetTypeID.Get())) + return true; + + return false; +} + + + + +// LOAD Mint +// +// Returns an OTMint pointer, or NULL. +// (Caller responsible to delete.) +// +OTMint * OT_API::LoadMint(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + const OTString strServerID(SERVER_ID); + const OTString strAssetTypeID(ASSET_ID); + + // ----------------------------------------------------------------- + + OTMint * pMint = new OTMint(strServerID, strAssetTypeID); + + OT_ASSERT_MSG(NULL != pMint, "Error allocating memory in the OT API"); // responsible to delete or return pMint below this point. + + if (false == pMint->LoadMint()) + { + OTLog::vOutput(0, "OT_API::LoadMint: Unable to load Mintfile : %s%s%s%s%s\n", + OTLog::MintFolder(), OTLog::PathSeparator(), strServerID.Get(), + OTLog::PathSeparator(), strAssetTypeID.Get()); + delete pMint; pMint = NULL; + return NULL; + } + + // TODO: some kind of Mint Verification here ... ? + + // I know by this point that pMint is a good pointer AND + // that I have successfully loaded the Mint file... + + return pMint; +} + + + +// LOAD SERVER CONTRACT (from local storage) +// +// Caller is responsible to delete. +// +OTServerContract * OT_API::LoadServerContract(const OTIdentifier & SERVER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTString strServerID(SERVER_ID); + + // ----------------------------------------------------------------- + + OTString strFoldername = OTLog::ContractFolder(); + OTString strFilename = strServerID.Get(); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(strFoldername.Get(), strFilename.Get())) + { + OTLog::vError("OT_API::LoadServerContract: File does not exist: %s%s%s\n", + strFoldername.Get(), OTLog::PathSeparator(), strFilename.Get()); + return NULL; + } + + // -------------------------------------------------------------------- + + OTServerContract * pContract = new OTServerContract(strServerID, strFoldername, + strFilename, strServerID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Server " + "Contract in OT_API::LoadServerContract\n"); + + if (pContract->LoadContract() && pContract->VerifyContract()) + { + return pContract; + } + + delete pContract; + pContract = NULL; + + return NULL; +} + + +// LOAD ASSET CONTRACT (from local storage) +// +// Caller is responsible to delete. +// +OTAssetContract * OT_API::LoadAssetContract(const OTIdentifier & ASSET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTString strAssetTypeID(ASSET_ID); + + // ----------------------------------------------------------------- + + OTString strFoldername = OTLog::ContractFolder(); + OTString strFilename = strAssetTypeID.Get(); + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(strFoldername.Get(), strFilename.Get())) + { + OTLog::vError("OT_API::LoadAssetContract: File does not exist: %s%s%s\n", + strFoldername.Get(), OTLog::PathSeparator(), strFilename.Get()); + return NULL; + } + + // ----------------------------------------------------------------- + + OTAssetContract * pContract = new OTAssetContract(strAssetTypeID, strFoldername, + strFilename, strAssetTypeID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Asset " + "Contract in OT_API::LoadAssetContract\n"); + + if (pContract->LoadContract() && pContract->VerifyContract()) + { + return pContract; + } + + delete pContract; + pContract = NULL; + + return NULL; +} + + + +// LOAD ASSET ACCOUNT +// +// Caller is NOT responsible to delete -- I add it to the wallet! +// +OTAccount * OT_API::LoadAssetAccount(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + // We don't care if this asset account is already loaded in the wallet. + // Presumably, the user has just download the latest copy of the account + // from the server, and the one in the wallet is old, so now this function + // is being called to load the new one from storage and update the wallet. + // + OTAccount * pAcct = OTAccount::LoadExistingAccount(ACCOUNT_ID, SERVER_ID); + + if (NULL == pAcct) + { + OTString strServerID(SERVER_ID), strAcctID(ACCOUNT_ID); + OTLog::vOutput(0, "Failed calling OTAccount::LoadExistingAccount in OT_API::LoadAssetAccount.\n" + " Server ID: %s\n Account ID: %s\n", strServerID.Get(), strAcctID.Get()); + return NULL; + } + + // Beyond this point, I know that pAcct is loaded and will need to be deleted or returned. + // ------------------------------------------------------ + + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + if (!pAcct->VerifyOwner(*pNym) || !pAcct->VerifySignature(*pNym)) + { + OTString strUserID(USER_ID), strAcctID(ACCOUNT_ID); + + OTLog::vOutput(0, "Unable to verify ownership or signature on account:\n%s\n For user:\n%s\n", + strAcctID.Get(), strUserID.Get()); + + delete pAcct; + pAcct = NULL; + + return NULL; + } + + // Beyond this point, I know the account is verified for the Nym... + // Therefore, add it to the wallet (caller is NOT responsible to delete.) + // + pWallet->AddAccount(*pAcct); + + return pAcct; +} + + + +// LOAD NYMBOX +// +// Caller IS responsible to delete +// +OTLedger * OT_API::LoadNymbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger * pLedger = new OTLedger(USER_ID, USER_ID, SERVER_ID); + + OT_ASSERT_MSG(NULL != pLedger, "Error allocating memory in the OT API."); + + // Beyond this point, I know that pLedger will need to be deleted or returned. + // ------------------------------------------------------ + + if (pLedger->LoadNymbox() && pLedger->VerifyAccount(*pNym)) + return pLedger; + else + { + OTString strUserID(USER_ID); + + OTLog::vOutput(0, "Unable to load or verify nymbox:\n%s\n", + strUserID.Get()); + + delete pLedger; + pLedger = NULL; + } + + return NULL; +} + + + +// LOAD INBOX +// +// Caller IS responsible to delete +// +OTLedger * OT_API::LoadInbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger * pLedger = new OTLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + + OT_ASSERT_MSG(NULL != pLedger, "Error allocating memory in the OT API."); + + // Beyond this point, I know that pLedger will need to be deleted or returned. + // ------------------------------------------------------ + + if (pLedger->LoadInbox() && pLedger->VerifyAccount(*pNym)) + return pLedger; + else + { + OTString strUserID(USER_ID), strAcctID(ACCOUNT_ID); + + OTLog::vOutput(0, "Unable to load or verify inbox:\n%s\n For user:\n%s\n", + strAcctID.Get(), strUserID.Get()); + + delete pLedger; + pLedger = NULL; + } + + return NULL; +} + + +// LOAD OUTBOX +// +// Caller IS responsible to delete +// +OTLedger * OT_API::LoadOutbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return NULL; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTLedger * pLedger = new OTLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + + OT_ASSERT_MSG(NULL != pLedger, "Error allocating memory in the OT API."); + + // Beyond this point, I know that pLedger is loaded and will need to be deleted or returned. + // ------------------------------------------------------ + + if (pLedger->LoadOutbox() && pLedger->VerifyAccount(*pNym)) + return pLedger; + else + { + OTString strUserID(USER_ID), strAcctID(ACCOUNT_ID); + + OTLog::vOutput(0, "Unable to load or verify outbox:\n%s\n For user:\n%s\n", + strAcctID.Get(), strUserID.Get()); + + delete pLedger; + pLedger = NULL; + } + + return NULL; +} + + + + + + +// YOU are responsible to delete the OTMessage object, once +// you receive the pointer that comes back from this function. +// (It also might return NULL, if there are none there.) +// +OTMessage * OT_API::PopMessageBuffer() +{ + OT_ASSERT_MSG(m_bInitialized && (m_pClient != NULL), "Not initialized; call OT_API::Init first."); + + return m_pClient->GetMessageBuffer().GetNextMessage(); +} + +void OT_API::FlushMessageBuffer() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTMessage * pMsg = m_pClient->GetMessageBuffer().GetNextMessage(); + + while (NULL != pMsg) + { + delete pMsg; + pMsg = m_pClient->GetMessageBuffer().GetNextMessage(); + } +} + + + + +// -------------------------------------------------------------------- + + + + + +// ABOVE ARE COMMANDS TO MANIPULATE LOCAL DATA (**NOT** MESSAGE THE SERVER.) + + +// --------------------------------------------------------------------- + + + + +// NOTE: This is only for Message->TCP->SSL mode, NOT for Message->XmlRpc->HTTP mode... +// +// Eventually this connects to the server denoted by SERVER_ID +// But for right now, it just connects to the first server in the list. +// TODO: make it connect to the server ID instead of the first one in the list. +// +bool OT_API::ConnectServer(OTIdentifier & SERVER_ID, OTIdentifier & USER_ID, + OTString & strCA_FILE, OTString & strKEY_FILE, OTString & strKEY_PASSWORD) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + +#if defined(OT_ZMQ_MODE) + OT_ASSERT_MSG(m_bInitialized, "OT_API::ConnectServer not necessary in ZMQ mode."); +#endif + + // Wallet, after loading, should contain a list of server + // contracts. Let's pull the hostname and port out of + // the first contract, and connect to that server. + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (!pNym) + { + OTLog::Error("No Nym loaded but tried to connect to server.\n"); + return false; + } + + bool bConnected = m_pClient->ConnectToTheFirstServerOnList(*pNym, strCA_FILE, strKEY_FILE, strKEY_PASSWORD); + + if (bConnected) + { + OTLog::Output(0, "Success. (Connected to the first notary server on your wallet's list.)\n"); + return true; + } + else { + OTLog::Output(0, "Either the wallet is not loaded, or there was an error connecting to server.\n"); + return false; + } +} + + + + +// NOTE: this function NOT needed in XmlRpc / HTTP (web services) mode. +// +// Open Transactions maintains a connection to the server(s) +// The client should call THIS function after a message, and/or periodicallyt, +// to listen on the connections for any server replies and process them. +// +// Perhaps once per second, and more often immediately following +// a request. (Usually only one response comes for each request.) +// +bool OT_API::ProcessSockets() +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + +#if defined(OT_ZMQ_MODE) + OT_ASSERT_MSG(m_bInitialized, "OT_API::ProcessSockets not necessary in XmlRpc mode."); +#endif + + bool bFoundMessage = false, bSuccess = false; + + do + { + OTMessage * pMsg = new OTMessage; + + OT_ASSERT_MSG(NULL != pMsg, "Error allocating memory in the OT API"); + + // If this returns true, that means a Message was + // received and processed into an OTMessage object (theMsg) + bFoundMessage = m_pClient->ProcessInBuffer(*pMsg); + + if (true == bFoundMessage) + { + bSuccess = true; + + // OTString strReply; + // theMsg.SaveContract(strReply); + // OTLog::vError("\n\n**********************************************\n" + // "Successfully in-processed server response.\n\n%s\n", strReply.Get()); + m_pClient->ProcessServerReply(*pMsg); // the Client takes ownership and will handle cleanup. + } + else + { + delete pMsg; + pMsg = NULL; + } + + + } while (true == bFoundMessage); + + return bSuccess; +} +// NOTE: The above function only applies in Message / TCP / SSL mode, since server replies are instantly +// received in XmlRpc / HTTP mode. (Both are request / response, it's the same protocol no matter what transport.) + + + + + + + + +// -------------------------------------------------------------- +// IS BASKET CURRENCY ? +// +// Tells you whether or not a given asset type is actually a basket currency. +// +bool OT_API::IsBasketCurrency(const OTIdentifier & BASKET_ASSET_TYPE_ID) // returns true or false. +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "OT_API::IsBasketCurrency: No such asset contract.\n"); + + return false; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + if (theBasket.Count() > 0) + return true; + } + + return false; +} + + + +// -------------------------------------------------------------------- +// Get Basket Count (of member currency types.) +// +// Returns the number of asset types that make up this basket. +// (Or zero.) +// +int OT_API::GetBasketMemberCount(const OTIdentifier & BASKET_ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "OT_API::GetBasketMemberCount: No such asset contract.\n"); + + return 0; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + return theBasket.Count(); + } + + return 0; +} + + + +// -------------------------------------------------------------------- +// Get Basket Member Asset Type +// +// Returns one of the asset types that make up this basket, +// by index, and true. +// (Or false.) +// +bool OT_API::GetBasketMemberType(const OTIdentifier & BASKET_ASSET_TYPE_ID, + const int nIndex, + OTIdentifier & theOutputMemberType) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "OT_API::GetBasketMemberType: No such asset contract.\n"); + + return false; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + if ((nIndex >= theBasket.Count()) || (nIndex < 0)) + { + OTLog::vError("OT_API::GetBasketMemberType: Index out of bounds: %d\n", nIndex); + return false; + } + + BasketItem * pItem = theBasket.At(nIndex); + + OT_ASSERT_MSG(NULL != pItem, "Bad index in OT_API::GetBasketMemberType"); + + theOutputMemberType = pItem->SUB_CONTRACT_ID; + + return true; + } + + return false; +} + + + + +// -------------------------------------------------------------------- +// Get Basket Member Minimum Transfer Amount +// +// Returns the minimum transfer amount for one of the asset types that +// makes up this basket, by index. +// (Or 0.) +// +long OT_API::GetBasketMemberMinimumTransferAmount(const OTIdentifier & BASKET_ASSET_TYPE_ID, + const int nIndex) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "OT_API::GetBasketMemberMinimumTransferAmount: No such asset contract.\n"); + + return 0; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + if ((nIndex >= theBasket.Count()) || (nIndex < 0)) + { + OTLog::vError("OT_API::GetBasketMemberMinimumTransferAmount: Index out of bounds: %d\n", nIndex); + return 0; + } + + BasketItem * pItem = theBasket.At(nIndex); + + OT_ASSERT_MSG(NULL != pItem, "Bad index in OT_API::GetBasketMemberMinimumTransferAmount."); + + return pItem->lMinimumTransferAmount;; + } + else + OTLog::Error("OT_API::GetBasketMemberMinimumTransferAmount: Failed loading basket info from basket asset contract.\n"); + + return 0; +} + + + +// -------------------------------------------------------------------- +// Get Basket Minimum Transfer Amount +// +// Returns the minimum transfer amount for the basket. +// (Or 0.) +// +long OT_API::GetBasketMinimumTransferAmount(const OTIdentifier & BASKET_ASSET_TYPE_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "OT_API::GetBasketMinimumTransferAmount: No such asset contract.\n"); + + return 0; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + return theBasket.GetMinimumTransfer(); + } + + return 0; +} + + + + + +// -------------------------------------------------------- +// GENERATE BASKET CREATION REQUEST +// +// Creates a new request (for generating a new Basket type). +// (Each currency in this request will be added with +// subsequent calls to OT_API::GenerateBasketItem()). +// +// (Caller is responsible to delete.) +// +OTBasket * OT_API::GenerateBasketCreation(const OTIdentifier & USER_ID, + const long MINIMUM_TRANSFER) // Must be above zero. If <= 0, defaults to 10. +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + long lMinimumTransferAmount = 10; + + if (MINIMUM_TRANSFER > 0) + lMinimumTransferAmount = MINIMUM_TRANSFER; + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return false; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return false; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTBasket * pBasket = new OTBasket(0, lMinimumTransferAmount); + + OT_ASSERT_MSG(NULL != pBasket, "Error allocating memory in the OT API"); + + pBasket->SignContract(*pNym); + pBasket->SaveContract(); + + return pBasket; +} + + +// -------------------------------------------------------- +// ADD BASKET CREATION ITEM +// +// Used for creating a request to generate a new basket currency. +bool OT_API::AddBasketCreationItem(const OTIdentifier & USER_ID, // for signature. + OTBasket & theBasket, + const OTIdentifier & ASSET_TYPE_ID, + const long MINIMUM_TRANSFER) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return false; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return false; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "No such asset contract.\n"); + + return false; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + + theBasket.AddSubContract(ASSET_TYPE_ID, MINIMUM_TRANSFER); + + theBasket.IncrementSubCount(); + + theBasket.ReleaseSignatures(); + + theBasket.SignContract(*pNym); + theBasket.SaveContract(); + + return true; +} + + + + + +// ----------------------------------------------------- +// ISSUE BASKET CREATION REQUEST (to server.) +// +void OT_API::issueBasket(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & BASKET_INFO) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + // AT SOME POINT, BASKET_INFO has been populated with the relevant data. (see test client for example.) + + OTString strServerID(SERVER_ID), strNymID(USER_ID); + + OTMessage theMessage; + long lRequestNumber = 0; + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "issueBasket"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + theMessage.m_ascPayload.SetString(BASKET_INFO); + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + +// --------------------------------------------------------------- +// GENERATE BASKET EXCHANGE REQUEST +// +// Creates a new request (for exchanging funds in/out of a Basket). +// (Each currency in this request will be added with +// subsequent calls to OT_API::GenerateBasketItem()). +// +// (Caller is responsible to delete.) +// +OTBasket * OT_API::GenerateBasketExchange(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & BASKET_ASSET_TYPE_ID, + const OTIdentifier & BASKET_ASSET_ACCT_ID, + const int TRANSFER_MULTIPLE) // 1 2 3 +{ // 5=2,3,4 OR 10=4,6,8 OR 15=6,9,12 + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + OTString strServerID(SERVER_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return NULL; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return NULL; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + int nTransferMultiple = 1; + + if (TRANSFER_MULTIPLE > 0) + nTransferMultiple = TRANSFER_MULTIPLE; + + // ----------------------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "No such asset contract.\n"); + + return NULL; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(BASKET_ASSET_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(BASKET_ASSET_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: server ID passed in didn't match " + "the one on the account.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: User is not the owner of the account..\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: Bad signature or Account ID.\n"); + delete pAccount; pAccount = NULL; + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + pWallet->AddAccount(*pAccount); + + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::GenerateBasketExchange\n"); + return NULL; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + // I checked these things above. But since I only check them when ADDING, + // I also want to check here, in cases where I get successfully and didn't + // need to add. + // + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: User is not the owner of the account.\n"); + return NULL; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: Bad signature or Account ID.\n"); + return NULL; + } + + if (BASKET_ASSET_TYPE_ID != pAccount->GetAssetTypeID()) + { + OTLog::Output(0, "Wrong asset type ID on account in OT_API::GenerateBasketExchange.\n"); + return NULL; + } + + // By this point, I know that everything checks out. Signature and Account ID. + // pAccount is good, and no need to clean it up. + // ----------------------------------------------------- + + // Next load the OTBasket object out of that contract. + OTBasket theBasket; + OTBasket * pRequestBasket = NULL; + + // todo perhaps verify the basket here, even though I already verified the asset contract itself... + // Can't never be too sure. + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo())) + { + // We need a transaction number just to send this thing. Plus, we need a number for + // each sub-account to the basket, as well as the basket's main account. + // That is: 1 + theBasket.Count() + 1 + + if (pNym->GetTransactionNumCount(SERVER_ID) < (2 + theBasket.Count())) + { + OTLog::Output(0, "Trying to exchange basket: you don't have enough transaction numbers to perform the exchange.\n"); + } + else + { + pRequestBasket = new OTBasket(theBasket.Count(), theBasket.GetMinimumTransfer()); + OT_ASSERT_MSG(NULL != pRequestBasket, "Error allocating memory in the OT API"); + + pRequestBasket->SetTransferMultiple(nTransferMultiple); // This stays in this function. + + // Make sure the server knows where to put my new basket currency funds, + // once the exchange is done. + pRequestBasket->SetRequestAccountID(BASKET_ASSET_ACCT_ID); // This stays too + + // Export the OTBasket object into a string, add it as + // a payload on my request, and send to server. + pRequestBasket->SignContract(*pNym); + pRequestBasket->SaveContract(); + } // *pNym apparently has enough transaction numbers to exchange the basket. + + // ---------------------------------------------------------------- + } + else + { + OTLog::Output(0, "OT_API::GenerateBasketExchange: Error loading " + "basket info from asset contract. " + "Are you SURE this is a basket currency?\n"); + return NULL; + } + + return pRequestBasket; +} + + + + + + + +// -------------------------------------------------------- +// ADD BASKET EXCHANGE ITEM +// +bool OT_API::AddBasketExchangeItem(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + OTBasket & theBasket, + const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & ASSET_ACCT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + const OTString strServerID(SERVER_ID); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return false; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return false; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + if (pNym->GetTransactionNumCount(SERVER_ID) < 1) + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: you need at least one transaction number to add this exchange item.\n"); + return false; + } + + // ----------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(ASSET_TYPE_ID); + + if (!pContract) + { + OTLog::Output(0, "No such asset contract.\n"); + + return false; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(ASSET_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(ASSET_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: server ID passed in didn't match " + "the one on the account.\n"); + delete pAccount; pAccount = NULL; + return false; + } + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: User is not the owner of the account..\n"); + delete pAccount; pAccount = NULL; + return false; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: Bad signature or Account ID.\n"); + delete pAccount; pAccount = NULL; + return false; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + if (ASSET_TYPE_ID != pAccount->GetAssetTypeID()) + { + OTLog::Output(0, "Wrong asset type ID on account in OT_API::AddBasketExchangeItem.\n"); + return false; + } + + // ----------------------------------------------------- + + pWallet->AddAccount(*pAccount); + + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::AddBasketExchangeItem\n"); + return false; + } + } + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID. + + // ----------------------------------------------------- + // I checked these things above. But since I only check them when ADDING, + // I also want to check here, in cases where I get successfully and didn't + // need to add. + // + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: User is not the owner of the account.\n"); + return false; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::AddBasketExchangeItem: Bad signature or Account ID.\n"); + return false; + } + + if (ASSET_TYPE_ID != pAccount->GetAssetTypeID()) + { + OTLog::Output(0, "Wrong asset type ID on account in OT_API::AddBasketExchangeItem.\n"); + return false; + } + + // By this point, I know that everything checks out. Signature and Account ID. + // pAccount is good, and no need to clean it up. + // ---------------------------------------------------- + + long lSubClosingTransactionNo = 0; // For the basketReceipt (closing transaction num) for the sub account. + + if (pNym->GetNextTransactionNum(*pNym, strServerID, lSubClosingTransactionNo)) // this saves + // --------------------------------------------------- + { + theBasket.AddRequestSubContract(ASSET_TYPE_ID, ASSET_ACCT_ID, lSubClosingTransactionNo); + + theBasket.ReleaseSignatures(); + theBasket.SignContract(*pNym); + theBasket.SaveContract(); + + return true; + } + else + { + OTLog::Error("OT_API::AddBasketExchangeItem: Failed getting next transaction number. \n"); + } + + return false; +} + +// ------------------------------------------------------ + + + + + +// TODO! Either stop getting the next transaction numbers above, and do it all in a big +// loop in the next function below, OR, provide a way to harvest those numbers back again +// in the event of error (ugh.) +// + + + + + +// ----------------------------------------------------- +// EXCHANGE (into or out of) BASKET (request to server.) +// +void OT_API::exchangeBasket(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & BASKET_ASSET_ID, + OTString & BASKET_INFO, + // ---------------------------------------- + const bool bExchangeInOrOut // exchanging in == true, out == false. + // ---------------------------------------- + ) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + const OTString strServerID(SERVER_ID), strUserID(USER_ID); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + // There is an OT_ASSERT_MSG in here for memory failure, + // but it still might return NULL if various verification fails. + OTAssetContract * pContract = this->GetAssetType(BASKET_ASSET_ID); + + if (!pContract) + { + OTLog::Output(0, "No such asset contract.\n"); + + return; + } + // No need to cleanup pContract. + // ----------------------------------------------------- + + // Next load the OTBasket object out of that contract, and load the RequestBasket object that was passed in. + OTBasket theBasket, theRequestBasket; + + if (pContract->GetBasketInfo().GetLength() && theBasket.LoadContractFromString(pContract->GetBasketInfo()) && + BASKET_INFO.GetLength() && theRequestBasket.LoadContractFromString(BASKET_INFO)) + { + const OTIdentifier & BASKET_ASSET_ACCT_ID(theRequestBasket.GetRequestAccountID()); + + // ------------------------------------------------------------------------- + OTAccount * pAccount = m_pWallet->GetAccount(BASKET_ASSET_ACCT_ID); + // no cleanup object here because the wallet owns the account. + + if (NULL == pAccount) + { + OTLog::Output(0, "OT_API::exchangeBasket: There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(BASKET_ASSET_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "OT_API::exchangeBasket: server ID passed in didn't match " + "the one on the account.\n"); + delete pAccount; pAccount = NULL; + return; + } + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "OT_API::exchangeBasket: User is not the owner of the account..\n"); + delete pAccount; pAccount = NULL; + return; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "OT_API::exchangeBasket: Bad signature or Account ID.\n"); + delete pAccount; pAccount = NULL; + return; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + m_pWallet->AddAccount(*pAccount); + + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::exchangeBasket\n"); + return; + } + } + // ------------------------------------------------------------------------ + + // We need a transaction number just to send this thing. Plus, we need a number for + // each sub-account to the basket, as well as the basket's main account. + // That is: 1 + theBasket.Count() + 1 + // Total of 2, since theBasket.Count() worth of numbers were already added in the + // calls to OT_API::AddBasketExchangeItem. + + if (pNym->GetTransactionNumCount(SERVER_ID) < 2) + { + OTLog::Output(0, "OT_API::exchangeBasket: you don't have enough transaction numbers to perform the exchange.\n"); + } + else + { + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber); // this saves + + if (bGotTransNum) + { + // ---------------------------------------------------- + // LOAD the INBOX for the MAIN ACCOUNT + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + // Set up the Request Basket! ------------------------------ + else + { + // Create a transaction + OTTransaction * pTransaction = + OTTransaction::GenerateTransaction (USER_ID, BASKET_ASSET_ACCT_ID, SERVER_ID, OTTransaction::exchangeBasket, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::exchangeBasket); + + // This pItem is where the Basket Info will be stored. (So it ends up on receipts...) + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // -------------------------------------------------- + // NOTE: I'm not checking this call for success... + // But, I DID check the count beforehand, and I know there are enough numbers. + // + long lClosingTransactionNo = 0; // for Main Basket Acct on the Request Basket. + OT_ASSERT(pNym->GetNextTransactionNum(*pNym, strServerID, lClosingTransactionNo)); // this saves + + // This goes in the final API call. + theRequestBasket.SetClosingNum(lClosingTransactionNo); // For the basketReceipt (Closing Transaction Num) for main account. + // ----------------------------------------------------------- + + // This goes in the final API call. + theRequestBasket.SetExchangingIn(bExchangeInOrOut); + + // ----------------------------------------------------------- + theRequestBasket.ReleaseSignatures(); + theRequestBasket.SignContract(*pNym); + theRequestBasket.SaveContract(); + + // Export the OTBasket object into a string, add it as + // a payload on my request, and send to server. + OTString strBasketInfo; + theRequestBasket.SaveContract(strBasketInfo); + + //*********************************************************************** + + pItem->SetAttachment(strBasketInfo); + + // sign the item. save it. + // + pItem->SignContract(*pNym); + pItem->SaveContract(); + + //*********************************************************************** + + // --------------------------------------------- + // BALANCE AGREEMENT! + // + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(0, // Change in balance is 0. (The accounts will all be changed, + *pTransaction, *pNym, *pAccount, *pOutbox); // but basketReceipts will be used to account for it.) + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, BASKET_ASSET_ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(BASKET_ASSET_ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + OTMessage theMessage; + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + long lRequestNumber=0; + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strUserID; + theMessage.m_strServerID = strServerID; + BASKET_ASSET_ACCT_ID.GetString(theMessage.m_strAcctID); + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } // Inbox loaded. + } // successfully got first transaction number. + } + } +} + + + + + +void OT_API::getTransactionNumber(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + if (m_pClient->ProcessUserCommand(OTClient::getTransactionNum, theMessage, + *pNym, *pServer, + NULL)) // NULL pAccount on this command. + { +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getTransactionNumber command in OT_API::getTransactionNumber\n"); +} + + + + + +void OT_API::notarizeWithdrawal(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & AMOUNT) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTIdentifier CONTRACT_ID; + OTString strContractID, strServerID(SERVER_ID); + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + else + { + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + // -------------------------------------------------------------------- + + if (false == OTDB::Exists(OTLog::MintFolder(), strServerID.Get(), strContractID.Get())) + { + OTLog::vError("OTContract::SignContract: File does not exist: %s%s%s%s%s\n", + OTLog::MintFolder(), OTLog::PathSeparator(), strServerID.Get(), + OTLog::PathSeparator(), strContractID.Get()); + return; + } + + // -------------------------------------------------------------------- + + OTMint theMint(strServerID, strContractID); // <================= + + // ----------------------------------------------------------------- + + OTMessage theMessage; + + long lRequestNumber = 0; + + const long lTotalAmount = atol(AMOUNT.Get()); + long lAmount = lTotalAmount; + + OTString strNymID(USER_ID), strFromAcct(ACCT_ID); + + long lStoredTransactionNumber=0; + bool bGotTransNum = false; + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + } + + else if (bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber)) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_ID, SERVER_ID, + OTTransaction::withdrawal, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::withdrawal); + pItem->SetAmount(lTotalAmount); +// pItem->m_lAmount = atol(strAmount.Get()); + OTString strNote("Gimme cash!"); + pItem->SetNote(strNote); + + const OTPseudonym * pServerNym = pServer->GetContractPublicNym(); + + // ----------------------------------------------------------------- + + if ((NULL != pServerNym) && + theMint.LoadMint() && + theMint.VerifyMint((OTPseudonym&)*pServerNym)) + { + OTPurse * pPurse = new OTPurse(SERVER_ID, CONTRACT_ID); + OTPurse * pPurseMyCopy = new OTPurse(SERVER_ID, CONTRACT_ID); + + // Create all the necessary tokens for the withdrawal amount. + // Push copies of each token into a purse to be sent to the server, + // as well as a purse to be kept for unblinding when we receive the + // server response. (Coin private unblinding keys are not sent to + // the server, obviously.) + long lTokenAmount = 0; + while (lTokenAmount = theMint.GetLargestDenomination(lAmount)) + { + lAmount -= lTokenAmount; + + // Create the relevant token request with same server/asset ID as the purse. + // the purse does NOT own the token at this point. the token's constructor + // just uses it to copy some IDs, since they must match. + OTToken theToken(*pPurse); + + // GENERATE new token, sign it and save it. + theToken.GenerateTokenRequest(*pNym, theMint, lTokenAmount); + theToken.SignContract(*pNym); + theToken.SaveContract(); + + // Now the proto-token is generated, let's add it to a purse + // By pushing theToken into pPurse with *pServerNym, I encrypt it to pServerNym. + // So now only the server Nym can decrypt that token and pop it out of that purse. + pPurse->Push(*pServerNym, theToken); + + // I'm saving my own copy of all this, encrypted to my nym + // instead of the server's, so I can get to my private coin data. + // The server's copy of theToken is already Pushed, so I can re-use + // the variable now for my own purse. + theToken.ReleaseSignatures(); + theToken.SetSavePrivateKeys(); // This time it will save the private keys when I sign it + theToken.SignContract(*pNym); + theToken.SaveContract(); + + pPurseMyCopy->Push(*pNym, theToken);// Now my copy of the purse has a version of the token, + } + + pPurse->SignContract(*pNym); + pPurse->SaveContract(); // I think this one is unnecessary. + + // Save the purse into a string... + OTString strPurse; + pPurse->SaveContract(strPurse); + + // Add the purse string as the attachment on the transaction item. + pItem->SetAttachment(strPurse); // The purse is contained in the reference string. + + + pPurseMyCopy->SignContract(*pNym); // encrypted to me instead of the server, and including + pPurseMyCopy->SaveContract(); // the private keys for unblinding the server response. + // This thing is neat and tidy. The wallet can just save it as an ascii-armored string as a + // purse field inside the wallet file. It doesn't do that for now (TODO) but it easily could. + + + // Add the purse to the wallet + // (We will need it to look up the private coin info for unblinding the token, + // when the response comes from the server.) + m_pWallet->AddPendingWithdrawal(*pPurseMyCopy); + + delete pPurse; + pPurse = NULL; // We're done with this one. + pPurseMyCopy = NULL; // The wallet owns my copy now and will handle cleaning it up. + + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(lTotalAmount*(-1), *pTransaction, *pNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; // I can't pass strLedger into this constructor because I want to encode it + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } + else + { + OTLog::Output(0, "No Transaction Numbers were available. Suggest requesting the server for a new one.\n"); + } +} + + + + + +void OT_API::notarizeDeposit(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & THE_PURSE) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTIdentifier CONTRACT_ID; + OTString strContractID; + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + else + { + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strFromAcct(ACCT_ID); + + + OTPurse thePurse(SERVER_ID, CONTRACT_ID); + + const OTPseudonym * pServerNym = pServer->GetContractPublicNym(); + + long lStoredTransactionNumber=0; + bool bGotTransNum = false; + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + } + + else if (!(bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber))) + { + OTLog::Output(0, "No Transaction Numbers were available. Try requesting the server for a new one.\n"); + } + + else if (pServerNym) + { + bool bSuccess = false; + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_ID, SERVER_ID, + OTTransaction::deposit, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::deposit); + + OTPurse theSourcePurse(thePurse); + + if (theSourcePurse.LoadContractFromString(THE_PURSE)) + while (!theSourcePurse.IsEmpty()) + { + OTToken * pToken = theSourcePurse.Pop(*pNym); + + if (pToken) + { + // TODO need 2-recipient envelopes. My request to the server is encrypted to the server's nym, + // but it should be encrypted to my Nym also, so both have access to decrypt it. + + // Now the token is ready, let's add it to a purse + // By pushing theToken into thePurse with *pServerNym, I encrypt it to pServerNym. + // So now only the server Nym can decrypt that token and pop it out of that purse. + if (false == pToken->ReassignOwnership(*pNym, *pServerNym)) + { + OTLog::Error("Error re-assigning ownership of token (to server.)\n"); + delete pToken; + pToken = NULL; + bSuccess = false; + break; + } + else + { + OTLog::vOutput(3, "Success re-assigning ownership of token (to server.)\n"); + + bSuccess = true; + + pToken->ReleaseSignatures(); + pToken->SignContract(*pNym); + pToken->SaveContract(); + + thePurse.Push(*pServerNym, *pToken); + + long lTemp = pItem->GetAmount(); + pItem->SetAmount(lTemp += pToken->GetDenomination()); + } + + delete pToken; + pToken = NULL; + } + else { + OTLog::Error("Error loading token from purse.\n"); + break; + } + + } + + if (bSuccess) + { + thePurse.SignContract(*pNym); + thePurse.SaveContract(); // I think this one is unnecessary. + + // Save the purse into a string... + OTString strPurse; + thePurse.SaveContract(strPurse); + + // Add the purse string as the attachment on the transaction item. + pItem->SetAttachment(strPurse); // The purse is contained in the reference string. + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(pItem->GetAmount(), *pTransaction, *pNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + + } // bSuccess + else + { + delete pItem; pItem = NULL; + delete pTransaction;pTransaction = NULL; + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + } // if (pServerNym) +} + + + +void OT_API::withdrawVoucher(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTIdentifier & RECIPIENT_USER_ID, + OTString & CHEQUE_MEMO, + OTString & AMOUNT) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTIdentifier CONTRACT_ID; + OTString strContractID; + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + else + { + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + + // ----------------------------------------------------------------- + + OTMessage theMessage; + + long lAmount = atol(AMOUNT.Get()); + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strFromAcct(ACCT_ID); + + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber); + + if (bGotTransNum) + { + const OTString strChequeMemo(CHEQUE_MEMO); + const OTString strRecipientUserID(RECIPIENT_USER_ID); + + const long lAmount = atol(AMOUNT.Get()); + + // ----------------------------------------------------------------------- + + // Expiration (ignored by server -- it sets its own for its vouchers.) + const time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + const time_t VALID_TO = VALID_FROM + 15552000; // 6 months. + + // ----------------------------------------------------------------------- + // The server only uses the memo, amount, and recipient from this cheque when it + // constructs the actual voucher. + OTCheque theRequestVoucher(SERVER_ID, CONTRACT_ID); + bool bIssueCheque = theRequestVoucher.IssueCheque(lAmount, lStoredTransactionNumber,// server actually ignores this and supplies its own transaction number for any voucher. + VALID_FROM, VALID_TO, ACCT_ID, USER_ID, strChequeMemo, + (strRecipientUserID.GetLength() > 2) ? &(RECIPIENT_USER_ID) : NULL); + + // -------------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else if (!bIssueCheque) + { + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_ID, SERVER_ID, + OTTransaction::withdrawal, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::withdrawVoucher); + pItem->SetAmount(lAmount); + OTString strNote("Withdraw Voucher: "); + pItem->SetNote(strNote); + + // Add the voucher request string as the attachment on the transaction item. + theRequestVoucher.SignContract(*pNym); + theRequestVoucher.SaveContract(); + OTString strVoucher(theRequestVoucher); + pItem->SetAttachment(strVoucher); // The voucher request is contained in the reference string. + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + // BALANCE AGREEMENT + + // The item is signed and saved within this call as well. No need to do that again. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(lAmount*(-1), *pTransaction, *pNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + long lRequestNumber = 0; + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + } + else + { + OTLog::Output(0, "No Transaction Numbers were available. Suggest requesting the server for a new one.\n"); + } +} + + + + + + + + + + + + + + + + + + + +// ------------------------------------------------------------------------ + + + + + + + +// ---------------------------------------------------------------- +// DEPOSIT CHEQUE +// + +void OT_API::depositCheque(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & THE_CHEQUE) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTIdentifier CONTRACT_ID; + OTString strContractID; + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + else + { + CONTRACT_ID = pAccount->GetAssetTypeID(); + CONTRACT_ID.GetString(strContractID); + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strFromAcct(ACCT_ID); + + OTCheque theCheque(SERVER_ID, CONTRACT_ID); + + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber); + + if (!bGotTransNum) + { + OTLog::Output(0, "No Transaction Numbers were available. Try requesting the server for a new one.\n"); + } + else if (!theCheque.LoadContractFromString(THE_CHEQUE)) + { + OTLog::Output(0, "Unable to load cheque from string. Sorry.\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_ID, SERVER_ID, + OTTransaction::deposit, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::depositCheque); + + OTString strNote("Deposit this cheque, please!"); + pItem->SetNote(strNote); + + OTString strCheque(theCheque); + + // Add the cheque string as the attachment on the transaction item. + pItem->SetAttachment(strCheque); // The cheque is contained in the reference string. + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + else + { + // BALANCE AGREEMENT + // --------------------------------------------- + + // pBalanceItem is signed and saved within this call. No need to do that twice. + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(theCheque.GetAmount(), *pTransaction, *pNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + } // bSuccess +} + + + + + +// ---------------------------------------------------------------- +// DEPOSIT PAYMENT PLAN +// +// The Recipient Creates the Payment Plan using ProposePaymentPlan. +// Then the sender Confirms it using ConfirmPaymentPlan. +// Both of the above steps involve attaching transaction numbers to +// the payment plan and signing copies of it. +// This function here is the final step, where the payment plan +// contract is now being deposited by the customer (who is also +// the sender), in a message to the server. +// +void OT_API::depositPaymentPlan(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTString & THE_PAYMENT_PLAN) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTPaymentPlan thePlan; + OTMessage theMessage; + + long lRequestNumber = 0; + + const OTString strServerID(SERVER_ID), strNymID(USER_ID); + + + if (thePlan.LoadContractFromString(THE_PAYMENT_PLAN) && + thePlan.VerifySignature(*pNym)) + { + const OTIdentifier SENDER_ACCT_ID(thePlan.GetSenderAcctID()); + const OTString strFromAcct(SENDER_ACCT_ID); + + OTAccount * pAccount = pWallet->GetAccount(SENDER_ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There's no asset account in the wallet with that ID. Trying to load from storage...\n"); + + pAccount = OTAccount::LoadExistingAccount(SENDER_ACCT_ID, SERVER_ID); + + if (NULL != pAccount) // It loaded... + { + if (SERVER_ID != pAccount->GetRealServerID()) + { + OTLog::Output(0, "Depositing a payment plan, server ID passed in didn't match the one on the account.\n"); + delete pAccount; pAccount = NULL; + return; + } + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "depositPaymentPlan: User is not the owner of the account.\n"); + delete pAccount; pAccount = NULL; + return; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "depositPaymentPlan: Bad signature or Account ID.\n"); + delete pAccount; pAccount = NULL; + return; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + pWallet->AddAccount(*pAccount); + + // ----------------------------------------------------- + } + else + { + OTLog::Error("Error loading Asset Account in OT_API::depositPaymentPlan\n"); + return; + } + } // if NULL == pAccount == pWallet->getAccount() + + if (false == pAccount->VerifyOwner(*pNym)) // Verifies Ownership. + { + OTLog::Output(0, "depositPaymentPlan: User is not the owner of the account.\n"); + return; + } + + // By this point, I know the user is listed on the account as the owner. + + // ----------------------------------------------------- + + if (false == pAccount->VerifyAccount(*pNym)) // Verifies ContractID and Signature. + { + OTLog::Output(0, "depositPaymentPlan: Bad signature or Account ID.\n"); + return; + } + + // By this point, I know that everything checks out. Signature and Account ID. + + // ----------------------------------------------------- + + // By this point, pAccount is a good pointer and in the wallet. + // (No need to cleanup.) I also know it has the right Server ID + // and that the Nym owns it, and has signed it. + // ----------------------------------------------------- + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, SENDER_ACCT_ID, SERVER_ID, + OTTransaction::paymentPlan, thePlan.GetTransactionNum()); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::paymentPlan); + + OTString strPlan(thePlan); + + // Add the payment plan string as the attachment on the transaction item. + pItem->SetAttachment(strPlan); // The payment plan is contained in the reference string. + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // TRANSACTION AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pStatementItem = pNym->GenerateTransactionStatement(*pTransaction); + + if (NULL != pStatementItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pStatementItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, SENDER_ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(SENDER_ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } // thePlan.LoadContractFromString() + else + { + OTLog::Output(0, "Unable to load payment plan from string, or verify it. Sorry.\n"); + } +} + + + + + + + + + +// DONE: CHange this into a TRANSACTION! +// + +///------------------------------------------------------- +/// CANCEL A SPECIFIC OFFER (THAT SAME NYM PLACED PREVIOUSLY ON SAME SERVER.) +/// By transaction number as key. +/// +void OT_API::cancelCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & ASSET_ACCT_ID, + const long & lTransactionNum) // so the server can lookup the offer in Cron. +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + // WALLET + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + // SERVER CONTRACT + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + // NYM + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + long lRequestNumber = 0; + + const OTString strServerID(SERVER_ID), strNymID(USER_ID); + + if (pNym->GetTransactionNumCount(strServerID) < 1) + { + OTLog::Output(0, "OT_API::cancelCronItem: At least 1 Transaction Number is necessary to cancel any cron item. " + "Try requesting the server for more numbers (you are low.)\n"); + return; + } + // ------------------------------------ + + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=false + + if (!bGotTransNum) + { + OTLog::Error("OT_API::cancelCronItem: Supposedly there was a transaction number available, but the call\n" + "still failed.\n"); + } + else + { + // ------------------------------------------------------------------- + + OTString str_ASSET_ACCT_ID(ASSET_ACCT_ID); + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ASSET_ACCT_ID, SERVER_ID, + OTTransaction::cancelCronItem, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::cancelCronItem); + OT_ASSERT_MSG(NULL != pItem, "Error allocating memory in the OT API"); + + pItem->SetReferenceToNum(lTransactionNum); // This transaction is being sent in order to cancel another transaction. + pTransaction->SetReferenceToNum(lTransactionNum); // This is where we clearly show which one is actually being cancelled. + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // TRANSACTION AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pStatementItem = pNym->GenerateTransactionStatement(*pTransaction); + + if (NULL != pStatementItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pStatementItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ASSET_ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ASSET_ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = str_ASSET_ACCT_ID; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } // got transaction number. +} + + + +// DONE: Make sure this includes a CLOSING transaction num! +// Copy the payment plan code.... + +// ---------------------------------------------------------------- +// ISSUE MARKET OFFER +// +// +void OT_API::issueMarketOffer(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + // ------------------------------------------- + const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & ASSET_ACCT_ID, + // ------------------------------------------- + const OTIdentifier & CURRENCY_TYPE_ID, + const OTIdentifier & CURRENCY_ACCT_ID, + // ------------------------------------------- + const long & MARKET_SCALE, // Defaults to minimum of 1. Market granularity. + const long & MINIMUM_INCREMENT, // This will be multiplied by the Scale. Min 1. + const long & TOTAL_ASSETS_ON_OFFER, // Total assets available for sale or purchase. Will be multiplied by minimum increment. + const long & PRICE_LIMIT, // Per Minimum Increment... + const bool bBuyingOrSelling) // BUYING == false, SELLING == true. +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + + OTMessage theMessage; + + long lRequestNumber = 0; + + const OTString strServerID(SERVER_ID), strNymID(USER_ID); + + if (pNym->GetTransactionNumCount(strServerID) < 3) + { + OTLog::Output(0, "OT_API::issueMarketOffer: At least 3 Transaction Numbers are necessary to issue a market offer. " + "Try requesting the server for more (you are low.)\n"); + return; + } + // ------------------------------------ + + long lStoredTransactionNumber=0, lAssetAcctClosingNo=0, lCurrencyAcctClosingNo=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber, false); // bSave=false + bool bGotAssetClosingNum = pNym->GetNextTransactionNum(*pNym, strServerID, lAssetAcctClosingNo, false); // bSave=true (true is default in this case, FYI.) + bool bGotCurrencyClosingNum = pNym->GetNextTransactionNum(*pNym, strServerID, lCurrencyAcctClosingNo, true); // bSave=true + + if (!bGotTransNum || !bGotAssetClosingNum || !bGotCurrencyClosingNum) + { + OTLog::Error("OT_API::issueMarketOffer: Supposedly there were 3 transaction numbers available, but the call(s)\n" + "still failed. (Re-adding back to Nym, and failing out of this function.)\n"); + + if (bGotTransNum) + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, false); // bSave=true + + if (bGotAssetClosingNum) + pNym->AddTransactionNum(*pNym, strServerID, lAssetAcctClosingNo, false); // bSave=true + + if (bGotCurrencyClosingNum) + pNym->AddTransactionNum(*pNym, strServerID, lCurrencyAcctClosingNo, false); // bSave=true + + if (bGotTransNum || bGotAssetClosingNum || bGotCurrencyClosingNum) + pNym->SaveSignedNymfile(*pNym); + } + else + { + // ------------------------------------------------------------------- + + long lTotalAssetsOnOffer = 1, + lMinimumIncrement = 1, + lPriceLimit = 1, + lMarketScale = 1; + + // ------------------------------------------------------------------- + + if (MARKET_SCALE > 0) + lMarketScale = MARKET_SCALE; // otherwise, defaults to 1. + + if (MINIMUM_INCREMENT > 0) + lMinimumIncrement = MINIMUM_INCREMENT; // otherwise, defaults to 1. + + lMinimumIncrement *= lMarketScale; // minimum increment is PER SCALE. + + // ------------------------------------------------------------------- + + if (TOTAL_ASSETS_ON_OFFER > 0) + lTotalAssetsOnOffer = TOTAL_ASSETS_ON_OFFER; // otherwise, defaults to 1. + + lTotalAssetsOnOffer *= lMinimumIncrement; + + // ------------------------------------------------------------------- + + if (PRICE_LIMIT > 0) // your price limit, per scale of assets. + lPriceLimit = PRICE_LIMIT; // otherwise, defaults to 1. + + // ------------------------------------------------------------------- + + + OTOffer theOffer(SERVER_ID, ASSET_TYPE_ID, CURRENCY_TYPE_ID, lMarketScale); + + OTTrade theTrade(SERVER_ID, + ASSET_TYPE_ID, ASSET_ACCT_ID, + USER_ID, + CURRENCY_TYPE_ID, CURRENCY_ACCT_ID); + + // MAKE OFFER... + + bool bCreateOffer = theOffer.MakeOffer(bBuyingOrSelling, // True == SELLING, False == BUYING + lPriceLimit, // Per Minimum Increment... + lTotalAssetsOnOffer, // Total assets available for sale or purchase. + lMinimumIncrement, // The minimum increment that must be bought or sold for each transaction + lStoredTransactionNumber); // Transaction number matches on transaction, item, offer, and trade. + + // ------------------------------------------------------------------- + + // ISSUE TRADE. + + bool bIssueTrade = false; + + if (bCreateOffer) + { + bCreateOffer = theOffer.SignContract(*pNym); + + if (bCreateOffer) + { + bCreateOffer = theOffer.SaveContract(); + + if (bCreateOffer) + { + bIssueTrade = theTrade.IssueTrade(theOffer); // <==== ISSUE TRADE <===== + + // ****************************************************************************** + // This is new: the closing transaction number is now used for CLOSING recurring + // cron items, like market offers and payment plans. It's also useful for baskets. + // Since this is a market offer, it needs a closing number (for later cancellation + // or expiration.) + // lAssetAcctClosingNo=0, lCurrencyAcctClosingNo=0; + // + theTrade.AddClosingTransactionNo(lAssetAcctClosingNo); + theTrade.AddClosingTransactionNo(lCurrencyAcctClosingNo); + + if (bIssueTrade) + { + bIssueTrade = theTrade.SignContract(*pNym); + + if (bIssueTrade) + bIssueTrade = theTrade.SaveContract(); + } // if ( bIssueTrade ) + } + } + } // if ( bCreateOffer ) + + // ------------------------------------------------------------------- + + if (bCreateOffer && bIssueTrade) + { + OTString str_ASSET_ACCT_ID(ASSET_ACCT_ID); + + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ASSET_ACCT_ID, SERVER_ID, + OTTransaction::marketOffer, lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::marketOffer, + (OTIdentifier *)(&CURRENCY_ACCT_ID)); + // the "To" account (normally used for a TRANSFER transaction) is used here + // storing the Currency Acct ID. The Server will expect the Trade object bundled + // within this item to have an Asset Acct ID and "Currency" Acct ID that match + // those on this Item. Otherwise it will reject the offer. + + OT_ASSERT_MSG(NULL != pItem, "Error allocating memory in the OT API"); + + OTString strTrade; + theTrade.SaveContract(strTrade); + + // Add the trade string as the attachment on the transaction item. + pItem->SetAttachment(strTrade); // The trade is contained in the attachment string. (The offer is within the trade.) + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + // TRANSACTION AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that again. + OTItem * pStatementItem = pNym->GenerateTransactionStatement(*pTransaction); + + if (NULL != pStatementItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pStatementItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ASSET_ACCT_ID, SERVER_ID); + theLedger.GenerateLedger(ASSET_ACCT_ID, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); // now the ledger "owns" and will handle cleaning up the transaction. + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form... encoding... + OTString strLedger(theLedger); + OTASCIIArmor ascLedger(strLedger); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = str_ASSET_ACCT_ID; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } // if (bCreateOffer && bIssueTrade) + else + { + OTLog::Output(0, "Unable to create offer or issue trade. Sorry.\n"); + + // IF FAILED, ADD TRANSACTION NUMBER (and closing number) BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, false); // bSave defaults to true + pNym->AddTransactionNum(*pNym, strServerID, lAssetAcctClosingNo, false); + pNym->AddTransactionNum(*pNym, strServerID, lCurrencyAcctClosingNo, true); // bSave=true (No sense saving thrice in a row.) + } + } // got transaction number. +} + + + +// ----------------------------------- +/// GET MARKET LIST +/// +/// Connect to a specific server, as a specific Nym, and request the list of markets. +/// (Flush the buffer before calling this. Then after you make this call, wait 50 ms +/// and then pop the buffer and check the server reply for success. From there you can +/// either read the reply data directly out of the reply message, or you can load it from +/// storage (OT will probably auto-store the reply to storage, for your convenience.) +/// +void OT_API::getMarketList(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + OTMessage theMessage; + + OTString strServerID(SERVER_ID); + + // ----------------------------------------------------- + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + long lRequestNumber = 0; + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + OTString strNymID(USER_ID); + + // (1) Set up member variables + theMessage.m_strCommand = "getMarketList"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + +// ----------------------------------------------------- +/// GET ALL THE OFFERS ON A SPECIFIC MARKET +/// +/// A specific Nym is requesting the Server to send a list of the offers on a specific +/// Market ID-- the bid/ask, and prices/amounts, basically--(up to lDepth or server Max) +/// +void OT_API::getMarketOffers(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & MARKET_ID, const long & lDepth) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + OTMessage theMessage; + + OTString strServerID(SERVER_ID), strMarketID(MARKET_ID); + + // ----------------------------------------------------- + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + long lRequestNumber = 0; + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + OTString strNymID(USER_ID); + // (1) Set up member variables + theMessage.m_strCommand = "getMarketOffers"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strNymID2 = strMarketID; + theMessage.m_lDepth = lDepth; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + +///------------------------------------------------------- +/// GET RECENT TRADES FOR A SPECIFIC MARKET ID +/// +/// Most likely, ticker data will be made available through a separate ZMQ instance, +/// which will use the publisher/subscriber model to distribute ticker data. From there, +/// those privileged subscribers can distribute it via RSS, store it for future analysis, +/// display charts, etc. +/// +/// (So this function is not here to usurp that purpose.) +/// +void OT_API::getMarketRecentTrades(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & MARKET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + OTMessage theMessage; + + OTString strServerID(SERVER_ID), strMarketID(MARKET_ID); + + // ----------------------------------------------------- + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + long lRequestNumber = 0; + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + OTString strNymID(USER_ID); + // (1) Set up member variables + theMessage.m_strCommand = "getMarketRecentTrades"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strNymID2 = strMarketID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + +///------------------------------------------------------- +/// GET ALL THE ACTIVE (in Cron) MARKET OFFERS FOR A SPECIFIC NYM. +/// (ON A SPECIFIC SERVER, OBVIOUSLY.) Remember to use Flush/Call/Wait/Pop +/// to check the server reply for success or fail. +/// Hmm for size reasons, this really will have to return a list of transaction #s, +/// and then I request them one-by-one after that... +/// +void OT_API::getNym_MarketOffers(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------------------- + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + OTMessage theMessage; + + OTString strServerID(SERVER_ID); + + // ----------------------------------------------------- + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + long lRequestNumber = 0; + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + OTString strNymID(USER_ID); + + // (1) Set up member variables + theMessage.m_strCommand = "getNym_MarketOffers"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + +// =============================================================== + + + + +void OT_API::notarizeTransfer(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_FROM, + OTIdentifier & ACCT_TO, + OTString & AMOUNT, + OTString & NOTE) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_FROM); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + + long lRequestNumber = 0; + long lAmount = atol(AMOUNT.Get()); + + OTString strServerID(SERVER_ID), strNymID(USER_ID), + strFromAcct(ACCT_FROM), strToAcct(ACCT_TO); + + long lStoredTransactionNumber=0; + bool bGotTransNum = pNym->GetNextTransactionNum(*pNym, strServerID, lStoredTransactionNumber); + + if (bGotTransNum) + { + // Create a transaction + OTTransaction * pTransaction = OTTransaction::GenerateTransaction (USER_ID, ACCT_FROM, + SERVER_ID, + OTTransaction::transfer, + lStoredTransactionNumber); + + // set up the transaction item (each transaction may have multiple items...) + OTItem * pItem = OTItem::CreateItemFromTransaction(*pTransaction, OTItem::transfer, &ACCT_TO); + pItem->SetAmount(atol(AMOUNT.Get())); + + // The user can include a note here for the recipient. + if (NOTE.Exists() && NOTE.GetLength() > 2) + { + pItem->SetNote(NOTE); + } + + // sign the item + pItem->SignContract(*pNym); + pItem->SaveContract(); + + pTransaction->AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // -------------------------------------------------- + + OTLedger * pInbox = pAccount->LoadInbox(*pNym); + OTLedger * pOutbox = pAccount->LoadOutbox(*pNym); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox) + { + OTLog::Output(0, "Failed loading inbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else if (NULL == pOutbox) + { + OTLog::Output(0, "Failed loading outbox!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + } + + else + { + // Need to setup a dummy outbox transaction (to mimic the one that will be on the server side when this pending transaction is actually put into the real outbox.) + // When the server adds its own, and then compares the two, they should both show the same pending transaction, in order for this balance agreement to be valid.. + // Otherwise the server would have to refuse it for being inaccurate (server can't sign something inaccurate!) So I throw a dummy on there before generating balance statement. + + OTTransaction * pOutboxTransaction = OTTransaction::GenerateTransaction(*pOutbox, OTTransaction::pending, + 1/*todo pick some number that everyone agrees doesn't matter, like 1. The referring-to is the important + number in this case, and perhaps server should update this value too before signing and returning.*/); // todo use a constant instead of '1' + + OT_ASSERT(NULL != pOutboxTransaction); // for now. + + OTString strItem(*pItem); + pOutboxTransaction->SetReferenceString(strItem); // So the GenerateBalanceStatement function below can get the other info off this item (like amount, etc) + pOutboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + +// pOutboxTransaction->SignContract(*pNym); // Unnecessary to sign/save, since this is just a dummy data for verification +// pOutboxTransaction->SaveContract(); // purposes, and isn't being serialized anywhere. + + pOutbox->AddTransaction(*pOutboxTransaction); // no need to cleanup pOutboxTransaction since pOutbox will handle it now. + + // --------------------------------------------- + // BALANCE AGREEMENT + + // pBalanceItem is signed and saved within this call. No need to do that twice. + // + OTItem * pBalanceItem = pInbox->GenerateBalanceStatement(atol(AMOUNT.Get())*(-1), *pTransaction, *pNym, *pAccount, *pOutbox); + + if (NULL != pBalanceItem) // will never be NULL. Will assert above before it gets here. + pTransaction->AddItem(*pBalanceItem); // Better not be NULL... message will fail... But better check anyway. + + // --------------------------------------------- + + // sign the transaction + pTransaction->SignContract(*pNym); + pTransaction->SaveContract(); + + // set up the ledger + OTLedger theLedger(USER_ID, ACCT_FROM, SERVER_ID); + theLedger.GenerateLedger(ACCT_FROM, SERVER_ID, OTLedger::message); // bGenerateLedger defaults to false, which is correct. + theLedger.AddTransaction(*pTransaction); + + // sign the ledger + theLedger.SignContract(*pNym); + theLedger.SaveContract(); + + // extract the ledger in ascii-armored form + OTString strLedger(theLedger); + OTASCIIArmor ascLedger; + + // Encoding... + ascLedger.SetString(strLedger); + + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) Set up member variables + theMessage.m_strCommand = "notarizeTransactions"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strFromAcct; + theMessage.m_ascPayload = ascLedger; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) + #if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); + #endif + m_pClient->ProcessMessageOut(theMessage); + } + } + else + { + OTLog::Output(0, "No transaction numbers were available. Suggest requesting the server for one.\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. +// pNym->AddTransactionNum(*pNym, strServerID, lStoredTransactionNumber, true); // bSave=true + // Duh! No need to re-add a transaction num when the error is that there weren't any transaction numbers... + } +} + + + + + +void OT_API::getNymbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getNymbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + +void OT_API::getInbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAcctID(ACCT_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getInbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + +void OT_API::getOutbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAcctID(ACCT_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getOutbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + + +void OT_API::processNymbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & NYMBOX_LEDGER) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "processNymbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + // Presumably NYMBOX_LEDGER was already set up before this function was called... + // See test client for example of it being done. + theMessage.m_ascPayload.SetString(NYMBOX_LEDGER); + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + +void OT_API::processInbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & ACCT_LEDGER) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAcctID(ACCT_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "processInbox"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // Presumably ACCT_LEDGER was already set up before this function was called... + // See test client for example of it being done. + theMessage.m_ascPayload.SetString(ACCT_LEDGER); + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + +void OT_API::issueAssetType(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & THE_CONTRACT) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAssetContract theAssetContract; + + if (theAssetContract.LoadContractFromString(THE_CONTRACT)) + { + OTIdentifier newID; + theAssetContract.CalculateContractID(newID); + + // ----------------------- + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "issueAssetType"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + + newID.GetString(theMessage.m_strAssetID); + OTString strAssetContract(theAssetContract); + theMessage.m_ascPayload.SetString(strAssetContract); + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // ------------------------------------ + // Save the contract to local storage and add to wallet. + + OTString strFilename; // In this case the filename isn't actually used, since SaveToContractFolder will + // handle setting up the filename and overwrite it anyway. But I still prefer to set it + // up correctly, rather than pass a blank. I'm just funny like that. + strFilename = theMessage.m_strAssetID.Get(); + + OTString strFoldername(OTLog::ContractFolder()); + + OTAssetContract * pContract = new OTAssetContract(theMessage.m_strAssetID, strFoldername, + strFilename, theMessage.m_strAssetID); + + OT_ASSERT(NULL != pContract); + + // Check the server signature on the contract here. (Perhaps the message is good enough? + // After all, the message IS signed by the server and contains the Account. + // if (pContract->LoadContract() && pContract->VerifyContract()) + if (pContract->LoadContractFromString(THE_CONTRACT) && pContract->VerifyContract()) + { + // Next make sure the wallet has this contract on its list... + OTWallet * pWallet = NULL; + + if (NULL != (pWallet = m_pWallet)) + { + pWallet->AddAssetContract(*pContract); // this saves both the contract and the wallet. + pContract = NULL; // Success. The wallet "owns" it now, no need to clean it up. + } + } + // cleanup + if (pContract) + { + delete pContract; + pContract = NULL; + } + + // ---------------------------- + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } +} + + + +void OT_API::getContract(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAssetContract * pAssetContract = m_pWallet->GetAssetContract(ASSET_ID); + + if (!pAssetContract) + { + OTLog::Output(0, "Couldn't find any asset contract with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAssetTypeID(ASSET_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getContract"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetTypeID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + + + +void OT_API::getMint(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAssetContract * pAssetContract = m_pWallet->GetAssetContract(ASSET_ID); + + if (!pAssetContract) + { + OTLog::Output(0, "There's no Asset Contract already loaded with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAssetTypeID(ASSET_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getMint"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetTypeID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + + +void OT_API::createAssetAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAssetContract * pAssetContract = pWallet->GetAssetContract(ASSET_ID); + + if (!pAssetContract) + { + OTLog::Output(0, "There's no Asset Contract already loaded with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAssetTypeID(ASSET_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "createAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAssetID = strAssetTypeID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + +void OT_API::deleteAssetAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCOUNT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTWallet * pWallet = GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The Wallet is not loaded.\n"); + return; + } + + // By this point, pWallet is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------- + + + OTServerContract * pServer = pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // By this point, pServer is a good pointer. (No need to cleanup.) + + // ----------------------------------------------------------------- + + OTPseudonym * pNym = pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + { + return; + } + + pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = pWallet->GetAccount(ACCOUNT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAcctID(ACCOUNT_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "deleteAssetAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + + + +void OT_API::getAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTAccount * pAccount = m_pWallet->GetAccount(ACCT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "There is no account in the wallet with that ID.\n"); + + return; + } + + // ----------------------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strAcctID(ACCT_ID); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "getAccount"; + theMessage.m_strNymID = strNymID; + theMessage.m_strServerID = strServerID; + theMessage.m_strAcctID = strAcctID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + +void OT_API::getRequest(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + if (m_pClient->ProcessUserCommand(OTClient::getRequest, theMessage, + *pNym, *pServer, + NULL)) // NULL pAccount on this command. + { +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing getRequest command in OT_API::getRequest\n"); +} + + + +void OT_API::checkUser(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & USER_ID_CHECK) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strNymID2(USER_ID_CHECK); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "checkUser"; + theMessage.m_strNymID = strNymID; + theMessage.m_strNymID2 = strNymID2; + theMessage.m_strServerID = strServerID; + + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); +} + + + +void OT_API::sendUserMessage(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & USER_ID_RECIPIENT, + OTASCIIArmor & RECIPIENT_PUBKEY, + OTString & THE_MESSAGE) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTMessage theMessage; + long lRequestNumber = 0; + + OTString strServerID(SERVER_ID), strNymID(USER_ID), strNymID2(USER_ID_RECIPIENT); + + // (0) Set up the REQUEST NUMBER and then INCREMENT IT + pNym->GetCurrentRequestNum(strServerID, lRequestNumber); + theMessage.m_strRequestNum.Format("%ld", lRequestNumber); // Always have to send this. + pNym->IncrementRequestNum(*pNym, strServerID); // since I used it for a server request, I have to increment it + + // (1) set up member variables + theMessage.m_strCommand = "sendUserMessage"; + theMessage.m_strNymID = strNymID; + theMessage.m_strNymID2 = strNymID2; + theMessage.m_strServerID = strServerID; + + OTEnvelope theEnvelope; + OTAsymmetricKey thePubkey; + + if (!thePubkey.SetPublicKey(RECIPIENT_PUBKEY)) + { + OTLog::Output(0, "Failed setting public key.\n"); + } + else if (THE_MESSAGE.Exists() && + theEnvelope.Seal(thePubkey, THE_MESSAGE) && + theEnvelope.GetAsciiArmoredData(theMessage.m_ascPayload)) + { + // (2) Sign the Message + theMessage.SignContract(*pNym); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + theMessage.SaveContract(); + + // (Send it) +#if defined(OT_ZMQ_MODE) + // ----------------------------------------------------------------- + + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + + + // ---------------------------------------------- + // store a copy in the outmail. + // (not encrypted, since the Nymfile will be encrypted anyway. + // + OTMessage * pMessage = new OTMessage; + + OT_ASSERT(NULL != pMessage); + + pMessage->m_strCommand = "outmailMessage"; + pMessage->m_strNymID = strNymID; + pMessage->m_strNymID2 = strNymID2; + pMessage->m_strServerID = strServerID; + pMessage->m_strRequestNum.Format("%ld", lRequestNumber); + + pMessage->m_ascPayload.SetString(THE_MESSAGE); + + pMessage->SignContract(*pNym); + pMessage->SaveContract(); + + pNym->AddOutmail(*pMessage); // Now the Nym is responsible to delete it. It's in his "outmail". + OTPseudonym * pSignerNym = pNym; + pNym->SaveSignedNymfile(*pSignerNym); // commented out temp for testing. + } + else + { + OTLog::Output(0, "Failed sealing envelope.\n"); + } +} + + + + +void OT_API::createUserAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + if (m_pClient->ProcessUserCommand(OTClient::createUserAccount, theMessage, + *pNym, *pServer, + NULL)) // NULL pAccount on this command. + { +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing createUserAccount command in OT_API::createUserAccount\n"); + +} + +void OT_API::deleteUserAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + if (m_pClient->ProcessUserCommand(OTClient::deleteUserAccount, theMessage, + *pNym, *pServer, + NULL)) // NULL pAccount on this command. + { +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing deleteUserAccount command in OT_API::deleteUserAccount\n"); + +} + + +void OT_API::checkServerID(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID) +{ + OT_ASSERT_MSG(m_bInitialized, "Not initialized; call OT_API::Init first."); + + // ----------------------------------------------------------------- + + OTServerContract * pServer = m_pWallet->GetServerContract(SERVER_ID); + + if (!pServer) + { + OTLog::Output(0, "That server contract is not available in the wallet.\n"); + + return; + } + + + // ----------------------------------------------------- + + OTPseudonym * pNym = m_pWallet->GetNymByID(USER_ID); + + if (NULL == pNym) // Wasn't already in the wallet. + { + OTLog::Output(0, "There's no User already loaded with that ID. Loading...\n"); + + pNym = this->LoadPrivateNym(USER_ID); + + if (NULL == pNym) // LoadPrivateNym has plenty of error logging already. + return; + + m_pWallet->AddNym(*pNym); + } + + // By this point, pNym is a good pointer, and is on the wallet. + // (No need to cleanup.) + // ----------------------------------------------------- + + OTMessage theMessage; + + if (m_pClient->ProcessUserCommand(OTClient::checkServerID, theMessage, + *pNym, *pServer, + NULL)) // NULL pAccount on this command. + { +#if defined(OT_ZMQ_MODE) + m_pClient->SetFocusToServerAndNym(*pServer, *pNym, &OT_API::TransportCallback); +#endif + m_pClient->ProcessMessageOut(theMessage); + } + else + OTLog::Error("Error processing checkServerID command in OT_API::checkServerID\n"); + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testwallet/OpenTransactions.h b/testwallet/OpenTransactions.h new file mode 100644 index 000000000..8e8497cfc --- /dev/null +++ b/testwallet/OpenTransactions.h @@ -0,0 +1,575 @@ +/************************************************************************************ + * + * OpenTransactions.h This is the header to include if you link to OTAPI.a + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + + +#ifndef __OPEN_TRANSACTIONS_INTERFACE_H__ +#define __OPEN_TRANSACTIONS_INTERFACE_H__ + +#include + +class OTString; +class OTIdentifier; +class OTServerContract; +class OTEnvelope; +class OTWallet; +class OTClient; +class OTPseudonym; +class OTAccount; +class OTAssetContract; +class OTServerContract; +class OTPurse; +class OTCheque; +class OTPaymentPlan; +class OTMint; +class OTMessage; +class OTLedger; + + +// This function is what makes Open Transactions go over XmlRpc/HTTP instead of TCP/SSL +// (If you compile it in rpc mode using "make rpc" +// +#if defined(OT_ZMQ_MODE) +#include +#endif + + +// -------------------------------------------------------------------- + +class OT_API // The C++ high-level interface to the Open Transactions client-side. +{ + OTWallet * m_pWallet; + OTClient * m_pClient; + + bool m_bInitialized; + + OTString * m_pstrStoragePath; + OTString * m_pstrWalletFilename; + + static zmq::context_t s_ZMQ_Context; + +public: + + static void TransportCallback(OTServerContract & theServerContract, OTEnvelope & theEnvelope); + + inline OTWallet * GetWallet() { return m_pWallet; } + inline OTClient * GetClient() { return m_pClient; } + + inline const char * GetStoragePath() { return ((NULL == m_pstrStoragePath) ? NULL : m_pstrStoragePath->Get()); } + inline const char * GetWalletFilename() { return ((NULL == m_pstrWalletFilename) ? NULL : m_pstrWalletFilename->Get()); } + + inline bool SetStoragePath(const OTString & strPath) + { return ((NULL == m_pstrStoragePath) ? false : (m_pstrStoragePath->Set(strPath), true) ); } + inline bool SetWalletFilename(const OTString & strFilename) + { return ((NULL == m_pstrWalletFilename) ? false : (m_pstrWalletFilename->Set(strFilename), true) ); } + + OT_API(); + ~OT_API(); + + bool LoadConfigFile(const OTString & strMainPath); + + bool Init(OTString & strClientPath); // Per instance. + static bool InitOTAPI(); // Once per run. + + bool IsInitialized() const { return m_bInitialized; } + + bool LoadWallet(const OTString & strFilename); + + // Note: these two functions are NOT used in XmlRpc Mode + // ONLY for SSL/TCP mode... + bool ConnectServer(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & strCA_FILE, + OTString & strKEY_FILE, + OTString & strKEY_PASSWORD); + bool ProcessSockets(); + // -------------------------------------------------- + + // Reading data about the local wallet.. presumably already loaded. + + int GetNymCount(); + int GetServerCount(); + int GetAssetTypeCount(); + int GetAccountCount(); + + bool GetNym(int iIndex, OTIdentifier & NYM_ID, OTString & NYM_NAME); + bool GetServer(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + bool GetAssetType(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + bool GetAccount(int iIndex, OTIdentifier & THE_ID, OTString & THE_NAME); + + // ---------------------------------------------------- + // In this case, the ID is input, the pointer is output. + // Gets the data from Wallet. + // + OTPseudonym * GetNym(const OTIdentifier & NYM_ID); + OTServerContract * GetServer(const OTIdentifier & THE_ID); + OTAssetContract * GetAssetType(const OTIdentifier & THE_ID); + OTAccount * GetAccount(const OTIdentifier & THE_ID); + + OTPseudonym * GetNymByIDPartialMatch(const std::string PARTIAL_ID); + OTServerContract * GetServerContractPartialMatch(const std::string PARTIAL_ID); + OTAssetContract * GetAssetContractPartialMatch(const std::string PARTIAL_ID); + OTAccount * GetAccountPartialMatch(const std::string PARTIAL_ID); + + // ---------------------------------------------------- + + // The name is basically just a client-side label. + // This function lets you change it. + bool SetNym_Name(const OTIdentifier & NYM_ID, + const OTIdentifier & SIGNER_NYM_ID, + const OTString & NYM_NEW_NAME); + + // The name is basically just a client-side label. + // This function lets you change it. + bool SetAccount_Name(const OTIdentifier & ACCT_ID, + const OTIdentifier & SIGNER_NYM_ID, + const OTString & ACCT_NEW_NAME); + + // The name is basically just a client-side label. + // This function lets you change it. + bool SetAssetType_Name(const OTIdentifier & ASSET_ID, + const OTString & STR_NEW_NAME); + + // The name is basically just a client-side label. + // This function lets you change it. + bool SetServer_Name(const OTIdentifier & SERVER_ID, + const OTString & STR_NEW_NAME); + + // ---------------------------------------------------- + + // Accessing local storage... + // (Caller responsible to delete.) + // + OTPseudonym * LoadPublicNym(const OTIdentifier & NYM_ID); + OTPseudonym * LoadPrivateNym(const OTIdentifier & NYM_ID); + + OTPseudonym * CreateNym(); // returns a new nym (with key pair) and files created. (Or NULL.) + + bool IsNym_RegisteredAtServer(const OTIdentifier & NYM_ID, const OTIdentifier & SERVER_ID); + + // ---------------------------------------------------- + // + // Returns an OTCheque pointer, or NULL. + // (Caller responsible to delete.) + OTCheque * WriteCheque(const OTIdentifier & SERVER_ID, + const long & CHEQUE_AMOUNT, + const time_t & VALID_FROM, + const time_t & VALID_TO, + const OTIdentifier & SENDER_ACCT_ID, + const OTIdentifier & SENDER_USER_ID, + const OTString & CHEQUE_MEMO, + const OTIdentifier * pRECIPIENT_USER_ID=NULL); + + // ---------------------------------------------------- + + // PROPOSE PAYMENT PLAN (called by Merchant) + // + // Returns an OTPaymentPlan pointer, or NULL. + // (Caller responsible to delete.) + // + // Payment Plan Delay, and Payment Plan Period, both default to 30 days (if you pass 0), + // measured in seconds. + // + // Payment Plan Length, and Payment Plan Max Payments, both default to 0, which means + // no maximum length and no maximum number of payments. + // + OTPaymentPlan * ProposePaymentPlan(const OTIdentifier & SERVER_ID, + // ---------------------------------------- + const time_t & VALID_FROM, + const time_t & VALID_TO, + // ---------------------------------------- + const OTIdentifier & SENDER_ACCT_ID, + const OTIdentifier & SENDER_USER_ID, + // ---------------------------------------- + const OTString & PLAN_CONSIDERATION, // like a memo. + // ---------------------------------------- + const OTIdentifier & RECIPIENT_ACCT_ID, + const OTIdentifier & RECIPIENT_USER_ID, + // ---------------------------------------- // If it's above zero, the initial + const long & INITIAL_PAYMENT_AMOUNT, // amount will be processed after + const time_t & INITIAL_PAYMENT_DELAY, // delay (seconds from now.) + // ---------------------------------------- // AND SEPARATELY FROM THIS... + const long & PAYMENT_PLAN_AMOUNT, // The regular amount charged, + const time_t & PAYMENT_PLAN_DELAY, // which begins occuring after delay + const time_t & PAYMENT_PLAN_PERIOD, // (seconds from now) and happens + // ----------------------------------------// every period, ad infinitum, until + time_t PAYMENT_PLAN_LENGTH = 0, // after the length (in seconds) + int PAYMENT_PLAN_MAX_PAYMENTS = 0 // expires, or after the maximum + ); // number of payments. These last + // two arguments are optional. + // CONFIRM PAYMENT PLAN (called by Customer) + // + bool ConfirmPaymentPlan(const OTIdentifier & SERVER_ID, + // ---------------------------------------- + const OTIdentifier & SENDER_USER_ID, + const OTIdentifier & SENDER_ACCT_ID, + // ---------------------------------------- + const OTIdentifier & RECIPIENT_USER_ID, + // ---------------------------------------- + OTPaymentPlan & thePlan); + + // ---------------------------------------------------- + + OTPurse * LoadPurse(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, + const OTIdentifier & USER_ID); + + bool SavePurse(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID, + const OTIdentifier & USER_ID, + OTPurse & THE_PURSE); + + OTMint * LoadMint(const OTIdentifier & SERVER_ID, + const OTIdentifier & ASSET_ID); + + OTAssetContract * LoadAssetContract(const OTIdentifier & ASSET_ID); + OTServerContract * LoadServerContract(const OTIdentifier & SERVER_ID); + + // ---------------------------------------------------- + + bool IsBasketCurrency(const OTIdentifier & BASKET_ASSET_TYPE_ID); + + long GetBasketMinimumTransferAmount(const OTIdentifier & BASKET_ASSET_TYPE_ID); + + int GetBasketMemberCount(const OTIdentifier & BASKET_ASSET_TYPE_ID); + + bool GetBasketMemberType(const OTIdentifier & BASKET_ASSET_TYPE_ID, + const int nIndex, + OTIdentifier & theOutputMemberType); + + long GetBasketMemberMinimumTransferAmount(const OTIdentifier & BASKET_ASSET_TYPE_ID, + const int nIndex); + + // ---------------------------------------------------- + + OTAccount * LoadAssetAccount(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID); + + OTLedger * LoadNymbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID); + + OTLedger * LoadInbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID); + + OTLedger * LoadOutbox(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & ACCOUNT_ID); + + // ------------------------------------------------------ + + + // YOU are responsible to delete the OTMessage object, once + // you receive the pointer that comes back from this function. + // (It also might return NULL, if there are none there.) + // + OTMessage * PopMessageBuffer(); + + void FlushMessageBuffer(); + + // **************************************************** + + // These commands below send messages to the server: + + void checkServerID(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + + void createUserAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + void deleteUserAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + + void checkUser(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & USER_ID_CHECK); + + void getRequest(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + + void sendUserMessage(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & USER_ID_RECIPIENT, + OTASCIIArmor & RECIPIENT_PUBKEY, + OTString & THE_MESSAGE); + + void issueAssetType(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & THE_CONTRACT); + + void getContract(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID); + + void getMint(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID); + + void createAssetAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ASSET_ID); + void deleteAssetAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCOUNT_ID); + + void getAccount(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID); + + // ---------------------------------------------------- + + OTBasket * GenerateBasketCreation(const OTIdentifier & USER_ID, + const long MINIMUM_TRANSFER); // Must be above zero. If <= 0, defaults to 10. + + bool AddBasketCreationItem(const OTIdentifier & USER_ID, // for signature. + OTBasket & theBasket, // created in above call. + const OTIdentifier & ASSET_TYPE_ID, // Adding an asset type to the new basket. + const long MINIMUM_TRANSFER); // The amount of the asset type that is in the basket. + + void issueBasket(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & BASKET_INFO); + + // ---------------------------------------------------- + + OTBasket * GenerateBasketExchange(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTIdentifier & BASKET_ASSET_TYPE_ID, + const OTIdentifier & BASKET_ASSET_ACCT_ID, + const int TRANSFER_MULTIPLE); // 1 2 3 + // 5=2,3,4 OR 10=4,6,8 OR 15=6,9,12 + + bool AddBasketExchangeItem(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + OTBasket & theBasket, + const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & ASSET_ACCT_ID); + + void exchangeBasket(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & BASKET_ASSET_ID, + OTString & BASKET_INFO, + const bool bExchangeInOrOut); + + // ---------------------------------------------------- + + void getTransactionNumber(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + + void notarizeWithdrawal(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & AMOUNT); + + void notarizeDeposit(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & THE_PURSE); + + void notarizeTransfer(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_FROM, + OTIdentifier & ACCT_TO, + OTString & AMOUNT, + OTString & NOTE); + + void getNymbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID); + + void getInbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID); + + void getOutbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID); + + void processNymbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTString & NYMBOX_LEDGER); + + void processInbox(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & ACCT_LEDGER); + + void withdrawVoucher(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTIdentifier & RECIPIENT_USER_ID, + OTString & CHEQUE_MEMO, + OTString & AMOUNT); + + void depositCheque(OTIdentifier & SERVER_ID, + OTIdentifier & USER_ID, + OTIdentifier & ACCT_ID, + OTString & THE_CHEQUE); + + void depositPaymentPlan(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + const OTString & THE_PAYMENT_PLAN); + + void issueMarketOffer(const OTIdentifier & SERVER_ID, + const OTIdentifier & USER_ID, + // ------------------------------------------- + const OTIdentifier & ASSET_TYPE_ID, + const OTIdentifier & ASSET_ACCT_ID, + // ------------------------------------------- + const OTIdentifier & CURRENCY_TYPE_ID, + const OTIdentifier & CURRENCY_ACCT_ID, + // ------------------------------------------- + const long & MARKET_SCALE, // Defaults to minimum of 1. Market granularity. + const long & MINIMUM_INCREMENT, // This will be multiplied by the Scale. Min 1. + const long & TOTAL_ASSETS_ON_OFFER, // Total assets available for sale or purchase. Will be multiplied by minimum increment. + const long & PRICE_LIMIT, // Per Minimum Increment... + const bool bBuyingOrSelling); // BUYING == false, SELLING == true. + + void getMarketList(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID); + void getMarketOffers(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & MARKET_ID, const long & lDepth); + void getMarketRecentTrades(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & MARKET_ID); + void getNym_MarketOffers(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID); + + + // For cancelling market offers and payment plans. + // + void cancelCronItem(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, + const OTIdentifier & ASSET_ACCT_ID, + const long & lTransactionNum); + + void getOffer_Trades(const OTIdentifier & SERVER_ID, const OTIdentifier & USER_ID, const long & lTransactionNum); + +}; + + + +#endif // __OPEN_TRANSACTIONS_INTERFACE_H__ diff --git a/testwallet/PackType.cs b/testwallet/PackType.cs new file mode 100644 index 000000000..3b987657f --- /dev/null +++ b/testwallet/PackType.cs @@ -0,0 +1,14 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum PackType { + PACK_MESSAGE_PACK = 0, + PACK_PROTOCOL_BUFFERS, + PACK_TYPE_ERROR +} diff --git a/testwallet/PackType.java b/testwallet/PackType.java new file mode 100644 index 000000000..a1fe280f2 --- /dev/null +++ b/testwallet/PackType.java @@ -0,0 +1,16 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public final class PackType { + public final static int PACK_MESSAGE_PACK = otapiJNI.PACK_MESSAGE_PACK_get(); + public final static int PACK_PROTOCOL_BUFFERS = otapiJNI.PACK_PROTOCOL_BUFFERS_get(); + public final static int PACK_TYPE_ERROR = otapiJNI.PACK_TYPE_ERROR_get(); +} + diff --git a/testwallet/RippleServer.cs b/testwallet/RippleServer.cs new file mode 100644 index 000000000..6ed87ef6c --- /dev/null +++ b/testwallet/RippleServer.cs @@ -0,0 +1,156 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class RippleServer : Server { + private HandleRef swigCPtr; + + internal RippleServer(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.RippleServer_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(RippleServer obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~RippleServer() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_RippleServer(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.RippleServer_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.RippleServer_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.RippleServer_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_host { + set { + otapiPINVOKE.RippleServer_server_host_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_server_host_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_port { + set { + otapiPINVOKE.RippleServer_server_port_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_server_port_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string ripple_username { + set { + otapiPINVOKE.RippleServer_ripple_username_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_ripple_username_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string ripple_password { + set { + otapiPINVOKE.RippleServer_ripple_password_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_ripple_password_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string namefield_id { + set { + otapiPINVOKE.RippleServer_namefield_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_namefield_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string passfield_id { + set { + otapiPINVOKE.RippleServer_passfield_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.RippleServer_passfield_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static RippleServer ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.RippleServer_ot_dynamic_cast(Storable.getCPtr(pObject)); + RippleServer ret = (cPtr == IntPtr.Zero) ? null : new RippleServer(cPtr, false); + return ret; + } + +} diff --git a/testwallet/RippleServer.java b/testwallet/RippleServer.java new file mode 100644 index 000000000..3c79fc703 --- /dev/null +++ b/testwallet/RippleServer.java @@ -0,0 +1,124 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class RippleServer extends Server { + private long swigCPtr; + + public RippleServer(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.RippleServer_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(RippleServer obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_RippleServer(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private WalletData containerRefWalletData; + // ---------------- + protected void addReference(WalletData theContainer) { // This is Java code + containerRefWalletData = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.RippleServer_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.RippleServer_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.RippleServer_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.RippleServer_server_id_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.RippleServer_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.RippleServer_server_type_get(swigCPtr, this); + } + + public void setServer_host(String value) { + otapiJNI.RippleServer_server_host_set(swigCPtr, this, value); + } + + public String getServer_host() { + return otapiJNI.RippleServer_server_host_get(swigCPtr, this); + } + + public void setServer_port(String value) { + otapiJNI.RippleServer_server_port_set(swigCPtr, this, value); + } + + public String getServer_port() { + return otapiJNI.RippleServer_server_port_get(swigCPtr, this); + } + + public void setRipple_username(String value) { + otapiJNI.RippleServer_ripple_username_set(swigCPtr, this, value); + } + + public String getRipple_username() { + return otapiJNI.RippleServer_ripple_username_get(swigCPtr, this); + } + + public void setRipple_password(String value) { + otapiJNI.RippleServer_ripple_password_set(swigCPtr, this, value); + } + + public String getRipple_password() { + return otapiJNI.RippleServer_ripple_password_get(swigCPtr, this); + } + + public void setNamefield_id(String value) { + otapiJNI.RippleServer_namefield_id_set(swigCPtr, this, value); + } + + public String getNamefield_id() { + return otapiJNI.RippleServer_namefield_id_get(swigCPtr, this); + } + + public void setPassfield_id(String value) { + otapiJNI.RippleServer_passfield_id_set(swigCPtr, this, value); + } + + public String getPassfield_id() { + return otapiJNI.RippleServer_passfield_id_get(swigCPtr, this); + } + + public static RippleServer ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.RippleServer_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new RippleServer(cPtr, false); + } + +} diff --git a/testwallet/SSL-Example/SFSocket.c b/testwallet/SSL-Example/SFSocket.c new file mode 100755 index 000000000..8cfc57f73 --- /dev/null +++ b/testwallet/SSL-Example/SFSocket.c @@ -0,0 +1,501 @@ + +/* (SSL Sockets) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission in OpenTransactions + * http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + +#ifdef _WIN32 +#include +#include +#include +#include +#include + +typedef int socklen_t; + +#define strcasecmp _stricmp + +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#include + +#include "SFSocket.h" + +#define SFSocketSSL(socket) ((socket)->sslSock) +#define SFSocketSetSSL(socket, ssl) (socket)->sslSock = (ssl) + +#define SFSocketBIO(socket) ((socket)->bio) +#define SFSocketSetBIO(socket, sslBio) (socket)->bio = (sslBio); + +#define SFSocketContext(socket) ((socket)->ctx) +#define SFSocketSetContext(socket, context) (socket)->ctx = (context) + +#define SFSocketDescriptor(socket) ((socket)->sock) +#define SFSocketSetDescriptor(socket, fd) (socket)->sock = (fd) + +#ifdef _WIN32 +#define SFSocketClearDescriptor(socket) (socket)->sock = (INVALID_SOCKET) +#else +#define SFSocketClearDescriptor(socket) (socket)->sock = (-1) +#endif + +#define SFSocketAddress(socket) (&(socket)->address) + +struct _SFSocket { + struct sockaddr_in address; + SSL_CTX *ctx; + SSL *sslSock; + BIO *bio; + int sock; +}; + +static int __SFSocketSetPasswordCallback (char *buf, int size, + int rwflag, void *password) +{ +#ifdef _WIN32 + strncpy_s(buf, size, (char *)password, size); +#else + strncpy(buf, (char *)password, size); +#endif + + buf[size - 1] = '\0'; + return(strlen(buf)); +} + +static int __SFSocketLoadDHParams (SFSocket *socket, const char *dhFile) { + BIO *bio = NULL; + DH *dh = NULL; + +#ifdef _WIN32 +// if ((bio = BIO_new_file(dhFile, "r")) == NULL) + if (NULL == (bio = BIO_new_file(dhFile, "rb"))) // _WIN32 +#else + if (NULL == (bio = BIO_new_file(dhFile, "r"))) +#endif + return(-1); + + if ((dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)) == NULL) { + BIO_free(bio); + bio = NULL; + return(-2); + } + + BIO_free(bio); + bio = NULL; + if (SSL_CTX_set_tmp_dh(SFSocketContext(socket), dh) < 0) + return(-3); + + DH_free(dh); + dh = NULL; + + return(0); +} + +static int __SFSocketCheckCert (SFSocket *socket, const char *host) { + char peerCN[384] = ""; // really 256 but I made it bigger for safety. + X509 *peer = NULL; + + if (SSL_get_verify_result(SFSocketSSL(socket)) != X509_V_OK) + return(-1); + + if ((peer = SSL_get_peer_certificate(SFSocketSSL(socket))) == NULL) + return(-2); + + X509_NAME_get_text_by_NID(X509_get_subject_name(peer), + NID_commonName, peerCN, 256); + X509_free(peer); + peer = NULL; + + return(strcasecmp(peerCN, host) ? - 3 : 0); +} + +static char __globalInit = 0; + +void SFSocketGlobalInit (void) { + if (!__globalInit) { + __globalInit = 1; + +#ifdef _WIN32 + CRYPTO_malloc_init(); +#endif + SSL_library_init(); + SSL_load_error_strings(); + } +} + +SFSocket *SFSocketAlloc (void) { + SFSocket *socket = NULL; + + if (NULL == (socket = (SFSocket *) malloc (sizeof(SFSocket)))) + return(NULL); + + socket->ctx = NULL; + socket->sslSock = NULL; + socket->sock = -1; + memset(&(socket->address), 0, sizeof(struct sockaddr_in)); + + return(socket); +} + +void SFSocketRelease (SFSocket *socket) { + if (socket->ctx != NULL) { + SSL_CTX_free(socket->ctx); + socket->ctx = NULL; + } + + if (socket->sslSock != NULL) { + SSL_shutdown(socket->sslSock); + SSL_free(socket->sslSock); + socket->sslSock = NULL; + } + +#ifdef _WIN32 + if (socket->sock != INVALID_SOCKET) { + closesocket(socket->sock); + socket->sock = INVALID_SOCKET; + } +#else + if (socket->sock != -1) { + close(socket->sock); + socket->sock = -1; + } +#endif + + free(socket); + socket = NULL; +} + +int SFSocketInit (SFSocket *socket, + const char *caFile, + const char *dhFile, + const char *keyFile, + const char *password, + const char *chipers) +{ + SSL_CTX *ctx = NULL; + + /* Create Context */ + if (NULL == (ctx = SSL_CTX_new(SSLv3_method()))) { + ERR_print_errors_fp(stderr); + return(-1); + } + + /* Load Key and Certificate */ + if (!SSL_CTX_use_certificate_chain_file(ctx, keyFile)) { + ERR_print_errors_fp(stderr); + return(-2); + } + + SSL_CTX_set_default_passwd_cb(ctx, __SFSocketSetPasswordCallback); + SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *)password); + if (!SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM)) { + ERR_print_errors_fp(stderr); + SSL_CTX_free(ctx); + return(-3); + } + + /* Load the CAs we Trust */ + if (!SSL_CTX_load_verify_locations(ctx, caFile, NULL)) { + SSL_CTX_free(ctx); + return(-4); + } + +#if (OPENSSL_VERSION_NUMBER < 0x00905100L) + SSL_CTX_set_verify_depth(ctx, 1); +#endif + + /* Set Context on Socket */ + SFSocketSetContext(socket, ctx); + + /* Load DH Params */ + if (dhFile != NULL) + __SFSocketLoadDHParams(socket, dhFile); + + /* Set Chipers */ + if (chipers != NULL) + SSL_CTX_set_cipher_list(ctx, chipers); + + return(0); +} + +int SFSocketListen (SFSocket *serverSocket, unsigned int address, int port) { + struct sockaddr_in *saddr = NULL; + SSL_CTX *ctx = NULL; + int sock = 0; + + /* Require Authentication */ + if (NULL != (ctx = SFSocketContext(serverSocket))) { + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); + } + + if (0 > (sock = socket(AF_INET, SOCK_STREAM, 0))) + return(-1); + + /* Setup Socket Address */ + saddr = SFSocketAddress(serverSocket); + memset(saddr, 0, sizeof(struct sockaddr_in)); + saddr->sin_addr.s_addr = address; + saddr->sin_family = AF_INET; + saddr->sin_port = htons(port); + + /* Bind */ + if (bind(sock, (struct sockaddr *)saddr, sizeof(struct sockaddr_in)) < 0) { + close(sock); + return(-2); + } + + /* Listen */ + listen(sock, 15); + + /* Set Socket Descriptor */ + SFSocketSetDescriptor(serverSocket, sock); + + return(0); +} + +SFSocket *SFSocketAccept (SFSocket *socket) { + struct sockaddr_in *addr = NULL; + SFSocket *clientSocket = NULL; + socklen_t addrlen = 0; + SSL_CTX *ctx = NULL; + int sock = 0; + + /* Alloc new Client Socket */ + if (NULL == (clientSocket = SFSocketAlloc())) + return(clientSocket); + + /* Accept Connection */ + addr = SFSocketAddress(clientSocket); + if ((sock = accept(SFSocketDescriptor(socket), + (struct sockaddr *)addr, &addrlen)) <= 0) + { + SFSocketRelease(clientSocket); + return(NULL); + } + + /* Set Client Socket Descriptor */ + SFSocketSetDescriptor(clientSocket, sock); + + /* Setup Client SSL */ + if (NULL != (ctx = SFSocketContext(socket))) { + BIO *bio = NULL; + SSL *ssl = NULL; + + if ((bio = BIO_new_socket(sock, BIO_NOCLOSE)) == NULL) { + ERR_print_errors_fp(stderr); + SFSocketRelease(clientSocket); + return(NULL); + } + + if (NULL == (ssl = SSL_new(ctx))) { + ERR_print_errors_fp(stderr); + BIO_free(bio); bio = NULL; + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + + /* SSL Accept */ + SSL_set_bio(ssl, bio, bio); + if (SSL_accept(ssl) <= 0) { + ERR_print_errors_fp(stderr); + SSL_free(ssl); ssl = NULL; + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + + /* Set SSL Socket */ + SFSocketSetSSL(clientSocket, ssl); + SFSocketSetBIO(clientSocket, bio); + } + + return(clientSocket); +} + +int SFSocketConnectToHost (SFSocket *clientSocket, const char *host, int port) { + struct sockaddr_in *addr = NULL; + struct hostent *hp = NULL; + SSL_CTX *ctx = NULL; + int sock = 0; + + if ((hp = gethostbyname(host)) == NULL) + return(-1); + + /* Setup Address */ + addr = SFSocketAddress(clientSocket); + memset(addr, 0, sizeof(struct sockaddr_in)); + addr->sin_addr = *((struct in_addr *)hp->h_addr_list[0]); + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + +#ifdef _WIN32 + if ( INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) ) +#else + if (0 > (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) +#endif + return(-2); + + /* Connect to Host */ +#ifdef _WIN32 + if (SOCKET_ERROR == connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) ) +#else + if (0 > connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in))) +#endif + { +#ifdef _WIN32 + errno_t theError = WSAGetLastError(); + closesocket(sock); +#else + close(sock); +#endif + sock = 0; + return(-3); + } + + /* Set Socket Descriptor */ + SFSocketSetDescriptor(clientSocket, sock); + + if (NULL != (ctx = SFSocketContext(clientSocket))) { + BIO *bio = NULL; + SSL *ssl = NULL; + + /* Setup SSL */ + if (NULL == (ssl = SSL_new(ctx))) { + ERR_print_errors_fp(stderr); + SFSocketClearDescriptor(clientSocket); +#ifdef _WIN32 + closesocket(sock); +#else + close(sock); +#endif + sock = 0; + return(-4); + } + + /* Setup BIO */ + if ((bio = BIO_new_socket(sock, BIO_NOCLOSE)) == NULL) { + SFSocketClearDescriptor(clientSocket); + SSL_free(ssl); +#ifdef _WIN32 + closesocket(sock); +#else + close(sock); +#endif + sock = 0; + return(-5); + } + + /* SSL Connect */ + SSL_set_bio(ssl, bio, bio); + if (0 >= SSL_connect(ssl)) { + ERR_print_errors_fp(stderr); + return(-6); + } + + /* Setup SSL/BIO on Socket */ + SFSocketSetSSL(clientSocket, ssl); + SFSocketSetBIO(clientSocket, bio); + + //TODO Figure out why Certs weren't working. + // TODO get certs working. + // TODO otherwise at least figure out how to call this without a cert + /* Check Certificate */ +// if (__SFSocketCheckCert(clientSocket, host) < 0) +// return(-7); + } + + return(0); +} + +int SFSocketRead (SFSocket *socket, void *buf, int len) +{ + SSL *ssl = NULL; + + fd_set read_flags, write_flags; // the flag sets to be used + struct timeval waitd; // the max wait time for an event + int stat = 0; // holds return value for select(); + + waitd.tv_sec = 0; // Make select wait up to 1 second for data + waitd.tv_usec = 100; // and 0 milliseconds. + + // (FellowTraveler) I'm trying to make this work asynchronously. + + + FD_ZERO(&read_flags); // Zero the flags ready for using + FD_ZERO(&write_flags); // Zero the flags ready for using + + // Set the sockets read flag, so when select is called it examines + // the read status of available data. + FD_SET(SFSocketDescriptor(socket), &read_flags); + + // Now call select + stat=select(SFSocketDescriptor(socket)+1, &read_flags,&write_flags,(fd_set*)0,&waitd); + +#ifdef _WIN32 + if (SOCKET_ERROR == stat) + { + fprintf(stderr, "Error during select()\n"); + } + else if (0 == stat) + { + // This means the timeout occurred and there were no new connections + // (Which is normal, don't want to log every single time that happens.) + } + else +#endif + if (FD_ISSET(SFSocketDescriptor(socket), &read_flags)) + { + FD_CLR(SFSocketDescriptor(socket), &read_flags); + + // here is where you use the read(). + // If read returns an error then the socket + // must be dead so you must close it. + + // (FellowTraveler) trying to make asynchronous sockets work... + if (NULL != (ssl = SFSocketSSL(socket))) + { + // if (SSL_pending(ssl)) + return(SSL_read(ssl, buf, len)); + // else { + // return 0; + // } + } + +#ifdef _WIN32 + return(recv(SFSocketDescriptor(socket), buf, len, 0)); +#else + return(read(SFSocketDescriptor(socket), buf, len)); +#endif + } + + + return 0; +} + +int SFSocketWrite (SFSocket *socket, const void *buf, int len) { + SSL *ssl = NULL; + if (NULL != (ssl = SFSocketSSL(socket))) + return(SSL_write(ssl, buf, len)); + +#ifdef _WIN32 + return(send(SFSocketDescriptor(socket), buf, len, 0)); +#else + return(write(SFSocketDescriptor(socket), buf, len)); +#endif +} + diff --git a/testwallet/SSL-Example/SFSocket.h b/testwallet/SSL-Example/SFSocket.h new file mode 100755 index 000000000..e8d133e10 --- /dev/null +++ b/testwallet/SSL-Example/SFSocket.h @@ -0,0 +1,44 @@ + +/* (SSL Sockets) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission in OpenTransactions + * http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +#ifndef _SFSOCKET_H_ +#define _SFSOCKET_H_ + +typedef struct _SFSocket SFSocket; + +void SFSocketGlobalInit (void); + +SFSocket * SFSocketAlloc (void); +void SFSocketRelease (SFSocket *socket); + +int SFSocketInit (SFSocket *socket, + const char *caFile, + const char *dhFile, + const char *keyFile, + const char *password, + const char *chipers); + +int SFSocketListen (SFSocket *serverSocket, + unsigned int address, + int port); +SFSocket * SFSocketAccept (SFSocket *socket); + +int SFSocketConnectToHost (SFSocket *socket, + const char *host, + int port); + +int SFSocketRead (SFSocket *socket, void *buf, int len); +int SFSocketWrite (SFSocket *socket, const void *buf, int len); + +#endif /* !_SFSOCKET_H_ */ + diff --git a/testwallet/SSL-Example/client.c b/testwallet/SSL-Example/client.c new file mode 100755 index 000000000..a64a60845 --- /dev/null +++ b/testwallet/SSL-Example/client.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "SFSocket.h" + +#define CA_FILE "ca.crt" +#define KEY_FILE "client.crt" +#define KEY_PASSWORD "PUT YOUR PASSPHRASE HERE" + +#define HOSTNAME "localhost" +#define PORT 7085 + +int main (int argc, char **argv) { + char buffer[1024]; + SFSocket *socket; + int rdSize; + + /* Initialize SSL */ + SFSocketGlobalInit(); + + /* Alloc Socket */ + if ((socket = SFSocketAlloc()) == NULL) { + printf("Alloc Failed\n"); + return(1); + } + + /* Initialize SSL Socket */ + if (SFSocketInit(socket, CA_FILE, NULL, KEY_FILE, KEY_PASSWORD, NULL) < 0) { + printf("Init Failed\n"); + return(2); + } + + /* Connect to Host */ + if (SFSocketConnectToHost(socket, HOSTNAME, PORT) < 0) { + printf("Connect to Host Failed\n"); + return(3); + } + + /* Send Message to Server */ + strcpy(buffer, "Hello from Client!"); + SFSocketWrite(socket, buffer, strlen(buffer)); + + /* Read Message from Server */ + if ((rdSize = SFSocketRead(socket, buffer, 1024 - 1)) > 0) { + buffer[rdSize] = '\0'; + printf("Server: %s\n", buffer); + } + + /* Close and Release Socket Resources */ + SFSocketRelease(socket); + + return(0); +} + diff --git a/testwallet/SSL-Example/server.c b/testwallet/SSL-Example/server.c new file mode 100755 index 000000000..24db3c39d --- /dev/null +++ b/testwallet/SSL-Example/server.c @@ -0,0 +1,67 @@ +#include +#include +#include + +#include "SFSocket.h" + +#define CA_FILE "SSL-Example/ca.crt" +#define DH_FILE "SSL-Example/dh_param_1024.pem" +#define KEY_FILE "SSL-Example/server.crt" +#define KEY_PASSWORD "test" + +#define PORT 7085 + +int main (int argc, char **argv) { + SFSocket *socket; + + /* Initialize SSL */ + SFSocketGlobalInit(); + + /* Alloc Socket */ + if ((socket = SFSocketAlloc()) == NULL) { + printf("Alloc Failed\n"); + return(1); + } + + /* Initialize SSL Socket */ + if (SFSocketInit(socket, CA_FILE, DH_FILE, KEY_FILE, KEY_PASSWORD, NULL) < 0) + { + printf("Init Context Failed\n"); + return(2); + } + + /* Listen on Address/Port */ + if (SFSocketListen(socket, INADDR_ANY, PORT) < 0) { + printf("Listen Failed\n"); + return(3); + } + + do { + SFSocket *clientSocket; + char buffer[1024]; + int rdSize; + + /* Accept Client Connection */ + if ((clientSocket = SFSocketAccept(socket)) == NULL) + break; + + /* Read Data from Client */ + if ((rdSize = SFSocketRead(clientSocket, buffer, 1024 - 1)) > 0) { + buffer[rdSize] = '\0'; + printf("Client: %s\n", buffer); + } + + /* Write to Client */ + strcpy(buffer, "Hello Client!"); + SFSocketWrite(clientSocket, buffer, strlen(buffer)); + + /* Disconnect Client */ + SFSocketRelease(clientSocket); + } while (1); + + /* Close and Release Socket Resources */ + SFSocketRelease(socket); + + return(0); +} + diff --git a/testwallet/SWIGTYPE_p_IStorable.cs b/testwallet/SWIGTYPE_p_IStorable.cs new file mode 100644 index 000000000..e555f4db7 --- /dev/null +++ b/testwallet/SWIGTYPE_p_IStorable.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_IStorable { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_IStorable(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_IStorable() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_IStorable obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_IStorable.java b/testwallet/SWIGTYPE_p_IStorable.java new file mode 100644 index 000000000..663106520 --- /dev/null +++ b/testwallet/SWIGTYPE_p_IStorable.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_IStorable { + private long swigCPtr; + + protected SWIGTYPE_p_IStorable(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_IStorable() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_IStorable obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_OTCallback.cs b/testwallet/SWIGTYPE_p_OTCallback.cs new file mode 100644 index 000000000..7b043aa9a --- /dev/null +++ b/testwallet/SWIGTYPE_p_OTCallback.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_OTCallback { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_OTCallback(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_OTCallback() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_OTCallback obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_OTCallback.java b/testwallet/SWIGTYPE_p_OTCallback.java new file mode 100644 index 000000000..1a688abde --- /dev/null +++ b/testwallet/SWIGTYPE_p_OTCallback.java @@ -0,0 +1,25 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public class SWIGTYPE_p_OTCallback { + private long swigCPtr; + + protected SWIGTYPE_p_OTCallback(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_OTCallback() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_OTCallback obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_OTPacker.cs b/testwallet/SWIGTYPE_p_OTPacker.cs new file mode 100644 index 000000000..c1b24c7ee --- /dev/null +++ b/testwallet/SWIGTYPE_p_OTPacker.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_OTPacker { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_OTPacker(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_OTPacker() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_OTPacker obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_OTPacker.java b/testwallet/SWIGTYPE_p_OTPacker.java new file mode 100644 index 000000000..89dce6750 --- /dev/null +++ b/testwallet/SWIGTYPE_p_OTPacker.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_OTPacker { + private long swigCPtr; + + protected SWIGTYPE_p_OTPacker(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_OTPacker() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_OTPacker obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_PackedBuffer.cs b/testwallet/SWIGTYPE_p_PackedBuffer.cs new file mode 100644 index 000000000..cc85635c7 --- /dev/null +++ b/testwallet/SWIGTYPE_p_PackedBuffer.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_PackedBuffer { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_PackedBuffer(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_PackedBuffer() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_PackedBuffer obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_PackedBuffer.java b/testwallet/SWIGTYPE_p_PackedBuffer.java new file mode 100644 index 000000000..ae434ea38 --- /dev/null +++ b/testwallet/SWIGTYPE_p_PackedBuffer.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_PackedBuffer { + private long swigCPtr; + + protected SWIGTYPE_p_PackedBuffer(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_PackedBuffer() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_PackedBuffer obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.cs b/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.cs new file mode 100644 index 000000000..a7dd78700 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_std__mapT_std__string_std__string_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_std__mapT_std__string_std__string_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_std__mapT_std__string_std__string_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_std__mapT_std__string_std__string_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.java b/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.java new file mode 100644 index 000000000..fc9686b6c --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__mapT_std__string_std__string_t.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_std__mapT_std__string_std__string_t { + private long swigCPtr; + + protected SWIGTYPE_p_std__mapT_std__string_std__string_t(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_std__mapT_std__string_std__string_t() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_std__mapT_std__string_std__string_t obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_std__mapTstd__string_std__string_t.cs b/testwallet/SWIGTYPE_p_std__mapTstd__string_std__string_t.cs new file mode 100644 index 000000000..4a1911a90 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__mapTstd__string_std__string_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.31 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_std__mapTstd__string_std__string_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_std__mapTstd__string_std__string_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_std__mapTstd__string_std__string_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_std__mapTstd__string_std__string_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_std__string.cs b/testwallet/SWIGTYPE_p_std__string.cs new file mode 100644 index 000000000..a9d07aa00 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__string.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_std__string { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_std__string(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_std__string() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_std__string obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_std__string.java b/testwallet/SWIGTYPE_p_std__string.java new file mode 100644 index 000000000..316470ec2 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__string.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.3 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_std__string { + private long swigCPtr; + + protected SWIGTYPE_p_std__string(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_std__string() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_std__string obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.cs b/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.cs new file mode 100644 index 000000000..362ea0910 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_std__vectorT_unsigned_char_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_std__vectorT_unsigned_char_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_std__vectorT_unsigned_char_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_std__vectorT_unsigned_char_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.java b/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.java new file mode 100644 index 000000000..31aa44945 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__vectorT_unsigned_char_t.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_std__vectorT_unsigned_char_t { + private long swigCPtr; + + protected SWIGTYPE_p_std__vectorT_unsigned_char_t(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_std__vectorT_unsigned_char_t() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_std__vectorT_unsigned_char_t obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_std__vectorTunsigned_char_t.cs b/testwallet/SWIGTYPE_p_std__vectorTunsigned_char_t.cs new file mode 100644 index 000000000..b2cc26173 --- /dev/null +++ b/testwallet/SWIGTYPE_p_std__vectorTunsigned_char_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 1.3.31 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_std__vectorTunsigned_char_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_std__vectorTunsigned_char_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_std__vectorTunsigned_char_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_std__vectorTunsigned_char_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_uint32_t.cs b/testwallet/SWIGTYPE_p_uint32_t.cs new file mode 100644 index 000000000..768f5b653 --- /dev/null +++ b/testwallet/SWIGTYPE_p_uint32_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_uint32_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_uint32_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_uint32_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_uint32_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_uint32_t.java b/testwallet/SWIGTYPE_p_uint32_t.java new file mode 100644 index 000000000..74d93472f --- /dev/null +++ b/testwallet/SWIGTYPE_p_uint32_t.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_uint32_t { + private long swigCPtr; + + protected SWIGTYPE_p_uint32_t(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_uint32_t() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_uint32_t obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/SWIGTYPE_p_uint64_t.cs b/testwallet/SWIGTYPE_p_uint64_t.cs new file mode 100644 index 000000000..e698d1c69 --- /dev/null +++ b/testwallet/SWIGTYPE_p_uint64_t.cs @@ -0,0 +1,27 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class SWIGTYPE_p_uint64_t { + private HandleRef swigCPtr; + + internal SWIGTYPE_p_uint64_t(IntPtr cPtr, bool futureUse) { + swigCPtr = new HandleRef(this, cPtr); + } + + protected SWIGTYPE_p_uint64_t() { + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + + internal static HandleRef getCPtr(SWIGTYPE_p_uint64_t obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } +} diff --git a/testwallet/SWIGTYPE_p_uint64_t.java b/testwallet/SWIGTYPE_p_uint64_t.java new file mode 100644 index 000000000..55df19e9d --- /dev/null +++ b/testwallet/SWIGTYPE_p_uint64_t.java @@ -0,0 +1,26 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class SWIGTYPE_p_uint64_t { + private long swigCPtr; + + protected SWIGTYPE_p_uint64_t(long cPtr, boolean futureUse) { + swigCPtr = cPtr; + } + + protected SWIGTYPE_p_uint64_t() { + swigCPtr = 0; + } + + protected static long getCPtr(SWIGTYPE_p_uint64_t obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } +} + diff --git a/testwallet/Server.cs b/testwallet/Server.cs new file mode 100644 index 000000000..7a6d38af5 --- /dev/null +++ b/testwallet/Server.cs @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Server : ServerInfo { + private HandleRef swigCPtr; + + internal Server(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.Server_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Server obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Server() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Server(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.Server_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Server_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.Server_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Server_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.Server_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Server_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_host { + set { + otapiPINVOKE.Server_server_host_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Server_server_host_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_port { + set { + otapiPINVOKE.Server_server_port_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.Server_server_port_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static Server ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Server_ot_dynamic_cast(Storable.getCPtr(pObject)); + Server ret = (cPtr == IntPtr.Zero) ? null : new Server(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Server.java b/testwallet/Server.java new file mode 100644 index 000000000..594bfc6c9 --- /dev/null +++ b/testwallet/Server.java @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Server extends ServerInfo { + private long swigCPtr; + + public Server(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.Server_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(Server obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Server(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } + + public void setGui_label(String value) { + otapiJNI.Server_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.Server_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.Server_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.Server_server_id_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.Server_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.Server_server_type_get(swigCPtr, this); + } + + public void setServer_host(String value) { + otapiJNI.Server_server_host_set(swigCPtr, this, value); + } + + public String getServer_host() { + return otapiJNI.Server_server_host_get(swigCPtr, this); + } + + public void setServer_port(String value) { + otapiJNI.Server_server_port_set(swigCPtr, this, value); + } + + public String getServer_port() { + return otapiJNI.Server_server_port_get(swigCPtr, this); + } + + public static Server ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Server_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Server(cPtr, false); + } + +} diff --git a/testwallet/ServerInfo.cs b/testwallet/ServerInfo.cs new file mode 100644 index 000000000..225dbe3d9 --- /dev/null +++ b/testwallet/ServerInfo.cs @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class ServerInfo : Displayable { + private HandleRef swigCPtr; + + internal ServerInfo(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.ServerInfo_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(ServerInfo obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~ServerInfo() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_ServerInfo(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.ServerInfo_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ServerInfo_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_id { + set { + otapiPINVOKE.ServerInfo_server_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ServerInfo_server_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string server_type { + set { + otapiPINVOKE.ServerInfo_server_type_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.ServerInfo_server_type_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static ServerInfo ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.ServerInfo_ot_dynamic_cast(Storable.getCPtr(pObject)); + ServerInfo ret = (cPtr == IntPtr.Zero) ? null : new ServerInfo(cPtr, false); + return ret; + } + +} diff --git a/testwallet/ServerInfo.java b/testwallet/ServerInfo.java new file mode 100644 index 000000000..3180b5b07 --- /dev/null +++ b/testwallet/ServerInfo.java @@ -0,0 +1,76 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class ServerInfo extends Displayable { + private long swigCPtr; + + public ServerInfo(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.ServerInfo_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(ServerInfo obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_ServerInfo(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private ContactNym containerRefContactNym; + // ---------------- + protected void addReference(ContactNym theContainer) { // This is Java code + containerRefContactNym = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.ServerInfo_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.ServerInfo_gui_label_get(swigCPtr, this); + } + + public void setServer_id(String value) { + otapiJNI.ServerInfo_server_id_set(swigCPtr, this, value); + } + + public String getServer_id() { + return otapiJNI.ServerInfo_server_id_get(swigCPtr, this); + } + + public void setServer_type(String value) { + otapiJNI.ServerInfo_server_type_set(swigCPtr, this, value); + } + + public String getServer_type() { + return otapiJNI.ServerInfo_server_type_get(swigCPtr, this); + } + + public static ServerInfo ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.ServerInfo_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new ServerInfo(cPtr, false); + } + +} diff --git a/testwallet/Storable.cs b/testwallet/Storable.cs new file mode 100644 index 000000000..a71954dfc --- /dev/null +++ b/testwallet/Storable.cs @@ -0,0 +1,55 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Storable : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal Storable(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Storable obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Storable() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Storable(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + } + } + + public static Storable Create(StoredObjectType eType, PackType thePackType) { + IntPtr cPtr = otapiPINVOKE.Storable_Create((int)eType, (int)thePackType); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, false); + return ret; + } + + public static Storable ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.Storable_ot_dynamic_cast(Storable.getCPtr(pObject)); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, false); + return ret; + } + +} diff --git a/testwallet/Storable.java b/testwallet/Storable.java new file mode 100644 index 000000000..15052605b --- /dev/null +++ b/testwallet/Storable.java @@ -0,0 +1,48 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Storable { + private long swigCPtr; + protected boolean swigCMemOwn; + + public Storable(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + public static long getCPtr(Storable obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Storable(swigCPtr); + } + swigCPtr = 0; + } + } + + public static Storable Create(int eType, int thePackType) { + long cPtr = otapiJNI.Storable_Create(eType, thePackType); + return (cPtr == 0) ? null : new Storable(cPtr, false); + } + + public static Storable ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.Storable_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new Storable(cPtr, false); + } + +} diff --git a/testwallet/Storage.cs b/testwallet/Storage.cs new file mode 100644 index 000000000..662502006 --- /dev/null +++ b/testwallet/Storage.cs @@ -0,0 +1,309 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class Storage : IDisposable { + private HandleRef swigCPtr; + protected bool swigCMemOwn; + + internal Storage(IntPtr cPtr, bool cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(Storage obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~Storage() { + Dispose(); + } + + public virtual void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_Storage(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + } + } + + public SWIGTYPE_p_OTPacker GetPacker(PackType ePackType) { + IntPtr cPtr = otapiPINVOKE.Storage_GetPacker__SWIG_0(swigCPtr, (int)ePackType); + SWIGTYPE_p_OTPacker ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_OTPacker(cPtr, false); + return ret; + } + + public SWIGTYPE_p_OTPacker GetPacker() { + IntPtr cPtr = otapiPINVOKE.Storage_GetPacker__SWIG_1(swigCPtr); + SWIGTYPE_p_OTPacker ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_OTPacker(cPtr, false); + return ret; + } + + public virtual bool Init(string oneStr, string twoStr, string threeStr, string fourStr, string fiveStr, string sixStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_0(swigCPtr, oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init(string oneStr, string twoStr, string threeStr, string fourStr, string fiveStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_1(swigCPtr, oneStr, twoStr, threeStr, fourStr, fiveStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init(string oneStr, string twoStr, string threeStr, string fourStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_2(swigCPtr, oneStr, twoStr, threeStr, fourStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init(string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_3(swigCPtr, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init(string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_4(swigCPtr, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init(string oneStr) { + bool ret = otapiPINVOKE.Storage_Init__SWIG_5(swigCPtr, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Init() { + bool ret = otapiPINVOKE.Storage_Init__SWIG_6(swigCPtr); + return ret; + } + + public virtual bool Exists(string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_Exists__SWIG_0(swigCPtr, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Exists(string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_Exists__SWIG_1(swigCPtr, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Exists(string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Storage_Exists__SWIG_2(swigCPtr, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public virtual bool Exists(string strFolder) { + bool ret = otapiPINVOKE.Storage_Exists__SWIG_3(swigCPtr, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreString(string strContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_StoreString__SWIG_0(swigCPtr, strContents, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreString(string strContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_StoreString__SWIG_1(swigCPtr, strContents, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreString(string strContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Storage_StoreString__SWIG_2(swigCPtr, strContents, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreString(string strContents, string strFolder) { + bool ret = otapiPINVOKE.Storage_StoreString__SWIG_3(swigCPtr, strContents, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryString(string strFolder, string oneStr, string twoStr, string threeStr) { + string ret = otapiPINVOKE.Storage_QueryString__SWIG_0(swigCPtr, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryString(string strFolder, string oneStr, string twoStr) { + string ret = otapiPINVOKE.Storage_QueryString__SWIG_1(swigCPtr, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryString(string strFolder, string oneStr) { + string ret = otapiPINVOKE.Storage_QueryString__SWIG_2(swigCPtr, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryString(string strFolder) { + string ret = otapiPINVOKE.Storage_QueryString__SWIG_3(swigCPtr, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StorePlainString(string strContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_StorePlainString__SWIG_0(swigCPtr, strContents, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StorePlainString(string strContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_StorePlainString__SWIG_1(swigCPtr, strContents, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StorePlainString(string strContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Storage_StorePlainString__SWIG_2(swigCPtr, strContents, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StorePlainString(string strContents, string strFolder) { + bool ret = otapiPINVOKE.Storage_StorePlainString__SWIG_3(swigCPtr, strContents, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryPlainString(string strFolder, string oneStr, string twoStr, string threeStr) { + string ret = otapiPINVOKE.Storage_QueryPlainString__SWIG_0(swigCPtr, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryPlainString(string strFolder, string oneStr, string twoStr) { + string ret = otapiPINVOKE.Storage_QueryPlainString__SWIG_1(swigCPtr, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryPlainString(string strFolder, string oneStr) { + string ret = otapiPINVOKE.Storage_QueryPlainString__SWIG_2(swigCPtr, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public string QueryPlainString(string strFolder) { + string ret = otapiPINVOKE.Storage_QueryPlainString__SWIG_3(swigCPtr, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreObject(Storable theContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_StoreObject__SWIG_0(swigCPtr, Storable.getCPtr(theContents), strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreObject(Storable theContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_StoreObject__SWIG_1(swigCPtr, Storable.getCPtr(theContents), strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreObject(Storable theContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Storage_StoreObject__SWIG_2(swigCPtr, Storable.getCPtr(theContents), strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool StoreObject(Storable theContents, string strFolder) { + bool ret = otapiPINVOKE.Storage_StoreObject__SWIG_3(swigCPtr, Storable.getCPtr(theContents), strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr, string twoStr, string threeStr) { + IntPtr cPtr = otapiPINVOKE.Storage_QueryObject__SWIG_0(swigCPtr, (int)theObjectType, strFolder, oneStr, twoStr, threeStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr, string twoStr) { + IntPtr cPtr = otapiPINVOKE.Storage_QueryObject__SWIG_1(swigCPtr, (int)theObjectType, strFolder, oneStr, twoStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr) { + IntPtr cPtr = otapiPINVOKE.Storage_QueryObject__SWIG_2(swigCPtr, (int)theObjectType, strFolder, oneStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public Storable QueryObject(StoredObjectType theObjectType, string strFolder) { + IntPtr cPtr = otapiPINVOKE.Storage_QueryObject__SWIG_3(swigCPtr, (int)theObjectType, strFolder); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool EraseValueByKey(string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Storage_EraseValueByKey__SWIG_0(swigCPtr, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool EraseValueByKey(string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Storage_EraseValueByKey__SWIG_1(swigCPtr, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool EraseValueByKey(string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Storage_EraseValueByKey__SWIG_2(swigCPtr, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public bool EraseValueByKey(string strFolder) { + bool ret = otapiPINVOKE.Storage_EraseValueByKey__SWIG_3(swigCPtr, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public Storable CreateObject(StoredObjectType eType) { + IntPtr cPtr = otapiPINVOKE.Storage_CreateObject(swigCPtr, (int)eType); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + return ret; + } + + public static Storage Create(StorageType eStorageType, PackType ePackType) { + IntPtr cPtr = otapiPINVOKE.Storage_Create((int)eStorageType, (int)ePackType); + Storage ret = (cPtr == IntPtr.Zero) ? null : new Storage(cPtr, false); + return ret; + } + + public StorageType GetType() { + StorageType ret = (StorageType)otapiPINVOKE.Storage_GetType(swigCPtr); + return ret; + } + +} diff --git a/testwallet/Storage.java b/testwallet/Storage.java new file mode 100644 index 000000000..519b8dc42 --- /dev/null +++ b/testwallet/Storage.java @@ -0,0 +1,222 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class Storage { + private long swigCPtr; + protected boolean swigCMemOwn; + + public Storage(long cPtr, boolean cMemoryOwn) { + swigCMemOwn = cMemoryOwn; + swigCPtr = cPtr; + } + + public static long getCPtr(Storage obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_Storage(swigCPtr); + } + swigCPtr = 0; + } + } + + public SWIGTYPE_p_OTPacker GetPacker(int ePackType) { + long cPtr = otapiJNI.Storage_GetPacker__SWIG_0(swigCPtr, this, ePackType); + return (cPtr == 0) ? null : new SWIGTYPE_p_OTPacker(cPtr, false); + } + + public SWIGTYPE_p_OTPacker GetPacker() { + long cPtr = otapiJNI.Storage_GetPacker__SWIG_1(swigCPtr, this); + return (cPtr == 0) ? null : new SWIGTYPE_p_OTPacker(cPtr, false); + } + + public boolean Init(String oneStr, String twoStr, String threeStr, String fourStr, String fiveStr, String sixStr) { + return otapiJNI.Storage_Init__SWIG_0(swigCPtr, this, oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr); + } + + public boolean Init(String oneStr, String twoStr, String threeStr, String fourStr, String fiveStr) { + return otapiJNI.Storage_Init__SWIG_1(swigCPtr, this, oneStr, twoStr, threeStr, fourStr, fiveStr); + } + + public boolean Init(String oneStr, String twoStr, String threeStr, String fourStr) { + return otapiJNI.Storage_Init__SWIG_2(swigCPtr, this, oneStr, twoStr, threeStr, fourStr); + } + + public boolean Init(String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_Init__SWIG_3(swigCPtr, this, oneStr, twoStr, threeStr); + } + + public boolean Init(String oneStr, String twoStr) { + return otapiJNI.Storage_Init__SWIG_4(swigCPtr, this, oneStr, twoStr); + } + + public boolean Init(String oneStr) { + return otapiJNI.Storage_Init__SWIG_5(swigCPtr, this, oneStr); + } + + public boolean Init() { + return otapiJNI.Storage_Init__SWIG_6(swigCPtr, this); + } + + public boolean Exists(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_Exists__SWIG_0(swigCPtr, this, strFolder, oneStr, twoStr, threeStr); + } + + public boolean Exists(String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_Exists__SWIG_1(swigCPtr, this, strFolder, oneStr, twoStr); + } + + public boolean Exists(String strFolder, String oneStr) { + return otapiJNI.Storage_Exists__SWIG_2(swigCPtr, this, strFolder, oneStr); + } + + public boolean Exists(String strFolder) { + return otapiJNI.Storage_Exists__SWIG_3(swigCPtr, this, strFolder); + } + + public boolean StoreString(String strContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_StoreString__SWIG_0(swigCPtr, this, strContents, strFolder, oneStr, twoStr, threeStr); + } + + public boolean StoreString(String strContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_StoreString__SWIG_1(swigCPtr, this, strContents, strFolder, oneStr, twoStr); + } + + public boolean StoreString(String strContents, String strFolder, String oneStr) { + return otapiJNI.Storage_StoreString__SWIG_2(swigCPtr, this, strContents, strFolder, oneStr); + } + + public boolean StoreString(String strContents, String strFolder) { + return otapiJNI.Storage_StoreString__SWIG_3(swigCPtr, this, strContents, strFolder); + } + + public String QueryString(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_QueryString__SWIG_0(swigCPtr, this, strFolder, oneStr, twoStr, threeStr); + } + + public String QueryString(String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_QueryString__SWIG_1(swigCPtr, this, strFolder, oneStr, twoStr); + } + + public String QueryString(String strFolder, String oneStr) { + return otapiJNI.Storage_QueryString__SWIG_2(swigCPtr, this, strFolder, oneStr); + } + + public String QueryString(String strFolder) { + return otapiJNI.Storage_QueryString__SWIG_3(swigCPtr, this, strFolder); + } + + public boolean StorePlainString(String strContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_StorePlainString__SWIG_0(swigCPtr, this, strContents, strFolder, oneStr, twoStr, threeStr); + } + + public boolean StorePlainString(String strContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_StorePlainString__SWIG_1(swigCPtr, this, strContents, strFolder, oneStr, twoStr); + } + + public boolean StorePlainString(String strContents, String strFolder, String oneStr) { + return otapiJNI.Storage_StorePlainString__SWIG_2(swigCPtr, this, strContents, strFolder, oneStr); + } + + public boolean StorePlainString(String strContents, String strFolder) { + return otapiJNI.Storage_StorePlainString__SWIG_3(swigCPtr, this, strContents, strFolder); + } + + public String QueryPlainString(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_QueryPlainString__SWIG_0(swigCPtr, this, strFolder, oneStr, twoStr, threeStr); + } + + public String QueryPlainString(String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_QueryPlainString__SWIG_1(swigCPtr, this, strFolder, oneStr, twoStr); + } + + public String QueryPlainString(String strFolder, String oneStr) { + return otapiJNI.Storage_QueryPlainString__SWIG_2(swigCPtr, this, strFolder, oneStr); + } + + public String QueryPlainString(String strFolder) { + return otapiJNI.Storage_QueryPlainString__SWIG_3(swigCPtr, this, strFolder); + } + + public boolean StoreObject(Storable theContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_StoreObject__SWIG_0(swigCPtr, this, Storable.getCPtr(theContents), theContents, strFolder, oneStr, twoStr, threeStr); + } + + public boolean StoreObject(Storable theContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_StoreObject__SWIG_1(swigCPtr, this, Storable.getCPtr(theContents), theContents, strFolder, oneStr, twoStr); + } + + public boolean StoreObject(Storable theContents, String strFolder, String oneStr) { + return otapiJNI.Storage_StoreObject__SWIG_2(swigCPtr, this, Storable.getCPtr(theContents), theContents, strFolder, oneStr); + } + + public boolean StoreObject(Storable theContents, String strFolder) { + return otapiJNI.Storage_StoreObject__SWIG_3(swigCPtr, this, Storable.getCPtr(theContents), theContents, strFolder); + } + + public Storable QueryObject(int theObjectType, String strFolder, String oneStr, String twoStr, String threeStr) { + long cPtr = otapiJNI.Storage_QueryObject__SWIG_0(swigCPtr, this, theObjectType, strFolder, oneStr, twoStr, threeStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public Storable QueryObject(int theObjectType, String strFolder, String oneStr, String twoStr) { + long cPtr = otapiJNI.Storage_QueryObject__SWIG_1(swigCPtr, this, theObjectType, strFolder, oneStr, twoStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public Storable QueryObject(int theObjectType, String strFolder, String oneStr) { + long cPtr = otapiJNI.Storage_QueryObject__SWIG_2(swigCPtr, this, theObjectType, strFolder, oneStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public Storable QueryObject(int theObjectType, String strFolder) { + long cPtr = otapiJNI.Storage_QueryObject__SWIG_3(swigCPtr, this, theObjectType, strFolder); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public boolean EraseValueByKey(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Storage_EraseValueByKey__SWIG_0(swigCPtr, this, strFolder, oneStr, twoStr, threeStr); + } + + public boolean EraseValueByKey(String strFolder, String oneStr, String twoStr) { + return otapiJNI.Storage_EraseValueByKey__SWIG_1(swigCPtr, this, strFolder, oneStr, twoStr); + } + + public boolean EraseValueByKey(String strFolder, String oneStr) { + return otapiJNI.Storage_EraseValueByKey__SWIG_2(swigCPtr, this, strFolder, oneStr); + } + + public boolean EraseValueByKey(String strFolder) { + return otapiJNI.Storage_EraseValueByKey__SWIG_3(swigCPtr, this, strFolder); + } + + public Storable CreateObject(int eType) { + long cPtr = otapiJNI.Storage_CreateObject(swigCPtr, this, eType); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static Storage Create(int eStorageType, int ePackType) { + long cPtr = otapiJNI.Storage_Create(eStorageType, ePackType); + return (cPtr == 0) ? null : new Storage(cPtr, false); + } + + public int GetType() { + return otapiJNI.Storage_GetType(swigCPtr, this); + } + +} diff --git a/testwallet/StorageType.cs b/testwallet/StorageType.cs new file mode 100644 index 000000000..d72172129 --- /dev/null +++ b/testwallet/StorageType.cs @@ -0,0 +1,13 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum StorageType { + STORE_FILESYSTEM = 0, + STORE_TYPE_SUBCLASS +} diff --git a/testwallet/StorageType.java b/testwallet/StorageType.java new file mode 100644 index 000000000..e8f203a87 --- /dev/null +++ b/testwallet/StorageType.java @@ -0,0 +1,15 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public final class StorageType { + public final static int STORE_FILESYSTEM = otapiJNI.STORE_FILESYSTEM_get(); + public final static int STORE_TYPE_SUBCLASS = otapiJNI.STORE_TYPE_SUBCLASS_get(); +} + diff --git a/testwallet/StoredObjectType.cs b/testwallet/StoredObjectType.cs new file mode 100644 index 000000000..4034ec470 --- /dev/null +++ b/testwallet/StoredObjectType.cs @@ -0,0 +1,36 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +public enum StoredObjectType { + STORED_OBJ_STRING = 0, + STORED_OBJ_BLOB, + STORED_OBJ_STRING_MAP, + STORED_OBJ_WALLET_DATA, + STORED_OBJ_BITCOIN_ACCT, + STORED_OBJ_BITCOIN_SERVER, + STORED_OBJ_RIPPLE_SERVER, + STORED_OBJ_LOOM_SERVER, + STORED_OBJ_SERVER_INFO, + STORED_OBJ_CONTACT_NYM, + STORED_OBJ_CONTACT_ACCT, + STORED_OBJ_CONTACT, + STORED_OBJ_ADDRESS_BOOK, + STORED_OBJ_MARKET_DATA, + STORED_OBJ_MARKET_LIST, + STORED_OBJ_BID_DATA, + STORED_OBJ_ASK_DATA, + STORED_OBJ_OFFER_LIST_MARKET, + STORED_OBJ_TRADE_DATA_MARKET, + STORED_OBJ_TRADE_LIST_MARKET, + STORED_OBJ_OFFER_DATA_NYM, + STORED_OBJ_OFFER_LIST_NYM, + STORED_OBJ_TRADE_DATA_NYM, + STORED_OBJ_TRADE_LIST_NYM, + STORED_OBJ_ERROR +} diff --git a/testwallet/StoredObjectType.java b/testwallet/StoredObjectType.java new file mode 100644 index 000000000..1da612289 --- /dev/null +++ b/testwallet/StoredObjectType.java @@ -0,0 +1,38 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public final class StoredObjectType { + public final static int STORED_OBJ_STRING = otapiJNI.STORED_OBJ_STRING_get(); + public final static int STORED_OBJ_BLOB = otapiJNI.STORED_OBJ_BLOB_get(); + public final static int STORED_OBJ_STRING_MAP = otapiJNI.STORED_OBJ_STRING_MAP_get(); + public final static int STORED_OBJ_WALLET_DATA = otapiJNI.STORED_OBJ_WALLET_DATA_get(); + public final static int STORED_OBJ_BITCOIN_ACCT = otapiJNI.STORED_OBJ_BITCOIN_ACCT_get(); + public final static int STORED_OBJ_BITCOIN_SERVER = otapiJNI.STORED_OBJ_BITCOIN_SERVER_get(); + public final static int STORED_OBJ_RIPPLE_SERVER = otapiJNI.STORED_OBJ_RIPPLE_SERVER_get(); + public final static int STORED_OBJ_LOOM_SERVER = otapiJNI.STORED_OBJ_LOOM_SERVER_get(); + public final static int STORED_OBJ_SERVER_INFO = otapiJNI.STORED_OBJ_SERVER_INFO_get(); + public final static int STORED_OBJ_CONTACT_NYM = otapiJNI.STORED_OBJ_CONTACT_NYM_get(); + public final static int STORED_OBJ_CONTACT_ACCT = otapiJNI.STORED_OBJ_CONTACT_ACCT_get(); + public final static int STORED_OBJ_CONTACT = otapiJNI.STORED_OBJ_CONTACT_get(); + public final static int STORED_OBJ_ADDRESS_BOOK = otapiJNI.STORED_OBJ_ADDRESS_BOOK_get(); + public final static int STORED_OBJ_MARKET_DATA = otapiJNI.STORED_OBJ_MARKET_DATA_get(); + public final static int STORED_OBJ_MARKET_LIST = otapiJNI.STORED_OBJ_MARKET_LIST_get(); + public final static int STORED_OBJ_BID_DATA = otapiJNI.STORED_OBJ_BID_DATA_get(); + public final static int STORED_OBJ_ASK_DATA = otapiJNI.STORED_OBJ_ASK_DATA_get(); + public final static int STORED_OBJ_OFFER_LIST_MARKET = otapiJNI.STORED_OBJ_OFFER_LIST_MARKET_get(); + public final static int STORED_OBJ_TRADE_DATA_MARKET = otapiJNI.STORED_OBJ_TRADE_DATA_MARKET_get(); + public final static int STORED_OBJ_TRADE_LIST_MARKET = otapiJNI.STORED_OBJ_TRADE_LIST_MARKET_get(); + public final static int STORED_OBJ_OFFER_DATA_NYM = otapiJNI.STORED_OBJ_OFFER_DATA_NYM_get(); + public final static int STORED_OBJ_OFFER_LIST_NYM = otapiJNI.STORED_OBJ_OFFER_LIST_NYM_get(); + public final static int STORED_OBJ_TRADE_DATA_NYM = otapiJNI.STORED_OBJ_TRADE_DATA_NYM_get(); + public final static int STORED_OBJ_TRADE_LIST_NYM = otapiJNI.STORED_OBJ_TRADE_LIST_NYM_get(); + public final static int STORED_OBJ_ERROR = otapiJNI.STORED_OBJ_ERROR_get(); +} + diff --git a/testwallet/StringMap.cs b/testwallet/StringMap.cs new file mode 100644 index 000000000..fdbdde802 --- /dev/null +++ b/testwallet/StringMap.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class StringMap : Storable { + private HandleRef swigCPtr; + + internal StringMap(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.StringMap_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(StringMap obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~StringMap() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_StringMap(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public SWIGTYPE_p_std__mapT_std__string_std__string_t the_map { + set { + otapiPINVOKE.StringMap_the_map_set(swigCPtr, SWIGTYPE_p_std__mapT_std__string_std__string_t.getCPtr(value)); + } + get { + IntPtr cPtr = otapiPINVOKE.StringMap_the_map_get(swigCPtr); + SWIGTYPE_p_std__mapT_std__string_std__string_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_std__mapT_std__string_std__string_t(cPtr, false); + return ret; + } + } + + public void SetValue(string strKey, string strValue) { + otapiPINVOKE.StringMap_SetValue(swigCPtr, strKey, strValue); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + + public string GetValue(string strKey) { + string ret = otapiPINVOKE.StringMap_GetValue(swigCPtr, strKey); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static StringMap ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.StringMap_ot_dynamic_cast(Storable.getCPtr(pObject)); + StringMap ret = (cPtr == IntPtr.Zero) ? null : new StringMap(cPtr, false); + return ret; + } + +} diff --git a/testwallet/StringMap.java b/testwallet/StringMap.java new file mode 100644 index 000000000..6939ddbe1 --- /dev/null +++ b/testwallet/StringMap.java @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class StringMap extends Storable { + private long swigCPtr; + + public StringMap(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.StringMap_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(StringMap obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_StringMap(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + public void setThe_map(SWIGTYPE_p_std__mapT_std__string_std__string_t value) { + otapiJNI.StringMap_the_map_set(swigCPtr, this, SWIGTYPE_p_std__mapT_std__string_std__string_t.getCPtr(value)); + } + + public SWIGTYPE_p_std__mapT_std__string_std__string_t getThe_map() { + long cPtr = otapiJNI.StringMap_the_map_get(swigCPtr, this); + return (cPtr == 0) ? null : new SWIGTYPE_p_std__mapT_std__string_std__string_t(cPtr, false); + } + + public void SetValue(String strKey, String strValue) { + otapiJNI.StringMap_SetValue(swigCPtr, this, strKey, strValue); + } + + public String GetValue(String strKey) { + return otapiJNI.StringMap_GetValue(swigCPtr, this, strKey); + } + + public static StringMap ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.StringMap_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new StringMap(cPtr, false); + } + +} diff --git a/testwallet/TradeDataMarket.cs b/testwallet/TradeDataMarket.cs new file mode 100644 index 000000000..05c253cea --- /dev/null +++ b/testwallet/TradeDataMarket.cs @@ -0,0 +1,108 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class TradeDataMarket : Displayable { + private HandleRef swigCPtr; + + internal TradeDataMarket(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.TradeDataMarket_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(TradeDataMarket obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~TradeDataMarket() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_TradeDataMarket(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.TradeDataMarket_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataMarket_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.TradeDataMarket_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataMarket_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string date { + set { + otapiPINVOKE.TradeDataMarket_date_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataMarket_date_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price { + set { + otapiPINVOKE.TradeDataMarket_price_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataMarket_price_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string amount_sold { + set { + otapiPINVOKE.TradeDataMarket_amount_sold_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataMarket_amount_sold_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static TradeDataMarket ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.TradeDataMarket_ot_dynamic_cast(Storable.getCPtr(pObject)); + TradeDataMarket ret = (cPtr == IntPtr.Zero) ? null : new TradeDataMarket(cPtr, false); + return ret; + } + +} diff --git a/testwallet/TradeDataMarket.java b/testwallet/TradeDataMarket.java new file mode 100644 index 000000000..3c616352b --- /dev/null +++ b/testwallet/TradeDataMarket.java @@ -0,0 +1,92 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class TradeDataMarket extends Displayable { + private long swigCPtr; + + public TradeDataMarket(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.TradeDataMarket_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(TradeDataMarket obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_TradeDataMarket(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private TradeListMarket containerRefTradeListMarket; + // ---------------- + protected void addReference(TradeListMarket theContainer) { // This is Java code + containerRefTradeListMarket = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.TradeDataMarket_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.TradeDataMarket_gui_label_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.TradeDataMarket_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.TradeDataMarket_transaction_id_get(swigCPtr, this); + } + + public void setDate(String value) { + otapiJNI.TradeDataMarket_date_set(swigCPtr, this, value); + } + + public String getDate() { + return otapiJNI.TradeDataMarket_date_get(swigCPtr, this); + } + + public void setPrice(String value) { + otapiJNI.TradeDataMarket_price_set(swigCPtr, this, value); + } + + public String getPrice() { + return otapiJNI.TradeDataMarket_price_get(swigCPtr, this); + } + + public void setAmount_sold(String value) { + otapiJNI.TradeDataMarket_amount_sold_set(swigCPtr, this, value); + } + + public String getAmount_sold() { + return otapiJNI.TradeDataMarket_amount_sold_get(swigCPtr, this); + } + + public static TradeDataMarket ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.TradeDataMarket_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new TradeDataMarket(cPtr, false); + } + +} diff --git a/testwallet/TradeDataNym.cs b/testwallet/TradeDataNym.cs new file mode 100644 index 000000000..5efc462bd --- /dev/null +++ b/testwallet/TradeDataNym.cs @@ -0,0 +1,120 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class TradeDataNym : Displayable { + private HandleRef swigCPtr; + + internal TradeDataNym(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.TradeDataNym_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(TradeDataNym obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~TradeDataNym() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_TradeDataNym(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public string gui_label { + set { + otapiPINVOKE.TradeDataNym_gui_label_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_gui_label_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string transaction_id { + set { + otapiPINVOKE.TradeDataNym_transaction_id_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_transaction_id_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string completed_count { + set { + otapiPINVOKE.TradeDataNym_completed_count_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_completed_count_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string date { + set { + otapiPINVOKE.TradeDataNym_date_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_date_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string price { + set { + otapiPINVOKE.TradeDataNym_price_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_price_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public string amount_sold { + set { + otapiPINVOKE.TradeDataNym_amount_sold_set(swigCPtr, value); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + } + get { + string ret = otapiPINVOKE.TradeDataNym_amount_sold_get(swigCPtr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + } + + public new static TradeDataNym ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.TradeDataNym_ot_dynamic_cast(Storable.getCPtr(pObject)); + TradeDataNym ret = (cPtr == IntPtr.Zero) ? null : new TradeDataNym(cPtr, false); + return ret; + } + +} diff --git a/testwallet/TradeDataNym.java b/testwallet/TradeDataNym.java new file mode 100644 index 000000000..03a130830 --- /dev/null +++ b/testwallet/TradeDataNym.java @@ -0,0 +1,100 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class TradeDataNym extends Displayable { + private long swigCPtr; + + public TradeDataNym(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.TradeDataNym_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(TradeDataNym obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_TradeDataNym(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +/*@SWIG:OTAPI.i,396,OT_CAN_BE_CONTAINED_BY@*/ + // Ensure that the GC doesn't collect any OT_CONTAINER instance set from Java + private TradeListNym containerRefTradeListNym; + // ---------------- + protected void addReference(TradeListNym theContainer) { // This is Java code + containerRefTradeListNym = theContainer; + } + // ---------------- +/*@SWIG@*/ + // ------------------------ + public void setGui_label(String value) { + otapiJNI.TradeDataNym_gui_label_set(swigCPtr, this, value); + } + + public String getGui_label() { + return otapiJNI.TradeDataNym_gui_label_get(swigCPtr, this); + } + + public void setTransaction_id(String value) { + otapiJNI.TradeDataNym_transaction_id_set(swigCPtr, this, value); + } + + public String getTransaction_id() { + return otapiJNI.TradeDataNym_transaction_id_get(swigCPtr, this); + } + + public void setCompleted_count(String value) { + otapiJNI.TradeDataNym_completed_count_set(swigCPtr, this, value); + } + + public String getCompleted_count() { + return otapiJNI.TradeDataNym_completed_count_get(swigCPtr, this); + } + + public void setDate(String value) { + otapiJNI.TradeDataNym_date_set(swigCPtr, this, value); + } + + public String getDate() { + return otapiJNI.TradeDataNym_date_get(swigCPtr, this); + } + + public void setPrice(String value) { + otapiJNI.TradeDataNym_price_set(swigCPtr, this, value); + } + + public String getPrice() { + return otapiJNI.TradeDataNym_price_get(swigCPtr, this); + } + + public void setAmount_sold(String value) { + otapiJNI.TradeDataNym_amount_sold_set(swigCPtr, this, value); + } + + public String getAmount_sold() { + return otapiJNI.TradeDataNym_amount_sold_get(swigCPtr, this); + } + + public static TradeDataNym ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.TradeDataNym_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new TradeDataNym(cPtr, false); + } + +} diff --git a/testwallet/TradeListMarket.cs b/testwallet/TradeListMarket.cs new file mode 100644 index 000000000..7c207c26f --- /dev/null +++ b/testwallet/TradeListMarket.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class TradeListMarket : Storable { + private HandleRef swigCPtr; + + internal TradeListMarket(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.TradeListMarket_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(TradeListMarket obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~TradeListMarket() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_TradeListMarket(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetTradeDataMarketCount() { + uint ret = otapiPINVOKE.TradeListMarket_GetTradeDataMarketCount(swigCPtr); + return ret; + } + + public TradeDataMarket GetTradeDataMarket(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.TradeListMarket_GetTradeDataMarket(swigCPtr, nIndex); + TradeDataMarket ret = (cPtr == IntPtr.Zero) ? null : new TradeDataMarket(cPtr, false); + return ret; + } + + public bool RemoveTradeDataMarket(uint nIndexTradeDataMarket) { + bool ret = otapiPINVOKE.TradeListMarket_RemoveTradeDataMarket(swigCPtr, nIndexTradeDataMarket); + return ret; + } + + public bool AddTradeDataMarket(TradeDataMarket disownObject) { + bool ret = otapiPINVOKE.TradeListMarket_AddTradeDataMarket(swigCPtr, TradeDataMarket.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static TradeListMarket ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.TradeListMarket_ot_dynamic_cast(Storable.getCPtr(pObject)); + TradeListMarket ret = (cPtr == IntPtr.Zero) ? null : new TradeListMarket(cPtr, false); + return ret; + } + +} diff --git a/testwallet/TradeListMarket.java b/testwallet/TradeListMarket.java new file mode 100644 index 000000000..e4d1bc0a4 --- /dev/null +++ b/testwallet/TradeListMarket.java @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class TradeListMarket extends Storable { + private long swigCPtr; + + public TradeListMarket(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.TradeListMarket_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(TradeListMarket obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_TradeListMarket(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefTradeDataMarket(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + TradeDataMarket refActualElement = GetTradeDataMarket(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof TradeDataMarket)) + continue; + + TradeDataMarket tempRef = (TradeDataMarket)(theObject); + + if ((TradeDataMarket.getCPtr(tempRef) == TradeDataMarket.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefTradeDataMarket(TradeDataMarket element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof TradeDataMarket)) + continue; + + TradeDataMarket tempRef = (TradeDataMarket)(theObject); + + if ((TradeDataMarket.getCPtr(tempRef) == TradeDataMarket.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + TradeDataMarket tempLocalRef = element; + elementList.add(tempLocalRef); + return TradeDataMarket.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetTradeDataMarketCount() { return otapiJNI.TradeListMarket_GetTradeDataMarketCount(swigCPtr, this); } + + public TradeDataMarket GetTradeDataMarket(long nIndex) { + long cPtr = otapiJNI.TradeListMarket_GetTradeDataMarket(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new TradeDataMarket(cPtr, false); + } + + public boolean RemoveTradeDataMarket(long nIndexTradeDataMarket) { + return otapiJNI.TradeListMarket_RemoveTradeDataMarket(swigCPtr, this, removeRefTradeDataMarket(nIndexTradeDataMarket)); + } + + public boolean AddTradeDataMarket(TradeDataMarket disownObject) { + return otapiJNI.TradeListMarket_AddTradeDataMarket(swigCPtr, this, TradeDataMarket.getCPtr(disownObject), disownObject); + } + + public static TradeListMarket ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.TradeListMarket_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new TradeListMarket(cPtr, false); + } + +} diff --git a/testwallet/TradeListNym.cs b/testwallet/TradeListNym.cs new file mode 100644 index 000000000..a20e64557 --- /dev/null +++ b/testwallet/TradeListNym.cs @@ -0,0 +1,70 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class TradeListNym : Storable { + private HandleRef swigCPtr; + + internal TradeListNym(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.TradeListNym_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(TradeListNym obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~TradeListNym() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_TradeListNym(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetTradeDataNymCount() { + uint ret = otapiPINVOKE.TradeListNym_GetTradeDataNymCount(swigCPtr); + return ret; + } + + public TradeDataNym GetTradeDataNym(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.TradeListNym_GetTradeDataNym(swigCPtr, nIndex); + TradeDataNym ret = (cPtr == IntPtr.Zero) ? null : new TradeDataNym(cPtr, false); + return ret; + } + + public bool RemoveTradeDataNym(uint nIndexTradeDataNym) { + bool ret = otapiPINVOKE.TradeListNym_RemoveTradeDataNym(swigCPtr, nIndexTradeDataNym); + return ret; + } + + public bool AddTradeDataNym(TradeDataNym disownObject) { + bool ret = otapiPINVOKE.TradeListNym_AddTradeDataNym(swigCPtr, TradeDataNym.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static TradeListNym ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.TradeListNym_ot_dynamic_cast(Storable.getCPtr(pObject)); + TradeListNym ret = (cPtr == IntPtr.Zero) ? null : new TradeListNym(cPtr, false); + return ret; + } + +} diff --git a/testwallet/TradeListNym.java b/testwallet/TradeListNym.java new file mode 100644 index 000000000..b24a53647 --- /dev/null +++ b/testwallet/TradeListNym.java @@ -0,0 +1,121 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class TradeListNym extends Storable { + private long swigCPtr; + + public TradeListNym(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.TradeListNym_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(TradeListNym obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_TradeListNym(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefTradeDataNym(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + TradeDataNym refActualElement = GetTradeDataNym(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof TradeDataNym)) + continue; + + TradeDataNym tempRef = (TradeDataNym)(theObject); + + if ((TradeDataNym.getCPtr(tempRef) == TradeDataNym.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefTradeDataNym(TradeDataNym element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof TradeDataNym)) + continue; + + TradeDataNym tempRef = (TradeDataNym)(theObject); + + if ((TradeDataNym.getCPtr(tempRef) == TradeDataNym.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + TradeDataNym tempLocalRef = element; + elementList.add(tempLocalRef); + return TradeDataNym.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetTradeDataNymCount() { return otapiJNI.TradeListNym_GetTradeDataNymCount(swigCPtr, this); } + + public TradeDataNym GetTradeDataNym(long nIndex) { + long cPtr = otapiJNI.TradeListNym_GetTradeDataNym(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new TradeDataNym(cPtr, false); + } + + public boolean RemoveTradeDataNym(long nIndexTradeDataNym) { + return otapiJNI.TradeListNym_RemoveTradeDataNym(swigCPtr, this, removeRefTradeDataNym(nIndexTradeDataNym)); + } + + public boolean AddTradeDataNym(TradeDataNym disownObject) { + return otapiJNI.TradeListNym_AddTradeDataNym(swigCPtr, this, TradeDataNym.getCPtr(disownObject), disownObject); + } + + public static TradeListNym ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.TradeListNym_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new TradeListNym(cPtr, false); + } + +} diff --git a/testwallet/WalletData.cs b/testwallet/WalletData.cs new file mode 100644 index 000000000..9fefcdf2d --- /dev/null +++ b/testwallet/WalletData.cs @@ -0,0 +1,136 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class WalletData : Storable { + private HandleRef swigCPtr; + + internal WalletData(IntPtr cPtr, bool cMemoryOwn) : base(otapiPINVOKE.WalletData_SWIGUpcast(cPtr), cMemoryOwn) { + swigCPtr = new HandleRef(this, cPtr); + } + + internal static HandleRef getCPtr(WalletData obj) { + return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr; + } + + ~WalletData() { + Dispose(); + } + + public override void Dispose() { + lock(this) { + if (swigCPtr.Handle != IntPtr.Zero) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiPINVOKE.delete_WalletData(swigCPtr); + } + swigCPtr = new HandleRef(null, IntPtr.Zero); + } + GC.SuppressFinalize(this); + base.Dispose(); + } + } + + public uint GetBitcoinServerCount() { + uint ret = otapiPINVOKE.WalletData_GetBitcoinServerCount(swigCPtr); + return ret; + } + + public BitcoinServer GetBitcoinServer(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.WalletData_GetBitcoinServer(swigCPtr, nIndex); + BitcoinServer ret = (cPtr == IntPtr.Zero) ? null : new BitcoinServer(cPtr, false); + return ret; + } + + public bool RemoveBitcoinServer(uint nIndexBitcoinServer) { + bool ret = otapiPINVOKE.WalletData_RemoveBitcoinServer(swigCPtr, nIndexBitcoinServer); + return ret; + } + + public bool AddBitcoinServer(BitcoinServer disownObject) { + bool ret = otapiPINVOKE.WalletData_AddBitcoinServer(swigCPtr, BitcoinServer.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public uint GetBitcoinAcctCount() { + uint ret = otapiPINVOKE.WalletData_GetBitcoinAcctCount(swigCPtr); + return ret; + } + + public BitcoinAcct GetBitcoinAcct(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.WalletData_GetBitcoinAcct(swigCPtr, nIndex); + BitcoinAcct ret = (cPtr == IntPtr.Zero) ? null : new BitcoinAcct(cPtr, false); + return ret; + } + + public bool RemoveBitcoinAcct(uint nIndexBitcoinAcct) { + bool ret = otapiPINVOKE.WalletData_RemoveBitcoinAcct(swigCPtr, nIndexBitcoinAcct); + return ret; + } + + public bool AddBitcoinAcct(BitcoinAcct disownObject) { + bool ret = otapiPINVOKE.WalletData_AddBitcoinAcct(swigCPtr, BitcoinAcct.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public uint GetRippleServerCount() { + uint ret = otapiPINVOKE.WalletData_GetRippleServerCount(swigCPtr); + return ret; + } + + public RippleServer GetRippleServer(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.WalletData_GetRippleServer(swigCPtr, nIndex); + RippleServer ret = (cPtr == IntPtr.Zero) ? null : new RippleServer(cPtr, false); + return ret; + } + + public bool RemoveRippleServer(uint nIndexRippleServer) { + bool ret = otapiPINVOKE.WalletData_RemoveRippleServer(swigCPtr, nIndexRippleServer); + return ret; + } + + public bool AddRippleServer(RippleServer disownObject) { + bool ret = otapiPINVOKE.WalletData_AddRippleServer(swigCPtr, RippleServer.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public uint GetLoomServerCount() { + uint ret = otapiPINVOKE.WalletData_GetLoomServerCount(swigCPtr); + return ret; + } + + public LoomServer GetLoomServer(uint nIndex) { + IntPtr cPtr = otapiPINVOKE.WalletData_GetLoomServer(swigCPtr, nIndex); + LoomServer ret = (cPtr == IntPtr.Zero) ? null : new LoomServer(cPtr, false); + return ret; + } + + public bool RemoveLoomServer(uint nIndexLoomServer) { + bool ret = otapiPINVOKE.WalletData_RemoveLoomServer(swigCPtr, nIndexLoomServer); + return ret; + } + + public bool AddLoomServer(LoomServer disownObject) { + bool ret = otapiPINVOKE.WalletData_AddLoomServer(swigCPtr, LoomServer.getCPtr(disownObject)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public new static WalletData ot_dynamic_cast(Storable pObject) { + IntPtr cPtr = otapiPINVOKE.WalletData_ot_dynamic_cast(Storable.getCPtr(pObject)); + WalletData ret = (cPtr == IntPtr.Zero) ? null : new WalletData(cPtr, false); + return ret; + } + +} diff --git a/testwallet/WalletData.java b/testwallet/WalletData.java new file mode 100644 index 000000000..8c0b8fa86 --- /dev/null +++ b/testwallet/WalletData.java @@ -0,0 +1,346 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class WalletData extends Storable { + private long swigCPtr; + + public WalletData(long cPtr, boolean cMemoryOwn) { + super(otapiJNI.WalletData_SWIGUpcast(cPtr), cMemoryOwn); + swigCPtr = cPtr; + } + + public static long getCPtr(WalletData obj) { + return (obj == null) ? 0 : obj.swigCPtr; + } + + protected void finalize() { + delete(); + } + + public synchronized void delete() { + if (swigCPtr != 0) { + if (swigCMemOwn) { + swigCMemOwn = false; + otapiJNI.delete_WalletData(swigCPtr); + } + swigCPtr = 0; + } + super.delete(); + } +// ------------------------ + /*@SWIG:OTAPI.i,346,OT_CONTAINER_TYPE_MEMBERS@*/ + private List elementList = new ArrayList(); +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefBitcoinServer(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + BitcoinServer refActualElement = GetBitcoinServer(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BitcoinServer)) + continue; + + BitcoinServer tempRef = (BitcoinServer)(theObject); + + if ((BitcoinServer.getCPtr(tempRef) == BitcoinServer.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefBitcoinServer(BitcoinServer element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BitcoinServer)) + continue; + + BitcoinServer tempRef = (BitcoinServer)(theObject); + + if ((BitcoinServer.getCPtr(tempRef) == BitcoinServer.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + BitcoinServer tempLocalRef = element; + elementList.add(tempLocalRef); + return BitcoinServer.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefBitcoinAcct(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + BitcoinAcct refActualElement = GetBitcoinAcct(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BitcoinAcct)) + continue; + + BitcoinAcct tempRef = (BitcoinAcct)(theObject); + + if ((BitcoinAcct.getCPtr(tempRef) == BitcoinAcct.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefBitcoinAcct(BitcoinAcct element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof BitcoinAcct)) + continue; + + BitcoinAcct tempRef = (BitcoinAcct)(theObject); + + if ((BitcoinAcct.getCPtr(tempRef) == BitcoinAcct.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + BitcoinAcct tempLocalRef = element; + elementList.add(tempLocalRef); + return BitcoinAcct.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefRippleServer(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + RippleServer refActualElement = GetRippleServer(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof RippleServer)) + continue; + + RippleServer tempRef = (RippleServer)(theObject); + + if ((RippleServer.getCPtr(tempRef) == RippleServer.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefRippleServer(RippleServer element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof RippleServer)) + continue; + + RippleServer tempRef = (RippleServer)(theObject); + + if ((RippleServer.getCPtr(tempRef) == RippleServer.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + RippleServer tempLocalRef = element; + elementList.add(tempLocalRef); + return RippleServer.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + /*@SWIG:OTAPI.i,427,OT_ADD_ELEMENT@*/ // THIS BLOCK CONTAINS JAVA CODE. +private long removeRefLoomServer(long lIndex) { + // + // loop through the elements in the actual container, in order to find the one + // at lIndex. Once it is found, then loop through the reference list and remove + // the corresponding reference for that element. + // + LoomServer refActualElement = GetLoomServer(lIndex); + + if (refActualElement == null) + return lIndex; // oh well. + + // Loop through the reference list and remove the corresponding reference + // for the specified element. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof LoomServer)) + continue; + + LoomServer tempRef = (LoomServer)(theObject); + + if ((LoomServer.getCPtr(tempRef) == LoomServer.getCPtr(refActualElement))) + { + elementList.remove(tempRef); + break; + } + } + + return lIndex; +} + +private long getCPtrAddRefLoomServer(LoomServer element) { + // Whenever adding a reference to the list, I remove it first (if already there.) + // That way we never store more than one reference per actual contained object. + // + for(int intIndex = 0; intIndex < elementList.size(); intIndex++) + { + Object theObject = elementList.get(intIndex); + + if ((theObject == null) || !(theObject instanceof LoomServer)) + continue; + + LoomServer tempRef = (LoomServer)(theObject); + + if ((LoomServer.getCPtr(tempRef) == LoomServer.getCPtr(element))) + { + elementList.remove(tempRef); // It was already there, so let's remove it before adding (below.) + break; + } + } + // Now we add it... + // + LoomServer tempLocalRef = element; + elementList.add(tempLocalRef); + return LoomServer.getCPtr(element); +} // Hope I get away with overloading this for every type. Otherwise, +/*@SWIG@*/ + public long GetBitcoinServerCount() { return otapiJNI.WalletData_GetBitcoinServerCount(swigCPtr, this); } + + public BitcoinServer GetBitcoinServer(long nIndex) { + long cPtr = otapiJNI.WalletData_GetBitcoinServer(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new BitcoinServer(cPtr, false); + } + + public boolean RemoveBitcoinServer(long nIndexBitcoinServer) { + return otapiJNI.WalletData_RemoveBitcoinServer(swigCPtr, this, removeRefBitcoinServer(nIndexBitcoinServer)); + } + + public boolean AddBitcoinServer(BitcoinServer disownObject) { + return otapiJNI.WalletData_AddBitcoinServer(swigCPtr, this, BitcoinServer.getCPtr(disownObject), disownObject); + } + + public long GetBitcoinAcctCount() { return otapiJNI.WalletData_GetBitcoinAcctCount(swigCPtr, this); } + + public BitcoinAcct GetBitcoinAcct(long nIndex) { + long cPtr = otapiJNI.WalletData_GetBitcoinAcct(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new BitcoinAcct(cPtr, false); + } + + public boolean RemoveBitcoinAcct(long nIndexBitcoinAcct) { + return otapiJNI.WalletData_RemoveBitcoinAcct(swigCPtr, this, removeRefBitcoinAcct(nIndexBitcoinAcct)); + } + + public boolean AddBitcoinAcct(BitcoinAcct disownObject) { + return otapiJNI.WalletData_AddBitcoinAcct(swigCPtr, this, BitcoinAcct.getCPtr(disownObject), disownObject); + } + + public long GetRippleServerCount() { return otapiJNI.WalletData_GetRippleServerCount(swigCPtr, this); } + + public RippleServer GetRippleServer(long nIndex) { + long cPtr = otapiJNI.WalletData_GetRippleServer(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new RippleServer(cPtr, false); + } + + public boolean RemoveRippleServer(long nIndexRippleServer) { + return otapiJNI.WalletData_RemoveRippleServer(swigCPtr, this, removeRefRippleServer(nIndexRippleServer)); + } + + public boolean AddRippleServer(RippleServer disownObject) { + return otapiJNI.WalletData_AddRippleServer(swigCPtr, this, RippleServer.getCPtr(disownObject), disownObject); + } + + public long GetLoomServerCount() { return otapiJNI.WalletData_GetLoomServerCount(swigCPtr, this); } + + public LoomServer GetLoomServer(long nIndex) { + long cPtr = otapiJNI.WalletData_GetLoomServer(swigCPtr, this, nIndex); + return (cPtr == 0) ? null : new LoomServer(cPtr, false); + } + + public boolean RemoveLoomServer(long nIndexLoomServer) { + return otapiJNI.WalletData_RemoveLoomServer(swigCPtr, this, removeRefLoomServer(nIndexLoomServer)); + } + + public boolean AddLoomServer(LoomServer disownObject) { + return otapiJNI.WalletData_AddLoomServer(swigCPtr, this, LoomServer.getCPtr(disownObject), disownObject); + } + + public static WalletData ot_dynamic_cast(Storable pObject) { + long cPtr = otapiJNI.WalletData_ot_dynamic_cast(Storable.getCPtr(pObject), pObject); + return (cPtr == 0) ? null : new WalletData(cPtr, false); + } + +} diff --git a/testwallet/buildwrappers b/testwallet/buildwrappers new file mode 100755 index 000000000..f56a225fc --- /dev/null +++ b/testwallet/buildwrappers @@ -0,0 +1,46 @@ +touch otapi.d; rm otapi.d; +touch otapi.cs; rm otapi.cs; +touch otapi.java; rm otapi.java; +touch otapi.php; rm otapi.php; +touch otapi.pm; rm otapi.pm; +touch otapi.py; rm otapi.py; +touch OTAPI.pyc; rm OTAPI.pyc; +touch otapiJNI.java; rm otapiJNI.java; +touch otapiPINVOKE.cs; rm otapiPINVOKE.cs; +touch OTAPI_d.cpp; rm OTAPI_d.cpp; +touch OTAPI_csharp.cpp; rm OTAPI_csharp.cpp; +touch OTAPI_java.cpp; rm OTAPI_java.cpp; +touch OTAPI_perl5.cpp; rm OTAPI_perl5.cpp; +touch OTAPI_php.cpp; rm OTAPI_php.cpp; +touch OTAPI_python.cpp; rm OTAPI_python.cpp; +touch OTAPI_ruby.cpp; rm OTAPI_ruby.cpp; +touch OTAPI_tcl.cpp; rm OTAPI_tcl.cpp; +touch php_otapi.h; rm php_otapi.h; +touch OTAPI_wrap.h; rm OTAPI_wrap.h; + +#Commenting out LISP since it doesn't seem to have std_string.i +#touch otapi.lisp; rm otapi.lisp; +#touch OTAPI_cffi.c; rm OTAPI_cffi.c; +#touch OTAPI_wrap.c; rm OTAPI_wrap.c; /usr/bin/swig -c++ -cffi OTAPI.i; touch OTAPI_wrap.c; mv OTAPI_wrap.c OTAPI_cffi.c + +# Commenting out the D-language for now, since swig-d doesn't seem to be available on macports right now. +#touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; /usr/bin/swig -c++ -d -d2 OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_d.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_d.h + +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -tcl OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_tcl.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_tcl.h +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -ruby OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_ruby.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_ruby.h +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -python OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_python.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_python.h +touch OTAPI_wrap.cpp; rm OTAPI_wrap.cpp; swig -c++ -php OTAPI.i; touch OTAPI_wrap.cpp; mv OTAPI_wrap.cpp OTAPI_php.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_php.h +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -perl5 OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_perl5.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_perl5.h +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -csharp OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_csharp.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_csharp.h + +#I'm putting the Moneychanger package in here so I don't have to search/replace anymore. +#touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; /usr/bin/swig -c++ -java OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_java.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_java.h + +#PACKAGE VERSION (com.wrapper.core.jni) +touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -java -package com.wrapper.core.jni OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_java.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_java.h + +#NO-PACKAGE VERSION +#touch OTAPI_wrap.cxx; rm OTAPI_wrap.cxx; swig -c++ -java OTAPI.i; touch OTAPI_wrap.cxx; mv OTAPI_wrap.cxx OTAPI_java.cpp; touch OTAPI_wrap.h; mv OTAPI_wrap.h OTAPI_java.h + + + diff --git a/testwallet/main.h b/testwallet/main.h new file mode 100644 index 000000000..913826ebf --- /dev/null +++ b/testwallet/main.h @@ -0,0 +1,146 @@ +/************************************************************************************ + * + * main.h + * + */ + + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +extern "C" +{ +#include +} + + +//int LoadWallet(); + + +#endif // __MAIN_H__ diff --git a/testwallet/ot_client.cfg b/testwallet/ot_client.cfg new file mode 100644 index 000000000..a588512f1 --- /dev/null +++ b/testwallet/ot_client.cfg @@ -0,0 +1,5 @@ + +[logging] +logfile_path=/Users/au/Projects/Open-Transactions/testwallet/ot.log +log_level=1 + diff --git a/testwallet/otapi.cs b/testwallet/otapi.cs new file mode 100644 index 000000000..17fabab6e --- /dev/null +++ b/testwallet/otapi.cs @@ -0,0 +1,1071 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +public class otapi { + public static bool OT_API_Set_PasswordCallback(OTCaller theCaller) { + bool ret = otapiPINVOKE.OT_API_Set_PasswordCallback(OTCaller.getCPtr(theCaller)); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static int OT_API_Init(string szClientPath) { + int ret = otapiPINVOKE.OT_API_Init(szClientPath); + return ret; + } + + public static int OT_API_LoadWallet(string szWalletFilename) { + int ret = otapiPINVOKE.OT_API_LoadWallet(szWalletFilename); + return ret; + } + + public static int OT_API_SwitchWallet(string szDataFolderPath, string szWalletFilename) { + int ret = otapiPINVOKE.OT_API_SwitchWallet(szDataFolderPath, szWalletFilename); + return ret; + } + + public static int OT_API_GetMemlogSize() { + int ret = otapiPINVOKE.OT_API_GetMemlogSize(); + return ret; + } + + public static string OT_API_GetMemlogAtIndex(int nIndex) { + string ret = otapiPINVOKE.OT_API_GetMemlogAtIndex(nIndex); + return ret; + } + + public static string OT_API_PeekMemlogFront() { + string ret = otapiPINVOKE.OT_API_PeekMemlogFront(); + return ret; + } + + public static string OT_API_PeekMemlogBack() { + string ret = otapiPINVOKE.OT_API_PeekMemlogBack(); + return ret; + } + + public static int OT_API_PopMemlogFront() { + int ret = otapiPINVOKE.OT_API_PopMemlogFront(); + return ret; + } + + public static int OT_API_PopMemlogBack() { + int ret = otapiPINVOKE.OT_API_PopMemlogBack(); + return ret; + } + + public static string OT_API_CreateNym() { + string ret = otapiPINVOKE.OT_API_CreateNym(); + return ret; + } + + public static int OT_API_AddServerContract(string szContract) { + int ret = otapiPINVOKE.OT_API_AddServerContract(szContract); + return ret; + } + + public static int OT_API_AddAssetContract(string szContract) { + int ret = otapiPINVOKE.OT_API_AddAssetContract(szContract); + return ret; + } + + public static int OT_API_GetServerCount() { + int ret = otapiPINVOKE.OT_API_GetServerCount(); + return ret; + } + + public static int OT_API_GetAssetTypeCount() { + int ret = otapiPINVOKE.OT_API_GetAssetTypeCount(); + return ret; + } + + public static int OT_API_GetAccountCount() { + int ret = otapiPINVOKE.OT_API_GetAccountCount(); + return ret; + } + + public static int OT_API_GetNymCount() { + int ret = otapiPINVOKE.OT_API_GetNymCount(); + return ret; + } + + public static string OT_API_GetServer_ID(int nIndex) { + string ret = otapiPINVOKE.OT_API_GetServer_ID(nIndex); + return ret; + } + + public static string OT_API_GetServer_Name(string SERVER_ID) { + string ret = otapiPINVOKE.OT_API_GetServer_Name(SERVER_ID); + return ret; + } + + public static string OT_API_GetAssetType_ID(int nIndex) { + string ret = otapiPINVOKE.OT_API_GetAssetType_ID(nIndex); + return ret; + } + + public static string OT_API_GetAssetType_Name(string ASSET_TYPE_ID) { + string ret = otapiPINVOKE.OT_API_GetAssetType_Name(ASSET_TYPE_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_ID(int nIndex) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_ID(nIndex); + return ret; + } + + public static string OT_API_GetAccountWallet_Name(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_Name(ACCOUNT_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_Balance(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_Balance(ACCOUNT_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_Type(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_Type(ACCOUNT_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_AssetTypeID(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_AssetTypeID(ACCOUNT_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_ServerID(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_ServerID(ACCOUNT_ID); + return ret; + } + + public static string OT_API_GetAccountWallet_NymID(string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_GetAccountWallet_NymID(ACCOUNT_ID); + return ret; + } + + public static int OT_API_VerifyAccountReceipt(string SERVER_ID, string NYM_ID, string ACCT_ID) { + int ret = otapiPINVOKE.OT_API_VerifyAccountReceipt(SERVER_ID, NYM_ID, ACCT_ID); + return ret; + } + + public static int OT_API_GetNym_TransactionNumCount(string SERVER_ID, string NYM_ID) { + int ret = otapiPINVOKE.OT_API_GetNym_TransactionNumCount(SERVER_ID, NYM_ID); + return ret; + } + + public static string OT_API_GetNym_ID(int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_ID(nIndex); + return ret; + } + + public static string OT_API_GetNym_Name(string NYM_ID) { + string ret = otapiPINVOKE.OT_API_GetNym_Name(NYM_ID); + return ret; + } + + public static string OT_API_GetNym_Stats(string NYM_ID) { + string ret = otapiPINVOKE.OT_API_GetNym_Stats(NYM_ID); + return ret; + } + + public static int OT_API_IsNym_RegisteredAtServer(string NYM_ID, string SERVER_ID) { + int ret = otapiPINVOKE.OT_API_IsNym_RegisteredAtServer(NYM_ID, SERVER_ID); + return ret; + } + + public static int OT_API_GetNym_MailCount(string NYM_ID) { + int ret = otapiPINVOKE.OT_API_GetNym_MailCount(NYM_ID); + return ret; + } + + public static string OT_API_GetNym_MailContentsByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_MailContentsByIndex(NYM_ID, nIndex); + return ret; + } + + public static string OT_API_GetNym_MailSenderIDByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_MailSenderIDByIndex(NYM_ID, nIndex); + return ret; + } + + public static string OT_API_GetNym_MailServerIDByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_MailServerIDByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_Nym_RemoveMailByIndex(string NYM_ID, int nIndex) { + int ret = otapiPINVOKE.OT_API_Nym_RemoveMailByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_Nym_VerifyMailByIndex(string NYM_ID, int nIndex) { + int ret = otapiPINVOKE.OT_API_Nym_VerifyMailByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_GetNym_OutmailCount(string NYM_ID) { + int ret = otapiPINVOKE.OT_API_GetNym_OutmailCount(NYM_ID); + return ret; + } + + public static string OT_API_GetNym_OutmailContentsByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_OutmailContentsByIndex(NYM_ID, nIndex); + return ret; + } + + public static string OT_API_GetNym_OutmailRecipientIDByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_OutmailRecipientIDByIndex(NYM_ID, nIndex); + return ret; + } + + public static string OT_API_GetNym_OutmailServerIDByIndex(string NYM_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_GetNym_OutmailServerIDByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_Nym_RemoveOutmailByIndex(string NYM_ID, int nIndex) { + int ret = otapiPINVOKE.OT_API_Nym_RemoveOutmailByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_Nym_VerifyOutmailByIndex(string NYM_ID, int nIndex) { + int ret = otapiPINVOKE.OT_API_Nym_VerifyOutmailByIndex(NYM_ID, nIndex); + return ret; + } + + public static int OT_API_Wallet_CanRemoveServer(string SERVER_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_CanRemoveServer(SERVER_ID); + return ret; + } + + public static int OT_API_Wallet_RemoveServer(string SERVER_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_RemoveServer(SERVER_ID); + return ret; + } + + public static int OT_API_Wallet_CanRemoveAssetType(string ASSET_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_CanRemoveAssetType(ASSET_ID); + return ret; + } + + public static int OT_API_Wallet_RemoveAssetType(string ASSET_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_RemoveAssetType(ASSET_ID); + return ret; + } + + public static int OT_API_Wallet_CanRemoveNym(string NYM_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_CanRemoveNym(NYM_ID); + return ret; + } + + public static int OT_API_Wallet_RemoveNym(string NYM_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_RemoveNym(NYM_ID); + return ret; + } + + public static int OT_API_Wallet_CanRemoveAccount(string ACCOUNT_ID) { + int ret = otapiPINVOKE.OT_API_Wallet_CanRemoveAccount(ACCOUNT_ID); + return ret; + } + + public static string OT_API_Wallet_ImportNym(string DISPLAY_NAME, string KEY_FILE_CONTENTS) { + string ret = otapiPINVOKE.OT_API_Wallet_ImportNym(DISPLAY_NAME, KEY_FILE_CONTENTS); + return ret; + } + + public static int OT_API_SetNym_Name(string NYM_ID, string SIGNER_NYM_ID, string NYM_NEW_NAME) { + int ret = otapiPINVOKE.OT_API_SetNym_Name(NYM_ID, SIGNER_NYM_ID, NYM_NEW_NAME); + return ret; + } + + public static int OT_API_SetAccountWallet_Name(string ACCT_ID, string SIGNER_NYM_ID, string ACCT_NEW_NAME) { + int ret = otapiPINVOKE.OT_API_SetAccountWallet_Name(ACCT_ID, SIGNER_NYM_ID, ACCT_NEW_NAME); + return ret; + } + + public static int OT_API_SetAssetType_Name(string ASSET_ID, string STR_NEW_NAME) { + int ret = otapiPINVOKE.OT_API_SetAssetType_Name(ASSET_ID, STR_NEW_NAME); + return ret; + } + + public static int OT_API_SetServer_Name(string SERVER_ID, string STR_NEW_NAME) { + int ret = otapiPINVOKE.OT_API_SetServer_Name(SERVER_ID, STR_NEW_NAME); + return ret; + } + + public static string OT_API_VerifyAndRetrieveXMLContents(string THE_CONTRACT, string USER_ID) { + string ret = otapiPINVOKE.OT_API_VerifyAndRetrieveXMLContents(THE_CONTRACT, USER_ID); + return ret; + } + + public static string OT_API_WriteCheque(string SERVER_ID, string CHEQUE_AMOUNT, string VALID_FROM, string VALID_TO, string SENDER_ACCT_ID, string SENDER_USER_ID, string CHEQUE_MEMO, string RECIPIENT_USER_ID) { + string ret = otapiPINVOKE.OT_API_WriteCheque(SERVER_ID, CHEQUE_AMOUNT, VALID_FROM, VALID_TO, SENDER_ACCT_ID, SENDER_USER_ID, CHEQUE_MEMO, RECIPIENT_USER_ID); + return ret; + } + + public static string OT_API_ProposePaymentPlan(string SERVER_ID, string VALID_FROM, string VALID_TO, string SENDER_ACCT_ID, string SENDER_USER_ID, string PLAN_CONSIDERATION, string RECIPIENT_ACCT_ID, string RECIPIENT_USER_ID, string INITIAL_PAYMENT_AMOUNT, string INITIAL_PAYMENT_DELAY, string PAYMENT_PLAN_AMOUNT, string PAYMENT_PLAN_DELAY, string PAYMENT_PLAN_PERIOD, string PAYMENT_PLAN_LENGTH, string PAYMENT_PLAN_MAX_PAYMENTS) { + string ret = otapiPINVOKE.OT_API_ProposePaymentPlan(SERVER_ID, VALID_FROM, VALID_TO, SENDER_ACCT_ID, SENDER_USER_ID, PLAN_CONSIDERATION, RECIPIENT_ACCT_ID, RECIPIENT_USER_ID, INITIAL_PAYMENT_AMOUNT, INITIAL_PAYMENT_DELAY, PAYMENT_PLAN_AMOUNT, PAYMENT_PLAN_DELAY, PAYMENT_PLAN_PERIOD, PAYMENT_PLAN_LENGTH, PAYMENT_PLAN_MAX_PAYMENTS); + return ret; + } + + public static string OT_API_ConfirmPaymentPlan(string SERVER_ID, string SENDER_USER_ID, string SENDER_ACCT_ID, string RECIPIENT_USER_ID, string PAYMENT_PLAN) { + string ret = otapiPINVOKE.OT_API_ConfirmPaymentPlan(SERVER_ID, SENDER_USER_ID, SENDER_ACCT_ID, RECIPIENT_USER_ID, PAYMENT_PLAN); + return ret; + } + + public static string OT_API_LoadUserPubkey(string USER_ID) { + string ret = otapiPINVOKE.OT_API_LoadUserPubkey(USER_ID); + return ret; + } + + public static string OT_API_LoadPubkey(string USER_ID) { + string ret = otapiPINVOKE.OT_API_LoadPubkey(USER_ID); + return ret; + } + + public static int OT_API_VerifyUserPrivateKey(string USER_ID) { + int ret = otapiPINVOKE.OT_API_VerifyUserPrivateKey(USER_ID); + return ret; + } + + public static string OT_API_LoadPurse(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID) { + string ret = otapiPINVOKE.OT_API_LoadPurse(SERVER_ID, ASSET_TYPE_ID, USER_ID); + return ret; + } + + public static string OT_API_LoadMint(string SERVER_ID, string ASSET_TYPE_ID) { + string ret = otapiPINVOKE.OT_API_LoadMint(SERVER_ID, ASSET_TYPE_ID); + return ret; + } + + public static string OT_API_LoadAssetContract(string ASSET_TYPE_ID) { + string ret = otapiPINVOKE.OT_API_LoadAssetContract(ASSET_TYPE_ID); + return ret; + } + + public static string OT_API_LoadServerContract(string SERVER_ID) { + string ret = otapiPINVOKE.OT_API_LoadServerContract(SERVER_ID); + return ret; + } + + public static int OT_API_Mint_IsStillGood(string SERVER_ID, string USER_ID, string ASSET_TYPE_ID) { + int ret = otapiPINVOKE.OT_API_Mint_IsStillGood(SERVER_ID, USER_ID, ASSET_TYPE_ID); + return ret; + } + + public static int OT_API_IsBasketCurrency(string ASSET_TYPE_ID) { + int ret = otapiPINVOKE.OT_API_IsBasketCurrency(ASSET_TYPE_ID); + return ret; + } + + public static int OT_API_Basket_GetMemberCount(string BASKET_ASSET_TYPE_ID) { + int ret = otapiPINVOKE.OT_API_Basket_GetMemberCount(BASKET_ASSET_TYPE_ID); + return ret; + } + + public static string OT_API_Basket_GetMemberType(string BASKET_ASSET_TYPE_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_Basket_GetMemberType(BASKET_ASSET_TYPE_ID, nIndex); + return ret; + } + + public static string OT_API_Basket_GetMinimumTransferAmount(string BASKET_ASSET_TYPE_ID) { + string ret = otapiPINVOKE.OT_API_Basket_GetMinimumTransferAmount(BASKET_ASSET_TYPE_ID); + return ret; + } + + public static string OT_API_Basket_GetMemberMinimumTransferAmount(string BASKET_ASSET_TYPE_ID, int nIndex) { + string ret = otapiPINVOKE.OT_API_Basket_GetMemberMinimumTransferAmount(BASKET_ASSET_TYPE_ID, nIndex); + return ret; + } + + public static string OT_API_LoadAssetAccount(string SERVER_ID, string USER_ID, string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_LoadAssetAccount(SERVER_ID, USER_ID, ACCOUNT_ID); + return ret; + } + + public static string OT_API_LoadInbox(string SERVER_ID, string USER_ID, string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_LoadInbox(SERVER_ID, USER_ID, ACCOUNT_ID); + return ret; + } + + public static string OT_API_LoadOutbox(string SERVER_ID, string USER_ID, string ACCOUNT_ID) { + string ret = otapiPINVOKE.OT_API_LoadOutbox(SERVER_ID, USER_ID, ACCOUNT_ID); + return ret; + } + + public static int OT_API_Ledger_GetCount(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER) { + int ret = otapiPINVOKE.OT_API_Ledger_GetCount(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER); + return ret; + } + + public static string OT_API_Ledger_CreateResponse(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string ORIGINAL_LEDGER) { + string ret = otapiPINVOKE.OT_API_Ledger_CreateResponse(SERVER_ID, USER_ID, ACCOUNT_ID, ORIGINAL_LEDGER); + return ret; + } + + public static string OT_API_Ledger_GetTransactionByIndex(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER, int nIndex) { + string ret = otapiPINVOKE.OT_API_Ledger_GetTransactionByIndex(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, nIndex); + return ret; + } + + public static string OT_API_Ledger_GetTransactionByID(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER, string TRANSACTION_NUMBER) { + string ret = otapiPINVOKE.OT_API_Ledger_GetTransactionByID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, TRANSACTION_NUMBER); + return ret; + } + + public static string OT_API_Ledger_GetTransactionIDByIndex(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER, int nIndex) { + string ret = otapiPINVOKE.OT_API_Ledger_GetTransactionIDByIndex(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, nIndex); + return ret; + } + + public static string OT_API_Ledger_AddTransaction(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Ledger_AddTransaction(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_CreateResponse(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string RESPONSE_LEDGER, string ORIGINAL_TRANSACTION, int BOOL_DO_I_ACCEPT) { + string ret = otapiPINVOKE.OT_API_Transaction_CreateResponse(SERVER_ID, USER_ID, ACCOUNT_ID, RESPONSE_LEDGER, ORIGINAL_TRANSACTION, BOOL_DO_I_ACCEPT); + return ret; + } + + public static string OT_API_Ledger_FinalizeResponse(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_LEDGER) { + string ret = otapiPINVOKE.OT_API_Ledger_FinalizeResponse(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER); + return ret; + } + + public static string OT_API_Transaction_GetType(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetType(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetVoucher(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetVoucher(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static int OT_API_Transaction_GetSuccess(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + int ret = otapiPINVOKE.OT_API_Transaction_GetSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static int OT_API_Transaction_GetBalanceAgreementSuccess(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + int ret = otapiPINVOKE.OT_API_Transaction_GetBalanceAgreementSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetDateSigned(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetDateSigned(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetAmount(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetAmount(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Pending_GetNote(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Pending_GetNote(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetSenderUserID(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetSenderUserID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetSenderAcctID(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetSenderAcctID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetRecipientUserID(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetRecipientUserID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetRecipientAcctID(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetRecipientAcctID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_Transaction_GetDisplayReferenceToNum(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_TRANSACTION) { + string ret = otapiPINVOKE.OT_API_Transaction_GetDisplayReferenceToNum(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + return ret; + } + + public static string OT_API_CreatePurse(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID) { + string ret = otapiPINVOKE.OT_API_CreatePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID); + return ret; + } + + public static int OT_API_SavePurse(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE) { + int ret = otapiPINVOKE.OT_API_SavePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + return ret; + } + + public static string OT_API_Purse_GetTotalValue(string SERVER_ID, string ASSET_TYPE_ID, string THE_PURSE) { + string ret = otapiPINVOKE.OT_API_Purse_GetTotalValue(SERVER_ID, ASSET_TYPE_ID, THE_PURSE); + return ret; + } + + public static int OT_API_Purse_Count(string SERVER_ID, string ASSET_TYPE_ID, string THE_PURSE) { + int ret = otapiPINVOKE.OT_API_Purse_Count(SERVER_ID, ASSET_TYPE_ID, THE_PURSE); + return ret; + } + + public static string OT_API_Purse_Peek(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE) { + string ret = otapiPINVOKE.OT_API_Purse_Peek(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + return ret; + } + + public static string OT_API_Purse_Pop(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE) { + string ret = otapiPINVOKE.OT_API_Purse_Pop(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + return ret; + } + + public static string OT_API_Purse_Push(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE, string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Purse_Push(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE, THE_TOKEN); + return ret; + } + + public static int OT_API_Wallet_ImportPurse(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE) { + int ret = otapiPINVOKE.OT_API_Wallet_ImportPurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + return ret; + } + + public static void OT_API_exchangePurse(string SERVER_ID, string ASSET_TYPE_ID, string USER_ID, string THE_PURSE) { + otapiPINVOKE.OT_API_exchangePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static string OT_API_Token_ChangeOwner(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN, string OLD_OWNER_NYM_ID, string NEW_OWNER_NYM_ID) { + string ret = otapiPINVOKE.OT_API_Token_ChangeOwner(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN, OLD_OWNER_NYM_ID, NEW_OWNER_NYM_ID); + return ret; + } + + public static string OT_API_Token_GetID(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetID(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + return ret; + } + + public static string OT_API_Token_GetDenomination(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetDenomination(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + return ret; + } + + public static int OT_API_Token_GetSeries(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN) { + int ret = otapiPINVOKE.OT_API_Token_GetSeries(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + return ret; + } + + public static string OT_API_Token_GetValidFrom(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetValidFrom(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + return ret; + } + + public static string OT_API_Token_GetValidTo(string SERVER_ID, string ASSET_TYPE_ID, string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetValidTo(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + return ret; + } + + public static string OT_API_Token_GetAssetID(string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetAssetID(THE_TOKEN); + return ret; + } + + public static string OT_API_Token_GetServerID(string THE_TOKEN) { + string ret = otapiPINVOKE.OT_API_Token_GetServerID(THE_TOKEN); + return ret; + } + + public static void OT_API_checkServerID(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_checkServerID(SERVER_ID, USER_ID); + } + + public static void OT_API_createUserAccount(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_createUserAccount(SERVER_ID, USER_ID); + } + + public static void OT_API_deleteUserAccount(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_deleteUserAccount(SERVER_ID, USER_ID); + } + + public static void OT_API_deleteAssetAccount(string SERVER_ID, string USER_ID, string ACCOUNT_ID) { + otapiPINVOKE.OT_API_deleteAssetAccount(SERVER_ID, USER_ID, ACCOUNT_ID); + } + + public static void OT_API_checkUser(string SERVER_ID, string USER_ID, string USER_ID_CHECK) { + otapiPINVOKE.OT_API_checkUser(SERVER_ID, USER_ID, USER_ID_CHECK); + } + + public static void OT_API_sendUserMessage(string SERVER_ID, string USER_ID, string USER_ID_RECIPIENT, string RECIPIENT_PUBKEY, string THE_MESSAGE) { + otapiPINVOKE.OT_API_sendUserMessage(SERVER_ID, USER_ID, USER_ID_RECIPIENT, RECIPIENT_PUBKEY, THE_MESSAGE); + } + + public static void OT_API_getRequest(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_getRequest(SERVER_ID, USER_ID); + } + + public static void OT_API_getTransactionNumber(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_getTransactionNumber(SERVER_ID, USER_ID); + } + + public static void OT_API_issueAssetType(string SERVER_ID, string USER_ID, string THE_CONTRACT) { + otapiPINVOKE.OT_API_issueAssetType(SERVER_ID, USER_ID, THE_CONTRACT); + } + + public static void OT_API_getContract(string SERVER_ID, string USER_ID, string ASSET_ID) { + otapiPINVOKE.OT_API_getContract(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_getMint(string SERVER_ID, string USER_ID, string ASSET_ID) { + otapiPINVOKE.OT_API_getMint(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_createAssetAccount(string SERVER_ID, string USER_ID, string ASSET_ID) { + otapiPINVOKE.OT_API_createAssetAccount(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_getAccount(string SERVER_ID, string USER_ID, string ACCT_ID) { + otapiPINVOKE.OT_API_getAccount(SERVER_ID, USER_ID, ACCT_ID); + } + + public static string OT_API_GenerateBasketCreation(string USER_ID, string MINIMUM_TRANSFER) { + string ret = otapiPINVOKE.OT_API_GenerateBasketCreation(USER_ID, MINIMUM_TRANSFER); + return ret; + } + + public static string OT_API_AddBasketCreationItem(string USER_ID, string THE_BASKET, string ASSET_TYPE_ID, string MINIMUM_TRANSFER) { + string ret = otapiPINVOKE.OT_API_AddBasketCreationItem(USER_ID, THE_BASKET, ASSET_TYPE_ID, MINIMUM_TRANSFER); + return ret; + } + + public static void OT_API_issueBasket(string SERVER_ID, string USER_ID, string THE_BASKET) { + otapiPINVOKE.OT_API_issueBasket(SERVER_ID, USER_ID, THE_BASKET); + } + + public static string OT_API_GenerateBasketExchange(string SERVER_ID, string USER_ID, string BASKET_ASSET_TYPE_ID, string BASKET_ASSET_ACCT_ID, int TRANSFER_MULTIPLE) { + string ret = otapiPINVOKE.OT_API_GenerateBasketExchange(SERVER_ID, USER_ID, BASKET_ASSET_TYPE_ID, BASKET_ASSET_ACCT_ID, TRANSFER_MULTIPLE); + return ret; + } + + public static string OT_API_AddBasketExchangeItem(string SERVER_ID, string USER_ID, string THE_BASKET, string ASSET_TYPE_ID, string ASSET_ACCT_ID) { + string ret = otapiPINVOKE.OT_API_AddBasketExchangeItem(SERVER_ID, USER_ID, THE_BASKET, ASSET_TYPE_ID, ASSET_ACCT_ID); + return ret; + } + + public static void OT_API_exchangeBasket(string SERVER_ID, string USER_ID, string BASKET_ASSET_ID, string THE_BASKET, int BOOL_EXCHANGE_IN_OR_OUT) { + otapiPINVOKE.OT_API_exchangeBasket(SERVER_ID, USER_ID, BASKET_ASSET_ID, THE_BASKET, BOOL_EXCHANGE_IN_OR_OUT); + } + + public static void OT_API_notarizeWithdrawal(string SERVER_ID, string USER_ID, string ACCT_ID, string AMOUNT) { + otapiPINVOKE.OT_API_notarizeWithdrawal(SERVER_ID, USER_ID, ACCT_ID, AMOUNT); + } + + public static void OT_API_notarizeDeposit(string SERVER_ID, string USER_ID, string ACCT_ID, string THE_PURSE) { + otapiPINVOKE.OT_API_notarizeDeposit(SERVER_ID, USER_ID, ACCT_ID, THE_PURSE); + } + + public static void OT_API_notarizeTransfer(string SERVER_ID, string USER_ID, string ACCT_FROM, string ACCT_TO, string AMOUNT, string NOTE) { + otapiPINVOKE.OT_API_notarizeTransfer(SERVER_ID, USER_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE); + } + + public static void OT_API_getInbox(string SERVER_ID, string USER_ID, string ACCT_ID) { + otapiPINVOKE.OT_API_getInbox(SERVER_ID, USER_ID, ACCT_ID); + } + + public static void OT_API_getOutbox(string SERVER_ID, string USER_ID, string ACCT_ID) { + otapiPINVOKE.OT_API_getOutbox(SERVER_ID, USER_ID, ACCT_ID); + } + + public static void OT_API_getNymbox(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_getNymbox(SERVER_ID, USER_ID); + } + + public static string OT_API_LoadNymbox(string SERVER_ID, string USER_ID) { + string ret = otapiPINVOKE.OT_API_LoadNymbox(SERVER_ID, USER_ID); + return ret; + } + + public static void OT_API_processInbox(string SERVER_ID, string USER_ID, string ACCT_ID, string ACCT_LEDGER) { + otapiPINVOKE.OT_API_processInbox(SERVER_ID, USER_ID, ACCT_ID, ACCT_LEDGER); + } + + public static void OT_API_processNymbox(string SERVER_ID, string USER_ID, string ACCT_LEDGER) { + otapiPINVOKE.OT_API_processNymbox(SERVER_ID, USER_ID, ACCT_LEDGER); + } + + public static void OT_API_withdrawVoucher(string SERVER_ID, string USER_ID, string ACCT_ID, string RECIPIENT_USER_ID, string CHEQUE_MEMO, string AMOUNT) { + otapiPINVOKE.OT_API_withdrawVoucher(SERVER_ID, USER_ID, ACCT_ID, RECIPIENT_USER_ID, CHEQUE_MEMO, AMOUNT); + } + + public static void OT_API_depositCheque(string SERVER_ID, string USER_ID, string ACCT_ID, string THE_CHEQUE) { + otapiPINVOKE.OT_API_depositCheque(SERVER_ID, USER_ID, ACCT_ID, THE_CHEQUE); + } + + public static void OT_API_depositPaymentPlan(string SERVER_ID, string USER_ID, string THE_PAYMENT_PLAN) { + otapiPINVOKE.OT_API_depositPaymentPlan(SERVER_ID, USER_ID, THE_PAYMENT_PLAN); + } + + public static void OT_API_issueMarketOffer(string SERVER_ID, string USER_ID, string ASSET_TYPE_ID, string ASSET_ACCT_ID, string CURRENCY_TYPE_ID, string CURRENCY_ACCT_ID, string MARKET_SCALE, string MINIMUM_INCREMENT, string TOTAL_ASSETS_ON_OFFER, string PRICE_LIMIT, int bBuyingOrSelling) { + otapiPINVOKE.OT_API_issueMarketOffer(SERVER_ID, USER_ID, ASSET_TYPE_ID, ASSET_ACCT_ID, CURRENCY_TYPE_ID, CURRENCY_ACCT_ID, MARKET_SCALE, MINIMUM_INCREMENT, TOTAL_ASSETS_ON_OFFER, PRICE_LIMIT, bBuyingOrSelling); + } + + public static void OT_API_getMarketList(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_getMarketList(SERVER_ID, USER_ID); + } + + public static void OT_API_getMarketOffers(string SERVER_ID, string USER_ID, string MARKET_ID, string MAX_DEPTH) { + otapiPINVOKE.OT_API_getMarketOffers(SERVER_ID, USER_ID, MARKET_ID, MAX_DEPTH); + } + + public static void OT_API_getMarketRecentTrades(string SERVER_ID, string USER_ID, string MARKET_ID) { + otapiPINVOKE.OT_API_getMarketRecentTrades(SERVER_ID, USER_ID, MARKET_ID); + } + + public static void OT_API_getNym_MarketOffers(string SERVER_ID, string USER_ID) { + otapiPINVOKE.OT_API_getNym_MarketOffers(SERVER_ID, USER_ID); + } + + public static void OT_API_cancelMarketOffer(string SERVER_ID, string USER_ID, string ASSET_ACCT_ID, string TRANSACTION_NUMBER) { + otapiPINVOKE.OT_API_cancelMarketOffer(SERVER_ID, USER_ID, ASSET_ACCT_ID, TRANSACTION_NUMBER); + } + + public static void OT_API_cancelPaymentPlan(string SERVER_ID, string USER_ID, string FROM_ACCT_ID, string TRANSACTION_NUMBER) { + otapiPINVOKE.OT_API_cancelPaymentPlan(SERVER_ID, USER_ID, FROM_ACCT_ID, TRANSACTION_NUMBER); + } + + public static string OT_API_PopMessageBuffer() { + string ret = otapiPINVOKE.OT_API_PopMessageBuffer(); + return ret; + } + + public static void OT_API_FlushMessageBuffer() { + otapiPINVOKE.OT_API_FlushMessageBuffer(); + } + + public static string OT_API_Message_GetCommand(string THE_MESSAGE) { + string ret = otapiPINVOKE.OT_API_Message_GetCommand(THE_MESSAGE); + return ret; + } + + public static int OT_API_Message_GetSuccess(string THE_MESSAGE) { + int ret = otapiPINVOKE.OT_API_Message_GetSuccess(THE_MESSAGE); + return ret; + } + + public static int OT_API_Message_GetDepth(string THE_MESSAGE) { + int ret = otapiPINVOKE.OT_API_Message_GetDepth(THE_MESSAGE); + return ret; + } + + public static int OT_API_Message_GetTransactionSuccess(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_MESSAGE) { + int ret = otapiPINVOKE.OT_API_Message_GetTransactionSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_MESSAGE); + return ret; + } + + public static int OT_API_Message_GetBalanceAgreementSuccess(string SERVER_ID, string USER_ID, string ACCOUNT_ID, string THE_MESSAGE) { + int ret = otapiPINVOKE.OT_API_Message_GetBalanceAgreementSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_MESSAGE); + return ret; + } + + public static string OT_API_Message_GetLedger(string THE_MESSAGE) { + string ret = otapiPINVOKE.OT_API_Message_GetLedger(THE_MESSAGE); + return ret; + } + + public static string OT_API_Message_GetNewAssetTypeID(string THE_MESSAGE) { + string ret = otapiPINVOKE.OT_API_Message_GetNewAssetTypeID(THE_MESSAGE); + return ret; + } + + public static string OT_API_Message_GetNewIssuerAcctID(string THE_MESSAGE) { + string ret = otapiPINVOKE.OT_API_Message_GetNewIssuerAcctID(THE_MESSAGE); + return ret; + } + + public static string OT_API_Message_GetNewAcctID(string THE_MESSAGE) { + string ret = otapiPINVOKE.OT_API_Message_GetNewAcctID(THE_MESSAGE); + return ret; + } + + public static int OT_API_ConnectServer(string SERVER_ID, string USER_ID, string szCA_FILE, string szKEY_FILE, string szKEY_PASSWORD) { + int ret = otapiPINVOKE.OT_API_ConnectServer(SERVER_ID, USER_ID, szCA_FILE, szKEY_FILE, szKEY_PASSWORD); + return ret; + } + + public static int OT_API_ProcessSockets() { + int ret = otapiPINVOKE.OT_API_ProcessSockets(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr, string twoStr, string threeStr, string fourStr, string fiveStr, string sixStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_0((int)eStoreType, (int)ePackType, oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr, string twoStr, string threeStr, string fourStr, string fiveStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_1((int)eStoreType, (int)ePackType, oneStr, twoStr, threeStr, fourStr, fiveStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr, string twoStr, string threeStr, string fourStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_2((int)eStoreType, (int)ePackType, oneStr, twoStr, threeStr, fourStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_3((int)eStoreType, (int)ePackType, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_4((int)eStoreType, (int)ePackType, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType, string oneStr) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_5((int)eStoreType, (int)ePackType, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool InitDefaultStorage(StorageType eStoreType, PackType ePackType) { + bool ret = otapiPINVOKE.InitDefaultStorage__SWIG_6((int)eStoreType, (int)ePackType); + return ret; + } + + public static Storage GetDefaultStorage() { + IntPtr cPtr = otapiPINVOKE.GetDefaultStorage(); + Storage ret = (cPtr == IntPtr.Zero) ? null : new Storage(cPtr, false); + return ret; + } + + public static Storage CreateStorageContext(StorageType eStoreType, PackType ePackType) { + IntPtr cPtr = otapiPINVOKE.CreateStorageContext__SWIG_0((int)eStoreType, (int)ePackType); + Storage ret = (cPtr == IntPtr.Zero) ? null : new Storage(cPtr, true); + return ret; + } + + public static Storage CreateStorageContext(StorageType eStoreType) { + IntPtr cPtr = otapiPINVOKE.CreateStorageContext__SWIG_1((int)eStoreType); + Storage ret = (cPtr == IntPtr.Zero) ? null : new Storage(cPtr, true); + return ret; + } + + public static Storable CreateObject(StoredObjectType eType) { + IntPtr cPtr = otapiPINVOKE.CreateObject((int)eType); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + return ret; + } + + public static bool Exists(string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.Exists__SWIG_0(strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool Exists(string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.Exists__SWIG_1(strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool Exists(string strFolder, string oneStr) { + bool ret = otapiPINVOKE.Exists__SWIG_2(strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool Exists(string strFolder) { + bool ret = otapiPINVOKE.Exists__SWIG_3(strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreString(string strContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.StoreString__SWIG_0(strContents, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreString(string strContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.StoreString__SWIG_1(strContents, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreString(string strContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.StoreString__SWIG_2(strContents, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreString(string strContents, string strFolder) { + bool ret = otapiPINVOKE.StoreString__SWIG_3(strContents, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryString(string strFolder, string oneStr, string twoStr, string threeStr) { + string ret = otapiPINVOKE.QueryString__SWIG_0(strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryString(string strFolder, string oneStr, string twoStr) { + string ret = otapiPINVOKE.QueryString__SWIG_1(strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryString(string strFolder, string oneStr) { + string ret = otapiPINVOKE.QueryString__SWIG_2(strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryString(string strFolder) { + string ret = otapiPINVOKE.QueryString__SWIG_3(strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StorePlainString(string strContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.StorePlainString__SWIG_0(strContents, strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StorePlainString(string strContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.StorePlainString__SWIG_1(strContents, strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StorePlainString(string strContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.StorePlainString__SWIG_2(strContents, strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StorePlainString(string strContents, string strFolder) { + bool ret = otapiPINVOKE.StorePlainString__SWIG_3(strContents, strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryPlainString(string strFolder, string oneStr, string twoStr, string threeStr) { + string ret = otapiPINVOKE.QueryPlainString__SWIG_0(strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryPlainString(string strFolder, string oneStr, string twoStr) { + string ret = otapiPINVOKE.QueryPlainString__SWIG_1(strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryPlainString(string strFolder, string oneStr) { + string ret = otapiPINVOKE.QueryPlainString__SWIG_2(strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static string QueryPlainString(string strFolder) { + string ret = otapiPINVOKE.QueryPlainString__SWIG_3(strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreObject(Storable theContents, string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.StoreObject__SWIG_0(Storable.getCPtr(theContents), strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreObject(Storable theContents, string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.StoreObject__SWIG_1(Storable.getCPtr(theContents), strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreObject(Storable theContents, string strFolder, string oneStr) { + bool ret = otapiPINVOKE.StoreObject__SWIG_2(Storable.getCPtr(theContents), strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool StoreObject(Storable theContents, string strFolder) { + bool ret = otapiPINVOKE.StoreObject__SWIG_3(Storable.getCPtr(theContents), strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr, string twoStr, string threeStr) { + IntPtr cPtr = otapiPINVOKE.QueryObject__SWIG_0((int)theObjectType, strFolder, oneStr, twoStr, threeStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr, string twoStr) { + IntPtr cPtr = otapiPINVOKE.QueryObject__SWIG_1((int)theObjectType, strFolder, oneStr, twoStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static Storable QueryObject(StoredObjectType theObjectType, string strFolder, string oneStr) { + IntPtr cPtr = otapiPINVOKE.QueryObject__SWIG_2((int)theObjectType, strFolder, oneStr); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static Storable QueryObject(StoredObjectType theObjectType, string strFolder) { + IntPtr cPtr = otapiPINVOKE.QueryObject__SWIG_3((int)theObjectType, strFolder); + Storable ret = (cPtr == IntPtr.Zero) ? null : new Storable(cPtr, true); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool EraseValueByKey(string strFolder, string oneStr, string twoStr, string threeStr) { + bool ret = otapiPINVOKE.EraseValueByKey__SWIG_0(strFolder, oneStr, twoStr, threeStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool EraseValueByKey(string strFolder, string oneStr, string twoStr) { + bool ret = otapiPINVOKE.EraseValueByKey__SWIG_1(strFolder, oneStr, twoStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool EraseValueByKey(string strFolder, string oneStr) { + bool ret = otapiPINVOKE.EraseValueByKey__SWIG_2(strFolder, oneStr); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + + public static bool EraseValueByKey(string strFolder) { + bool ret = otapiPINVOKE.EraseValueByKey__SWIG_3(strFolder); + if (otapiPINVOKE.SWIGPendingException.Pending) throw otapiPINVOKE.SWIGPendingException.Retrieve(); + return ret; + } + +} diff --git a/testwallet/otapi.java b/testwallet/otapi.java new file mode 100644 index 000000000..6108ebeda --- /dev/null +++ b/testwallet/otapi.java @@ -0,0 +1,856 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class otapi { + public static boolean OT_API_Set_PasswordCallback(OTCaller theCaller) { + return otapiJNI.OT_API_Set_PasswordCallback(OTCaller.getCPtr(theCaller), theCaller); + } + + public static int OT_API_Init(String szClientPath) { + return otapiJNI.OT_API_Init(szClientPath); + } + + public static int OT_API_LoadWallet(String szWalletFilename) { + return otapiJNI.OT_API_LoadWallet(szWalletFilename); + } + + public static int OT_API_SwitchWallet(String szDataFolderPath, String szWalletFilename) { + return otapiJNI.OT_API_SwitchWallet(szDataFolderPath, szWalletFilename); + } + + public static int OT_API_GetMemlogSize() { + return otapiJNI.OT_API_GetMemlogSize(); + } + + public static String OT_API_GetMemlogAtIndex(int nIndex) { + return otapiJNI.OT_API_GetMemlogAtIndex(nIndex); + } + + public static String OT_API_PeekMemlogFront() { + return otapiJNI.OT_API_PeekMemlogFront(); + } + + public static String OT_API_PeekMemlogBack() { + return otapiJNI.OT_API_PeekMemlogBack(); + } + + public static int OT_API_PopMemlogFront() { + return otapiJNI.OT_API_PopMemlogFront(); + } + + public static int OT_API_PopMemlogBack() { + return otapiJNI.OT_API_PopMemlogBack(); + } + + public static String OT_API_CreateNym() { + return otapiJNI.OT_API_CreateNym(); + } + + public static int OT_API_AddServerContract(String szContract) { + return otapiJNI.OT_API_AddServerContract(szContract); + } + + public static int OT_API_AddAssetContract(String szContract) { + return otapiJNI.OT_API_AddAssetContract(szContract); + } + + public static int OT_API_GetServerCount() { + return otapiJNI.OT_API_GetServerCount(); + } + + public static int OT_API_GetAssetTypeCount() { + return otapiJNI.OT_API_GetAssetTypeCount(); + } + + public static int OT_API_GetAccountCount() { + return otapiJNI.OT_API_GetAccountCount(); + } + + public static int OT_API_GetNymCount() { + return otapiJNI.OT_API_GetNymCount(); + } + + public static String OT_API_GetServer_ID(int nIndex) { + return otapiJNI.OT_API_GetServer_ID(nIndex); + } + + public static String OT_API_GetServer_Name(String SERVER_ID) { + return otapiJNI.OT_API_GetServer_Name(SERVER_ID); + } + + public static String OT_API_GetAssetType_ID(int nIndex) { + return otapiJNI.OT_API_GetAssetType_ID(nIndex); + } + + public static String OT_API_GetAssetType_Name(String ASSET_TYPE_ID) { + return otapiJNI.OT_API_GetAssetType_Name(ASSET_TYPE_ID); + } + + public static String OT_API_GetAccountWallet_ID(int nIndex) { + return otapiJNI.OT_API_GetAccountWallet_ID(nIndex); + } + + public static String OT_API_GetAccountWallet_Name(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_Name(ACCOUNT_ID); + } + + public static String OT_API_GetAccountWallet_Balance(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_Balance(ACCOUNT_ID); + } + + public static String OT_API_GetAccountWallet_Type(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_Type(ACCOUNT_ID); + } + + public static String OT_API_GetAccountWallet_AssetTypeID(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_AssetTypeID(ACCOUNT_ID); + } + + public static String OT_API_GetAccountWallet_ServerID(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_ServerID(ACCOUNT_ID); + } + + public static String OT_API_GetAccountWallet_NymID(String ACCOUNT_ID) { + return otapiJNI.OT_API_GetAccountWallet_NymID(ACCOUNT_ID); + } + + public static int OT_API_VerifyAccountReceipt(String SERVER_ID, String NYM_ID, String ACCT_ID) { + return otapiJNI.OT_API_VerifyAccountReceipt(SERVER_ID, NYM_ID, ACCT_ID); + } + + public static int OT_API_GetNym_TransactionNumCount(String SERVER_ID, String NYM_ID) { + return otapiJNI.OT_API_GetNym_TransactionNumCount(SERVER_ID, NYM_ID); + } + + public static String OT_API_GetNym_ID(int nIndex) { + return otapiJNI.OT_API_GetNym_ID(nIndex); + } + + public static String OT_API_GetNym_Name(String NYM_ID) { + return otapiJNI.OT_API_GetNym_Name(NYM_ID); + } + + public static String OT_API_GetNym_Stats(String NYM_ID) { + return otapiJNI.OT_API_GetNym_Stats(NYM_ID); + } + + public static int OT_API_IsNym_RegisteredAtServer(String NYM_ID, String SERVER_ID) { + return otapiJNI.OT_API_IsNym_RegisteredAtServer(NYM_ID, SERVER_ID); + } + + public static int OT_API_GetNym_MailCount(String NYM_ID) { + return otapiJNI.OT_API_GetNym_MailCount(NYM_ID); + } + + public static String OT_API_GetNym_MailContentsByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_MailContentsByIndex(NYM_ID, nIndex); + } + + public static String OT_API_GetNym_MailSenderIDByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_MailSenderIDByIndex(NYM_ID, nIndex); + } + + public static String OT_API_GetNym_MailServerIDByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_MailServerIDByIndex(NYM_ID, nIndex); + } + + public static int OT_API_Nym_RemoveMailByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_Nym_RemoveMailByIndex(NYM_ID, nIndex); + } + + public static int OT_API_Nym_VerifyMailByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_Nym_VerifyMailByIndex(NYM_ID, nIndex); + } + + public static int OT_API_GetNym_OutmailCount(String NYM_ID) { + return otapiJNI.OT_API_GetNym_OutmailCount(NYM_ID); + } + + public static String OT_API_GetNym_OutmailContentsByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_OutmailContentsByIndex(NYM_ID, nIndex); + } + + public static String OT_API_GetNym_OutmailRecipientIDByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_OutmailRecipientIDByIndex(NYM_ID, nIndex); + } + + public static String OT_API_GetNym_OutmailServerIDByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_GetNym_OutmailServerIDByIndex(NYM_ID, nIndex); + } + + public static int OT_API_Nym_RemoveOutmailByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_Nym_RemoveOutmailByIndex(NYM_ID, nIndex); + } + + public static int OT_API_Nym_VerifyOutmailByIndex(String NYM_ID, int nIndex) { + return otapiJNI.OT_API_Nym_VerifyOutmailByIndex(NYM_ID, nIndex); + } + + public static int OT_API_Wallet_CanRemoveServer(String SERVER_ID) { + return otapiJNI.OT_API_Wallet_CanRemoveServer(SERVER_ID); + } + + public static int OT_API_Wallet_RemoveServer(String SERVER_ID) { + return otapiJNI.OT_API_Wallet_RemoveServer(SERVER_ID); + } + + public static int OT_API_Wallet_CanRemoveAssetType(String ASSET_ID) { + return otapiJNI.OT_API_Wallet_CanRemoveAssetType(ASSET_ID); + } + + public static int OT_API_Wallet_RemoveAssetType(String ASSET_ID) { + return otapiJNI.OT_API_Wallet_RemoveAssetType(ASSET_ID); + } + + public static int OT_API_Wallet_CanRemoveNym(String NYM_ID) { + return otapiJNI.OT_API_Wallet_CanRemoveNym(NYM_ID); + } + + public static int OT_API_Wallet_RemoveNym(String NYM_ID) { + return otapiJNI.OT_API_Wallet_RemoveNym(NYM_ID); + } + + public static int OT_API_Wallet_CanRemoveAccount(String ACCOUNT_ID) { + return otapiJNI.OT_API_Wallet_CanRemoveAccount(ACCOUNT_ID); + } + + public static String OT_API_Wallet_ImportNym(String DISPLAY_NAME, String KEY_FILE_CONTENTS) { + return otapiJNI.OT_API_Wallet_ImportNym(DISPLAY_NAME, KEY_FILE_CONTENTS); + } + + public static int OT_API_SetNym_Name(String NYM_ID, String SIGNER_NYM_ID, String NYM_NEW_NAME) { + return otapiJNI.OT_API_SetNym_Name(NYM_ID, SIGNER_NYM_ID, NYM_NEW_NAME); + } + + public static int OT_API_SetAccountWallet_Name(String ACCT_ID, String SIGNER_NYM_ID, String ACCT_NEW_NAME) { + return otapiJNI.OT_API_SetAccountWallet_Name(ACCT_ID, SIGNER_NYM_ID, ACCT_NEW_NAME); + } + + public static int OT_API_SetAssetType_Name(String ASSET_ID, String STR_NEW_NAME) { + return otapiJNI.OT_API_SetAssetType_Name(ASSET_ID, STR_NEW_NAME); + } + + public static int OT_API_SetServer_Name(String SERVER_ID, String STR_NEW_NAME) { + return otapiJNI.OT_API_SetServer_Name(SERVER_ID, STR_NEW_NAME); + } + + public static String OT_API_VerifyAndRetrieveXMLContents(String THE_CONTRACT, String USER_ID) { + return otapiJNI.OT_API_VerifyAndRetrieveXMLContents(THE_CONTRACT, USER_ID); + } + + public static String OT_API_WriteCheque(String SERVER_ID, String CHEQUE_AMOUNT, String VALID_FROM, String VALID_TO, String SENDER_ACCT_ID, String SENDER_USER_ID, String CHEQUE_MEMO, String RECIPIENT_USER_ID) { + return otapiJNI.OT_API_WriteCheque(SERVER_ID, CHEQUE_AMOUNT, VALID_FROM, VALID_TO, SENDER_ACCT_ID, SENDER_USER_ID, CHEQUE_MEMO, RECIPIENT_USER_ID); + } + + public static String OT_API_ProposePaymentPlan(String SERVER_ID, String VALID_FROM, String VALID_TO, String SENDER_ACCT_ID, String SENDER_USER_ID, String PLAN_CONSIDERATION, String RECIPIENT_ACCT_ID, String RECIPIENT_USER_ID, String INITIAL_PAYMENT_AMOUNT, String INITIAL_PAYMENT_DELAY, String PAYMENT_PLAN_AMOUNT, String PAYMENT_PLAN_DELAY, String PAYMENT_PLAN_PERIOD, String PAYMENT_PLAN_LENGTH, String PAYMENT_PLAN_MAX_PAYMENTS) { + return otapiJNI.OT_API_ProposePaymentPlan(SERVER_ID, VALID_FROM, VALID_TO, SENDER_ACCT_ID, SENDER_USER_ID, PLAN_CONSIDERATION, RECIPIENT_ACCT_ID, RECIPIENT_USER_ID, INITIAL_PAYMENT_AMOUNT, INITIAL_PAYMENT_DELAY, PAYMENT_PLAN_AMOUNT, PAYMENT_PLAN_DELAY, PAYMENT_PLAN_PERIOD, PAYMENT_PLAN_LENGTH, PAYMENT_PLAN_MAX_PAYMENTS); + } + + public static String OT_API_ConfirmPaymentPlan(String SERVER_ID, String SENDER_USER_ID, String SENDER_ACCT_ID, String RECIPIENT_USER_ID, String PAYMENT_PLAN) { + return otapiJNI.OT_API_ConfirmPaymentPlan(SERVER_ID, SENDER_USER_ID, SENDER_ACCT_ID, RECIPIENT_USER_ID, PAYMENT_PLAN); + } + + public static String OT_API_LoadUserPubkey(String USER_ID) { + return otapiJNI.OT_API_LoadUserPubkey(USER_ID); + } + + public static String OT_API_LoadPubkey(String USER_ID) { + return otapiJNI.OT_API_LoadPubkey(USER_ID); + } + + public static int OT_API_VerifyUserPrivateKey(String USER_ID) { + return otapiJNI.OT_API_VerifyUserPrivateKey(USER_ID); + } + + public static String OT_API_LoadPurse(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID) { + return otapiJNI.OT_API_LoadPurse(SERVER_ID, ASSET_TYPE_ID, USER_ID); + } + + public static String OT_API_LoadMint(String SERVER_ID, String ASSET_TYPE_ID) { + return otapiJNI.OT_API_LoadMint(SERVER_ID, ASSET_TYPE_ID); + } + + public static String OT_API_LoadAssetContract(String ASSET_TYPE_ID) { + return otapiJNI.OT_API_LoadAssetContract(ASSET_TYPE_ID); + } + + public static String OT_API_LoadServerContract(String SERVER_ID) { + return otapiJNI.OT_API_LoadServerContract(SERVER_ID); + } + + public static int OT_API_Mint_IsStillGood(String SERVER_ID, String USER_ID, String ASSET_TYPE_ID) { + return otapiJNI.OT_API_Mint_IsStillGood(SERVER_ID, USER_ID, ASSET_TYPE_ID); + } + + public static int OT_API_IsBasketCurrency(String ASSET_TYPE_ID) { + return otapiJNI.OT_API_IsBasketCurrency(ASSET_TYPE_ID); + } + + public static int OT_API_Basket_GetMemberCount(String BASKET_ASSET_TYPE_ID) { + return otapiJNI.OT_API_Basket_GetMemberCount(BASKET_ASSET_TYPE_ID); + } + + public static String OT_API_Basket_GetMemberType(String BASKET_ASSET_TYPE_ID, int nIndex) { + return otapiJNI.OT_API_Basket_GetMemberType(BASKET_ASSET_TYPE_ID, nIndex); + } + + public static String OT_API_Basket_GetMinimumTransferAmount(String BASKET_ASSET_TYPE_ID) { + return otapiJNI.OT_API_Basket_GetMinimumTransferAmount(BASKET_ASSET_TYPE_ID); + } + + public static String OT_API_Basket_GetMemberMinimumTransferAmount(String BASKET_ASSET_TYPE_ID, int nIndex) { + return otapiJNI.OT_API_Basket_GetMemberMinimumTransferAmount(BASKET_ASSET_TYPE_ID, nIndex); + } + + public static String OT_API_LoadAssetAccount(String SERVER_ID, String USER_ID, String ACCOUNT_ID) { + return otapiJNI.OT_API_LoadAssetAccount(SERVER_ID, USER_ID, ACCOUNT_ID); + } + + public static String OT_API_LoadInbox(String SERVER_ID, String USER_ID, String ACCOUNT_ID) { + return otapiJNI.OT_API_LoadInbox(SERVER_ID, USER_ID, ACCOUNT_ID); + } + + public static String OT_API_LoadOutbox(String SERVER_ID, String USER_ID, String ACCOUNT_ID) { + return otapiJNI.OT_API_LoadOutbox(SERVER_ID, USER_ID, ACCOUNT_ID); + } + + public static int OT_API_Ledger_GetCount(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER) { + return otapiJNI.OT_API_Ledger_GetCount(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER); + } + + public static String OT_API_Ledger_CreateResponse(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String ORIGINAL_LEDGER) { + return otapiJNI.OT_API_Ledger_CreateResponse(SERVER_ID, USER_ID, ACCOUNT_ID, ORIGINAL_LEDGER); + } + + public static String OT_API_Ledger_GetTransactionByIndex(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER, int nIndex) { + return otapiJNI.OT_API_Ledger_GetTransactionByIndex(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, nIndex); + } + + public static String OT_API_Ledger_GetTransactionByID(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER, String TRANSACTION_NUMBER) { + return otapiJNI.OT_API_Ledger_GetTransactionByID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, TRANSACTION_NUMBER); + } + + public static String OT_API_Ledger_GetTransactionIDByIndex(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER, int nIndex) { + return otapiJNI.OT_API_Ledger_GetTransactionIDByIndex(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, nIndex); + } + + public static String OT_API_Ledger_AddTransaction(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER, String THE_TRANSACTION) { + return otapiJNI.OT_API_Ledger_AddTransaction(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER, THE_TRANSACTION); + } + + public static String OT_API_Transaction_CreateResponse(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String RESPONSE_LEDGER, String ORIGINAL_TRANSACTION, int BOOL_DO_I_ACCEPT) { + return otapiJNI.OT_API_Transaction_CreateResponse(SERVER_ID, USER_ID, ACCOUNT_ID, RESPONSE_LEDGER, ORIGINAL_TRANSACTION, BOOL_DO_I_ACCEPT); + } + + public static String OT_API_Ledger_FinalizeResponse(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_LEDGER) { + return otapiJNI.OT_API_Ledger_FinalizeResponse(SERVER_ID, USER_ID, ACCOUNT_ID, THE_LEDGER); + } + + public static String OT_API_Transaction_GetType(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetType(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetVoucher(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetVoucher(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static int OT_API_Transaction_GetSuccess(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static int OT_API_Transaction_GetBalanceAgreementSuccess(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetBalanceAgreementSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetDateSigned(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetDateSigned(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetAmount(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetAmount(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Pending_GetNote(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Pending_GetNote(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetSenderUserID(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetSenderUserID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetSenderAcctID(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetSenderAcctID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetRecipientUserID(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetRecipientUserID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetRecipientAcctID(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetRecipientAcctID(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_Transaction_GetDisplayReferenceToNum(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_TRANSACTION) { + return otapiJNI.OT_API_Transaction_GetDisplayReferenceToNum(SERVER_ID, USER_ID, ACCOUNT_ID, THE_TRANSACTION); + } + + public static String OT_API_CreatePurse(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID) { + return otapiJNI.OT_API_CreatePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID); + } + + public static int OT_API_SavePurse(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE) { + return otapiJNI.OT_API_SavePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static String OT_API_Purse_GetTotalValue(String SERVER_ID, String ASSET_TYPE_ID, String THE_PURSE) { + return otapiJNI.OT_API_Purse_GetTotalValue(SERVER_ID, ASSET_TYPE_ID, THE_PURSE); + } + + public static int OT_API_Purse_Count(String SERVER_ID, String ASSET_TYPE_ID, String THE_PURSE) { + return otapiJNI.OT_API_Purse_Count(SERVER_ID, ASSET_TYPE_ID, THE_PURSE); + } + + public static String OT_API_Purse_Peek(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE) { + return otapiJNI.OT_API_Purse_Peek(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static String OT_API_Purse_Pop(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE) { + return otapiJNI.OT_API_Purse_Pop(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static String OT_API_Purse_Push(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE, String THE_TOKEN) { + return otapiJNI.OT_API_Purse_Push(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE, THE_TOKEN); + } + + public static int OT_API_Wallet_ImportPurse(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE) { + return otapiJNI.OT_API_Wallet_ImportPurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static void OT_API_exchangePurse(String SERVER_ID, String ASSET_TYPE_ID, String USER_ID, String THE_PURSE) { + otapiJNI.OT_API_exchangePurse(SERVER_ID, ASSET_TYPE_ID, USER_ID, THE_PURSE); + } + + public static String OT_API_Token_ChangeOwner(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN, String OLD_OWNER_NYM_ID, String NEW_OWNER_NYM_ID) { + return otapiJNI.OT_API_Token_ChangeOwner(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN, OLD_OWNER_NYM_ID, NEW_OWNER_NYM_ID); + } + + public static String OT_API_Token_GetID(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetID(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + } + + public static String OT_API_Token_GetDenomination(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetDenomination(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + } + + public static int OT_API_Token_GetSeries(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetSeries(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + } + + public static String OT_API_Token_GetValidFrom(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetValidFrom(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + } + + public static String OT_API_Token_GetValidTo(String SERVER_ID, String ASSET_TYPE_ID, String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetValidTo(SERVER_ID, ASSET_TYPE_ID, THE_TOKEN); + } + + public static String OT_API_Token_GetAssetID(String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetAssetID(THE_TOKEN); + } + + public static String OT_API_Token_GetServerID(String THE_TOKEN) { + return otapiJNI.OT_API_Token_GetServerID(THE_TOKEN); + } + + public static void OT_API_checkServerID(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_checkServerID(SERVER_ID, USER_ID); + } + + public static void OT_API_createUserAccount(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_createUserAccount(SERVER_ID, USER_ID); + } + + public static void OT_API_deleteUserAccount(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_deleteUserAccount(SERVER_ID, USER_ID); + } + + public static void OT_API_deleteAssetAccount(String SERVER_ID, String USER_ID, String ACCOUNT_ID) { + otapiJNI.OT_API_deleteAssetAccount(SERVER_ID, USER_ID, ACCOUNT_ID); + } + + public static void OT_API_checkUser(String SERVER_ID, String USER_ID, String USER_ID_CHECK) { + otapiJNI.OT_API_checkUser(SERVER_ID, USER_ID, USER_ID_CHECK); + } + + public static void OT_API_sendUserMessage(String SERVER_ID, String USER_ID, String USER_ID_RECIPIENT, String RECIPIENT_PUBKEY, String THE_MESSAGE) { + otapiJNI.OT_API_sendUserMessage(SERVER_ID, USER_ID, USER_ID_RECIPIENT, RECIPIENT_PUBKEY, THE_MESSAGE); + } + + public static void OT_API_getRequest(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_getRequest(SERVER_ID, USER_ID); + } + + public static void OT_API_getTransactionNumber(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_getTransactionNumber(SERVER_ID, USER_ID); + } + + public static void OT_API_issueAssetType(String SERVER_ID, String USER_ID, String THE_CONTRACT) { + otapiJNI.OT_API_issueAssetType(SERVER_ID, USER_ID, THE_CONTRACT); + } + + public static void OT_API_getContract(String SERVER_ID, String USER_ID, String ASSET_ID) { + otapiJNI.OT_API_getContract(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_getMint(String SERVER_ID, String USER_ID, String ASSET_ID) { + otapiJNI.OT_API_getMint(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_createAssetAccount(String SERVER_ID, String USER_ID, String ASSET_ID) { + otapiJNI.OT_API_createAssetAccount(SERVER_ID, USER_ID, ASSET_ID); + } + + public static void OT_API_getAccount(String SERVER_ID, String USER_ID, String ACCT_ID) { + otapiJNI.OT_API_getAccount(SERVER_ID, USER_ID, ACCT_ID); + } + + public static String OT_API_GenerateBasketCreation(String USER_ID, String MINIMUM_TRANSFER) { + return otapiJNI.OT_API_GenerateBasketCreation(USER_ID, MINIMUM_TRANSFER); + } + + public static String OT_API_AddBasketCreationItem(String USER_ID, String THE_BASKET, String ASSET_TYPE_ID, String MINIMUM_TRANSFER) { + return otapiJNI.OT_API_AddBasketCreationItem(USER_ID, THE_BASKET, ASSET_TYPE_ID, MINIMUM_TRANSFER); + } + + public static void OT_API_issueBasket(String SERVER_ID, String USER_ID, String THE_BASKET) { + otapiJNI.OT_API_issueBasket(SERVER_ID, USER_ID, THE_BASKET); + } + + public static String OT_API_GenerateBasketExchange(String SERVER_ID, String USER_ID, String BASKET_ASSET_TYPE_ID, String BASKET_ASSET_ACCT_ID, int TRANSFER_MULTIPLE) { + return otapiJNI.OT_API_GenerateBasketExchange(SERVER_ID, USER_ID, BASKET_ASSET_TYPE_ID, BASKET_ASSET_ACCT_ID, TRANSFER_MULTIPLE); + } + + public static String OT_API_AddBasketExchangeItem(String SERVER_ID, String USER_ID, String THE_BASKET, String ASSET_TYPE_ID, String ASSET_ACCT_ID) { + return otapiJNI.OT_API_AddBasketExchangeItem(SERVER_ID, USER_ID, THE_BASKET, ASSET_TYPE_ID, ASSET_ACCT_ID); + } + + public static void OT_API_exchangeBasket(String SERVER_ID, String USER_ID, String BASKET_ASSET_ID, String THE_BASKET, int BOOL_EXCHANGE_IN_OR_OUT) { + otapiJNI.OT_API_exchangeBasket(SERVER_ID, USER_ID, BASKET_ASSET_ID, THE_BASKET, BOOL_EXCHANGE_IN_OR_OUT); + } + + public static void OT_API_notarizeWithdrawal(String SERVER_ID, String USER_ID, String ACCT_ID, String AMOUNT) { + otapiJNI.OT_API_notarizeWithdrawal(SERVER_ID, USER_ID, ACCT_ID, AMOUNT); + } + + public static void OT_API_notarizeDeposit(String SERVER_ID, String USER_ID, String ACCT_ID, String THE_PURSE) { + otapiJNI.OT_API_notarizeDeposit(SERVER_ID, USER_ID, ACCT_ID, THE_PURSE); + } + + public static void OT_API_notarizeTransfer(String SERVER_ID, String USER_ID, String ACCT_FROM, String ACCT_TO, String AMOUNT, String NOTE) { + otapiJNI.OT_API_notarizeTransfer(SERVER_ID, USER_ID, ACCT_FROM, ACCT_TO, AMOUNT, NOTE); + } + + public static void OT_API_getInbox(String SERVER_ID, String USER_ID, String ACCT_ID) { + otapiJNI.OT_API_getInbox(SERVER_ID, USER_ID, ACCT_ID); + } + + public static void OT_API_getOutbox(String SERVER_ID, String USER_ID, String ACCT_ID) { + otapiJNI.OT_API_getOutbox(SERVER_ID, USER_ID, ACCT_ID); + } + + public static void OT_API_getNymbox(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_getNymbox(SERVER_ID, USER_ID); + } + + public static String OT_API_LoadNymbox(String SERVER_ID, String USER_ID) { + return otapiJNI.OT_API_LoadNymbox(SERVER_ID, USER_ID); + } + + public static void OT_API_processInbox(String SERVER_ID, String USER_ID, String ACCT_ID, String ACCT_LEDGER) { + otapiJNI.OT_API_processInbox(SERVER_ID, USER_ID, ACCT_ID, ACCT_LEDGER); + } + + public static void OT_API_processNymbox(String SERVER_ID, String USER_ID, String ACCT_LEDGER) { + otapiJNI.OT_API_processNymbox(SERVER_ID, USER_ID, ACCT_LEDGER); + } + + public static void OT_API_withdrawVoucher(String SERVER_ID, String USER_ID, String ACCT_ID, String RECIPIENT_USER_ID, String CHEQUE_MEMO, String AMOUNT) { + otapiJNI.OT_API_withdrawVoucher(SERVER_ID, USER_ID, ACCT_ID, RECIPIENT_USER_ID, CHEQUE_MEMO, AMOUNT); + } + + public static void OT_API_depositCheque(String SERVER_ID, String USER_ID, String ACCT_ID, String THE_CHEQUE) { + otapiJNI.OT_API_depositCheque(SERVER_ID, USER_ID, ACCT_ID, THE_CHEQUE); + } + + public static void OT_API_depositPaymentPlan(String SERVER_ID, String USER_ID, String THE_PAYMENT_PLAN) { + otapiJNI.OT_API_depositPaymentPlan(SERVER_ID, USER_ID, THE_PAYMENT_PLAN); + } + + public static void OT_API_issueMarketOffer(String SERVER_ID, String USER_ID, String ASSET_TYPE_ID, String ASSET_ACCT_ID, String CURRENCY_TYPE_ID, String CURRENCY_ACCT_ID, String MARKET_SCALE, String MINIMUM_INCREMENT, String TOTAL_ASSETS_ON_OFFER, String PRICE_LIMIT, int bBuyingOrSelling) { + otapiJNI.OT_API_issueMarketOffer(SERVER_ID, USER_ID, ASSET_TYPE_ID, ASSET_ACCT_ID, CURRENCY_TYPE_ID, CURRENCY_ACCT_ID, MARKET_SCALE, MINIMUM_INCREMENT, TOTAL_ASSETS_ON_OFFER, PRICE_LIMIT, bBuyingOrSelling); + } + + public static void OT_API_getMarketList(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_getMarketList(SERVER_ID, USER_ID); + } + + public static void OT_API_getMarketOffers(String SERVER_ID, String USER_ID, String MARKET_ID, String MAX_DEPTH) { + otapiJNI.OT_API_getMarketOffers(SERVER_ID, USER_ID, MARKET_ID, MAX_DEPTH); + } + + public static void OT_API_getMarketRecentTrades(String SERVER_ID, String USER_ID, String MARKET_ID) { + otapiJNI.OT_API_getMarketRecentTrades(SERVER_ID, USER_ID, MARKET_ID); + } + + public static void OT_API_getNym_MarketOffers(String SERVER_ID, String USER_ID) { + otapiJNI.OT_API_getNym_MarketOffers(SERVER_ID, USER_ID); + } + + public static void OT_API_cancelMarketOffer(String SERVER_ID, String USER_ID, String ASSET_ACCT_ID, String TRANSACTION_NUMBER) { + otapiJNI.OT_API_cancelMarketOffer(SERVER_ID, USER_ID, ASSET_ACCT_ID, TRANSACTION_NUMBER); + } + + public static void OT_API_cancelPaymentPlan(String SERVER_ID, String USER_ID, String FROM_ACCT_ID, String TRANSACTION_NUMBER) { + otapiJNI.OT_API_cancelPaymentPlan(SERVER_ID, USER_ID, FROM_ACCT_ID, TRANSACTION_NUMBER); + } + + public static String OT_API_PopMessageBuffer() { + return otapiJNI.OT_API_PopMessageBuffer(); + } + + public static void OT_API_FlushMessageBuffer() { + otapiJNI.OT_API_FlushMessageBuffer(); + } + + public static String OT_API_Message_GetCommand(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetCommand(THE_MESSAGE); + } + + public static int OT_API_Message_GetSuccess(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetSuccess(THE_MESSAGE); + } + + public static int OT_API_Message_GetDepth(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetDepth(THE_MESSAGE); + } + + public static int OT_API_Message_GetTransactionSuccess(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetTransactionSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_MESSAGE); + } + + public static int OT_API_Message_GetBalanceAgreementSuccess(String SERVER_ID, String USER_ID, String ACCOUNT_ID, String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetBalanceAgreementSuccess(SERVER_ID, USER_ID, ACCOUNT_ID, THE_MESSAGE); + } + + public static String OT_API_Message_GetLedger(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetLedger(THE_MESSAGE); + } + + public static String OT_API_Message_GetNewAssetTypeID(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetNewAssetTypeID(THE_MESSAGE); + } + + public static String OT_API_Message_GetNewIssuerAcctID(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetNewIssuerAcctID(THE_MESSAGE); + } + + public static String OT_API_Message_GetNewAcctID(String THE_MESSAGE) { + return otapiJNI.OT_API_Message_GetNewAcctID(THE_MESSAGE); + } + + public static int OT_API_ConnectServer(String SERVER_ID, String USER_ID, String szCA_FILE, String szKEY_FILE, String szKEY_PASSWORD) { + return otapiJNI.OT_API_ConnectServer(SERVER_ID, USER_ID, szCA_FILE, szKEY_FILE, szKEY_PASSWORD); + } + + public static int OT_API_ProcessSockets() { + return otapiJNI.OT_API_ProcessSockets(); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr, String twoStr, String threeStr, String fourStr, String fiveStr, String sixStr) { + return otapiJNI.InitDefaultStorage__SWIG_0(eStoreType, ePackType, oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr, String twoStr, String threeStr, String fourStr, String fiveStr) { + return otapiJNI.InitDefaultStorage__SWIG_1(eStoreType, ePackType, oneStr, twoStr, threeStr, fourStr, fiveStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr, String twoStr, String threeStr, String fourStr) { + return otapiJNI.InitDefaultStorage__SWIG_2(eStoreType, ePackType, oneStr, twoStr, threeStr, fourStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr, String twoStr, String threeStr) { + return otapiJNI.InitDefaultStorage__SWIG_3(eStoreType, ePackType, oneStr, twoStr, threeStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr, String twoStr) { + return otapiJNI.InitDefaultStorage__SWIG_4(eStoreType, ePackType, oneStr, twoStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType, String oneStr) { + return otapiJNI.InitDefaultStorage__SWIG_5(eStoreType, ePackType, oneStr); + } + + public static boolean InitDefaultStorage(int eStoreType, int ePackType) { + return otapiJNI.InitDefaultStorage__SWIG_6(eStoreType, ePackType); + } + + public static Storage GetDefaultStorage() { + long cPtr = otapiJNI.GetDefaultStorage(); + return (cPtr == 0) ? null : new Storage(cPtr, false); + } + + public static Storage CreateStorageContext(int eStoreType, int ePackType) { + long cPtr = otapiJNI.CreateStorageContext__SWIG_0(eStoreType, ePackType); + return (cPtr == 0) ? null : new Storage(cPtr, true); + } + + public static Storage CreateStorageContext(int eStoreType) { + long cPtr = otapiJNI.CreateStorageContext__SWIG_1(eStoreType); + return (cPtr == 0) ? null : new Storage(cPtr, true); + } + + public static Storable CreateObject(int eType) { + long cPtr = otapiJNI.CreateObject(eType); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static boolean Exists(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.Exists__SWIG_0(strFolder, oneStr, twoStr, threeStr); + } + + public static boolean Exists(String strFolder, String oneStr, String twoStr) { + return otapiJNI.Exists__SWIG_1(strFolder, oneStr, twoStr); + } + + public static boolean Exists(String strFolder, String oneStr) { + return otapiJNI.Exists__SWIG_2(strFolder, oneStr); + } + + public static boolean Exists(String strFolder) { + return otapiJNI.Exists__SWIG_3(strFolder); + } + + public static boolean StoreString(String strContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.StoreString__SWIG_0(strContents, strFolder, oneStr, twoStr, threeStr); + } + + public static boolean StoreString(String strContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.StoreString__SWIG_1(strContents, strFolder, oneStr, twoStr); + } + + public static boolean StoreString(String strContents, String strFolder, String oneStr) { + return otapiJNI.StoreString__SWIG_2(strContents, strFolder, oneStr); + } + + public static boolean StoreString(String strContents, String strFolder) { + return otapiJNI.StoreString__SWIG_3(strContents, strFolder); + } + + public static String QueryString(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.QueryString__SWIG_0(strFolder, oneStr, twoStr, threeStr); + } + + public static String QueryString(String strFolder, String oneStr, String twoStr) { + return otapiJNI.QueryString__SWIG_1(strFolder, oneStr, twoStr); + } + + public static String QueryString(String strFolder, String oneStr) { + return otapiJNI.QueryString__SWIG_2(strFolder, oneStr); + } + + public static String QueryString(String strFolder) { + return otapiJNI.QueryString__SWIG_3(strFolder); + } + + public static boolean StorePlainString(String strContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.StorePlainString__SWIG_0(strContents, strFolder, oneStr, twoStr, threeStr); + } + + public static boolean StorePlainString(String strContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.StorePlainString__SWIG_1(strContents, strFolder, oneStr, twoStr); + } + + public static boolean StorePlainString(String strContents, String strFolder, String oneStr) { + return otapiJNI.StorePlainString__SWIG_2(strContents, strFolder, oneStr); + } + + public static boolean StorePlainString(String strContents, String strFolder) { + return otapiJNI.StorePlainString__SWIG_3(strContents, strFolder); + } + + public static String QueryPlainString(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.QueryPlainString__SWIG_0(strFolder, oneStr, twoStr, threeStr); + } + + public static String QueryPlainString(String strFolder, String oneStr, String twoStr) { + return otapiJNI.QueryPlainString__SWIG_1(strFolder, oneStr, twoStr); + } + + public static String QueryPlainString(String strFolder, String oneStr) { + return otapiJNI.QueryPlainString__SWIG_2(strFolder, oneStr); + } + + public static String QueryPlainString(String strFolder) { + return otapiJNI.QueryPlainString__SWIG_3(strFolder); + } + + public static boolean StoreObject(Storable theContents, String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.StoreObject__SWIG_0(Storable.getCPtr(theContents), theContents, strFolder, oneStr, twoStr, threeStr); + } + + public static boolean StoreObject(Storable theContents, String strFolder, String oneStr, String twoStr) { + return otapiJNI.StoreObject__SWIG_1(Storable.getCPtr(theContents), theContents, strFolder, oneStr, twoStr); + } + + public static boolean StoreObject(Storable theContents, String strFolder, String oneStr) { + return otapiJNI.StoreObject__SWIG_2(Storable.getCPtr(theContents), theContents, strFolder, oneStr); + } + + public static boolean StoreObject(Storable theContents, String strFolder) { + return otapiJNI.StoreObject__SWIG_3(Storable.getCPtr(theContents), theContents, strFolder); + } + + public static Storable QueryObject(int theObjectType, String strFolder, String oneStr, String twoStr, String threeStr) { + long cPtr = otapiJNI.QueryObject__SWIG_0(theObjectType, strFolder, oneStr, twoStr, threeStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static Storable QueryObject(int theObjectType, String strFolder, String oneStr, String twoStr) { + long cPtr = otapiJNI.QueryObject__SWIG_1(theObjectType, strFolder, oneStr, twoStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static Storable QueryObject(int theObjectType, String strFolder, String oneStr) { + long cPtr = otapiJNI.QueryObject__SWIG_2(theObjectType, strFolder, oneStr); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static Storable QueryObject(int theObjectType, String strFolder) { + long cPtr = otapiJNI.QueryObject__SWIG_3(theObjectType, strFolder); + return (cPtr == 0) ? null : new Storable(cPtr, true); + } + + public static boolean EraseValueByKey(String strFolder, String oneStr, String twoStr, String threeStr) { + return otapiJNI.EraseValueByKey__SWIG_0(strFolder, oneStr, twoStr, threeStr); + } + + public static boolean EraseValueByKey(String strFolder, String oneStr, String twoStr) { + return otapiJNI.EraseValueByKey__SWIG_1(strFolder, oneStr, twoStr); + } + + public static boolean EraseValueByKey(String strFolder, String oneStr) { + return otapiJNI.EraseValueByKey__SWIG_2(strFolder, oneStr); + } + + public static boolean EraseValueByKey(String strFolder) { + return otapiJNI.EraseValueByKey__SWIG_3(strFolder); + } + +} diff --git a/testwallet/otapi.php b/testwallet/otapi.php new file mode 100644 index 000000000..368c6b0a3 --- /dev/null +++ b/testwallet/otapi.php @@ -0,0 +1,2672 @@ +_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + + function __construct($res=null) { + if (is_resource($res) && get_resource_type($res) === '_p_OTCallback') { + $this->_cPtr=$res; + return; + } + if (get_class($this) === 'OTCallback') { + $_this = null; + } else { + $_this = $this; + } + $this->_cPtr=new_OTCallback($_this); + } + + function runOne() { + return OTCallback_runOne($this->_cPtr); + } + + function runTwo() { + return OTCallback_runTwo($this->_cPtr); + } +} + +class OTCaller { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + + function __construct($res=null) { + if (is_resource($res) && get_resource_type($res) === '_p_OTCaller') { + $this->_cPtr=$res; + return; + } + $this->_cPtr=new_OTCaller(); + } + + function GetPassword() { + return OTCaller_GetPassword($this->_cPtr); + } + + function delCallback() { + OTCaller_delCallback($this->_cPtr); + } + + function setCallback($cb) { + OTCaller_setCallback($this->_cPtr,$cb); + } + + function isCallbackSet() { + return OTCaller_isCallbackSet($this->_cPtr); + } + + function callOne() { + OTCaller_callOne($this->_cPtr); + } + + function callTwo() { + OTCaller_callTwo($this->_cPtr); + } +} + +class Storable { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function Create($eType,$thePackType) { + $r=Storable_Create($eType,$thePackType); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Storable($r); + } + return new $c($r); + } + return $r; + } + + static function ot_dynamic_cast($pObject) { + $r=Storable_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Storable($r); + } + return new $c($r); + } + return $r; + } +} + +abstract class Storage { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetPacker($ePackType=null) { + switch (func_num_args()) { + case 0: $r=Storage_GetPacker($this->_cPtr); break; + default: $r=Storage_GetPacker($this->_cPtr,$ePackType); + } + return $r; + } + + function Init($oneStr=null,$twoStr=null,$threeStr=null,$fourStr=null,$fiveStr=null,$sixStr=null) { + switch (func_num_args()) { + case 0: $r=Storage_Init($this->_cPtr); break; + case 1: $r=Storage_Init($this->_cPtr,$oneStr); break; + case 2: $r=Storage_Init($this->_cPtr,$oneStr,$twoStr); break; + case 3: $r=Storage_Init($this->_cPtr,$oneStr,$twoStr,$threeStr); break; + case 4: $r=Storage_Init($this->_cPtr,$oneStr,$twoStr,$threeStr,$fourStr); break; + case 5: $r=Storage_Init($this->_cPtr,$oneStr,$twoStr,$threeStr,$fourStr,$fiveStr); break; + default: $r=Storage_Init($this->_cPtr,$oneStr,$twoStr,$threeStr,$fourStr,$fiveStr,$sixStr); + } + return $r; + } + + function Exists($strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 1: $r=Storage_Exists($this->_cPtr,$strFolder); break; + case 2: $r=Storage_Exists($this->_cPtr,$strFolder,$oneStr); break; + case 3: $r=Storage_Exists($this->_cPtr,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_Exists($this->_cPtr,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function StoreString($strContents,$strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 2: $r=Storage_StoreString($this->_cPtr,$strContents,$strFolder); break; + case 3: $r=Storage_StoreString($this->_cPtr,$strContents,$strFolder,$oneStr); break; + case 4: $r=Storage_StoreString($this->_cPtr,$strContents,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_StoreString($this->_cPtr,$strContents,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function QueryString($strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 1: $r=Storage_QueryString($this->_cPtr,$strFolder); break; + case 2: $r=Storage_QueryString($this->_cPtr,$strFolder,$oneStr); break; + case 3: $r=Storage_QueryString($this->_cPtr,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_QueryString($this->_cPtr,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function StorePlainString($strContents,$strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 2: $r=Storage_StorePlainString($this->_cPtr,$strContents,$strFolder); break; + case 3: $r=Storage_StorePlainString($this->_cPtr,$strContents,$strFolder,$oneStr); break; + case 4: $r=Storage_StorePlainString($this->_cPtr,$strContents,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_StorePlainString($this->_cPtr,$strContents,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function QueryPlainString($strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 1: $r=Storage_QueryPlainString($this->_cPtr,$strFolder); break; + case 2: $r=Storage_QueryPlainString($this->_cPtr,$strFolder,$oneStr); break; + case 3: $r=Storage_QueryPlainString($this->_cPtr,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_QueryPlainString($this->_cPtr,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function StoreObject($theContents,$strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 2: $r=Storage_StoreObject($this->_cPtr,$theContents,$strFolder); break; + case 3: $r=Storage_StoreObject($this->_cPtr,$theContents,$strFolder,$oneStr); break; + case 4: $r=Storage_StoreObject($this->_cPtr,$theContents,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_StoreObject($this->_cPtr,$theContents,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function QueryObject($theObjectType,$strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + if (!is_resource($r)) return $r; + switch (get_resource_type($r)) { + case '_p_OTDB__Storable': return new Storable($r); + default: return new Storable($r); + } + } + + function EraseValueByKey($strFolder,$oneStr=null,$twoStr=null,$threeStr=null) { + switch (func_num_args()) { + case 1: $r=Storage_EraseValueByKey($this->_cPtr,$strFolder); break; + case 2: $r=Storage_EraseValueByKey($this->_cPtr,$strFolder,$oneStr); break; + case 3: $r=Storage_EraseValueByKey($this->_cPtr,$strFolder,$oneStr,$twoStr); break; + default: $r=Storage_EraseValueByKey($this->_cPtr,$strFolder,$oneStr,$twoStr,$threeStr); + } + return $r; + } + + function CreateObject($eType) { + $r=Storage_CreateObject($this->_cPtr,$eType); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Storable($r); + } + return new $c($r); + } + return $r; + } + + static function Create($eStorageType,$ePackType) { + $r=Storage_Create($eStorageType,$ePackType); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Storage($r); + } + return new $c($r); + } + return $r; + } + + function GetType() { + return Storage_GetType($this->_cPtr); + } +} + +class OTDBString extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'm_string') return OTDBString_m_string_set($this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('OTDBString_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + $func = 'OTDBString_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=OTDBString_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OTDBString($r); + } + return new $c($r); + } + return $r; + } +} + +class Blob extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'm_memBuffer') return Blob_m_memBuffer_set($this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('Blob_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + $func = 'Blob_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=Blob_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Blob($r); + } + return new $c($r); + } + return $r; + } +} + +class StringMap extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'the_map') return StringMap_the_map_set($this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('StringMap_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + $func = 'StringMap_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function SetValue($strKey,$strValue) { + return StringMap_SetValue($this->_cPtr,$strKey,$strValue); + } + + function GetValue($strKey) { + return StringMap_GetValue($this->_cPtr,$strKey); + } + + static function ot_dynamic_cast($pObject) { + $r=StringMap_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new StringMap($r); + } + return new $c($r); + } + return $r; + } +} + +class Displayable extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'gui_label') return Displayable_gui_label_set($this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('Displayable_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + $func = 'Displayable_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=Displayable_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Displayable($r); + } + return new $c($r); + } + return $r; + } +} + +class MarketData extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'MarketData_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('MarketData_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'MarketData_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=MarketData_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new MarketData($r); + } + return new $c($r); + } + return $r; + } +} + +class MarketList extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetMarketDataCount() { + return MarketList_GetMarketDataCount($this->_cPtr); + } + + function GetMarketData($nIndex) { + $r=MarketList_GetMarketData($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new MarketData($r); + } + return new $c($r); + } + return $r; + } + + function RemoveMarketData($nIndexMarketData) { + return MarketList_RemoveMarketData($this->_cPtr,$nIndexMarketData); + } + + function AddMarketData($disownObject) { + return MarketList_AddMarketData($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=MarketList_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new MarketList($r); + } + return new $c($r); + } + return $r; + } +} + +class OfferDataMarket extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'OfferDataMarket_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('OfferDataMarket_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'OfferDataMarket_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=OfferDataMarket_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OfferDataMarket($r); + } + return new $c($r); + } + return $r; + } +} + +class BidData extends OfferDataMarket { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'BidData_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + OfferDataMarket::__set($var,$value); + } + + function __isset($var) { + if (function_exists('BidData_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return OfferDataMarket::__isset($var); + } + + function __get($var) { + $func = 'BidData_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return OfferDataMarket::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=BidData_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BidData($r); + } + return new $c($r); + } + return $r; + } +} + +class AskData extends OfferDataMarket { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'AskData_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + OfferDataMarket::__set($var,$value); + } + + function __isset($var) { + if (function_exists('AskData_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return OfferDataMarket::__isset($var); + } + + function __get($var) { + $func = 'AskData_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return OfferDataMarket::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=AskData_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new AskData($r); + } + return new $c($r); + } + return $r; + } +} + +class OfferListMarket extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetBidDataCount() { + return OfferListMarket_GetBidDataCount($this->_cPtr); + } + + function GetBidData($nIndex) { + $r=OfferListMarket_GetBidData($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BidData($r); + } + return new $c($r); + } + return $r; + } + + function RemoveBidData($nIndexBidData) { + return OfferListMarket_RemoveBidData($this->_cPtr,$nIndexBidData); + } + + function AddBidData($disownObject) { + return OfferListMarket_AddBidData($this->_cPtr,$disownObject); + } + + function GetAskDataCount() { + return OfferListMarket_GetAskDataCount($this->_cPtr); + } + + function GetAskData($nIndex) { + $r=OfferListMarket_GetAskData($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new AskData($r); + } + return new $c($r); + } + return $r; + } + + function RemoveAskData($nIndexAskData) { + return OfferListMarket_RemoveAskData($this->_cPtr,$nIndexAskData); + } + + function AddAskData($disownObject) { + return OfferListMarket_AddAskData($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=OfferListMarket_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OfferListMarket($r); + } + return new $c($r); + } + return $r; + } +} + +class TradeDataMarket extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'TradeDataMarket_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('TradeDataMarket_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'TradeDataMarket_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=TradeDataMarket_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeDataMarket($r); + } + return new $c($r); + } + return $r; + } +} + +class TradeListMarket extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetTradeDataMarketCount() { + return TradeListMarket_GetTradeDataMarketCount($this->_cPtr); + } + + function GetTradeDataMarket($nIndex) { + $r=TradeListMarket_GetTradeDataMarket($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeDataMarket($r); + } + return new $c($r); + } + return $r; + } + + function RemoveTradeDataMarket($nIndexTradeDataMarket) { + return TradeListMarket_RemoveTradeDataMarket($this->_cPtr,$nIndexTradeDataMarket); + } + + function AddTradeDataMarket($disownObject) { + return TradeListMarket_AddTradeDataMarket($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=TradeListMarket_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeListMarket($r); + } + return new $c($r); + } + return $r; + } +} + +class OfferDataNym extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'OfferDataNym_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('OfferDataNym_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'OfferDataNym_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=OfferDataNym_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OfferDataNym($r); + } + return new $c($r); + } + return $r; + } +} + +class OfferListNym extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetOfferDataNymCount() { + return OfferListNym_GetOfferDataNymCount($this->_cPtr); + } + + function GetOfferDataNym($nIndex) { + $r=OfferListNym_GetOfferDataNym($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OfferDataNym($r); + } + return new $c($r); + } + return $r; + } + + function RemoveOfferDataNym($nIndexOfferDataNym) { + return OfferListNym_RemoveOfferDataNym($this->_cPtr,$nIndexOfferDataNym); + } + + function AddOfferDataNym($disownObject) { + return OfferListNym_AddOfferDataNym($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=OfferListNym_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new OfferListNym($r); + } + return new $c($r); + } + return $r; + } +} + +class TradeDataNym extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'TradeDataNym_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('TradeDataNym_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'TradeDataNym_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=TradeDataNym_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeDataNym($r); + } + return new $c($r); + } + return $r; + } +} + +class TradeListNym extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetTradeDataNymCount() { + return TradeListNym_GetTradeDataNymCount($this->_cPtr); + } + + function GetTradeDataNym($nIndex) { + $r=TradeListNym_GetTradeDataNym($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeDataNym($r); + } + return new $c($r); + } + return $r; + } + + function RemoveTradeDataNym($nIndexTradeDataNym) { + return TradeListNym_RemoveTradeDataNym($this->_cPtr,$nIndexTradeDataNym); + } + + function AddTradeDataNym($disownObject) { + return TradeListNym_AddTradeDataNym($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=TradeListNym_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new TradeListNym($r); + } + return new $c($r); + } + return $r; + } +} + +class Acct extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'Acct_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('Acct_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'Acct_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=Acct_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Acct($r); + } + return new $c($r); + } + return $r; + } +} + +class BitcoinAcct extends Acct { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'BitcoinAcct_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Acct::__set($var,$value); + } + + function __isset($var) { + if (function_exists('BitcoinAcct_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Acct::__isset($var); + } + + function __get($var) { + $func = 'BitcoinAcct_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Acct::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=BitcoinAcct_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BitcoinAcct($r); + } + return new $c($r); + } + return $r; + } +} + +class ServerInfo extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'ServerInfo_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('ServerInfo_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'ServerInfo_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=ServerInfo_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ServerInfo($r); + } + return new $c($r); + } + return $r; + } +} + +class Server extends ServerInfo { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'Server_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + ServerInfo::__set($var,$value); + } + + function __isset($var) { + if (function_exists('Server_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return ServerInfo::__isset($var); + } + + function __get($var) { + $func = 'Server_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return ServerInfo::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=Server_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Server($r); + } + return new $c($r); + } + return $r; + } +} + +class BitcoinServer extends Server { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'BitcoinServer_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Server::__set($var,$value); + } + + function __isset($var) { + if (function_exists('BitcoinServer_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Server::__isset($var); + } + + function __get($var) { + $func = 'BitcoinServer_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Server::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=BitcoinServer_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BitcoinServer($r); + } + return new $c($r); + } + return $r; + } +} + +class RippleServer extends Server { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'RippleServer_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Server::__set($var,$value); + } + + function __isset($var) { + if (function_exists('RippleServer_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Server::__isset($var); + } + + function __get($var) { + $func = 'RippleServer_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Server::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=RippleServer_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new RippleServer($r); + } + return new $c($r); + } + return $r; + } +} + +class LoomServer extends Server { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'LoomServer_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Server::__set($var,$value); + } + + function __isset($var) { + if (function_exists('LoomServer_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Server::__isset($var); + } + + function __get($var) { + $func = 'LoomServer_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Server::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=LoomServer_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new LoomServer($r); + } + return new $c($r); + } + return $r; + } +} + +class ContactNym extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'ContactNym_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('ContactNym_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'ContactNym_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetServerInfoCount() { + return ContactNym_GetServerInfoCount($this->_cPtr); + } + + function GetServerInfo($nIndex) { + $r=ContactNym_GetServerInfo($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ServerInfo($r); + } + return new $c($r); + } + return $r; + } + + function RemoveServerInfo($nIndexServerInfo) { + return ContactNym_RemoveServerInfo($this->_cPtr,$nIndexServerInfo); + } + + function AddServerInfo($disownObject) { + return ContactNym_AddServerInfo($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=ContactNym_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ContactNym($r); + } + return new $c($r); + } + return $r; + } +} + +class WalletData extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetBitcoinServerCount() { + return WalletData_GetBitcoinServerCount($this->_cPtr); + } + + function GetBitcoinServer($nIndex) { + $r=WalletData_GetBitcoinServer($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BitcoinServer($r); + } + return new $c($r); + } + return $r; + } + + function RemoveBitcoinServer($nIndexBitcoinServer) { + return WalletData_RemoveBitcoinServer($this->_cPtr,$nIndexBitcoinServer); + } + + function AddBitcoinServer($disownObject) { + return WalletData_AddBitcoinServer($this->_cPtr,$disownObject); + } + + function GetBitcoinAcctCount() { + return WalletData_GetBitcoinAcctCount($this->_cPtr); + } + + function GetBitcoinAcct($nIndex) { + $r=WalletData_GetBitcoinAcct($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new BitcoinAcct($r); + } + return new $c($r); + } + return $r; + } + + function RemoveBitcoinAcct($nIndexBitcoinAcct) { + return WalletData_RemoveBitcoinAcct($this->_cPtr,$nIndexBitcoinAcct); + } + + function AddBitcoinAcct($disownObject) { + return WalletData_AddBitcoinAcct($this->_cPtr,$disownObject); + } + + function GetRippleServerCount() { + return WalletData_GetRippleServerCount($this->_cPtr); + } + + function GetRippleServer($nIndex) { + $r=WalletData_GetRippleServer($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new RippleServer($r); + } + return new $c($r); + } + return $r; + } + + function RemoveRippleServer($nIndexRippleServer) { + return WalletData_RemoveRippleServer($this->_cPtr,$nIndexRippleServer); + } + + function AddRippleServer($disownObject) { + return WalletData_AddRippleServer($this->_cPtr,$disownObject); + } + + function GetLoomServerCount() { + return WalletData_GetLoomServerCount($this->_cPtr); + } + + function GetLoomServer($nIndex) { + $r=WalletData_GetLoomServer($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new LoomServer($r); + } + return new $c($r); + } + return $r; + } + + function RemoveLoomServer($nIndexLoomServer) { + return WalletData_RemoveLoomServer($this->_cPtr,$nIndexLoomServer); + } + + function AddLoomServer($disownObject) { + return WalletData_AddLoomServer($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=WalletData_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new WalletData($r); + } + return new $c($r); + } + return $r; + } +} + +class ContactAcct extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'ContactAcct_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('ContactAcct_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'ContactAcct_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + static function ot_dynamic_cast($pObject) { + $r=ContactAcct_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ContactAcct($r); + } + return new $c($r); + } + return $r; + } +} + +class Contact extends Displayable { + public $_cPtr=null; + + function __set($var,$value) { + $func = 'Contact_'.$var.'_set'; + if (function_exists($func)) return call_user_func($func,$this->_cPtr,$value); + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Displayable::__set($var,$value); + } + + function __isset($var) { + if (function_exists('Contact_'.$var.'_set')) return true; + if ($var === 'thisown') return true; + return Displayable::__isset($var); + } + + function __get($var) { + $func = 'Contact_'.$var.'_get'; + if (function_exists($func)) { + $r = call_user_func($func,$this->_cPtr); + if (!is_resource($r)) return $r; + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + return new $c($r); + } + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Displayable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetContactNymCount() { + return Contact_GetContactNymCount($this->_cPtr); + } + + function GetContactNym($nIndex) { + $r=Contact_GetContactNym($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ContactNym($r); + } + return new $c($r); + } + return $r; + } + + function RemoveContactNym($nIndexContactNym) { + return Contact_RemoveContactNym($this->_cPtr,$nIndexContactNym); + } + + function AddContactNym($disownObject) { + return Contact_AddContactNym($this->_cPtr,$disownObject); + } + + function GetContactAcctCount() { + return Contact_GetContactAcctCount($this->_cPtr); + } + + function GetContactAcct($nIndex) { + $r=Contact_GetContactAcct($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new ContactAcct($r); + } + return new $c($r); + } + return $r; + } + + function RemoveContactAcct($nIndexContactAcct) { + return Contact_RemoveContactAcct($this->_cPtr,$nIndexContactAcct); + } + + function AddContactAcct($disownObject) { + return Contact_AddContactAcct($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=Contact_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Contact($r); + } + return new $c($r); + } + return $r; + } +} + +class AddressBook extends Storable { + public $_cPtr=null; + + function __set($var,$value) { + if ($var === 'thisown') return swig_otapi_alter_newobject($this->_cPtr,$value); + Storable::__set($var,$value); + } + + function __isset($var) { + if ($var === 'thisown') return true; + return Storable::__isset($var); + } + + function __get($var) { + if ($var === 'thisown') return swig_otapi_get_newobject($this->_cPtr); + return Storable::__get($var); + } + function __construct($h) { + $this->_cPtr=$h; + } + + function GetContactCount() { + return AddressBook_GetContactCount($this->_cPtr); + } + + function GetContact($nIndex) { + $r=AddressBook_GetContact($this->_cPtr,$nIndex); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new Contact($r); + } + return new $c($r); + } + return $r; + } + + function RemoveContact($nIndexContact) { + return AddressBook_RemoveContact($this->_cPtr,$nIndexContact); + } + + function AddContact($disownObject) { + return AddressBook_AddContact($this->_cPtr,$disownObject); + } + + static function ot_dynamic_cast($pObject) { + $r=AddressBook_ot_dynamic_cast($pObject); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (!class_exists($c)) { + return new AddressBook($r); + } + return new $c($r); + } + return $r; + } +} + + +?> diff --git a/testwallet/otapi.pm b/testwallet/otapi.pm new file mode 100644 index 000000000..1c7fcaefe --- /dev/null +++ b/testwallet/otapi.pm @@ -0,0 +1,1618 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 2.0.4 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +package otapi; +use base qw(Exporter); +use base qw(DynaLoader); +package otapic; +bootstrap otapi; +package otapi; +@EXPORT = qw(); + +# ---------- BASE METHODS ------------- + +package otapi; + +sub TIEHASH { + my ($classname,$obj) = @_; + return bless $obj, $classname; +} + +sub CLEAR { } + +sub FIRSTKEY { } + +sub NEXTKEY { } + +sub FETCH { + my ($self,$field) = @_; + my $member_func = "swig_${field}_get"; + $self->$member_func(); +} + +sub STORE { + my ($self,$field,$newval) = @_; + my $member_func = "swig_${field}_set"; + $self->$member_func($newval); +} + +sub this { + my $ptr = shift; + return tied(%$ptr); +} + + +# ------- FUNCTION WRAPPERS -------- + +package otapi; + +*OT_API_Set_PasswordCallback = *otapic::OT_API_Set_PasswordCallback; +*OT_API_Init = *otapic::OT_API_Init; +*OT_API_LoadWallet = *otapic::OT_API_LoadWallet; +*OT_API_SwitchWallet = *otapic::OT_API_SwitchWallet; +*OT_API_GetMemlogSize = *otapic::OT_API_GetMemlogSize; +*OT_API_GetMemlogAtIndex = *otapic::OT_API_GetMemlogAtIndex; +*OT_API_PeekMemlogFront = *otapic::OT_API_PeekMemlogFront; +*OT_API_PeekMemlogBack = *otapic::OT_API_PeekMemlogBack; +*OT_API_PopMemlogFront = *otapic::OT_API_PopMemlogFront; +*OT_API_PopMemlogBack = *otapic::OT_API_PopMemlogBack; +*OT_API_CreateNym = *otapic::OT_API_CreateNym; +*OT_API_AddServerContract = *otapic::OT_API_AddServerContract; +*OT_API_AddAssetContract = *otapic::OT_API_AddAssetContract; +*OT_API_GetServerCount = *otapic::OT_API_GetServerCount; +*OT_API_GetAssetTypeCount = *otapic::OT_API_GetAssetTypeCount; +*OT_API_GetAccountCount = *otapic::OT_API_GetAccountCount; +*OT_API_GetNymCount = *otapic::OT_API_GetNymCount; +*OT_API_GetServer_ID = *otapic::OT_API_GetServer_ID; +*OT_API_GetServer_Name = *otapic::OT_API_GetServer_Name; +*OT_API_GetAssetType_ID = *otapic::OT_API_GetAssetType_ID; +*OT_API_GetAssetType_Name = *otapic::OT_API_GetAssetType_Name; +*OT_API_GetAccountWallet_ID = *otapic::OT_API_GetAccountWallet_ID; +*OT_API_GetAccountWallet_Name = *otapic::OT_API_GetAccountWallet_Name; +*OT_API_GetAccountWallet_Balance = *otapic::OT_API_GetAccountWallet_Balance; +*OT_API_GetAccountWallet_Type = *otapic::OT_API_GetAccountWallet_Type; +*OT_API_GetAccountWallet_AssetTypeID = *otapic::OT_API_GetAccountWallet_AssetTypeID; +*OT_API_GetAccountWallet_ServerID = *otapic::OT_API_GetAccountWallet_ServerID; +*OT_API_GetAccountWallet_NymID = *otapic::OT_API_GetAccountWallet_NymID; +*OT_API_VerifyAccountReceipt = *otapic::OT_API_VerifyAccountReceipt; +*OT_API_GetNym_TransactionNumCount = *otapic::OT_API_GetNym_TransactionNumCount; +*OT_API_GetNym_ID = *otapic::OT_API_GetNym_ID; +*OT_API_GetNym_Name = *otapic::OT_API_GetNym_Name; +*OT_API_GetNym_Stats = *otapic::OT_API_GetNym_Stats; +*OT_API_IsNym_RegisteredAtServer = *otapic::OT_API_IsNym_RegisteredAtServer; +*OT_API_GetNym_MailCount = *otapic::OT_API_GetNym_MailCount; +*OT_API_GetNym_MailContentsByIndex = *otapic::OT_API_GetNym_MailContentsByIndex; +*OT_API_GetNym_MailSenderIDByIndex = *otapic::OT_API_GetNym_MailSenderIDByIndex; +*OT_API_GetNym_MailServerIDByIndex = *otapic::OT_API_GetNym_MailServerIDByIndex; +*OT_API_Nym_RemoveMailByIndex = *otapic::OT_API_Nym_RemoveMailByIndex; +*OT_API_Nym_VerifyMailByIndex = *otapic::OT_API_Nym_VerifyMailByIndex; +*OT_API_GetNym_OutmailCount = *otapic::OT_API_GetNym_OutmailCount; +*OT_API_GetNym_OutmailContentsByIndex = *otapic::OT_API_GetNym_OutmailContentsByIndex; +*OT_API_GetNym_OutmailRecipientIDByIndex = *otapic::OT_API_GetNym_OutmailRecipientIDByIndex; +*OT_API_GetNym_OutmailServerIDByIndex = *otapic::OT_API_GetNym_OutmailServerIDByIndex; +*OT_API_Nym_RemoveOutmailByIndex = *otapic::OT_API_Nym_RemoveOutmailByIndex; +*OT_API_Nym_VerifyOutmailByIndex = *otapic::OT_API_Nym_VerifyOutmailByIndex; +*OT_API_Wallet_CanRemoveServer = *otapic::OT_API_Wallet_CanRemoveServer; +*OT_API_Wallet_RemoveServer = *otapic::OT_API_Wallet_RemoveServer; +*OT_API_Wallet_CanRemoveAssetType = *otapic::OT_API_Wallet_CanRemoveAssetType; +*OT_API_Wallet_RemoveAssetType = *otapic::OT_API_Wallet_RemoveAssetType; +*OT_API_Wallet_CanRemoveNym = *otapic::OT_API_Wallet_CanRemoveNym; +*OT_API_Wallet_RemoveNym = *otapic::OT_API_Wallet_RemoveNym; +*OT_API_Wallet_CanRemoveAccount = *otapic::OT_API_Wallet_CanRemoveAccount; +*OT_API_Wallet_ImportNym = *otapic::OT_API_Wallet_ImportNym; +*OT_API_SetNym_Name = *otapic::OT_API_SetNym_Name; +*OT_API_SetAccountWallet_Name = *otapic::OT_API_SetAccountWallet_Name; +*OT_API_SetAssetType_Name = *otapic::OT_API_SetAssetType_Name; +*OT_API_SetServer_Name = *otapic::OT_API_SetServer_Name; +*OT_API_VerifyAndRetrieveXMLContents = *otapic::OT_API_VerifyAndRetrieveXMLContents; +*OT_API_WriteCheque = *otapic::OT_API_WriteCheque; +*OT_API_ProposePaymentPlan = *otapic::OT_API_ProposePaymentPlan; +*OT_API_ConfirmPaymentPlan = *otapic::OT_API_ConfirmPaymentPlan; +*OT_API_LoadUserPubkey = *otapic::OT_API_LoadUserPubkey; +*OT_API_LoadPubkey = *otapic::OT_API_LoadPubkey; +*OT_API_VerifyUserPrivateKey = *otapic::OT_API_VerifyUserPrivateKey; +*OT_API_LoadPurse = *otapic::OT_API_LoadPurse; +*OT_API_LoadMint = *otapic::OT_API_LoadMint; +*OT_API_LoadAssetContract = *otapic::OT_API_LoadAssetContract; +*OT_API_LoadServerContract = *otapic::OT_API_LoadServerContract; +*OT_API_Mint_IsStillGood = *otapic::OT_API_Mint_IsStillGood; +*OT_API_IsBasketCurrency = *otapic::OT_API_IsBasketCurrency; +*OT_API_Basket_GetMemberCount = *otapic::OT_API_Basket_GetMemberCount; +*OT_API_Basket_GetMemberType = *otapic::OT_API_Basket_GetMemberType; +*OT_API_Basket_GetMinimumTransferAmount = *otapic::OT_API_Basket_GetMinimumTransferAmount; +*OT_API_Basket_GetMemberMinimumTransferAmount = *otapic::OT_API_Basket_GetMemberMinimumTransferAmount; +*OT_API_LoadAssetAccount = *otapic::OT_API_LoadAssetAccount; +*OT_API_LoadInbox = *otapic::OT_API_LoadInbox; +*OT_API_LoadOutbox = *otapic::OT_API_LoadOutbox; +*OT_API_Ledger_GetCount = *otapic::OT_API_Ledger_GetCount; +*OT_API_Ledger_CreateResponse = *otapic::OT_API_Ledger_CreateResponse; +*OT_API_Ledger_GetTransactionByIndex = *otapic::OT_API_Ledger_GetTransactionByIndex; +*OT_API_Ledger_GetTransactionByID = *otapic::OT_API_Ledger_GetTransactionByID; +*OT_API_Ledger_GetTransactionIDByIndex = *otapic::OT_API_Ledger_GetTransactionIDByIndex; +*OT_API_Ledger_AddTransaction = *otapic::OT_API_Ledger_AddTransaction; +*OT_API_Transaction_CreateResponse = *otapic::OT_API_Transaction_CreateResponse; +*OT_API_Ledger_FinalizeResponse = *otapic::OT_API_Ledger_FinalizeResponse; +*OT_API_Transaction_GetType = *otapic::OT_API_Transaction_GetType; +*OT_API_Transaction_GetVoucher = *otapic::OT_API_Transaction_GetVoucher; +*OT_API_Transaction_GetSuccess = *otapic::OT_API_Transaction_GetSuccess; +*OT_API_Transaction_GetBalanceAgreementSuccess = *otapic::OT_API_Transaction_GetBalanceAgreementSuccess; +*OT_API_Transaction_GetDateSigned = *otapic::OT_API_Transaction_GetDateSigned; +*OT_API_Transaction_GetAmount = *otapic::OT_API_Transaction_GetAmount; +*OT_API_Pending_GetNote = *otapic::OT_API_Pending_GetNote; +*OT_API_Transaction_GetSenderUserID = *otapic::OT_API_Transaction_GetSenderUserID; +*OT_API_Transaction_GetSenderAcctID = *otapic::OT_API_Transaction_GetSenderAcctID; +*OT_API_Transaction_GetRecipientUserID = *otapic::OT_API_Transaction_GetRecipientUserID; +*OT_API_Transaction_GetRecipientAcctID = *otapic::OT_API_Transaction_GetRecipientAcctID; +*OT_API_Transaction_GetDisplayReferenceToNum = *otapic::OT_API_Transaction_GetDisplayReferenceToNum; +*OT_API_CreatePurse = *otapic::OT_API_CreatePurse; +*OT_API_SavePurse = *otapic::OT_API_SavePurse; +*OT_API_Purse_GetTotalValue = *otapic::OT_API_Purse_GetTotalValue; +*OT_API_Purse_Count = *otapic::OT_API_Purse_Count; +*OT_API_Purse_Peek = *otapic::OT_API_Purse_Peek; +*OT_API_Purse_Pop = *otapic::OT_API_Purse_Pop; +*OT_API_Purse_Push = *otapic::OT_API_Purse_Push; +*OT_API_Wallet_ImportPurse = *otapic::OT_API_Wallet_ImportPurse; +*OT_API_exchangePurse = *otapic::OT_API_exchangePurse; +*OT_API_Token_ChangeOwner = *otapic::OT_API_Token_ChangeOwner; +*OT_API_Token_GetID = *otapic::OT_API_Token_GetID; +*OT_API_Token_GetDenomination = *otapic::OT_API_Token_GetDenomination; +*OT_API_Token_GetSeries = *otapic::OT_API_Token_GetSeries; +*OT_API_Token_GetValidFrom = *otapic::OT_API_Token_GetValidFrom; +*OT_API_Token_GetValidTo = *otapic::OT_API_Token_GetValidTo; +*OT_API_Token_GetAssetID = *otapic::OT_API_Token_GetAssetID; +*OT_API_Token_GetServerID = *otapic::OT_API_Token_GetServerID; +*OT_API_checkServerID = *otapic::OT_API_checkServerID; +*OT_API_createUserAccount = *otapic::OT_API_createUserAccount; +*OT_API_deleteUserAccount = *otapic::OT_API_deleteUserAccount; +*OT_API_deleteAssetAccount = *otapic::OT_API_deleteAssetAccount; +*OT_API_checkUser = *otapic::OT_API_checkUser; +*OT_API_sendUserMessage = *otapic::OT_API_sendUserMessage; +*OT_API_getRequest = *otapic::OT_API_getRequest; +*OT_API_getTransactionNumber = *otapic::OT_API_getTransactionNumber; +*OT_API_issueAssetType = *otapic::OT_API_issueAssetType; +*OT_API_getContract = *otapic::OT_API_getContract; +*OT_API_getMint = *otapic::OT_API_getMint; +*OT_API_createAssetAccount = *otapic::OT_API_createAssetAccount; +*OT_API_getAccount = *otapic::OT_API_getAccount; +*OT_API_GenerateBasketCreation = *otapic::OT_API_GenerateBasketCreation; +*OT_API_AddBasketCreationItem = *otapic::OT_API_AddBasketCreationItem; +*OT_API_issueBasket = *otapic::OT_API_issueBasket; +*OT_API_GenerateBasketExchange = *otapic::OT_API_GenerateBasketExchange; +*OT_API_AddBasketExchangeItem = *otapic::OT_API_AddBasketExchangeItem; +*OT_API_exchangeBasket = *otapic::OT_API_exchangeBasket; +*OT_API_notarizeWithdrawal = *otapic::OT_API_notarizeWithdrawal; +*OT_API_notarizeDeposit = *otapic::OT_API_notarizeDeposit; +*OT_API_notarizeTransfer = *otapic::OT_API_notarizeTransfer; +*OT_API_getInbox = *otapic::OT_API_getInbox; +*OT_API_getOutbox = *otapic::OT_API_getOutbox; +*OT_API_getNymbox = *otapic::OT_API_getNymbox; +*OT_API_LoadNymbox = *otapic::OT_API_LoadNymbox; +*OT_API_processInbox = *otapic::OT_API_processInbox; +*OT_API_processNymbox = *otapic::OT_API_processNymbox; +*OT_API_withdrawVoucher = *otapic::OT_API_withdrawVoucher; +*OT_API_depositCheque = *otapic::OT_API_depositCheque; +*OT_API_depositPaymentPlan = *otapic::OT_API_depositPaymentPlan; +*OT_API_issueMarketOffer = *otapic::OT_API_issueMarketOffer; +*OT_API_getMarketList = *otapic::OT_API_getMarketList; +*OT_API_getMarketOffers = *otapic::OT_API_getMarketOffers; +*OT_API_getMarketRecentTrades = *otapic::OT_API_getMarketRecentTrades; +*OT_API_getNym_MarketOffers = *otapic::OT_API_getNym_MarketOffers; +*OT_API_cancelMarketOffer = *otapic::OT_API_cancelMarketOffer; +*OT_API_cancelPaymentPlan = *otapic::OT_API_cancelPaymentPlan; +*OT_API_PopMessageBuffer = *otapic::OT_API_PopMessageBuffer; +*OT_API_FlushMessageBuffer = *otapic::OT_API_FlushMessageBuffer; +*OT_API_Message_GetCommand = *otapic::OT_API_Message_GetCommand; +*OT_API_Message_GetSuccess = *otapic::OT_API_Message_GetSuccess; +*OT_API_Message_GetDepth = *otapic::OT_API_Message_GetDepth; +*OT_API_Message_GetTransactionSuccess = *otapic::OT_API_Message_GetTransactionSuccess; +*OT_API_Message_GetBalanceAgreementSuccess = *otapic::OT_API_Message_GetBalanceAgreementSuccess; +*OT_API_Message_GetLedger = *otapic::OT_API_Message_GetLedger; +*OT_API_Message_GetNewAssetTypeID = *otapic::OT_API_Message_GetNewAssetTypeID; +*OT_API_Message_GetNewIssuerAcctID = *otapic::OT_API_Message_GetNewIssuerAcctID; +*OT_API_Message_GetNewAcctID = *otapic::OT_API_Message_GetNewAcctID; +*OT_API_ConnectServer = *otapic::OT_API_ConnectServer; +*OT_API_ProcessSockets = *otapic::OT_API_ProcessSockets; +*InitDefaultStorage = *otapic::InitDefaultStorage; +*GetDefaultStorage = *otapic::GetDefaultStorage; +*CreateStorageContext = *otapic::CreateStorageContext; +*CreateObject = *otapic::CreateObject; +*Exists = *otapic::Exists; +*StoreString = *otapic::StoreString; +*QueryString = *otapic::QueryString; +*StorePlainString = *otapic::StorePlainString; +*QueryPlainString = *otapic::QueryPlainString; +*StoreObject = *otapic::StoreObject; +*QueryObject = *otapic::QueryObject; +*EraseValueByKey = *otapic::EraseValueByKey; + +############# Class : otapi::OTCallback ############## + +package otapi::OTCallback; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi ); +%OWNER = (); +%ITERATORS = (); +sub new { + my $pkg = shift; + my $self = otapic::new_OTCallback(@_); + bless $self, $pkg if defined($self); +} + +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OTCallback($self); + delete $OWNER{$self}; + } +} + +*runOne = *otapic::OTCallback_runOne; +*runTwo = *otapic::OTCallback_runTwo; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OTCaller ############## + +package otapi::OTCaller; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi ); +%OWNER = (); +%ITERATORS = (); +sub new { + my $pkg = shift; + my $self = otapic::new_OTCaller(@_); + bless $self, $pkg if defined($self); +} + +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OTCaller($self); + delete $OWNER{$self}; + } +} + +*GetPassword = *otapic::OTCaller_GetPassword; +*delCallback = *otapic::OTCaller_delCallback; +*setCallback = *otapic::OTCaller_setCallback; +*isCallbackSet = *otapic::OTCaller_isCallbackSet; +*callOne = *otapic::OTCaller_callOne; +*callTwo = *otapic::OTCaller_callTwo; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Storable ############## + +package otapi::Storable; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Storable($self); + delete $OWNER{$self}; + } +} + +*Create = *otapic::Storable_Create; +*ot_dynamic_cast = *otapic::Storable_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Storage ############## + +package otapi::Storage; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi ); +%OWNER = (); +%ITERATORS = (); +*GetPacker = *otapic::Storage_GetPacker; +*Init = *otapic::Storage_Init; +*Exists = *otapic::Storage_Exists; +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Storage($self); + delete $OWNER{$self}; + } +} + +*StoreString = *otapic::Storage_StoreString; +*QueryString = *otapic::Storage_QueryString; +*StorePlainString = *otapic::Storage_StorePlainString; +*QueryPlainString = *otapic::Storage_QueryPlainString; +*StoreObject = *otapic::Storage_StoreObject; +*QueryObject = *otapic::Storage_QueryObject; +*EraseValueByKey = *otapic::Storage_EraseValueByKey; +*CreateObject = *otapic::Storage_CreateObject; +*Create = *otapic::Storage_Create; +*GetType = *otapic::Storage_GetType; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OTDBString ############## + +package otapi::OTDBString; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OTDBString($self); + delete $OWNER{$self}; + } +} + +*swig_m_string_get = *otapic::OTDBString_m_string_get; +*swig_m_string_set = *otapic::OTDBString_m_string_set; +*ot_dynamic_cast = *otapic::OTDBString_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Blob ############## + +package otapi::Blob; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Blob($self); + delete $OWNER{$self}; + } +} + +*swig_m_memBuffer_get = *otapic::Blob_m_memBuffer_get; +*swig_m_memBuffer_set = *otapic::Blob_m_memBuffer_set; +*ot_dynamic_cast = *otapic::Blob_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::StringMap ############## + +package otapi::StringMap; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_StringMap($self); + delete $OWNER{$self}; + } +} + +*swig_the_map_get = *otapic::StringMap_the_map_get; +*swig_the_map_set = *otapic::StringMap_the_map_set; +*SetValue = *otapic::StringMap_SetValue; +*GetValue = *otapic::StringMap_GetValue; +*ot_dynamic_cast = *otapic::StringMap_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Displayable ############## + +package otapi::Displayable; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Displayable($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::Displayable_gui_label_get; +*swig_gui_label_set = *otapic::Displayable_gui_label_set; +*ot_dynamic_cast = *otapic::Displayable_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::MarketData ############## + +package otapi::MarketData; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_MarketData($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::MarketData_gui_label_get; +*swig_gui_label_set = *otapic::MarketData_gui_label_set; +*swig_server_id_get = *otapic::MarketData_server_id_get; +*swig_server_id_set = *otapic::MarketData_server_id_set; +*swig_market_id_get = *otapic::MarketData_market_id_get; +*swig_market_id_set = *otapic::MarketData_market_id_set; +*swig_asset_type_id_get = *otapic::MarketData_asset_type_id_get; +*swig_asset_type_id_set = *otapic::MarketData_asset_type_id_set; +*swig_currency_type_id_get = *otapic::MarketData_currency_type_id_get; +*swig_currency_type_id_set = *otapic::MarketData_currency_type_id_set; +*swig_scale_get = *otapic::MarketData_scale_get; +*swig_scale_set = *otapic::MarketData_scale_set; +*swig_total_assets_get = *otapic::MarketData_total_assets_get; +*swig_total_assets_set = *otapic::MarketData_total_assets_set; +*swig_number_bids_get = *otapic::MarketData_number_bids_get; +*swig_number_bids_set = *otapic::MarketData_number_bids_set; +*swig_number_asks_get = *otapic::MarketData_number_asks_get; +*swig_number_asks_set = *otapic::MarketData_number_asks_set; +*swig_last_sale_price_get = *otapic::MarketData_last_sale_price_get; +*swig_last_sale_price_set = *otapic::MarketData_last_sale_price_set; +*swig_current_bid_get = *otapic::MarketData_current_bid_get; +*swig_current_bid_set = *otapic::MarketData_current_bid_set; +*swig_current_ask_get = *otapic::MarketData_current_ask_get; +*swig_current_ask_set = *otapic::MarketData_current_ask_set; +*swig_volume_trades_get = *otapic::MarketData_volume_trades_get; +*swig_volume_trades_set = *otapic::MarketData_volume_trades_set; +*swig_volume_assets_get = *otapic::MarketData_volume_assets_get; +*swig_volume_assets_set = *otapic::MarketData_volume_assets_set; +*swig_volume_currency_get = *otapic::MarketData_volume_currency_get; +*swig_volume_currency_set = *otapic::MarketData_volume_currency_set; +*swig_recent_highest_bid_get = *otapic::MarketData_recent_highest_bid_get; +*swig_recent_highest_bid_set = *otapic::MarketData_recent_highest_bid_set; +*swig_recent_lowest_ask_get = *otapic::MarketData_recent_lowest_ask_get; +*swig_recent_lowest_ask_set = *otapic::MarketData_recent_lowest_ask_set; +*ot_dynamic_cast = *otapic::MarketData_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::MarketList ############## + +package otapi::MarketList; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_MarketList($self); + delete $OWNER{$self}; + } +} + +*GetMarketDataCount = *otapic::MarketList_GetMarketDataCount; +*GetMarketData = *otapic::MarketList_GetMarketData; +*RemoveMarketData = *otapic::MarketList_RemoveMarketData; +*AddMarketData = *otapic::MarketList_AddMarketData; +*ot_dynamic_cast = *otapic::MarketList_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OfferDataMarket ############## + +package otapi::OfferDataMarket; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OfferDataMarket($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::OfferDataMarket_gui_label_get; +*swig_gui_label_set = *otapic::OfferDataMarket_gui_label_set; +*swig_transaction_id_get = *otapic::OfferDataMarket_transaction_id_get; +*swig_transaction_id_set = *otapic::OfferDataMarket_transaction_id_set; +*swig_price_per_scale_get = *otapic::OfferDataMarket_price_per_scale_get; +*swig_price_per_scale_set = *otapic::OfferDataMarket_price_per_scale_set; +*swig_available_assets_get = *otapic::OfferDataMarket_available_assets_get; +*swig_available_assets_set = *otapic::OfferDataMarket_available_assets_set; +*swig_minimum_increment_get = *otapic::OfferDataMarket_minimum_increment_get; +*swig_minimum_increment_set = *otapic::OfferDataMarket_minimum_increment_set; +*ot_dynamic_cast = *otapic::OfferDataMarket_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::BidData ############## + +package otapi::BidData; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::OfferDataMarket otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_BidData($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::BidData_gui_label_get; +*swig_gui_label_set = *otapic::BidData_gui_label_set; +*swig_transaction_id_get = *otapic::BidData_transaction_id_get; +*swig_transaction_id_set = *otapic::BidData_transaction_id_set; +*swig_price_per_scale_get = *otapic::BidData_price_per_scale_get; +*swig_price_per_scale_set = *otapic::BidData_price_per_scale_set; +*swig_available_assets_get = *otapic::BidData_available_assets_get; +*swig_available_assets_set = *otapic::BidData_available_assets_set; +*swig_minimum_increment_get = *otapic::BidData_minimum_increment_get; +*swig_minimum_increment_set = *otapic::BidData_minimum_increment_set; +*ot_dynamic_cast = *otapic::BidData_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::AskData ############## + +package otapi::AskData; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::OfferDataMarket otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_AskData($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::AskData_gui_label_get; +*swig_gui_label_set = *otapic::AskData_gui_label_set; +*swig_transaction_id_get = *otapic::AskData_transaction_id_get; +*swig_transaction_id_set = *otapic::AskData_transaction_id_set; +*swig_price_per_scale_get = *otapic::AskData_price_per_scale_get; +*swig_price_per_scale_set = *otapic::AskData_price_per_scale_set; +*swig_available_assets_get = *otapic::AskData_available_assets_get; +*swig_available_assets_set = *otapic::AskData_available_assets_set; +*swig_minimum_increment_get = *otapic::AskData_minimum_increment_get; +*swig_minimum_increment_set = *otapic::AskData_minimum_increment_set; +*ot_dynamic_cast = *otapic::AskData_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OfferListMarket ############## + +package otapi::OfferListMarket; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OfferListMarket($self); + delete $OWNER{$self}; + } +} + +*GetBidDataCount = *otapic::OfferListMarket_GetBidDataCount; +*GetBidData = *otapic::OfferListMarket_GetBidData; +*RemoveBidData = *otapic::OfferListMarket_RemoveBidData; +*AddBidData = *otapic::OfferListMarket_AddBidData; +*GetAskDataCount = *otapic::OfferListMarket_GetAskDataCount; +*GetAskData = *otapic::OfferListMarket_GetAskData; +*RemoveAskData = *otapic::OfferListMarket_RemoveAskData; +*AddAskData = *otapic::OfferListMarket_AddAskData; +*ot_dynamic_cast = *otapic::OfferListMarket_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::TradeDataMarket ############## + +package otapi::TradeDataMarket; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_TradeDataMarket($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::TradeDataMarket_gui_label_get; +*swig_gui_label_set = *otapic::TradeDataMarket_gui_label_set; +*swig_transaction_id_get = *otapic::TradeDataMarket_transaction_id_get; +*swig_transaction_id_set = *otapic::TradeDataMarket_transaction_id_set; +*swig_date_get = *otapic::TradeDataMarket_date_get; +*swig_date_set = *otapic::TradeDataMarket_date_set; +*swig_price_get = *otapic::TradeDataMarket_price_get; +*swig_price_set = *otapic::TradeDataMarket_price_set; +*swig_amount_sold_get = *otapic::TradeDataMarket_amount_sold_get; +*swig_amount_sold_set = *otapic::TradeDataMarket_amount_sold_set; +*ot_dynamic_cast = *otapic::TradeDataMarket_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::TradeListMarket ############## + +package otapi::TradeListMarket; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_TradeListMarket($self); + delete $OWNER{$self}; + } +} + +*GetTradeDataMarketCount = *otapic::TradeListMarket_GetTradeDataMarketCount; +*GetTradeDataMarket = *otapic::TradeListMarket_GetTradeDataMarket; +*RemoveTradeDataMarket = *otapic::TradeListMarket_RemoveTradeDataMarket; +*AddTradeDataMarket = *otapic::TradeListMarket_AddTradeDataMarket; +*ot_dynamic_cast = *otapic::TradeListMarket_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OfferDataNym ############## + +package otapi::OfferDataNym; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OfferDataNym($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::OfferDataNym_gui_label_get; +*swig_gui_label_set = *otapic::OfferDataNym_gui_label_set; +*swig_valid_from_get = *otapic::OfferDataNym_valid_from_get; +*swig_valid_from_set = *otapic::OfferDataNym_valid_from_set; +*swig_valid_to_get = *otapic::OfferDataNym_valid_to_get; +*swig_valid_to_set = *otapic::OfferDataNym_valid_to_set; +*swig_server_id_get = *otapic::OfferDataNym_server_id_get; +*swig_server_id_set = *otapic::OfferDataNym_server_id_set; +*swig_asset_type_id_get = *otapic::OfferDataNym_asset_type_id_get; +*swig_asset_type_id_set = *otapic::OfferDataNym_asset_type_id_set; +*swig_asset_acct_id_get = *otapic::OfferDataNym_asset_acct_id_get; +*swig_asset_acct_id_set = *otapic::OfferDataNym_asset_acct_id_set; +*swig_currency_type_id_get = *otapic::OfferDataNym_currency_type_id_get; +*swig_currency_type_id_set = *otapic::OfferDataNym_currency_type_id_set; +*swig_currency_acct_id_get = *otapic::OfferDataNym_currency_acct_id_get; +*swig_currency_acct_id_set = *otapic::OfferDataNym_currency_acct_id_set; +*swig_selling_get = *otapic::OfferDataNym_selling_get; +*swig_selling_set = *otapic::OfferDataNym_selling_set; +*swig_scale_get = *otapic::OfferDataNym_scale_get; +*swig_scale_set = *otapic::OfferDataNym_scale_set; +*swig_price_per_scale_get = *otapic::OfferDataNym_price_per_scale_get; +*swig_price_per_scale_set = *otapic::OfferDataNym_price_per_scale_set; +*swig_transaction_id_get = *otapic::OfferDataNym_transaction_id_get; +*swig_transaction_id_set = *otapic::OfferDataNym_transaction_id_set; +*swig_total_assets_get = *otapic::OfferDataNym_total_assets_get; +*swig_total_assets_set = *otapic::OfferDataNym_total_assets_set; +*swig_finished_so_far_get = *otapic::OfferDataNym_finished_so_far_get; +*swig_finished_so_far_set = *otapic::OfferDataNym_finished_so_far_set; +*swig_minimum_increment_get = *otapic::OfferDataNym_minimum_increment_get; +*swig_minimum_increment_set = *otapic::OfferDataNym_minimum_increment_set; +*swig_stop_sign_get = *otapic::OfferDataNym_stop_sign_get; +*swig_stop_sign_set = *otapic::OfferDataNym_stop_sign_set; +*swig_stop_price_get = *otapic::OfferDataNym_stop_price_get; +*swig_stop_price_set = *otapic::OfferDataNym_stop_price_set; +*ot_dynamic_cast = *otapic::OfferDataNym_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::OfferListNym ############## + +package otapi::OfferListNym; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_OfferListNym($self); + delete $OWNER{$self}; + } +} + +*GetOfferDataNymCount = *otapic::OfferListNym_GetOfferDataNymCount; +*GetOfferDataNym = *otapic::OfferListNym_GetOfferDataNym; +*RemoveOfferDataNym = *otapic::OfferListNym_RemoveOfferDataNym; +*AddOfferDataNym = *otapic::OfferListNym_AddOfferDataNym; +*ot_dynamic_cast = *otapic::OfferListNym_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::TradeDataNym ############## + +package otapi::TradeDataNym; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_TradeDataNym($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::TradeDataNym_gui_label_get; +*swig_gui_label_set = *otapic::TradeDataNym_gui_label_set; +*swig_transaction_id_get = *otapic::TradeDataNym_transaction_id_get; +*swig_transaction_id_set = *otapic::TradeDataNym_transaction_id_set; +*swig_completed_count_get = *otapic::TradeDataNym_completed_count_get; +*swig_completed_count_set = *otapic::TradeDataNym_completed_count_set; +*swig_date_get = *otapic::TradeDataNym_date_get; +*swig_date_set = *otapic::TradeDataNym_date_set; +*swig_price_get = *otapic::TradeDataNym_price_get; +*swig_price_set = *otapic::TradeDataNym_price_set; +*swig_amount_sold_get = *otapic::TradeDataNym_amount_sold_get; +*swig_amount_sold_set = *otapic::TradeDataNym_amount_sold_set; +*ot_dynamic_cast = *otapic::TradeDataNym_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::TradeListNym ############## + +package otapi::TradeListNym; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_TradeListNym($self); + delete $OWNER{$self}; + } +} + +*GetTradeDataNymCount = *otapic::TradeListNym_GetTradeDataNymCount; +*GetTradeDataNym = *otapic::TradeListNym_GetTradeDataNym; +*RemoveTradeDataNym = *otapic::TradeListNym_RemoveTradeDataNym; +*AddTradeDataNym = *otapic::TradeListNym_AddTradeDataNym; +*ot_dynamic_cast = *otapic::TradeListNym_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Acct ############## + +package otapi::Acct; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Acct($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::Acct_gui_label_get; +*swig_gui_label_set = *otapic::Acct_gui_label_set; +*swig_acct_id_get = *otapic::Acct_acct_id_get; +*swig_acct_id_set = *otapic::Acct_acct_id_set; +*swig_server_id_get = *otapic::Acct_server_id_get; +*swig_server_id_set = *otapic::Acct_server_id_set; +*ot_dynamic_cast = *otapic::Acct_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::BitcoinAcct ############## + +package otapi::BitcoinAcct; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Acct otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_BitcoinAcct($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::BitcoinAcct_gui_label_get; +*swig_gui_label_set = *otapic::BitcoinAcct_gui_label_set; +*swig_acct_id_get = *otapic::BitcoinAcct_acct_id_get; +*swig_acct_id_set = *otapic::BitcoinAcct_acct_id_set; +*swig_server_id_get = *otapic::BitcoinAcct_server_id_get; +*swig_server_id_set = *otapic::BitcoinAcct_server_id_set; +*swig_bitcoin_acct_name_get = *otapic::BitcoinAcct_bitcoin_acct_name_get; +*swig_bitcoin_acct_name_set = *otapic::BitcoinAcct_bitcoin_acct_name_set; +*ot_dynamic_cast = *otapic::BitcoinAcct_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::ServerInfo ############## + +package otapi::ServerInfo; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_ServerInfo($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::ServerInfo_gui_label_get; +*swig_gui_label_set = *otapic::ServerInfo_gui_label_set; +*swig_server_id_get = *otapic::ServerInfo_server_id_get; +*swig_server_id_set = *otapic::ServerInfo_server_id_set; +*swig_server_type_get = *otapic::ServerInfo_server_type_get; +*swig_server_type_set = *otapic::ServerInfo_server_type_set; +*ot_dynamic_cast = *otapic::ServerInfo_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Server ############## + +package otapi::Server; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::ServerInfo otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Server($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::Server_gui_label_get; +*swig_gui_label_set = *otapic::Server_gui_label_set; +*swig_server_id_get = *otapic::Server_server_id_get; +*swig_server_id_set = *otapic::Server_server_id_set; +*swig_server_type_get = *otapic::Server_server_type_get; +*swig_server_type_set = *otapic::Server_server_type_set; +*swig_server_host_get = *otapic::Server_server_host_get; +*swig_server_host_set = *otapic::Server_server_host_set; +*swig_server_port_get = *otapic::Server_server_port_get; +*swig_server_port_set = *otapic::Server_server_port_set; +*ot_dynamic_cast = *otapic::Server_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::BitcoinServer ############## + +package otapi::BitcoinServer; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Server otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_BitcoinServer($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::BitcoinServer_gui_label_get; +*swig_gui_label_set = *otapic::BitcoinServer_gui_label_set; +*swig_server_id_get = *otapic::BitcoinServer_server_id_get; +*swig_server_id_set = *otapic::BitcoinServer_server_id_set; +*swig_server_type_get = *otapic::BitcoinServer_server_type_get; +*swig_server_type_set = *otapic::BitcoinServer_server_type_set; +*swig_server_host_get = *otapic::BitcoinServer_server_host_get; +*swig_server_host_set = *otapic::BitcoinServer_server_host_set; +*swig_server_port_get = *otapic::BitcoinServer_server_port_get; +*swig_server_port_set = *otapic::BitcoinServer_server_port_set; +*swig_bitcoin_username_get = *otapic::BitcoinServer_bitcoin_username_get; +*swig_bitcoin_username_set = *otapic::BitcoinServer_bitcoin_username_set; +*swig_bitcoin_password_get = *otapic::BitcoinServer_bitcoin_password_get; +*swig_bitcoin_password_set = *otapic::BitcoinServer_bitcoin_password_set; +*ot_dynamic_cast = *otapic::BitcoinServer_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::RippleServer ############## + +package otapi::RippleServer; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Server otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_RippleServer($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::RippleServer_gui_label_get; +*swig_gui_label_set = *otapic::RippleServer_gui_label_set; +*swig_server_id_get = *otapic::RippleServer_server_id_get; +*swig_server_id_set = *otapic::RippleServer_server_id_set; +*swig_server_type_get = *otapic::RippleServer_server_type_get; +*swig_server_type_set = *otapic::RippleServer_server_type_set; +*swig_server_host_get = *otapic::RippleServer_server_host_get; +*swig_server_host_set = *otapic::RippleServer_server_host_set; +*swig_server_port_get = *otapic::RippleServer_server_port_get; +*swig_server_port_set = *otapic::RippleServer_server_port_set; +*swig_ripple_username_get = *otapic::RippleServer_ripple_username_get; +*swig_ripple_username_set = *otapic::RippleServer_ripple_username_set; +*swig_ripple_password_get = *otapic::RippleServer_ripple_password_get; +*swig_ripple_password_set = *otapic::RippleServer_ripple_password_set; +*swig_namefield_id_get = *otapic::RippleServer_namefield_id_get; +*swig_namefield_id_set = *otapic::RippleServer_namefield_id_set; +*swig_passfield_id_get = *otapic::RippleServer_passfield_id_get; +*swig_passfield_id_set = *otapic::RippleServer_passfield_id_set; +*ot_dynamic_cast = *otapic::RippleServer_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::LoomServer ############## + +package otapi::LoomServer; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Server otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_LoomServer($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::LoomServer_gui_label_get; +*swig_gui_label_set = *otapic::LoomServer_gui_label_set; +*swig_server_id_get = *otapic::LoomServer_server_id_get; +*swig_server_id_set = *otapic::LoomServer_server_id_set; +*swig_server_type_get = *otapic::LoomServer_server_type_get; +*swig_server_type_set = *otapic::LoomServer_server_type_set; +*swig_server_host_get = *otapic::LoomServer_server_host_get; +*swig_server_host_set = *otapic::LoomServer_server_host_set; +*swig_server_port_get = *otapic::LoomServer_server_port_get; +*swig_server_port_set = *otapic::LoomServer_server_port_set; +*swig_loom_username_get = *otapic::LoomServer_loom_username_get; +*swig_loom_username_set = *otapic::LoomServer_loom_username_set; +*swig_namefield_id_get = *otapic::LoomServer_namefield_id_get; +*swig_namefield_id_set = *otapic::LoomServer_namefield_id_set; +*ot_dynamic_cast = *otapic::LoomServer_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::ContactNym ############## + +package otapi::ContactNym; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_ContactNym($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::ContactNym_gui_label_get; +*swig_gui_label_set = *otapic::ContactNym_gui_label_set; +*swig_nym_type_get = *otapic::ContactNym_nym_type_get; +*swig_nym_type_set = *otapic::ContactNym_nym_type_set; +*swig_nym_id_get = *otapic::ContactNym_nym_id_get; +*swig_nym_id_set = *otapic::ContactNym_nym_id_set; +*swig_public_key_get = *otapic::ContactNym_public_key_get; +*swig_public_key_set = *otapic::ContactNym_public_key_set; +*swig_memo_get = *otapic::ContactNym_memo_get; +*swig_memo_set = *otapic::ContactNym_memo_set; +*GetServerInfoCount = *otapic::ContactNym_GetServerInfoCount; +*GetServerInfo = *otapic::ContactNym_GetServerInfo; +*RemoveServerInfo = *otapic::ContactNym_RemoveServerInfo; +*AddServerInfo = *otapic::ContactNym_AddServerInfo; +*ot_dynamic_cast = *otapic::ContactNym_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::WalletData ############## + +package otapi::WalletData; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_WalletData($self); + delete $OWNER{$self}; + } +} + +*GetBitcoinServerCount = *otapic::WalletData_GetBitcoinServerCount; +*GetBitcoinServer = *otapic::WalletData_GetBitcoinServer; +*RemoveBitcoinServer = *otapic::WalletData_RemoveBitcoinServer; +*AddBitcoinServer = *otapic::WalletData_AddBitcoinServer; +*GetBitcoinAcctCount = *otapic::WalletData_GetBitcoinAcctCount; +*GetBitcoinAcct = *otapic::WalletData_GetBitcoinAcct; +*RemoveBitcoinAcct = *otapic::WalletData_RemoveBitcoinAcct; +*AddBitcoinAcct = *otapic::WalletData_AddBitcoinAcct; +*GetRippleServerCount = *otapic::WalletData_GetRippleServerCount; +*GetRippleServer = *otapic::WalletData_GetRippleServer; +*RemoveRippleServer = *otapic::WalletData_RemoveRippleServer; +*AddRippleServer = *otapic::WalletData_AddRippleServer; +*GetLoomServerCount = *otapic::WalletData_GetLoomServerCount; +*GetLoomServer = *otapic::WalletData_GetLoomServer; +*RemoveLoomServer = *otapic::WalletData_RemoveLoomServer; +*AddLoomServer = *otapic::WalletData_AddLoomServer; +*ot_dynamic_cast = *otapic::WalletData_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::ContactAcct ############## + +package otapi::ContactAcct; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_ContactAcct($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::ContactAcct_gui_label_get; +*swig_gui_label_set = *otapic::ContactAcct_gui_label_set; +*swig_server_type_get = *otapic::ContactAcct_server_type_get; +*swig_server_type_set = *otapic::ContactAcct_server_type_set; +*swig_server_id_get = *otapic::ContactAcct_server_id_get; +*swig_server_id_set = *otapic::ContactAcct_server_id_set; +*swig_asset_type_id_get = *otapic::ContactAcct_asset_type_id_get; +*swig_asset_type_id_set = *otapic::ContactAcct_asset_type_id_set; +*swig_acct_id_get = *otapic::ContactAcct_acct_id_get; +*swig_acct_id_set = *otapic::ContactAcct_acct_id_set; +*swig_nym_id_get = *otapic::ContactAcct_nym_id_get; +*swig_nym_id_set = *otapic::ContactAcct_nym_id_set; +*swig_memo_get = *otapic::ContactAcct_memo_get; +*swig_memo_set = *otapic::ContactAcct_memo_set; +*swig_public_key_get = *otapic::ContactAcct_public_key_get; +*swig_public_key_set = *otapic::ContactAcct_public_key_set; +*ot_dynamic_cast = *otapic::ContactAcct_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::Contact ############## + +package otapi::Contact; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Displayable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_Contact($self); + delete $OWNER{$self}; + } +} + +*swig_gui_label_get = *otapic::Contact_gui_label_get; +*swig_gui_label_set = *otapic::Contact_gui_label_set; +*swig_contact_id_get = *otapic::Contact_contact_id_get; +*swig_contact_id_set = *otapic::Contact_contact_id_set; +*swig_email_get = *otapic::Contact_email_get; +*swig_email_set = *otapic::Contact_email_set; +*swig_memo_get = *otapic::Contact_memo_get; +*swig_memo_set = *otapic::Contact_memo_set; +*swig_public_key_get = *otapic::Contact_public_key_get; +*swig_public_key_set = *otapic::Contact_public_key_set; +*GetContactNymCount = *otapic::Contact_GetContactNymCount; +*GetContactNym = *otapic::Contact_GetContactNym; +*RemoveContactNym = *otapic::Contact_RemoveContactNym; +*AddContactNym = *otapic::Contact_AddContactNym; +*GetContactAcctCount = *otapic::Contact_GetContactAcctCount; +*GetContactAcct = *otapic::Contact_GetContactAcct; +*RemoveContactAcct = *otapic::Contact_RemoveContactAcct; +*AddContactAcct = *otapic::Contact_AddContactAcct; +*ot_dynamic_cast = *otapic::Contact_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +############# Class : otapi::AddressBook ############## + +package otapi::AddressBook; +use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS); +@ISA = qw( otapi::Storable otapi ); +%OWNER = (); +%ITERATORS = (); +sub DESTROY { + return unless $_[0]->isa('HASH'); + my $self = tied(%{$_[0]}); + return unless defined $self; + delete $ITERATORS{$self}; + if (exists $OWNER{$self}) { + otapic::delete_AddressBook($self); + delete $OWNER{$self}; + } +} + +*GetContactCount = *otapic::AddressBook_GetContactCount; +*GetContact = *otapic::AddressBook_GetContact; +*RemoveContact = *otapic::AddressBook_RemoveContact; +*AddContact = *otapic::AddressBook_AddContact; +*ot_dynamic_cast = *otapic::AddressBook_ot_dynamic_cast; +sub DISOWN { + my $self = shift; + my $ptr = tied(%$self); + delete $OWNER{$ptr}; +} + +sub ACQUIRE { + my $self = shift; + my $ptr = tied(%$self); + $OWNER{$ptr} = 1; +} + + +# ------- VARIABLE STUBS -------- + +package otapi; + +*PACK_MESSAGE_PACK = *otapic::PACK_MESSAGE_PACK; +*PACK_PROTOCOL_BUFFERS = *otapic::PACK_PROTOCOL_BUFFERS; +*PACK_TYPE_ERROR = *otapic::PACK_TYPE_ERROR; +*STORE_FILESYSTEM = *otapic::STORE_FILESYSTEM; +*STORE_TYPE_SUBCLASS = *otapic::STORE_TYPE_SUBCLASS; +*STORED_OBJ_STRING = *otapic::STORED_OBJ_STRING; +*STORED_OBJ_BLOB = *otapic::STORED_OBJ_BLOB; +*STORED_OBJ_STRING_MAP = *otapic::STORED_OBJ_STRING_MAP; +*STORED_OBJ_WALLET_DATA = *otapic::STORED_OBJ_WALLET_DATA; +*STORED_OBJ_BITCOIN_ACCT = *otapic::STORED_OBJ_BITCOIN_ACCT; +*STORED_OBJ_BITCOIN_SERVER = *otapic::STORED_OBJ_BITCOIN_SERVER; +*STORED_OBJ_RIPPLE_SERVER = *otapic::STORED_OBJ_RIPPLE_SERVER; +*STORED_OBJ_LOOM_SERVER = *otapic::STORED_OBJ_LOOM_SERVER; +*STORED_OBJ_SERVER_INFO = *otapic::STORED_OBJ_SERVER_INFO; +*STORED_OBJ_CONTACT_NYM = *otapic::STORED_OBJ_CONTACT_NYM; +*STORED_OBJ_CONTACT_ACCT = *otapic::STORED_OBJ_CONTACT_ACCT; +*STORED_OBJ_CONTACT = *otapic::STORED_OBJ_CONTACT; +*STORED_OBJ_ADDRESS_BOOK = *otapic::STORED_OBJ_ADDRESS_BOOK; +*STORED_OBJ_MARKET_DATA = *otapic::STORED_OBJ_MARKET_DATA; +*STORED_OBJ_MARKET_LIST = *otapic::STORED_OBJ_MARKET_LIST; +*STORED_OBJ_BID_DATA = *otapic::STORED_OBJ_BID_DATA; +*STORED_OBJ_ASK_DATA = *otapic::STORED_OBJ_ASK_DATA; +*STORED_OBJ_OFFER_LIST_MARKET = *otapic::STORED_OBJ_OFFER_LIST_MARKET; +*STORED_OBJ_TRADE_DATA_MARKET = *otapic::STORED_OBJ_TRADE_DATA_MARKET; +*STORED_OBJ_TRADE_LIST_MARKET = *otapic::STORED_OBJ_TRADE_LIST_MARKET; +*STORED_OBJ_OFFER_DATA_NYM = *otapic::STORED_OBJ_OFFER_DATA_NYM; +*STORED_OBJ_OFFER_LIST_NYM = *otapic::STORED_OBJ_OFFER_LIST_NYM; +*STORED_OBJ_TRADE_DATA_NYM = *otapic::STORED_OBJ_TRADE_DATA_NYM; +*STORED_OBJ_TRADE_LIST_NYM = *otapic::STORED_OBJ_TRADE_LIST_NYM; +*STORED_OBJ_ERROR = *otapic::STORED_OBJ_ERROR; +1; diff --git a/testwallet/otapi.py b/testwallet/otapi.py new file mode 100644 index 000000000..53460a58c --- /dev/null +++ b/testwallet/otapi.py @@ -0,0 +1,1900 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 2.0.4 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + + + +from sys import version_info +if version_info >= (2,6,0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_otapi', [dirname(__file__)]) + except ImportError: + import _otapi + return _otapi + if fp is not None: + try: + _mod = imp.load_module('_otapi', fp, pathname, description) + finally: + fp.close() + return _mod + _otapi = swig_import_helper() + del swig_import_helper +else: + import _otapi +del version_info +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. +def _swig_setattr_nondynamic(self,class_type,name,value,static=1): + if (name == "thisown"): return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name,None) + if method: return method(self,value) + if (not static): + self.__dict__[name] = value + else: + raise AttributeError("You cannot add attributes to %s" % self) + +def _swig_setattr(self,class_type,name,value): + return _swig_setattr_nondynamic(self,class_type,name,value,0) + +def _swig_getattr(self,class_type,name): + if (name == "thisown"): return self.this.own() + method = class_type.__swig_getmethods__.get(name,None) + if method: return method(self) + raise AttributeError(name) + +def _swig_repr(self): + try: strthis = "proxy of " + self.this.__repr__() + except: strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + +try: + _object = object + _newclass = 1 +except AttributeError: + class _object : pass + _newclass = 0 + + +try: + import weakref + weakref_proxy = weakref.proxy +except: + weakref_proxy = lambda x: x + + +class OTCallback(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, OTCallback, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, OTCallback, name) + __repr__ = _swig_repr + def __init__(self): + if self.__class__ == OTCallback: + _self = None + else: + _self = self + this = _otapi.new_OTCallback(_self, ) + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _otapi.delete_OTCallback + __del__ = lambda self : None; + def runOne(self): return _otapi.OTCallback_runOne(self) + def runTwo(self): return _otapi.OTCallback_runTwo(self) + def __disown__(self): + self.this.disown() + _otapi.disown_OTCallback(self) + return weakref_proxy(self) +OTCallback_swigregister = _otapi.OTCallback_swigregister +OTCallback_swigregister(OTCallback) + +class OTCaller(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, OTCaller, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, OTCaller, name) + __repr__ = _swig_repr + def __init__(self): + this = _otapi.new_OTCaller() + try: self.this.append(this) + except: self.this = this + __swig_destroy__ = _otapi.delete_OTCaller + __del__ = lambda self : None; + def GetPassword(self): return _otapi.OTCaller_GetPassword(self) + def delCallback(self): return _otapi.OTCaller_delCallback(self) + def setCallback(self, *args): return _otapi.OTCaller_setCallback(self, *args) + def isCallbackSet(self): return _otapi.OTCaller_isCallbackSet(self) + def callOne(self): return _otapi.OTCaller_callOne(self) + def callTwo(self): return _otapi.OTCaller_callTwo(self) +OTCaller_swigregister = _otapi.OTCaller_swigregister +OTCaller_swigregister(OTCaller) + + +def OT_API_Set_PasswordCallback(*args): + return _otapi.OT_API_Set_PasswordCallback(*args) +OT_API_Set_PasswordCallback = _otapi.OT_API_Set_PasswordCallback + +def OT_API_Init(*args): + return _otapi.OT_API_Init(*args) +OT_API_Init = _otapi.OT_API_Init + +def OT_API_LoadWallet(*args): + return _otapi.OT_API_LoadWallet(*args) +OT_API_LoadWallet = _otapi.OT_API_LoadWallet + +def OT_API_SwitchWallet(*args): + return _otapi.OT_API_SwitchWallet(*args) +OT_API_SwitchWallet = _otapi.OT_API_SwitchWallet + +def OT_API_GetMemlogSize(): + return _otapi.OT_API_GetMemlogSize() +OT_API_GetMemlogSize = _otapi.OT_API_GetMemlogSize + +def OT_API_GetMemlogAtIndex(*args): + return _otapi.OT_API_GetMemlogAtIndex(*args) +OT_API_GetMemlogAtIndex = _otapi.OT_API_GetMemlogAtIndex + +def OT_API_PeekMemlogFront(): + return _otapi.OT_API_PeekMemlogFront() +OT_API_PeekMemlogFront = _otapi.OT_API_PeekMemlogFront + +def OT_API_PeekMemlogBack(): + return _otapi.OT_API_PeekMemlogBack() +OT_API_PeekMemlogBack = _otapi.OT_API_PeekMemlogBack + +def OT_API_PopMemlogFront(): + return _otapi.OT_API_PopMemlogFront() +OT_API_PopMemlogFront = _otapi.OT_API_PopMemlogFront + +def OT_API_PopMemlogBack(): + return _otapi.OT_API_PopMemlogBack() +OT_API_PopMemlogBack = _otapi.OT_API_PopMemlogBack + +def OT_API_CreateNym(): + return _otapi.OT_API_CreateNym() +OT_API_CreateNym = _otapi.OT_API_CreateNym + +def OT_API_AddServerContract(*args): + return _otapi.OT_API_AddServerContract(*args) +OT_API_AddServerContract = _otapi.OT_API_AddServerContract + +def OT_API_AddAssetContract(*args): + return _otapi.OT_API_AddAssetContract(*args) +OT_API_AddAssetContract = _otapi.OT_API_AddAssetContract + +def OT_API_GetServerCount(): + return _otapi.OT_API_GetServerCount() +OT_API_GetServerCount = _otapi.OT_API_GetServerCount + +def OT_API_GetAssetTypeCount(): + return _otapi.OT_API_GetAssetTypeCount() +OT_API_GetAssetTypeCount = _otapi.OT_API_GetAssetTypeCount + +def OT_API_GetAccountCount(): + return _otapi.OT_API_GetAccountCount() +OT_API_GetAccountCount = _otapi.OT_API_GetAccountCount + +def OT_API_GetNymCount(): + return _otapi.OT_API_GetNymCount() +OT_API_GetNymCount = _otapi.OT_API_GetNymCount + +def OT_API_GetServer_ID(*args): + return _otapi.OT_API_GetServer_ID(*args) +OT_API_GetServer_ID = _otapi.OT_API_GetServer_ID + +def OT_API_GetServer_Name(*args): + return _otapi.OT_API_GetServer_Name(*args) +OT_API_GetServer_Name = _otapi.OT_API_GetServer_Name + +def OT_API_GetAssetType_ID(*args): + return _otapi.OT_API_GetAssetType_ID(*args) +OT_API_GetAssetType_ID = _otapi.OT_API_GetAssetType_ID + +def OT_API_GetAssetType_Name(*args): + return _otapi.OT_API_GetAssetType_Name(*args) +OT_API_GetAssetType_Name = _otapi.OT_API_GetAssetType_Name + +def OT_API_GetAccountWallet_ID(*args): + return _otapi.OT_API_GetAccountWallet_ID(*args) +OT_API_GetAccountWallet_ID = _otapi.OT_API_GetAccountWallet_ID + +def OT_API_GetAccountWallet_Name(*args): + return _otapi.OT_API_GetAccountWallet_Name(*args) +OT_API_GetAccountWallet_Name = _otapi.OT_API_GetAccountWallet_Name + +def OT_API_GetAccountWallet_Balance(*args): + return _otapi.OT_API_GetAccountWallet_Balance(*args) +OT_API_GetAccountWallet_Balance = _otapi.OT_API_GetAccountWallet_Balance + +def OT_API_GetAccountWallet_Type(*args): + return _otapi.OT_API_GetAccountWallet_Type(*args) +OT_API_GetAccountWallet_Type = _otapi.OT_API_GetAccountWallet_Type + +def OT_API_GetAccountWallet_AssetTypeID(*args): + return _otapi.OT_API_GetAccountWallet_AssetTypeID(*args) +OT_API_GetAccountWallet_AssetTypeID = _otapi.OT_API_GetAccountWallet_AssetTypeID + +def OT_API_GetAccountWallet_ServerID(*args): + return _otapi.OT_API_GetAccountWallet_ServerID(*args) +OT_API_GetAccountWallet_ServerID = _otapi.OT_API_GetAccountWallet_ServerID + +def OT_API_GetAccountWallet_NymID(*args): + return _otapi.OT_API_GetAccountWallet_NymID(*args) +OT_API_GetAccountWallet_NymID = _otapi.OT_API_GetAccountWallet_NymID + +def OT_API_VerifyAccountReceipt(*args): + return _otapi.OT_API_VerifyAccountReceipt(*args) +OT_API_VerifyAccountReceipt = _otapi.OT_API_VerifyAccountReceipt + +def OT_API_GetNym_TransactionNumCount(*args): + return _otapi.OT_API_GetNym_TransactionNumCount(*args) +OT_API_GetNym_TransactionNumCount = _otapi.OT_API_GetNym_TransactionNumCount + +def OT_API_GetNym_ID(*args): + return _otapi.OT_API_GetNym_ID(*args) +OT_API_GetNym_ID = _otapi.OT_API_GetNym_ID + +def OT_API_GetNym_Name(*args): + return _otapi.OT_API_GetNym_Name(*args) +OT_API_GetNym_Name = _otapi.OT_API_GetNym_Name + +def OT_API_GetNym_Stats(*args): + return _otapi.OT_API_GetNym_Stats(*args) +OT_API_GetNym_Stats = _otapi.OT_API_GetNym_Stats + +def OT_API_IsNym_RegisteredAtServer(*args): + return _otapi.OT_API_IsNym_RegisteredAtServer(*args) +OT_API_IsNym_RegisteredAtServer = _otapi.OT_API_IsNym_RegisteredAtServer + +def OT_API_GetNym_MailCount(*args): + return _otapi.OT_API_GetNym_MailCount(*args) +OT_API_GetNym_MailCount = _otapi.OT_API_GetNym_MailCount + +def OT_API_GetNym_MailContentsByIndex(*args): + return _otapi.OT_API_GetNym_MailContentsByIndex(*args) +OT_API_GetNym_MailContentsByIndex = _otapi.OT_API_GetNym_MailContentsByIndex + +def OT_API_GetNym_MailSenderIDByIndex(*args): + return _otapi.OT_API_GetNym_MailSenderIDByIndex(*args) +OT_API_GetNym_MailSenderIDByIndex = _otapi.OT_API_GetNym_MailSenderIDByIndex + +def OT_API_GetNym_MailServerIDByIndex(*args): + return _otapi.OT_API_GetNym_MailServerIDByIndex(*args) +OT_API_GetNym_MailServerIDByIndex = _otapi.OT_API_GetNym_MailServerIDByIndex + +def OT_API_Nym_RemoveMailByIndex(*args): + return _otapi.OT_API_Nym_RemoveMailByIndex(*args) +OT_API_Nym_RemoveMailByIndex = _otapi.OT_API_Nym_RemoveMailByIndex + +def OT_API_Nym_VerifyMailByIndex(*args): + return _otapi.OT_API_Nym_VerifyMailByIndex(*args) +OT_API_Nym_VerifyMailByIndex = _otapi.OT_API_Nym_VerifyMailByIndex + +def OT_API_GetNym_OutmailCount(*args): + return _otapi.OT_API_GetNym_OutmailCount(*args) +OT_API_GetNym_OutmailCount = _otapi.OT_API_GetNym_OutmailCount + +def OT_API_GetNym_OutmailContentsByIndex(*args): + return _otapi.OT_API_GetNym_OutmailContentsByIndex(*args) +OT_API_GetNym_OutmailContentsByIndex = _otapi.OT_API_GetNym_OutmailContentsByIndex + +def OT_API_GetNym_OutmailRecipientIDByIndex(*args): + return _otapi.OT_API_GetNym_OutmailRecipientIDByIndex(*args) +OT_API_GetNym_OutmailRecipientIDByIndex = _otapi.OT_API_GetNym_OutmailRecipientIDByIndex + +def OT_API_GetNym_OutmailServerIDByIndex(*args): + return _otapi.OT_API_GetNym_OutmailServerIDByIndex(*args) +OT_API_GetNym_OutmailServerIDByIndex = _otapi.OT_API_GetNym_OutmailServerIDByIndex + +def OT_API_Nym_RemoveOutmailByIndex(*args): + return _otapi.OT_API_Nym_RemoveOutmailByIndex(*args) +OT_API_Nym_RemoveOutmailByIndex = _otapi.OT_API_Nym_RemoveOutmailByIndex + +def OT_API_Nym_VerifyOutmailByIndex(*args): + return _otapi.OT_API_Nym_VerifyOutmailByIndex(*args) +OT_API_Nym_VerifyOutmailByIndex = _otapi.OT_API_Nym_VerifyOutmailByIndex + +def OT_API_Wallet_CanRemoveServer(*args): + return _otapi.OT_API_Wallet_CanRemoveServer(*args) +OT_API_Wallet_CanRemoveServer = _otapi.OT_API_Wallet_CanRemoveServer + +def OT_API_Wallet_RemoveServer(*args): + return _otapi.OT_API_Wallet_RemoveServer(*args) +OT_API_Wallet_RemoveServer = _otapi.OT_API_Wallet_RemoveServer + +def OT_API_Wallet_CanRemoveAssetType(*args): + return _otapi.OT_API_Wallet_CanRemoveAssetType(*args) +OT_API_Wallet_CanRemoveAssetType = _otapi.OT_API_Wallet_CanRemoveAssetType + +def OT_API_Wallet_RemoveAssetType(*args): + return _otapi.OT_API_Wallet_RemoveAssetType(*args) +OT_API_Wallet_RemoveAssetType = _otapi.OT_API_Wallet_RemoveAssetType + +def OT_API_Wallet_CanRemoveNym(*args): + return _otapi.OT_API_Wallet_CanRemoveNym(*args) +OT_API_Wallet_CanRemoveNym = _otapi.OT_API_Wallet_CanRemoveNym + +def OT_API_Wallet_RemoveNym(*args): + return _otapi.OT_API_Wallet_RemoveNym(*args) +OT_API_Wallet_RemoveNym = _otapi.OT_API_Wallet_RemoveNym + +def OT_API_Wallet_CanRemoveAccount(*args): + return _otapi.OT_API_Wallet_CanRemoveAccount(*args) +OT_API_Wallet_CanRemoveAccount = _otapi.OT_API_Wallet_CanRemoveAccount + +def OT_API_Wallet_ImportNym(*args): + return _otapi.OT_API_Wallet_ImportNym(*args) +OT_API_Wallet_ImportNym = _otapi.OT_API_Wallet_ImportNym + +def OT_API_SetNym_Name(*args): + return _otapi.OT_API_SetNym_Name(*args) +OT_API_SetNym_Name = _otapi.OT_API_SetNym_Name + +def OT_API_SetAccountWallet_Name(*args): + return _otapi.OT_API_SetAccountWallet_Name(*args) +OT_API_SetAccountWallet_Name = _otapi.OT_API_SetAccountWallet_Name + +def OT_API_SetAssetType_Name(*args): + return _otapi.OT_API_SetAssetType_Name(*args) +OT_API_SetAssetType_Name = _otapi.OT_API_SetAssetType_Name + +def OT_API_SetServer_Name(*args): + return _otapi.OT_API_SetServer_Name(*args) +OT_API_SetServer_Name = _otapi.OT_API_SetServer_Name + +def OT_API_VerifyAndRetrieveXMLContents(*args): + return _otapi.OT_API_VerifyAndRetrieveXMLContents(*args) +OT_API_VerifyAndRetrieveXMLContents = _otapi.OT_API_VerifyAndRetrieveXMLContents + +def OT_API_WriteCheque(*args): + return _otapi.OT_API_WriteCheque(*args) +OT_API_WriteCheque = _otapi.OT_API_WriteCheque + +def OT_API_ProposePaymentPlan(*args): + return _otapi.OT_API_ProposePaymentPlan(*args) +OT_API_ProposePaymentPlan = _otapi.OT_API_ProposePaymentPlan + +def OT_API_ConfirmPaymentPlan(*args): + return _otapi.OT_API_ConfirmPaymentPlan(*args) +OT_API_ConfirmPaymentPlan = _otapi.OT_API_ConfirmPaymentPlan + +def OT_API_LoadUserPubkey(*args): + return _otapi.OT_API_LoadUserPubkey(*args) +OT_API_LoadUserPubkey = _otapi.OT_API_LoadUserPubkey + +def OT_API_LoadPubkey(*args): + return _otapi.OT_API_LoadPubkey(*args) +OT_API_LoadPubkey = _otapi.OT_API_LoadPubkey + +def OT_API_VerifyUserPrivateKey(*args): + return _otapi.OT_API_VerifyUserPrivateKey(*args) +OT_API_VerifyUserPrivateKey = _otapi.OT_API_VerifyUserPrivateKey + +def OT_API_LoadPurse(*args): + return _otapi.OT_API_LoadPurse(*args) +OT_API_LoadPurse = _otapi.OT_API_LoadPurse + +def OT_API_LoadMint(*args): + return _otapi.OT_API_LoadMint(*args) +OT_API_LoadMint = _otapi.OT_API_LoadMint + +def OT_API_LoadAssetContract(*args): + return _otapi.OT_API_LoadAssetContract(*args) +OT_API_LoadAssetContract = _otapi.OT_API_LoadAssetContract + +def OT_API_LoadServerContract(*args): + return _otapi.OT_API_LoadServerContract(*args) +OT_API_LoadServerContract = _otapi.OT_API_LoadServerContract + +def OT_API_Mint_IsStillGood(*args): + return _otapi.OT_API_Mint_IsStillGood(*args) +OT_API_Mint_IsStillGood = _otapi.OT_API_Mint_IsStillGood + +def OT_API_IsBasketCurrency(*args): + return _otapi.OT_API_IsBasketCurrency(*args) +OT_API_IsBasketCurrency = _otapi.OT_API_IsBasketCurrency + +def OT_API_Basket_GetMemberCount(*args): + return _otapi.OT_API_Basket_GetMemberCount(*args) +OT_API_Basket_GetMemberCount = _otapi.OT_API_Basket_GetMemberCount + +def OT_API_Basket_GetMemberType(*args): + return _otapi.OT_API_Basket_GetMemberType(*args) +OT_API_Basket_GetMemberType = _otapi.OT_API_Basket_GetMemberType + +def OT_API_Basket_GetMinimumTransferAmount(*args): + return _otapi.OT_API_Basket_GetMinimumTransferAmount(*args) +OT_API_Basket_GetMinimumTransferAmount = _otapi.OT_API_Basket_GetMinimumTransferAmount + +def OT_API_Basket_GetMemberMinimumTransferAmount(*args): + return _otapi.OT_API_Basket_GetMemberMinimumTransferAmount(*args) +OT_API_Basket_GetMemberMinimumTransferAmount = _otapi.OT_API_Basket_GetMemberMinimumTransferAmount + +def OT_API_LoadAssetAccount(*args): + return _otapi.OT_API_LoadAssetAccount(*args) +OT_API_LoadAssetAccount = _otapi.OT_API_LoadAssetAccount + +def OT_API_LoadInbox(*args): + return _otapi.OT_API_LoadInbox(*args) +OT_API_LoadInbox = _otapi.OT_API_LoadInbox + +def OT_API_LoadOutbox(*args): + return _otapi.OT_API_LoadOutbox(*args) +OT_API_LoadOutbox = _otapi.OT_API_LoadOutbox + +def OT_API_Ledger_GetCount(*args): + return _otapi.OT_API_Ledger_GetCount(*args) +OT_API_Ledger_GetCount = _otapi.OT_API_Ledger_GetCount + +def OT_API_Ledger_CreateResponse(*args): + return _otapi.OT_API_Ledger_CreateResponse(*args) +OT_API_Ledger_CreateResponse = _otapi.OT_API_Ledger_CreateResponse + +def OT_API_Ledger_GetTransactionByIndex(*args): + return _otapi.OT_API_Ledger_GetTransactionByIndex(*args) +OT_API_Ledger_GetTransactionByIndex = _otapi.OT_API_Ledger_GetTransactionByIndex + +def OT_API_Ledger_GetTransactionByID(*args): + return _otapi.OT_API_Ledger_GetTransactionByID(*args) +OT_API_Ledger_GetTransactionByID = _otapi.OT_API_Ledger_GetTransactionByID + +def OT_API_Ledger_GetTransactionIDByIndex(*args): + return _otapi.OT_API_Ledger_GetTransactionIDByIndex(*args) +OT_API_Ledger_GetTransactionIDByIndex = _otapi.OT_API_Ledger_GetTransactionIDByIndex + +def OT_API_Ledger_AddTransaction(*args): + return _otapi.OT_API_Ledger_AddTransaction(*args) +OT_API_Ledger_AddTransaction = _otapi.OT_API_Ledger_AddTransaction + +def OT_API_Transaction_CreateResponse(*args): + return _otapi.OT_API_Transaction_CreateResponse(*args) +OT_API_Transaction_CreateResponse = _otapi.OT_API_Transaction_CreateResponse + +def OT_API_Ledger_FinalizeResponse(*args): + return _otapi.OT_API_Ledger_FinalizeResponse(*args) +OT_API_Ledger_FinalizeResponse = _otapi.OT_API_Ledger_FinalizeResponse + +def OT_API_Transaction_GetType(*args): + return _otapi.OT_API_Transaction_GetType(*args) +OT_API_Transaction_GetType = _otapi.OT_API_Transaction_GetType + +def OT_API_Transaction_GetVoucher(*args): + return _otapi.OT_API_Transaction_GetVoucher(*args) +OT_API_Transaction_GetVoucher = _otapi.OT_API_Transaction_GetVoucher + +def OT_API_Transaction_GetSuccess(*args): + return _otapi.OT_API_Transaction_GetSuccess(*args) +OT_API_Transaction_GetSuccess = _otapi.OT_API_Transaction_GetSuccess + +def OT_API_Transaction_GetBalanceAgreementSuccess(*args): + return _otapi.OT_API_Transaction_GetBalanceAgreementSuccess(*args) +OT_API_Transaction_GetBalanceAgreementSuccess = _otapi.OT_API_Transaction_GetBalanceAgreementSuccess + +def OT_API_Transaction_GetDateSigned(*args): + return _otapi.OT_API_Transaction_GetDateSigned(*args) +OT_API_Transaction_GetDateSigned = _otapi.OT_API_Transaction_GetDateSigned + +def OT_API_Transaction_GetAmount(*args): + return _otapi.OT_API_Transaction_GetAmount(*args) +OT_API_Transaction_GetAmount = _otapi.OT_API_Transaction_GetAmount + +def OT_API_Pending_GetNote(*args): + return _otapi.OT_API_Pending_GetNote(*args) +OT_API_Pending_GetNote = _otapi.OT_API_Pending_GetNote + +def OT_API_Transaction_GetSenderUserID(*args): + return _otapi.OT_API_Transaction_GetSenderUserID(*args) +OT_API_Transaction_GetSenderUserID = _otapi.OT_API_Transaction_GetSenderUserID + +def OT_API_Transaction_GetSenderAcctID(*args): + return _otapi.OT_API_Transaction_GetSenderAcctID(*args) +OT_API_Transaction_GetSenderAcctID = _otapi.OT_API_Transaction_GetSenderAcctID + +def OT_API_Transaction_GetRecipientUserID(*args): + return _otapi.OT_API_Transaction_GetRecipientUserID(*args) +OT_API_Transaction_GetRecipientUserID = _otapi.OT_API_Transaction_GetRecipientUserID + +def OT_API_Transaction_GetRecipientAcctID(*args): + return _otapi.OT_API_Transaction_GetRecipientAcctID(*args) +OT_API_Transaction_GetRecipientAcctID = _otapi.OT_API_Transaction_GetRecipientAcctID + +def OT_API_Transaction_GetDisplayReferenceToNum(*args): + return _otapi.OT_API_Transaction_GetDisplayReferenceToNum(*args) +OT_API_Transaction_GetDisplayReferenceToNum = _otapi.OT_API_Transaction_GetDisplayReferenceToNum + +def OT_API_CreatePurse(*args): + return _otapi.OT_API_CreatePurse(*args) +OT_API_CreatePurse = _otapi.OT_API_CreatePurse + +def OT_API_SavePurse(*args): + return _otapi.OT_API_SavePurse(*args) +OT_API_SavePurse = _otapi.OT_API_SavePurse + +def OT_API_Purse_GetTotalValue(*args): + return _otapi.OT_API_Purse_GetTotalValue(*args) +OT_API_Purse_GetTotalValue = _otapi.OT_API_Purse_GetTotalValue + +def OT_API_Purse_Count(*args): + return _otapi.OT_API_Purse_Count(*args) +OT_API_Purse_Count = _otapi.OT_API_Purse_Count + +def OT_API_Purse_Peek(*args): + return _otapi.OT_API_Purse_Peek(*args) +OT_API_Purse_Peek = _otapi.OT_API_Purse_Peek + +def OT_API_Purse_Pop(*args): + return _otapi.OT_API_Purse_Pop(*args) +OT_API_Purse_Pop = _otapi.OT_API_Purse_Pop + +def OT_API_Purse_Push(*args): + return _otapi.OT_API_Purse_Push(*args) +OT_API_Purse_Push = _otapi.OT_API_Purse_Push + +def OT_API_Wallet_ImportPurse(*args): + return _otapi.OT_API_Wallet_ImportPurse(*args) +OT_API_Wallet_ImportPurse = _otapi.OT_API_Wallet_ImportPurse + +def OT_API_exchangePurse(*args): + return _otapi.OT_API_exchangePurse(*args) +OT_API_exchangePurse = _otapi.OT_API_exchangePurse + +def OT_API_Token_ChangeOwner(*args): + return _otapi.OT_API_Token_ChangeOwner(*args) +OT_API_Token_ChangeOwner = _otapi.OT_API_Token_ChangeOwner + +def OT_API_Token_GetID(*args): + return _otapi.OT_API_Token_GetID(*args) +OT_API_Token_GetID = _otapi.OT_API_Token_GetID + +def OT_API_Token_GetDenomination(*args): + return _otapi.OT_API_Token_GetDenomination(*args) +OT_API_Token_GetDenomination = _otapi.OT_API_Token_GetDenomination + +def OT_API_Token_GetSeries(*args): + return _otapi.OT_API_Token_GetSeries(*args) +OT_API_Token_GetSeries = _otapi.OT_API_Token_GetSeries + +def OT_API_Token_GetValidFrom(*args): + return _otapi.OT_API_Token_GetValidFrom(*args) +OT_API_Token_GetValidFrom = _otapi.OT_API_Token_GetValidFrom + +def OT_API_Token_GetValidTo(*args): + return _otapi.OT_API_Token_GetValidTo(*args) +OT_API_Token_GetValidTo = _otapi.OT_API_Token_GetValidTo + +def OT_API_Token_GetAssetID(*args): + return _otapi.OT_API_Token_GetAssetID(*args) +OT_API_Token_GetAssetID = _otapi.OT_API_Token_GetAssetID + +def OT_API_Token_GetServerID(*args): + return _otapi.OT_API_Token_GetServerID(*args) +OT_API_Token_GetServerID = _otapi.OT_API_Token_GetServerID + +def OT_API_checkServerID(*args): + return _otapi.OT_API_checkServerID(*args) +OT_API_checkServerID = _otapi.OT_API_checkServerID + +def OT_API_createUserAccount(*args): + return _otapi.OT_API_createUserAccount(*args) +OT_API_createUserAccount = _otapi.OT_API_createUserAccount + +def OT_API_deleteUserAccount(*args): + return _otapi.OT_API_deleteUserAccount(*args) +OT_API_deleteUserAccount = _otapi.OT_API_deleteUserAccount + +def OT_API_deleteAssetAccount(*args): + return _otapi.OT_API_deleteAssetAccount(*args) +OT_API_deleteAssetAccount = _otapi.OT_API_deleteAssetAccount + +def OT_API_checkUser(*args): + return _otapi.OT_API_checkUser(*args) +OT_API_checkUser = _otapi.OT_API_checkUser + +def OT_API_sendUserMessage(*args): + return _otapi.OT_API_sendUserMessage(*args) +OT_API_sendUserMessage = _otapi.OT_API_sendUserMessage + +def OT_API_getRequest(*args): + return _otapi.OT_API_getRequest(*args) +OT_API_getRequest = _otapi.OT_API_getRequest + +def OT_API_getTransactionNumber(*args): + return _otapi.OT_API_getTransactionNumber(*args) +OT_API_getTransactionNumber = _otapi.OT_API_getTransactionNumber + +def OT_API_issueAssetType(*args): + return _otapi.OT_API_issueAssetType(*args) +OT_API_issueAssetType = _otapi.OT_API_issueAssetType + +def OT_API_getContract(*args): + return _otapi.OT_API_getContract(*args) +OT_API_getContract = _otapi.OT_API_getContract + +def OT_API_getMint(*args): + return _otapi.OT_API_getMint(*args) +OT_API_getMint = _otapi.OT_API_getMint + +def OT_API_createAssetAccount(*args): + return _otapi.OT_API_createAssetAccount(*args) +OT_API_createAssetAccount = _otapi.OT_API_createAssetAccount + +def OT_API_getAccount(*args): + return _otapi.OT_API_getAccount(*args) +OT_API_getAccount = _otapi.OT_API_getAccount + +def OT_API_GenerateBasketCreation(*args): + return _otapi.OT_API_GenerateBasketCreation(*args) +OT_API_GenerateBasketCreation = _otapi.OT_API_GenerateBasketCreation + +def OT_API_AddBasketCreationItem(*args): + return _otapi.OT_API_AddBasketCreationItem(*args) +OT_API_AddBasketCreationItem = _otapi.OT_API_AddBasketCreationItem + +def OT_API_issueBasket(*args): + return _otapi.OT_API_issueBasket(*args) +OT_API_issueBasket = _otapi.OT_API_issueBasket + +def OT_API_GenerateBasketExchange(*args): + return _otapi.OT_API_GenerateBasketExchange(*args) +OT_API_GenerateBasketExchange = _otapi.OT_API_GenerateBasketExchange + +def OT_API_AddBasketExchangeItem(*args): + return _otapi.OT_API_AddBasketExchangeItem(*args) +OT_API_AddBasketExchangeItem = _otapi.OT_API_AddBasketExchangeItem + +def OT_API_exchangeBasket(*args): + return _otapi.OT_API_exchangeBasket(*args) +OT_API_exchangeBasket = _otapi.OT_API_exchangeBasket + +def OT_API_notarizeWithdrawal(*args): + return _otapi.OT_API_notarizeWithdrawal(*args) +OT_API_notarizeWithdrawal = _otapi.OT_API_notarizeWithdrawal + +def OT_API_notarizeDeposit(*args): + return _otapi.OT_API_notarizeDeposit(*args) +OT_API_notarizeDeposit = _otapi.OT_API_notarizeDeposit + +def OT_API_notarizeTransfer(*args): + return _otapi.OT_API_notarizeTransfer(*args) +OT_API_notarizeTransfer = _otapi.OT_API_notarizeTransfer + +def OT_API_getInbox(*args): + return _otapi.OT_API_getInbox(*args) +OT_API_getInbox = _otapi.OT_API_getInbox + +def OT_API_getOutbox(*args): + return _otapi.OT_API_getOutbox(*args) +OT_API_getOutbox = _otapi.OT_API_getOutbox + +def OT_API_getNymbox(*args): + return _otapi.OT_API_getNymbox(*args) +OT_API_getNymbox = _otapi.OT_API_getNymbox + +def OT_API_LoadNymbox(*args): + return _otapi.OT_API_LoadNymbox(*args) +OT_API_LoadNymbox = _otapi.OT_API_LoadNymbox + +def OT_API_processInbox(*args): + return _otapi.OT_API_processInbox(*args) +OT_API_processInbox = _otapi.OT_API_processInbox + +def OT_API_processNymbox(*args): + return _otapi.OT_API_processNymbox(*args) +OT_API_processNymbox = _otapi.OT_API_processNymbox + +def OT_API_withdrawVoucher(*args): + return _otapi.OT_API_withdrawVoucher(*args) +OT_API_withdrawVoucher = _otapi.OT_API_withdrawVoucher + +def OT_API_depositCheque(*args): + return _otapi.OT_API_depositCheque(*args) +OT_API_depositCheque = _otapi.OT_API_depositCheque + +def OT_API_depositPaymentPlan(*args): + return _otapi.OT_API_depositPaymentPlan(*args) +OT_API_depositPaymentPlan = _otapi.OT_API_depositPaymentPlan + +def OT_API_issueMarketOffer(*args): + return _otapi.OT_API_issueMarketOffer(*args) +OT_API_issueMarketOffer = _otapi.OT_API_issueMarketOffer + +def OT_API_getMarketList(*args): + return _otapi.OT_API_getMarketList(*args) +OT_API_getMarketList = _otapi.OT_API_getMarketList + +def OT_API_getMarketOffers(*args): + return _otapi.OT_API_getMarketOffers(*args) +OT_API_getMarketOffers = _otapi.OT_API_getMarketOffers + +def OT_API_getMarketRecentTrades(*args): + return _otapi.OT_API_getMarketRecentTrades(*args) +OT_API_getMarketRecentTrades = _otapi.OT_API_getMarketRecentTrades + +def OT_API_getNym_MarketOffers(*args): + return _otapi.OT_API_getNym_MarketOffers(*args) +OT_API_getNym_MarketOffers = _otapi.OT_API_getNym_MarketOffers + +def OT_API_cancelMarketOffer(*args): + return _otapi.OT_API_cancelMarketOffer(*args) +OT_API_cancelMarketOffer = _otapi.OT_API_cancelMarketOffer + +def OT_API_cancelPaymentPlan(*args): + return _otapi.OT_API_cancelPaymentPlan(*args) +OT_API_cancelPaymentPlan = _otapi.OT_API_cancelPaymentPlan + +def OT_API_PopMessageBuffer(): + return _otapi.OT_API_PopMessageBuffer() +OT_API_PopMessageBuffer = _otapi.OT_API_PopMessageBuffer + +def OT_API_FlushMessageBuffer(): + return _otapi.OT_API_FlushMessageBuffer() +OT_API_FlushMessageBuffer = _otapi.OT_API_FlushMessageBuffer + +def OT_API_Message_GetCommand(*args): + return _otapi.OT_API_Message_GetCommand(*args) +OT_API_Message_GetCommand = _otapi.OT_API_Message_GetCommand + +def OT_API_Message_GetSuccess(*args): + return _otapi.OT_API_Message_GetSuccess(*args) +OT_API_Message_GetSuccess = _otapi.OT_API_Message_GetSuccess + +def OT_API_Message_GetDepth(*args): + return _otapi.OT_API_Message_GetDepth(*args) +OT_API_Message_GetDepth = _otapi.OT_API_Message_GetDepth + +def OT_API_Message_GetTransactionSuccess(*args): + return _otapi.OT_API_Message_GetTransactionSuccess(*args) +OT_API_Message_GetTransactionSuccess = _otapi.OT_API_Message_GetTransactionSuccess + +def OT_API_Message_GetBalanceAgreementSuccess(*args): + return _otapi.OT_API_Message_GetBalanceAgreementSuccess(*args) +OT_API_Message_GetBalanceAgreementSuccess = _otapi.OT_API_Message_GetBalanceAgreementSuccess + +def OT_API_Message_GetLedger(*args): + return _otapi.OT_API_Message_GetLedger(*args) +OT_API_Message_GetLedger = _otapi.OT_API_Message_GetLedger + +def OT_API_Message_GetNewAssetTypeID(*args): + return _otapi.OT_API_Message_GetNewAssetTypeID(*args) +OT_API_Message_GetNewAssetTypeID = _otapi.OT_API_Message_GetNewAssetTypeID + +def OT_API_Message_GetNewIssuerAcctID(*args): + return _otapi.OT_API_Message_GetNewIssuerAcctID(*args) +OT_API_Message_GetNewIssuerAcctID = _otapi.OT_API_Message_GetNewIssuerAcctID + +def OT_API_Message_GetNewAcctID(*args): + return _otapi.OT_API_Message_GetNewAcctID(*args) +OT_API_Message_GetNewAcctID = _otapi.OT_API_Message_GetNewAcctID + +def OT_API_ConnectServer(*args): + return _otapi.OT_API_ConnectServer(*args) +OT_API_ConnectServer = _otapi.OT_API_ConnectServer + +def OT_API_ProcessSockets(): + return _otapi.OT_API_ProcessSockets() +OT_API_ProcessSockets = _otapi.OT_API_ProcessSockets +PACK_MESSAGE_PACK = _otapi.PACK_MESSAGE_PACK +PACK_PROTOCOL_BUFFERS = _otapi.PACK_PROTOCOL_BUFFERS +PACK_TYPE_ERROR = _otapi.PACK_TYPE_ERROR +STORE_FILESYSTEM = _otapi.STORE_FILESYSTEM +STORE_TYPE_SUBCLASS = _otapi.STORE_TYPE_SUBCLASS +STORED_OBJ_STRING = _otapi.STORED_OBJ_STRING +STORED_OBJ_BLOB = _otapi.STORED_OBJ_BLOB +STORED_OBJ_STRING_MAP = _otapi.STORED_OBJ_STRING_MAP +STORED_OBJ_WALLET_DATA = _otapi.STORED_OBJ_WALLET_DATA +STORED_OBJ_BITCOIN_ACCT = _otapi.STORED_OBJ_BITCOIN_ACCT +STORED_OBJ_BITCOIN_SERVER = _otapi.STORED_OBJ_BITCOIN_SERVER +STORED_OBJ_RIPPLE_SERVER = _otapi.STORED_OBJ_RIPPLE_SERVER +STORED_OBJ_LOOM_SERVER = _otapi.STORED_OBJ_LOOM_SERVER +STORED_OBJ_SERVER_INFO = _otapi.STORED_OBJ_SERVER_INFO +STORED_OBJ_CONTACT_NYM = _otapi.STORED_OBJ_CONTACT_NYM +STORED_OBJ_CONTACT_ACCT = _otapi.STORED_OBJ_CONTACT_ACCT +STORED_OBJ_CONTACT = _otapi.STORED_OBJ_CONTACT +STORED_OBJ_ADDRESS_BOOK = _otapi.STORED_OBJ_ADDRESS_BOOK +STORED_OBJ_MARKET_DATA = _otapi.STORED_OBJ_MARKET_DATA +STORED_OBJ_MARKET_LIST = _otapi.STORED_OBJ_MARKET_LIST +STORED_OBJ_BID_DATA = _otapi.STORED_OBJ_BID_DATA +STORED_OBJ_ASK_DATA = _otapi.STORED_OBJ_ASK_DATA +STORED_OBJ_OFFER_LIST_MARKET = _otapi.STORED_OBJ_OFFER_LIST_MARKET +STORED_OBJ_TRADE_DATA_MARKET = _otapi.STORED_OBJ_TRADE_DATA_MARKET +STORED_OBJ_TRADE_LIST_MARKET = _otapi.STORED_OBJ_TRADE_LIST_MARKET +STORED_OBJ_OFFER_DATA_NYM = _otapi.STORED_OBJ_OFFER_DATA_NYM +STORED_OBJ_OFFER_LIST_NYM = _otapi.STORED_OBJ_OFFER_LIST_NYM +STORED_OBJ_TRADE_DATA_NYM = _otapi.STORED_OBJ_TRADE_DATA_NYM +STORED_OBJ_TRADE_LIST_NYM = _otapi.STORED_OBJ_TRADE_LIST_NYM +STORED_OBJ_ERROR = _otapi.STORED_OBJ_ERROR +class Storable(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, Storable, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, Storable, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Storable + __del__ = lambda self : None; + __swig_getmethods__["Create"] = lambda x: _otapi.Storable_Create + if _newclass:Create = staticmethod(_otapi.Storable_Create) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Storable_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Storable_ot_dynamic_cast) +Storable_swigregister = _otapi.Storable_swigregister +Storable_swigregister(Storable) + +def Storable_Create(*args): + return _otapi.Storable_Create(*args) +Storable_Create = _otapi.Storable_Create + +def Storable_ot_dynamic_cast(*args): + return _otapi.Storable_ot_dynamic_cast(*args) +Storable_ot_dynamic_cast = _otapi.Storable_ot_dynamic_cast + +class Storage(_object): + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, Storage, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, Storage, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + def GetPacker(self, *args): return _otapi.Storage_GetPacker(self, *args) + def Init(self, oneStr = "", twoStr = "", threeStr = "", fourStr = "", + fiveStr = "", sixStr = ""): return _otapi.Storage_Init(self, oneStr, twoStr, threeStr, fourStr, fiveStr, sixStr) + def Exists(self, *args): return _otapi.Storage_Exists(self, *args) + __swig_destroy__ = _otapi.delete_Storage + __del__ = lambda self : None; + def StoreString(self, *args): return _otapi.Storage_StoreString(self, *args) + def QueryString(self, *args): return _otapi.Storage_QueryString(self, *args) + def StorePlainString(self, *args): return _otapi.Storage_StorePlainString(self, *args) + def QueryPlainString(self, *args): return _otapi.Storage_QueryPlainString(self, *args) + def StoreObject(self, *args): return _otapi.Storage_StoreObject(self, *args) + def QueryObject(self, *args): return _otapi.Storage_QueryObject(self, *args) + def EraseValueByKey(self, *args): return _otapi.Storage_EraseValueByKey(self, *args) + def CreateObject(self, *args): return _otapi.Storage_CreateObject(self, *args) + __swig_getmethods__["Create"] = lambda x: _otapi.Storage_Create + if _newclass:Create = staticmethod(_otapi.Storage_Create) + def GetType(self): return _otapi.Storage_GetType(self) +Storage_swigregister = _otapi.Storage_swigregister +Storage_swigregister(Storage) + +def Storage_Create(*args): + return _otapi.Storage_Create(*args) +Storage_Create = _otapi.Storage_Create + + +def GetDefaultStorage(): + return _otapi.GetDefaultStorage() +GetDefaultStorage = _otapi.GetDefaultStorage + +def CreateObject(*args): + return _otapi.CreateObject(*args) +CreateObject = _otapi.CreateObject +class OTDBString(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, OTDBString, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, OTDBString, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_OTDBString + __del__ = lambda self : None; + __swig_setmethods__["m_string"] = _otapi.OTDBString_m_string_set + __swig_getmethods__["m_string"] = _otapi.OTDBString_m_string_get + if _newclass:m_string = _swig_property(_otapi.OTDBString_m_string_get, _otapi.OTDBString_m_string_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.OTDBString_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.OTDBString_ot_dynamic_cast) +OTDBString_swigregister = _otapi.OTDBString_swigregister +OTDBString_swigregister(OTDBString) + +def InitDefaultStorage(*args): + return _otapi.InitDefaultStorage(*args) +InitDefaultStorage = _otapi.InitDefaultStorage + +def CreateStorageContext(*args): + return _otapi.CreateStorageContext(*args) +CreateStorageContext = _otapi.CreateStorageContext + +def Exists(*args): + return _otapi.Exists(*args) +Exists = _otapi.Exists + +def StoreString(*args): + return _otapi.StoreString(*args) +StoreString = _otapi.StoreString + +def QueryString(*args): + return _otapi.QueryString(*args) +QueryString = _otapi.QueryString + +def StorePlainString(*args): + return _otapi.StorePlainString(*args) +StorePlainString = _otapi.StorePlainString + +def QueryPlainString(*args): + return _otapi.QueryPlainString(*args) +QueryPlainString = _otapi.QueryPlainString + +def StoreObject(*args): + return _otapi.StoreObject(*args) +StoreObject = _otapi.StoreObject + +def QueryObject(*args): + return _otapi.QueryObject(*args) +QueryObject = _otapi.QueryObject + +def EraseValueByKey(*args): + return _otapi.EraseValueByKey(*args) +EraseValueByKey = _otapi.EraseValueByKey + +def OTDBString_ot_dynamic_cast(*args): + return _otapi.OTDBString_ot_dynamic_cast(*args) +OTDBString_ot_dynamic_cast = _otapi.OTDBString_ot_dynamic_cast + +class Blob(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, Blob, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, Blob, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Blob + __del__ = lambda self : None; + __swig_setmethods__["m_memBuffer"] = _otapi.Blob_m_memBuffer_set + __swig_getmethods__["m_memBuffer"] = _otapi.Blob_m_memBuffer_get + if _newclass:m_memBuffer = _swig_property(_otapi.Blob_m_memBuffer_get, _otapi.Blob_m_memBuffer_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Blob_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Blob_ot_dynamic_cast) +Blob_swigregister = _otapi.Blob_swigregister +Blob_swigregister(Blob) + +def Blob_ot_dynamic_cast(*args): + return _otapi.Blob_ot_dynamic_cast(*args) +Blob_ot_dynamic_cast = _otapi.Blob_ot_dynamic_cast + +class StringMap(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, StringMap, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, StringMap, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_StringMap + __del__ = lambda self : None; + __swig_setmethods__["the_map"] = _otapi.StringMap_the_map_set + __swig_getmethods__["the_map"] = _otapi.StringMap_the_map_get + if _newclass:the_map = _swig_property(_otapi.StringMap_the_map_get, _otapi.StringMap_the_map_set) + def SetValue(self, *args): return _otapi.StringMap_SetValue(self, *args) + def GetValue(self, *args): return _otapi.StringMap_GetValue(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.StringMap_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.StringMap_ot_dynamic_cast) +StringMap_swigregister = _otapi.StringMap_swigregister +StringMap_swigregister(StringMap) + +def StringMap_ot_dynamic_cast(*args): + return _otapi.StringMap_ot_dynamic_cast(*args) +StringMap_ot_dynamic_cast = _otapi.StringMap_ot_dynamic_cast + +class Displayable(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, Displayable, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, Displayable, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Displayable + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.Displayable_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.Displayable_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.Displayable_gui_label_get, _otapi.Displayable_gui_label_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Displayable_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Displayable_ot_dynamic_cast) +Displayable_swigregister = _otapi.Displayable_swigregister +Displayable_swigregister(Displayable) + +def Displayable_ot_dynamic_cast(*args): + return _otapi.Displayable_ot_dynamic_cast(*args) +Displayable_ot_dynamic_cast = _otapi.Displayable_ot_dynamic_cast + +class MarketData(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, MarketData, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, MarketData, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_MarketData + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.MarketData_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.MarketData_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.MarketData_gui_label_get, _otapi.MarketData_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.MarketData_server_id_set + __swig_getmethods__["server_id"] = _otapi.MarketData_server_id_get + if _newclass:server_id = _swig_property(_otapi.MarketData_server_id_get, _otapi.MarketData_server_id_set) + __swig_setmethods__["market_id"] = _otapi.MarketData_market_id_set + __swig_getmethods__["market_id"] = _otapi.MarketData_market_id_get + if _newclass:market_id = _swig_property(_otapi.MarketData_market_id_get, _otapi.MarketData_market_id_set) + __swig_setmethods__["asset_type_id"] = _otapi.MarketData_asset_type_id_set + __swig_getmethods__["asset_type_id"] = _otapi.MarketData_asset_type_id_get + if _newclass:asset_type_id = _swig_property(_otapi.MarketData_asset_type_id_get, _otapi.MarketData_asset_type_id_set) + __swig_setmethods__["currency_type_id"] = _otapi.MarketData_currency_type_id_set + __swig_getmethods__["currency_type_id"] = _otapi.MarketData_currency_type_id_get + if _newclass:currency_type_id = _swig_property(_otapi.MarketData_currency_type_id_get, _otapi.MarketData_currency_type_id_set) + __swig_setmethods__["scale"] = _otapi.MarketData_scale_set + __swig_getmethods__["scale"] = _otapi.MarketData_scale_get + if _newclass:scale = _swig_property(_otapi.MarketData_scale_get, _otapi.MarketData_scale_set) + __swig_setmethods__["total_assets"] = _otapi.MarketData_total_assets_set + __swig_getmethods__["total_assets"] = _otapi.MarketData_total_assets_get + if _newclass:total_assets = _swig_property(_otapi.MarketData_total_assets_get, _otapi.MarketData_total_assets_set) + __swig_setmethods__["number_bids"] = _otapi.MarketData_number_bids_set + __swig_getmethods__["number_bids"] = _otapi.MarketData_number_bids_get + if _newclass:number_bids = _swig_property(_otapi.MarketData_number_bids_get, _otapi.MarketData_number_bids_set) + __swig_setmethods__["number_asks"] = _otapi.MarketData_number_asks_set + __swig_getmethods__["number_asks"] = _otapi.MarketData_number_asks_get + if _newclass:number_asks = _swig_property(_otapi.MarketData_number_asks_get, _otapi.MarketData_number_asks_set) + __swig_setmethods__["last_sale_price"] = _otapi.MarketData_last_sale_price_set + __swig_getmethods__["last_sale_price"] = _otapi.MarketData_last_sale_price_get + if _newclass:last_sale_price = _swig_property(_otapi.MarketData_last_sale_price_get, _otapi.MarketData_last_sale_price_set) + __swig_setmethods__["current_bid"] = _otapi.MarketData_current_bid_set + __swig_getmethods__["current_bid"] = _otapi.MarketData_current_bid_get + if _newclass:current_bid = _swig_property(_otapi.MarketData_current_bid_get, _otapi.MarketData_current_bid_set) + __swig_setmethods__["current_ask"] = _otapi.MarketData_current_ask_set + __swig_getmethods__["current_ask"] = _otapi.MarketData_current_ask_get + if _newclass:current_ask = _swig_property(_otapi.MarketData_current_ask_get, _otapi.MarketData_current_ask_set) + __swig_setmethods__["volume_trades"] = _otapi.MarketData_volume_trades_set + __swig_getmethods__["volume_trades"] = _otapi.MarketData_volume_trades_get + if _newclass:volume_trades = _swig_property(_otapi.MarketData_volume_trades_get, _otapi.MarketData_volume_trades_set) + __swig_setmethods__["volume_assets"] = _otapi.MarketData_volume_assets_set + __swig_getmethods__["volume_assets"] = _otapi.MarketData_volume_assets_get + if _newclass:volume_assets = _swig_property(_otapi.MarketData_volume_assets_get, _otapi.MarketData_volume_assets_set) + __swig_setmethods__["volume_currency"] = _otapi.MarketData_volume_currency_set + __swig_getmethods__["volume_currency"] = _otapi.MarketData_volume_currency_get + if _newclass:volume_currency = _swig_property(_otapi.MarketData_volume_currency_get, _otapi.MarketData_volume_currency_set) + __swig_setmethods__["recent_highest_bid"] = _otapi.MarketData_recent_highest_bid_set + __swig_getmethods__["recent_highest_bid"] = _otapi.MarketData_recent_highest_bid_get + if _newclass:recent_highest_bid = _swig_property(_otapi.MarketData_recent_highest_bid_get, _otapi.MarketData_recent_highest_bid_set) + __swig_setmethods__["recent_lowest_ask"] = _otapi.MarketData_recent_lowest_ask_set + __swig_getmethods__["recent_lowest_ask"] = _otapi.MarketData_recent_lowest_ask_get + if _newclass:recent_lowest_ask = _swig_property(_otapi.MarketData_recent_lowest_ask_get, _otapi.MarketData_recent_lowest_ask_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.MarketData_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.MarketData_ot_dynamic_cast) +MarketData_swigregister = _otapi.MarketData_swigregister +MarketData_swigregister(MarketData) + +def MarketData_ot_dynamic_cast(*args): + return _otapi.MarketData_ot_dynamic_cast(*args) +MarketData_ot_dynamic_cast = _otapi.MarketData_ot_dynamic_cast + +class MarketList(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, MarketList, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, MarketList, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_MarketList + __del__ = lambda self : None; + def GetMarketDataCount(self): return _otapi.MarketList_GetMarketDataCount(self) + def GetMarketData(self, *args): return _otapi.MarketList_GetMarketData(self, *args) + def RemoveMarketData(self, *args): return _otapi.MarketList_RemoveMarketData(self, *args) + def AddMarketData(self, *args): return _otapi.MarketList_AddMarketData(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.MarketList_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.MarketList_ot_dynamic_cast) +MarketList_swigregister = _otapi.MarketList_swigregister +MarketList_swigregister(MarketList) + +def MarketList_ot_dynamic_cast(*args): + return _otapi.MarketList_ot_dynamic_cast(*args) +MarketList_ot_dynamic_cast = _otapi.MarketList_ot_dynamic_cast + +class OfferDataMarket(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, OfferDataMarket, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, OfferDataMarket, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_OfferDataMarket + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.OfferDataMarket_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.OfferDataMarket_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.OfferDataMarket_gui_label_get, _otapi.OfferDataMarket_gui_label_set) + __swig_setmethods__["transaction_id"] = _otapi.OfferDataMarket_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.OfferDataMarket_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.OfferDataMarket_transaction_id_get, _otapi.OfferDataMarket_transaction_id_set) + __swig_setmethods__["price_per_scale"] = _otapi.OfferDataMarket_price_per_scale_set + __swig_getmethods__["price_per_scale"] = _otapi.OfferDataMarket_price_per_scale_get + if _newclass:price_per_scale = _swig_property(_otapi.OfferDataMarket_price_per_scale_get, _otapi.OfferDataMarket_price_per_scale_set) + __swig_setmethods__["available_assets"] = _otapi.OfferDataMarket_available_assets_set + __swig_getmethods__["available_assets"] = _otapi.OfferDataMarket_available_assets_get + if _newclass:available_assets = _swig_property(_otapi.OfferDataMarket_available_assets_get, _otapi.OfferDataMarket_available_assets_set) + __swig_setmethods__["minimum_increment"] = _otapi.OfferDataMarket_minimum_increment_set + __swig_getmethods__["minimum_increment"] = _otapi.OfferDataMarket_minimum_increment_get + if _newclass:minimum_increment = _swig_property(_otapi.OfferDataMarket_minimum_increment_get, _otapi.OfferDataMarket_minimum_increment_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.OfferDataMarket_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.OfferDataMarket_ot_dynamic_cast) +OfferDataMarket_swigregister = _otapi.OfferDataMarket_swigregister +OfferDataMarket_swigregister(OfferDataMarket) + +def OfferDataMarket_ot_dynamic_cast(*args): + return _otapi.OfferDataMarket_ot_dynamic_cast(*args) +OfferDataMarket_ot_dynamic_cast = _otapi.OfferDataMarket_ot_dynamic_cast + +class BidData(OfferDataMarket): + __swig_setmethods__ = {} + for _s in [OfferDataMarket]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, BidData, name, value) + __swig_getmethods__ = {} + for _s in [OfferDataMarket]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, BidData, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_BidData + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.BidData_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.BidData_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.BidData_gui_label_get, _otapi.BidData_gui_label_set) + __swig_setmethods__["transaction_id"] = _otapi.BidData_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.BidData_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.BidData_transaction_id_get, _otapi.BidData_transaction_id_set) + __swig_setmethods__["price_per_scale"] = _otapi.BidData_price_per_scale_set + __swig_getmethods__["price_per_scale"] = _otapi.BidData_price_per_scale_get + if _newclass:price_per_scale = _swig_property(_otapi.BidData_price_per_scale_get, _otapi.BidData_price_per_scale_set) + __swig_setmethods__["available_assets"] = _otapi.BidData_available_assets_set + __swig_getmethods__["available_assets"] = _otapi.BidData_available_assets_get + if _newclass:available_assets = _swig_property(_otapi.BidData_available_assets_get, _otapi.BidData_available_assets_set) + __swig_setmethods__["minimum_increment"] = _otapi.BidData_minimum_increment_set + __swig_getmethods__["minimum_increment"] = _otapi.BidData_minimum_increment_get + if _newclass:minimum_increment = _swig_property(_otapi.BidData_minimum_increment_get, _otapi.BidData_minimum_increment_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.BidData_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.BidData_ot_dynamic_cast) +BidData_swigregister = _otapi.BidData_swigregister +BidData_swigregister(BidData) + +def BidData_ot_dynamic_cast(*args): + return _otapi.BidData_ot_dynamic_cast(*args) +BidData_ot_dynamic_cast = _otapi.BidData_ot_dynamic_cast + +class AskData(OfferDataMarket): + __swig_setmethods__ = {} + for _s in [OfferDataMarket]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, AskData, name, value) + __swig_getmethods__ = {} + for _s in [OfferDataMarket]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, AskData, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_AskData + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.AskData_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.AskData_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.AskData_gui_label_get, _otapi.AskData_gui_label_set) + __swig_setmethods__["transaction_id"] = _otapi.AskData_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.AskData_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.AskData_transaction_id_get, _otapi.AskData_transaction_id_set) + __swig_setmethods__["price_per_scale"] = _otapi.AskData_price_per_scale_set + __swig_getmethods__["price_per_scale"] = _otapi.AskData_price_per_scale_get + if _newclass:price_per_scale = _swig_property(_otapi.AskData_price_per_scale_get, _otapi.AskData_price_per_scale_set) + __swig_setmethods__["available_assets"] = _otapi.AskData_available_assets_set + __swig_getmethods__["available_assets"] = _otapi.AskData_available_assets_get + if _newclass:available_assets = _swig_property(_otapi.AskData_available_assets_get, _otapi.AskData_available_assets_set) + __swig_setmethods__["minimum_increment"] = _otapi.AskData_minimum_increment_set + __swig_getmethods__["minimum_increment"] = _otapi.AskData_minimum_increment_get + if _newclass:minimum_increment = _swig_property(_otapi.AskData_minimum_increment_get, _otapi.AskData_minimum_increment_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.AskData_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.AskData_ot_dynamic_cast) +AskData_swigregister = _otapi.AskData_swigregister +AskData_swigregister(AskData) + +def AskData_ot_dynamic_cast(*args): + return _otapi.AskData_ot_dynamic_cast(*args) +AskData_ot_dynamic_cast = _otapi.AskData_ot_dynamic_cast + +class OfferListMarket(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, OfferListMarket, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, OfferListMarket, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_OfferListMarket + __del__ = lambda self : None; + def GetBidDataCount(self): return _otapi.OfferListMarket_GetBidDataCount(self) + def GetBidData(self, *args): return _otapi.OfferListMarket_GetBidData(self, *args) + def RemoveBidData(self, *args): return _otapi.OfferListMarket_RemoveBidData(self, *args) + def AddBidData(self, *args): return _otapi.OfferListMarket_AddBidData(self, *args) + def GetAskDataCount(self): return _otapi.OfferListMarket_GetAskDataCount(self) + def GetAskData(self, *args): return _otapi.OfferListMarket_GetAskData(self, *args) + def RemoveAskData(self, *args): return _otapi.OfferListMarket_RemoveAskData(self, *args) + def AddAskData(self, *args): return _otapi.OfferListMarket_AddAskData(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.OfferListMarket_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.OfferListMarket_ot_dynamic_cast) +OfferListMarket_swigregister = _otapi.OfferListMarket_swigregister +OfferListMarket_swigregister(OfferListMarket) + +def OfferListMarket_ot_dynamic_cast(*args): + return _otapi.OfferListMarket_ot_dynamic_cast(*args) +OfferListMarket_ot_dynamic_cast = _otapi.OfferListMarket_ot_dynamic_cast + +class TradeDataMarket(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, TradeDataMarket, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, TradeDataMarket, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_TradeDataMarket + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.TradeDataMarket_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.TradeDataMarket_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.TradeDataMarket_gui_label_get, _otapi.TradeDataMarket_gui_label_set) + __swig_setmethods__["transaction_id"] = _otapi.TradeDataMarket_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.TradeDataMarket_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.TradeDataMarket_transaction_id_get, _otapi.TradeDataMarket_transaction_id_set) + __swig_setmethods__["date"] = _otapi.TradeDataMarket_date_set + __swig_getmethods__["date"] = _otapi.TradeDataMarket_date_get + if _newclass:date = _swig_property(_otapi.TradeDataMarket_date_get, _otapi.TradeDataMarket_date_set) + __swig_setmethods__["price"] = _otapi.TradeDataMarket_price_set + __swig_getmethods__["price"] = _otapi.TradeDataMarket_price_get + if _newclass:price = _swig_property(_otapi.TradeDataMarket_price_get, _otapi.TradeDataMarket_price_set) + __swig_setmethods__["amount_sold"] = _otapi.TradeDataMarket_amount_sold_set + __swig_getmethods__["amount_sold"] = _otapi.TradeDataMarket_amount_sold_get + if _newclass:amount_sold = _swig_property(_otapi.TradeDataMarket_amount_sold_get, _otapi.TradeDataMarket_amount_sold_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.TradeDataMarket_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.TradeDataMarket_ot_dynamic_cast) +TradeDataMarket_swigregister = _otapi.TradeDataMarket_swigregister +TradeDataMarket_swigregister(TradeDataMarket) + +def TradeDataMarket_ot_dynamic_cast(*args): + return _otapi.TradeDataMarket_ot_dynamic_cast(*args) +TradeDataMarket_ot_dynamic_cast = _otapi.TradeDataMarket_ot_dynamic_cast + +class TradeListMarket(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, TradeListMarket, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, TradeListMarket, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_TradeListMarket + __del__ = lambda self : None; + def GetTradeDataMarketCount(self): return _otapi.TradeListMarket_GetTradeDataMarketCount(self) + def GetTradeDataMarket(self, *args): return _otapi.TradeListMarket_GetTradeDataMarket(self, *args) + def RemoveTradeDataMarket(self, *args): return _otapi.TradeListMarket_RemoveTradeDataMarket(self, *args) + def AddTradeDataMarket(self, *args): return _otapi.TradeListMarket_AddTradeDataMarket(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.TradeListMarket_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.TradeListMarket_ot_dynamic_cast) +TradeListMarket_swigregister = _otapi.TradeListMarket_swigregister +TradeListMarket_swigregister(TradeListMarket) + +def TradeListMarket_ot_dynamic_cast(*args): + return _otapi.TradeListMarket_ot_dynamic_cast(*args) +TradeListMarket_ot_dynamic_cast = _otapi.TradeListMarket_ot_dynamic_cast + +class OfferDataNym(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, OfferDataNym, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, OfferDataNym, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_OfferDataNym + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.OfferDataNym_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.OfferDataNym_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.OfferDataNym_gui_label_get, _otapi.OfferDataNym_gui_label_set) + __swig_setmethods__["valid_from"] = _otapi.OfferDataNym_valid_from_set + __swig_getmethods__["valid_from"] = _otapi.OfferDataNym_valid_from_get + if _newclass:valid_from = _swig_property(_otapi.OfferDataNym_valid_from_get, _otapi.OfferDataNym_valid_from_set) + __swig_setmethods__["valid_to"] = _otapi.OfferDataNym_valid_to_set + __swig_getmethods__["valid_to"] = _otapi.OfferDataNym_valid_to_get + if _newclass:valid_to = _swig_property(_otapi.OfferDataNym_valid_to_get, _otapi.OfferDataNym_valid_to_set) + __swig_setmethods__["server_id"] = _otapi.OfferDataNym_server_id_set + __swig_getmethods__["server_id"] = _otapi.OfferDataNym_server_id_get + if _newclass:server_id = _swig_property(_otapi.OfferDataNym_server_id_get, _otapi.OfferDataNym_server_id_set) + __swig_setmethods__["asset_type_id"] = _otapi.OfferDataNym_asset_type_id_set + __swig_getmethods__["asset_type_id"] = _otapi.OfferDataNym_asset_type_id_get + if _newclass:asset_type_id = _swig_property(_otapi.OfferDataNym_asset_type_id_get, _otapi.OfferDataNym_asset_type_id_set) + __swig_setmethods__["asset_acct_id"] = _otapi.OfferDataNym_asset_acct_id_set + __swig_getmethods__["asset_acct_id"] = _otapi.OfferDataNym_asset_acct_id_get + if _newclass:asset_acct_id = _swig_property(_otapi.OfferDataNym_asset_acct_id_get, _otapi.OfferDataNym_asset_acct_id_set) + __swig_setmethods__["currency_type_id"] = _otapi.OfferDataNym_currency_type_id_set + __swig_getmethods__["currency_type_id"] = _otapi.OfferDataNym_currency_type_id_get + if _newclass:currency_type_id = _swig_property(_otapi.OfferDataNym_currency_type_id_get, _otapi.OfferDataNym_currency_type_id_set) + __swig_setmethods__["currency_acct_id"] = _otapi.OfferDataNym_currency_acct_id_set + __swig_getmethods__["currency_acct_id"] = _otapi.OfferDataNym_currency_acct_id_get + if _newclass:currency_acct_id = _swig_property(_otapi.OfferDataNym_currency_acct_id_get, _otapi.OfferDataNym_currency_acct_id_set) + __swig_setmethods__["selling"] = _otapi.OfferDataNym_selling_set + __swig_getmethods__["selling"] = _otapi.OfferDataNym_selling_get + if _newclass:selling = _swig_property(_otapi.OfferDataNym_selling_get, _otapi.OfferDataNym_selling_set) + __swig_setmethods__["scale"] = _otapi.OfferDataNym_scale_set + __swig_getmethods__["scale"] = _otapi.OfferDataNym_scale_get + if _newclass:scale = _swig_property(_otapi.OfferDataNym_scale_get, _otapi.OfferDataNym_scale_set) + __swig_setmethods__["price_per_scale"] = _otapi.OfferDataNym_price_per_scale_set + __swig_getmethods__["price_per_scale"] = _otapi.OfferDataNym_price_per_scale_get + if _newclass:price_per_scale = _swig_property(_otapi.OfferDataNym_price_per_scale_get, _otapi.OfferDataNym_price_per_scale_set) + __swig_setmethods__["transaction_id"] = _otapi.OfferDataNym_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.OfferDataNym_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.OfferDataNym_transaction_id_get, _otapi.OfferDataNym_transaction_id_set) + __swig_setmethods__["total_assets"] = _otapi.OfferDataNym_total_assets_set + __swig_getmethods__["total_assets"] = _otapi.OfferDataNym_total_assets_get + if _newclass:total_assets = _swig_property(_otapi.OfferDataNym_total_assets_get, _otapi.OfferDataNym_total_assets_set) + __swig_setmethods__["finished_so_far"] = _otapi.OfferDataNym_finished_so_far_set + __swig_getmethods__["finished_so_far"] = _otapi.OfferDataNym_finished_so_far_get + if _newclass:finished_so_far = _swig_property(_otapi.OfferDataNym_finished_so_far_get, _otapi.OfferDataNym_finished_so_far_set) + __swig_setmethods__["minimum_increment"] = _otapi.OfferDataNym_minimum_increment_set + __swig_getmethods__["minimum_increment"] = _otapi.OfferDataNym_minimum_increment_get + if _newclass:minimum_increment = _swig_property(_otapi.OfferDataNym_minimum_increment_get, _otapi.OfferDataNym_minimum_increment_set) + __swig_setmethods__["stop_sign"] = _otapi.OfferDataNym_stop_sign_set + __swig_getmethods__["stop_sign"] = _otapi.OfferDataNym_stop_sign_get + if _newclass:stop_sign = _swig_property(_otapi.OfferDataNym_stop_sign_get, _otapi.OfferDataNym_stop_sign_set) + __swig_setmethods__["stop_price"] = _otapi.OfferDataNym_stop_price_set + __swig_getmethods__["stop_price"] = _otapi.OfferDataNym_stop_price_get + if _newclass:stop_price = _swig_property(_otapi.OfferDataNym_stop_price_get, _otapi.OfferDataNym_stop_price_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.OfferDataNym_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.OfferDataNym_ot_dynamic_cast) +OfferDataNym_swigregister = _otapi.OfferDataNym_swigregister +OfferDataNym_swigregister(OfferDataNym) + +def OfferDataNym_ot_dynamic_cast(*args): + return _otapi.OfferDataNym_ot_dynamic_cast(*args) +OfferDataNym_ot_dynamic_cast = _otapi.OfferDataNym_ot_dynamic_cast + +class OfferListNym(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, OfferListNym, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, OfferListNym, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_OfferListNym + __del__ = lambda self : None; + def GetOfferDataNymCount(self): return _otapi.OfferListNym_GetOfferDataNymCount(self) + def GetOfferDataNym(self, *args): return _otapi.OfferListNym_GetOfferDataNym(self, *args) + def RemoveOfferDataNym(self, *args): return _otapi.OfferListNym_RemoveOfferDataNym(self, *args) + def AddOfferDataNym(self, *args): return _otapi.OfferListNym_AddOfferDataNym(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.OfferListNym_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.OfferListNym_ot_dynamic_cast) +OfferListNym_swigregister = _otapi.OfferListNym_swigregister +OfferListNym_swigregister(OfferListNym) + +def OfferListNym_ot_dynamic_cast(*args): + return _otapi.OfferListNym_ot_dynamic_cast(*args) +OfferListNym_ot_dynamic_cast = _otapi.OfferListNym_ot_dynamic_cast + +class TradeDataNym(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, TradeDataNym, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, TradeDataNym, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_TradeDataNym + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.TradeDataNym_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.TradeDataNym_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.TradeDataNym_gui_label_get, _otapi.TradeDataNym_gui_label_set) + __swig_setmethods__["transaction_id"] = _otapi.TradeDataNym_transaction_id_set + __swig_getmethods__["transaction_id"] = _otapi.TradeDataNym_transaction_id_get + if _newclass:transaction_id = _swig_property(_otapi.TradeDataNym_transaction_id_get, _otapi.TradeDataNym_transaction_id_set) + __swig_setmethods__["completed_count"] = _otapi.TradeDataNym_completed_count_set + __swig_getmethods__["completed_count"] = _otapi.TradeDataNym_completed_count_get + if _newclass:completed_count = _swig_property(_otapi.TradeDataNym_completed_count_get, _otapi.TradeDataNym_completed_count_set) + __swig_setmethods__["date"] = _otapi.TradeDataNym_date_set + __swig_getmethods__["date"] = _otapi.TradeDataNym_date_get + if _newclass:date = _swig_property(_otapi.TradeDataNym_date_get, _otapi.TradeDataNym_date_set) + __swig_setmethods__["price"] = _otapi.TradeDataNym_price_set + __swig_getmethods__["price"] = _otapi.TradeDataNym_price_get + if _newclass:price = _swig_property(_otapi.TradeDataNym_price_get, _otapi.TradeDataNym_price_set) + __swig_setmethods__["amount_sold"] = _otapi.TradeDataNym_amount_sold_set + __swig_getmethods__["amount_sold"] = _otapi.TradeDataNym_amount_sold_get + if _newclass:amount_sold = _swig_property(_otapi.TradeDataNym_amount_sold_get, _otapi.TradeDataNym_amount_sold_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.TradeDataNym_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.TradeDataNym_ot_dynamic_cast) +TradeDataNym_swigregister = _otapi.TradeDataNym_swigregister +TradeDataNym_swigregister(TradeDataNym) + +def TradeDataNym_ot_dynamic_cast(*args): + return _otapi.TradeDataNym_ot_dynamic_cast(*args) +TradeDataNym_ot_dynamic_cast = _otapi.TradeDataNym_ot_dynamic_cast + +class TradeListNym(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, TradeListNym, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, TradeListNym, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_TradeListNym + __del__ = lambda self : None; + def GetTradeDataNymCount(self): return _otapi.TradeListNym_GetTradeDataNymCount(self) + def GetTradeDataNym(self, *args): return _otapi.TradeListNym_GetTradeDataNym(self, *args) + def RemoveTradeDataNym(self, *args): return _otapi.TradeListNym_RemoveTradeDataNym(self, *args) + def AddTradeDataNym(self, *args): return _otapi.TradeListNym_AddTradeDataNym(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.TradeListNym_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.TradeListNym_ot_dynamic_cast) +TradeListNym_swigregister = _otapi.TradeListNym_swigregister +TradeListNym_swigregister(TradeListNym) + +def TradeListNym_ot_dynamic_cast(*args): + return _otapi.TradeListNym_ot_dynamic_cast(*args) +TradeListNym_ot_dynamic_cast = _otapi.TradeListNym_ot_dynamic_cast + +class Acct(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, Acct, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, Acct, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Acct + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.Acct_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.Acct_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.Acct_gui_label_get, _otapi.Acct_gui_label_set) + __swig_setmethods__["acct_id"] = _otapi.Acct_acct_id_set + __swig_getmethods__["acct_id"] = _otapi.Acct_acct_id_get + if _newclass:acct_id = _swig_property(_otapi.Acct_acct_id_get, _otapi.Acct_acct_id_set) + __swig_setmethods__["server_id"] = _otapi.Acct_server_id_set + __swig_getmethods__["server_id"] = _otapi.Acct_server_id_get + if _newclass:server_id = _swig_property(_otapi.Acct_server_id_get, _otapi.Acct_server_id_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Acct_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Acct_ot_dynamic_cast) +Acct_swigregister = _otapi.Acct_swigregister +Acct_swigregister(Acct) + +def Acct_ot_dynamic_cast(*args): + return _otapi.Acct_ot_dynamic_cast(*args) +Acct_ot_dynamic_cast = _otapi.Acct_ot_dynamic_cast + +class BitcoinAcct(Acct): + __swig_setmethods__ = {} + for _s in [Acct]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, BitcoinAcct, name, value) + __swig_getmethods__ = {} + for _s in [Acct]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, BitcoinAcct, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_BitcoinAcct + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.BitcoinAcct_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.BitcoinAcct_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.BitcoinAcct_gui_label_get, _otapi.BitcoinAcct_gui_label_set) + __swig_setmethods__["acct_id"] = _otapi.BitcoinAcct_acct_id_set + __swig_getmethods__["acct_id"] = _otapi.BitcoinAcct_acct_id_get + if _newclass:acct_id = _swig_property(_otapi.BitcoinAcct_acct_id_get, _otapi.BitcoinAcct_acct_id_set) + __swig_setmethods__["server_id"] = _otapi.BitcoinAcct_server_id_set + __swig_getmethods__["server_id"] = _otapi.BitcoinAcct_server_id_get + if _newclass:server_id = _swig_property(_otapi.BitcoinAcct_server_id_get, _otapi.BitcoinAcct_server_id_set) + __swig_setmethods__["bitcoin_acct_name"] = _otapi.BitcoinAcct_bitcoin_acct_name_set + __swig_getmethods__["bitcoin_acct_name"] = _otapi.BitcoinAcct_bitcoin_acct_name_get + if _newclass:bitcoin_acct_name = _swig_property(_otapi.BitcoinAcct_bitcoin_acct_name_get, _otapi.BitcoinAcct_bitcoin_acct_name_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.BitcoinAcct_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.BitcoinAcct_ot_dynamic_cast) +BitcoinAcct_swigregister = _otapi.BitcoinAcct_swigregister +BitcoinAcct_swigregister(BitcoinAcct) + +def BitcoinAcct_ot_dynamic_cast(*args): + return _otapi.BitcoinAcct_ot_dynamic_cast(*args) +BitcoinAcct_ot_dynamic_cast = _otapi.BitcoinAcct_ot_dynamic_cast + +class ServerInfo(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, ServerInfo, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, ServerInfo, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_ServerInfo + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.ServerInfo_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.ServerInfo_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.ServerInfo_gui_label_get, _otapi.ServerInfo_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.ServerInfo_server_id_set + __swig_getmethods__["server_id"] = _otapi.ServerInfo_server_id_get + if _newclass:server_id = _swig_property(_otapi.ServerInfo_server_id_get, _otapi.ServerInfo_server_id_set) + __swig_setmethods__["server_type"] = _otapi.ServerInfo_server_type_set + __swig_getmethods__["server_type"] = _otapi.ServerInfo_server_type_get + if _newclass:server_type = _swig_property(_otapi.ServerInfo_server_type_get, _otapi.ServerInfo_server_type_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.ServerInfo_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.ServerInfo_ot_dynamic_cast) +ServerInfo_swigregister = _otapi.ServerInfo_swigregister +ServerInfo_swigregister(ServerInfo) + +def ServerInfo_ot_dynamic_cast(*args): + return _otapi.ServerInfo_ot_dynamic_cast(*args) +ServerInfo_ot_dynamic_cast = _otapi.ServerInfo_ot_dynamic_cast + +class Server(ServerInfo): + __swig_setmethods__ = {} + for _s in [ServerInfo]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, Server, name, value) + __swig_getmethods__ = {} + for _s in [ServerInfo]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, Server, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Server + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.Server_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.Server_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.Server_gui_label_get, _otapi.Server_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.Server_server_id_set + __swig_getmethods__["server_id"] = _otapi.Server_server_id_get + if _newclass:server_id = _swig_property(_otapi.Server_server_id_get, _otapi.Server_server_id_set) + __swig_setmethods__["server_type"] = _otapi.Server_server_type_set + __swig_getmethods__["server_type"] = _otapi.Server_server_type_get + if _newclass:server_type = _swig_property(_otapi.Server_server_type_get, _otapi.Server_server_type_set) + __swig_setmethods__["server_host"] = _otapi.Server_server_host_set + __swig_getmethods__["server_host"] = _otapi.Server_server_host_get + if _newclass:server_host = _swig_property(_otapi.Server_server_host_get, _otapi.Server_server_host_set) + __swig_setmethods__["server_port"] = _otapi.Server_server_port_set + __swig_getmethods__["server_port"] = _otapi.Server_server_port_get + if _newclass:server_port = _swig_property(_otapi.Server_server_port_get, _otapi.Server_server_port_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Server_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Server_ot_dynamic_cast) +Server_swigregister = _otapi.Server_swigregister +Server_swigregister(Server) + +def Server_ot_dynamic_cast(*args): + return _otapi.Server_ot_dynamic_cast(*args) +Server_ot_dynamic_cast = _otapi.Server_ot_dynamic_cast + +class BitcoinServer(Server): + __swig_setmethods__ = {} + for _s in [Server]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, BitcoinServer, name, value) + __swig_getmethods__ = {} + for _s in [Server]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, BitcoinServer, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_BitcoinServer + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.BitcoinServer_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.BitcoinServer_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.BitcoinServer_gui_label_get, _otapi.BitcoinServer_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.BitcoinServer_server_id_set + __swig_getmethods__["server_id"] = _otapi.BitcoinServer_server_id_get + if _newclass:server_id = _swig_property(_otapi.BitcoinServer_server_id_get, _otapi.BitcoinServer_server_id_set) + __swig_setmethods__["server_type"] = _otapi.BitcoinServer_server_type_set + __swig_getmethods__["server_type"] = _otapi.BitcoinServer_server_type_get + if _newclass:server_type = _swig_property(_otapi.BitcoinServer_server_type_get, _otapi.BitcoinServer_server_type_set) + __swig_setmethods__["server_host"] = _otapi.BitcoinServer_server_host_set + __swig_getmethods__["server_host"] = _otapi.BitcoinServer_server_host_get + if _newclass:server_host = _swig_property(_otapi.BitcoinServer_server_host_get, _otapi.BitcoinServer_server_host_set) + __swig_setmethods__["server_port"] = _otapi.BitcoinServer_server_port_set + __swig_getmethods__["server_port"] = _otapi.BitcoinServer_server_port_get + if _newclass:server_port = _swig_property(_otapi.BitcoinServer_server_port_get, _otapi.BitcoinServer_server_port_set) + __swig_setmethods__["bitcoin_username"] = _otapi.BitcoinServer_bitcoin_username_set + __swig_getmethods__["bitcoin_username"] = _otapi.BitcoinServer_bitcoin_username_get + if _newclass:bitcoin_username = _swig_property(_otapi.BitcoinServer_bitcoin_username_get, _otapi.BitcoinServer_bitcoin_username_set) + __swig_setmethods__["bitcoin_password"] = _otapi.BitcoinServer_bitcoin_password_set + __swig_getmethods__["bitcoin_password"] = _otapi.BitcoinServer_bitcoin_password_get + if _newclass:bitcoin_password = _swig_property(_otapi.BitcoinServer_bitcoin_password_get, _otapi.BitcoinServer_bitcoin_password_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.BitcoinServer_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.BitcoinServer_ot_dynamic_cast) +BitcoinServer_swigregister = _otapi.BitcoinServer_swigregister +BitcoinServer_swigregister(BitcoinServer) + +def BitcoinServer_ot_dynamic_cast(*args): + return _otapi.BitcoinServer_ot_dynamic_cast(*args) +BitcoinServer_ot_dynamic_cast = _otapi.BitcoinServer_ot_dynamic_cast + +class RippleServer(Server): + __swig_setmethods__ = {} + for _s in [Server]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, RippleServer, name, value) + __swig_getmethods__ = {} + for _s in [Server]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, RippleServer, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_RippleServer + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.RippleServer_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.RippleServer_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.RippleServer_gui_label_get, _otapi.RippleServer_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.RippleServer_server_id_set + __swig_getmethods__["server_id"] = _otapi.RippleServer_server_id_get + if _newclass:server_id = _swig_property(_otapi.RippleServer_server_id_get, _otapi.RippleServer_server_id_set) + __swig_setmethods__["server_type"] = _otapi.RippleServer_server_type_set + __swig_getmethods__["server_type"] = _otapi.RippleServer_server_type_get + if _newclass:server_type = _swig_property(_otapi.RippleServer_server_type_get, _otapi.RippleServer_server_type_set) + __swig_setmethods__["server_host"] = _otapi.RippleServer_server_host_set + __swig_getmethods__["server_host"] = _otapi.RippleServer_server_host_get + if _newclass:server_host = _swig_property(_otapi.RippleServer_server_host_get, _otapi.RippleServer_server_host_set) + __swig_setmethods__["server_port"] = _otapi.RippleServer_server_port_set + __swig_getmethods__["server_port"] = _otapi.RippleServer_server_port_get + if _newclass:server_port = _swig_property(_otapi.RippleServer_server_port_get, _otapi.RippleServer_server_port_set) + __swig_setmethods__["ripple_username"] = _otapi.RippleServer_ripple_username_set + __swig_getmethods__["ripple_username"] = _otapi.RippleServer_ripple_username_get + if _newclass:ripple_username = _swig_property(_otapi.RippleServer_ripple_username_get, _otapi.RippleServer_ripple_username_set) + __swig_setmethods__["ripple_password"] = _otapi.RippleServer_ripple_password_set + __swig_getmethods__["ripple_password"] = _otapi.RippleServer_ripple_password_get + if _newclass:ripple_password = _swig_property(_otapi.RippleServer_ripple_password_get, _otapi.RippleServer_ripple_password_set) + __swig_setmethods__["namefield_id"] = _otapi.RippleServer_namefield_id_set + __swig_getmethods__["namefield_id"] = _otapi.RippleServer_namefield_id_get + if _newclass:namefield_id = _swig_property(_otapi.RippleServer_namefield_id_get, _otapi.RippleServer_namefield_id_set) + __swig_setmethods__["passfield_id"] = _otapi.RippleServer_passfield_id_set + __swig_getmethods__["passfield_id"] = _otapi.RippleServer_passfield_id_get + if _newclass:passfield_id = _swig_property(_otapi.RippleServer_passfield_id_get, _otapi.RippleServer_passfield_id_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.RippleServer_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.RippleServer_ot_dynamic_cast) +RippleServer_swigregister = _otapi.RippleServer_swigregister +RippleServer_swigregister(RippleServer) + +def RippleServer_ot_dynamic_cast(*args): + return _otapi.RippleServer_ot_dynamic_cast(*args) +RippleServer_ot_dynamic_cast = _otapi.RippleServer_ot_dynamic_cast + +class LoomServer(Server): + __swig_setmethods__ = {} + for _s in [Server]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, LoomServer, name, value) + __swig_getmethods__ = {} + for _s in [Server]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, LoomServer, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_LoomServer + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.LoomServer_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.LoomServer_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.LoomServer_gui_label_get, _otapi.LoomServer_gui_label_set) + __swig_setmethods__["server_id"] = _otapi.LoomServer_server_id_set + __swig_getmethods__["server_id"] = _otapi.LoomServer_server_id_get + if _newclass:server_id = _swig_property(_otapi.LoomServer_server_id_get, _otapi.LoomServer_server_id_set) + __swig_setmethods__["server_type"] = _otapi.LoomServer_server_type_set + __swig_getmethods__["server_type"] = _otapi.LoomServer_server_type_get + if _newclass:server_type = _swig_property(_otapi.LoomServer_server_type_get, _otapi.LoomServer_server_type_set) + __swig_setmethods__["server_host"] = _otapi.LoomServer_server_host_set + __swig_getmethods__["server_host"] = _otapi.LoomServer_server_host_get + if _newclass:server_host = _swig_property(_otapi.LoomServer_server_host_get, _otapi.LoomServer_server_host_set) + __swig_setmethods__["server_port"] = _otapi.LoomServer_server_port_set + __swig_getmethods__["server_port"] = _otapi.LoomServer_server_port_get + if _newclass:server_port = _swig_property(_otapi.LoomServer_server_port_get, _otapi.LoomServer_server_port_set) + __swig_setmethods__["loom_username"] = _otapi.LoomServer_loom_username_set + __swig_getmethods__["loom_username"] = _otapi.LoomServer_loom_username_get + if _newclass:loom_username = _swig_property(_otapi.LoomServer_loom_username_get, _otapi.LoomServer_loom_username_set) + __swig_setmethods__["namefield_id"] = _otapi.LoomServer_namefield_id_set + __swig_getmethods__["namefield_id"] = _otapi.LoomServer_namefield_id_get + if _newclass:namefield_id = _swig_property(_otapi.LoomServer_namefield_id_get, _otapi.LoomServer_namefield_id_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.LoomServer_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.LoomServer_ot_dynamic_cast) +LoomServer_swigregister = _otapi.LoomServer_swigregister +LoomServer_swigregister(LoomServer) + +def LoomServer_ot_dynamic_cast(*args): + return _otapi.LoomServer_ot_dynamic_cast(*args) +LoomServer_ot_dynamic_cast = _otapi.LoomServer_ot_dynamic_cast + +class ContactNym(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, ContactNym, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, ContactNym, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_ContactNym + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.ContactNym_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.ContactNym_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.ContactNym_gui_label_get, _otapi.ContactNym_gui_label_set) + __swig_setmethods__["nym_type"] = _otapi.ContactNym_nym_type_set + __swig_getmethods__["nym_type"] = _otapi.ContactNym_nym_type_get + if _newclass:nym_type = _swig_property(_otapi.ContactNym_nym_type_get, _otapi.ContactNym_nym_type_set) + __swig_setmethods__["nym_id"] = _otapi.ContactNym_nym_id_set + __swig_getmethods__["nym_id"] = _otapi.ContactNym_nym_id_get + if _newclass:nym_id = _swig_property(_otapi.ContactNym_nym_id_get, _otapi.ContactNym_nym_id_set) + __swig_setmethods__["public_key"] = _otapi.ContactNym_public_key_set + __swig_getmethods__["public_key"] = _otapi.ContactNym_public_key_get + if _newclass:public_key = _swig_property(_otapi.ContactNym_public_key_get, _otapi.ContactNym_public_key_set) + __swig_setmethods__["memo"] = _otapi.ContactNym_memo_set + __swig_getmethods__["memo"] = _otapi.ContactNym_memo_get + if _newclass:memo = _swig_property(_otapi.ContactNym_memo_get, _otapi.ContactNym_memo_set) + def GetServerInfoCount(self): return _otapi.ContactNym_GetServerInfoCount(self) + def GetServerInfo(self, *args): return _otapi.ContactNym_GetServerInfo(self, *args) + def RemoveServerInfo(self, *args): return _otapi.ContactNym_RemoveServerInfo(self, *args) + def AddServerInfo(self, *args): return _otapi.ContactNym_AddServerInfo(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.ContactNym_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.ContactNym_ot_dynamic_cast) +ContactNym_swigregister = _otapi.ContactNym_swigregister +ContactNym_swigregister(ContactNym) + +def ContactNym_ot_dynamic_cast(*args): + return _otapi.ContactNym_ot_dynamic_cast(*args) +ContactNym_ot_dynamic_cast = _otapi.ContactNym_ot_dynamic_cast + +class WalletData(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, WalletData, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, WalletData, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_WalletData + __del__ = lambda self : None; + def GetBitcoinServerCount(self): return _otapi.WalletData_GetBitcoinServerCount(self) + def GetBitcoinServer(self, *args): return _otapi.WalletData_GetBitcoinServer(self, *args) + def RemoveBitcoinServer(self, *args): return _otapi.WalletData_RemoveBitcoinServer(self, *args) + def AddBitcoinServer(self, *args): return _otapi.WalletData_AddBitcoinServer(self, *args) + def GetBitcoinAcctCount(self): return _otapi.WalletData_GetBitcoinAcctCount(self) + def GetBitcoinAcct(self, *args): return _otapi.WalletData_GetBitcoinAcct(self, *args) + def RemoveBitcoinAcct(self, *args): return _otapi.WalletData_RemoveBitcoinAcct(self, *args) + def AddBitcoinAcct(self, *args): return _otapi.WalletData_AddBitcoinAcct(self, *args) + def GetRippleServerCount(self): return _otapi.WalletData_GetRippleServerCount(self) + def GetRippleServer(self, *args): return _otapi.WalletData_GetRippleServer(self, *args) + def RemoveRippleServer(self, *args): return _otapi.WalletData_RemoveRippleServer(self, *args) + def AddRippleServer(self, *args): return _otapi.WalletData_AddRippleServer(self, *args) + def GetLoomServerCount(self): return _otapi.WalletData_GetLoomServerCount(self) + def GetLoomServer(self, *args): return _otapi.WalletData_GetLoomServer(self, *args) + def RemoveLoomServer(self, *args): return _otapi.WalletData_RemoveLoomServer(self, *args) + def AddLoomServer(self, *args): return _otapi.WalletData_AddLoomServer(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.WalletData_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.WalletData_ot_dynamic_cast) +WalletData_swigregister = _otapi.WalletData_swigregister +WalletData_swigregister(WalletData) + +def WalletData_ot_dynamic_cast(*args): + return _otapi.WalletData_ot_dynamic_cast(*args) +WalletData_ot_dynamic_cast = _otapi.WalletData_ot_dynamic_cast + +class ContactAcct(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, ContactAcct, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, ContactAcct, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_ContactAcct + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.ContactAcct_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.ContactAcct_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.ContactAcct_gui_label_get, _otapi.ContactAcct_gui_label_set) + __swig_setmethods__["server_type"] = _otapi.ContactAcct_server_type_set + __swig_getmethods__["server_type"] = _otapi.ContactAcct_server_type_get + if _newclass:server_type = _swig_property(_otapi.ContactAcct_server_type_get, _otapi.ContactAcct_server_type_set) + __swig_setmethods__["server_id"] = _otapi.ContactAcct_server_id_set + __swig_getmethods__["server_id"] = _otapi.ContactAcct_server_id_get + if _newclass:server_id = _swig_property(_otapi.ContactAcct_server_id_get, _otapi.ContactAcct_server_id_set) + __swig_setmethods__["asset_type_id"] = _otapi.ContactAcct_asset_type_id_set + __swig_getmethods__["asset_type_id"] = _otapi.ContactAcct_asset_type_id_get + if _newclass:asset_type_id = _swig_property(_otapi.ContactAcct_asset_type_id_get, _otapi.ContactAcct_asset_type_id_set) + __swig_setmethods__["acct_id"] = _otapi.ContactAcct_acct_id_set + __swig_getmethods__["acct_id"] = _otapi.ContactAcct_acct_id_get + if _newclass:acct_id = _swig_property(_otapi.ContactAcct_acct_id_get, _otapi.ContactAcct_acct_id_set) + __swig_setmethods__["nym_id"] = _otapi.ContactAcct_nym_id_set + __swig_getmethods__["nym_id"] = _otapi.ContactAcct_nym_id_get + if _newclass:nym_id = _swig_property(_otapi.ContactAcct_nym_id_get, _otapi.ContactAcct_nym_id_set) + __swig_setmethods__["memo"] = _otapi.ContactAcct_memo_set + __swig_getmethods__["memo"] = _otapi.ContactAcct_memo_get + if _newclass:memo = _swig_property(_otapi.ContactAcct_memo_get, _otapi.ContactAcct_memo_set) + __swig_setmethods__["public_key"] = _otapi.ContactAcct_public_key_set + __swig_getmethods__["public_key"] = _otapi.ContactAcct_public_key_get + if _newclass:public_key = _swig_property(_otapi.ContactAcct_public_key_get, _otapi.ContactAcct_public_key_set) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.ContactAcct_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.ContactAcct_ot_dynamic_cast) +ContactAcct_swigregister = _otapi.ContactAcct_swigregister +ContactAcct_swigregister(ContactAcct) + +def ContactAcct_ot_dynamic_cast(*args): + return _otapi.ContactAcct_ot_dynamic_cast(*args) +ContactAcct_ot_dynamic_cast = _otapi.ContactAcct_ot_dynamic_cast + +class Contact(Displayable): + __swig_setmethods__ = {} + for _s in [Displayable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, Contact, name, value) + __swig_getmethods__ = {} + for _s in [Displayable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, Contact, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_Contact + __del__ = lambda self : None; + __swig_setmethods__["gui_label"] = _otapi.Contact_gui_label_set + __swig_getmethods__["gui_label"] = _otapi.Contact_gui_label_get + if _newclass:gui_label = _swig_property(_otapi.Contact_gui_label_get, _otapi.Contact_gui_label_set) + __swig_setmethods__["contact_id"] = _otapi.Contact_contact_id_set + __swig_getmethods__["contact_id"] = _otapi.Contact_contact_id_get + if _newclass:contact_id = _swig_property(_otapi.Contact_contact_id_get, _otapi.Contact_contact_id_set) + __swig_setmethods__["email"] = _otapi.Contact_email_set + __swig_getmethods__["email"] = _otapi.Contact_email_get + if _newclass:email = _swig_property(_otapi.Contact_email_get, _otapi.Contact_email_set) + __swig_setmethods__["memo"] = _otapi.Contact_memo_set + __swig_getmethods__["memo"] = _otapi.Contact_memo_get + if _newclass:memo = _swig_property(_otapi.Contact_memo_get, _otapi.Contact_memo_set) + __swig_setmethods__["public_key"] = _otapi.Contact_public_key_set + __swig_getmethods__["public_key"] = _otapi.Contact_public_key_get + if _newclass:public_key = _swig_property(_otapi.Contact_public_key_get, _otapi.Contact_public_key_set) + def GetContactNymCount(self): return _otapi.Contact_GetContactNymCount(self) + def GetContactNym(self, *args): return _otapi.Contact_GetContactNym(self, *args) + def RemoveContactNym(self, *args): return _otapi.Contact_RemoveContactNym(self, *args) + def AddContactNym(self, *args): return _otapi.Contact_AddContactNym(self, *args) + def GetContactAcctCount(self): return _otapi.Contact_GetContactAcctCount(self) + def GetContactAcct(self, *args): return _otapi.Contact_GetContactAcct(self, *args) + def RemoveContactAcct(self, *args): return _otapi.Contact_RemoveContactAcct(self, *args) + def AddContactAcct(self, *args): return _otapi.Contact_AddContactAcct(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.Contact_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.Contact_ot_dynamic_cast) +Contact_swigregister = _otapi.Contact_swigregister +Contact_swigregister(Contact) + +def Contact_ot_dynamic_cast(*args): + return _otapi.Contact_ot_dynamic_cast(*args) +Contact_ot_dynamic_cast = _otapi.Contact_ot_dynamic_cast + +class AddressBook(Storable): + __swig_setmethods__ = {} + for _s in [Storable]: __swig_setmethods__.update(getattr(_s,'__swig_setmethods__',{})) + __setattr__ = lambda self, name, value: _swig_setattr(self, AddressBook, name, value) + __swig_getmethods__ = {} + for _s in [Storable]: __swig_getmethods__.update(getattr(_s,'__swig_getmethods__',{})) + __getattr__ = lambda self, name: _swig_getattr(self, AddressBook, name) + def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined") + __repr__ = _swig_repr + __swig_destroy__ = _otapi.delete_AddressBook + __del__ = lambda self : None; + def GetContactCount(self): return _otapi.AddressBook_GetContactCount(self) + def GetContact(self, *args): return _otapi.AddressBook_GetContact(self, *args) + def RemoveContact(self, *args): return _otapi.AddressBook_RemoveContact(self, *args) + def AddContact(self, *args): return _otapi.AddressBook_AddContact(self, *args) + __swig_getmethods__["ot_dynamic_cast"] = lambda x: _otapi.AddressBook_ot_dynamic_cast + if _newclass:ot_dynamic_cast = staticmethod(_otapi.AddressBook_ot_dynamic_cast) +AddressBook_swigregister = _otapi.AddressBook_swigregister +AddressBook_swigregister(AddressBook) + +def AddressBook_ot_dynamic_cast(*args): + return _otapi.AddressBook_ot_dynamic_cast(*args) +AddressBook_ot_dynamic_cast = _otapi.AddressBook_ot_dynamic_cast + +# This file is compatible with both classic and new-style classes. + + diff --git a/testwallet/otapiJNI.java b/testwallet/otapiJNI.java new file mode 100644 index 000000000..f7d7c2368 --- /dev/null +++ b/testwallet/otapiJNI.java @@ -0,0 +1,709 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +package com.wrapper.core.jni; + +public class otapiJNI { + public final static native long new_OTCallback(); + public final static native void delete_OTCallback(long jarg1); + public final static native String OTCallback_runOne(long jarg1, OTCallback jarg1_); + public final static native String OTCallback_runOneSwigExplicitOTCallback(long jarg1, OTCallback jarg1_); + public final static native String OTCallback_runTwo(long jarg1, OTCallback jarg1_); + public final static native String OTCallback_runTwoSwigExplicitOTCallback(long jarg1, OTCallback jarg1_); + public final static native void OTCallback_director_connect(OTCallback obj, long cptr, boolean mem_own, boolean weak_global); + public final static native void OTCallback_change_ownership(OTCallback obj, long cptr, boolean take_or_release); + public final static native long new_OTCaller(); + public final static native void delete_OTCaller(long jarg1); + public final static native String OTCaller_GetPassword(long jarg1, OTCaller jarg1_); + public final static native void OTCaller_delCallback(long jarg1, OTCaller jarg1_); + public final static native void OTCaller_setCallback(long jarg1, OTCaller jarg1_, long jarg2, OTCallback jarg2_); + public final static native boolean OTCaller_isCallbackSet(long jarg1, OTCaller jarg1_); + public final static native void OTCaller_callOne(long jarg1, OTCaller jarg1_); + public final static native void OTCaller_callTwo(long jarg1, OTCaller jarg1_); + public final static native boolean OT_API_Set_PasswordCallback(long jarg1, OTCaller jarg1_); + public final static native int OT_API_Init(String jarg1); + public final static native int OT_API_LoadWallet(String jarg1); + public final static native int OT_API_SwitchWallet(String jarg1, String jarg2); + public final static native int OT_API_GetMemlogSize(); + public final static native String OT_API_GetMemlogAtIndex(int jarg1); + public final static native String OT_API_PeekMemlogFront(); + public final static native String OT_API_PeekMemlogBack(); + public final static native int OT_API_PopMemlogFront(); + public final static native int OT_API_PopMemlogBack(); + public final static native String OT_API_CreateNym(); + public final static native int OT_API_AddServerContract(String jarg1); + public final static native int OT_API_AddAssetContract(String jarg1); + public final static native int OT_API_GetServerCount(); + public final static native int OT_API_GetAssetTypeCount(); + public final static native int OT_API_GetAccountCount(); + public final static native int OT_API_GetNymCount(); + public final static native String OT_API_GetServer_ID(int jarg1); + public final static native String OT_API_GetServer_Name(String jarg1); + public final static native String OT_API_GetAssetType_ID(int jarg1); + public final static native String OT_API_GetAssetType_Name(String jarg1); + public final static native String OT_API_GetAccountWallet_ID(int jarg1); + public final static native String OT_API_GetAccountWallet_Name(String jarg1); + public final static native String OT_API_GetAccountWallet_Balance(String jarg1); + public final static native String OT_API_GetAccountWallet_Type(String jarg1); + public final static native String OT_API_GetAccountWallet_AssetTypeID(String jarg1); + public final static native String OT_API_GetAccountWallet_ServerID(String jarg1); + public final static native String OT_API_GetAccountWallet_NymID(String jarg1); + public final static native int OT_API_VerifyAccountReceipt(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_GetNym_TransactionNumCount(String jarg1, String jarg2); + public final static native String OT_API_GetNym_ID(int jarg1); + public final static native String OT_API_GetNym_Name(String jarg1); + public final static native String OT_API_GetNym_Stats(String jarg1); + public final static native int OT_API_IsNym_RegisteredAtServer(String jarg1, String jarg2); + public final static native int OT_API_GetNym_MailCount(String jarg1); + public final static native String OT_API_GetNym_MailContentsByIndex(String jarg1, int jarg2); + public final static native String OT_API_GetNym_MailSenderIDByIndex(String jarg1, int jarg2); + public final static native String OT_API_GetNym_MailServerIDByIndex(String jarg1, int jarg2); + public final static native int OT_API_Nym_RemoveMailByIndex(String jarg1, int jarg2); + public final static native int OT_API_Nym_VerifyMailByIndex(String jarg1, int jarg2); + public final static native int OT_API_GetNym_OutmailCount(String jarg1); + public final static native String OT_API_GetNym_OutmailContentsByIndex(String jarg1, int jarg2); + public final static native String OT_API_GetNym_OutmailRecipientIDByIndex(String jarg1, int jarg2); + public final static native String OT_API_GetNym_OutmailServerIDByIndex(String jarg1, int jarg2); + public final static native int OT_API_Nym_RemoveOutmailByIndex(String jarg1, int jarg2); + public final static native int OT_API_Nym_VerifyOutmailByIndex(String jarg1, int jarg2); + public final static native int OT_API_Wallet_CanRemoveServer(String jarg1); + public final static native int OT_API_Wallet_RemoveServer(String jarg1); + public final static native int OT_API_Wallet_CanRemoveAssetType(String jarg1); + public final static native int OT_API_Wallet_RemoveAssetType(String jarg1); + public final static native int OT_API_Wallet_CanRemoveNym(String jarg1); + public final static native int OT_API_Wallet_RemoveNym(String jarg1); + public final static native int OT_API_Wallet_CanRemoveAccount(String jarg1); + public final static native String OT_API_Wallet_ImportNym(String jarg1, String jarg2); + public final static native int OT_API_SetNym_Name(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_SetAccountWallet_Name(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_SetAssetType_Name(String jarg1, String jarg2); + public final static native int OT_API_SetServer_Name(String jarg1, String jarg2); + public final static native String OT_API_VerifyAndRetrieveXMLContents(String jarg1, String jarg2); + public final static native String OT_API_WriteCheque(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7, String jarg8); + public final static native String OT_API_ProposePaymentPlan(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7, String jarg8, String jarg9, String jarg10, String jarg11, String jarg12, String jarg13, String jarg14, String jarg15); + public final static native String OT_API_ConfirmPaymentPlan(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String OT_API_LoadUserPubkey(String jarg1); + public final static native String OT_API_LoadPubkey(String jarg1); + public final static native int OT_API_VerifyUserPrivateKey(String jarg1); + public final static native String OT_API_LoadPurse(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_LoadMint(String jarg1, String jarg2); + public final static native String OT_API_LoadAssetContract(String jarg1); + public final static native String OT_API_LoadServerContract(String jarg1); + public final static native int OT_API_Mint_IsStillGood(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_IsBasketCurrency(String jarg1); + public final static native int OT_API_Basket_GetMemberCount(String jarg1); + public final static native String OT_API_Basket_GetMemberType(String jarg1, int jarg2); + public final static native String OT_API_Basket_GetMinimumTransferAmount(String jarg1); + public final static native String OT_API_Basket_GetMemberMinimumTransferAmount(String jarg1, int jarg2); + public final static native String OT_API_LoadAssetAccount(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_LoadInbox(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_LoadOutbox(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_Ledger_GetCount(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Ledger_CreateResponse(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Ledger_GetTransactionByIndex(String jarg1, String jarg2, String jarg3, String jarg4, int jarg5); + public final static native String OT_API_Ledger_GetTransactionByID(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String OT_API_Ledger_GetTransactionIDByIndex(String jarg1, String jarg2, String jarg3, String jarg4, int jarg5); + public final static native String OT_API_Ledger_AddTransaction(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String OT_API_Transaction_CreateResponse(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, int jarg6); + public final static native String OT_API_Ledger_FinalizeResponse(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetType(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetVoucher(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native int OT_API_Transaction_GetSuccess(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native int OT_API_Transaction_GetBalanceAgreementSuccess(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetDateSigned(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetAmount(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Pending_GetNote(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetSenderUserID(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetSenderAcctID(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetRecipientUserID(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetRecipientAcctID(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Transaction_GetDisplayReferenceToNum(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_CreatePurse(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_SavePurse(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Purse_GetTotalValue(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_Purse_Count(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_Purse_Peek(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Purse_Pop(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Purse_Push(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native int OT_API_Wallet_ImportPurse(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_exchangePurse(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Token_ChangeOwner(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String OT_API_Token_GetID(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_Token_GetDenomination(String jarg1, String jarg2, String jarg3); + public final static native int OT_API_Token_GetSeries(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_Token_GetValidFrom(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_Token_GetValidTo(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_Token_GetAssetID(String jarg1); + public final static native String OT_API_Token_GetServerID(String jarg1); + public final static native void OT_API_checkServerID(String jarg1, String jarg2); + public final static native void OT_API_createUserAccount(String jarg1, String jarg2); + public final static native void OT_API_deleteUserAccount(String jarg1, String jarg2); + public final static native void OT_API_deleteAssetAccount(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_checkUser(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_sendUserMessage(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native void OT_API_getRequest(String jarg1, String jarg2); + public final static native void OT_API_getTransactionNumber(String jarg1, String jarg2); + public final static native void OT_API_issueAssetType(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getContract(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getMint(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_createAssetAccount(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getAccount(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_GenerateBasketCreation(String jarg1, String jarg2); + public final static native String OT_API_AddBasketCreationItem(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_issueBasket(String jarg1, String jarg2, String jarg3); + public final static native String OT_API_GenerateBasketExchange(String jarg1, String jarg2, String jarg3, String jarg4, int jarg5); + public final static native String OT_API_AddBasketExchangeItem(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native void OT_API_exchangeBasket(String jarg1, String jarg2, String jarg3, String jarg4, int jarg5); + public final static native void OT_API_notarizeWithdrawal(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_notarizeDeposit(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_notarizeTransfer(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native void OT_API_getInbox(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getOutbox(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getNymbox(String jarg1, String jarg2); + public final static native String OT_API_LoadNymbox(String jarg1, String jarg2); + public final static native void OT_API_processInbox(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_processNymbox(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_withdrawVoucher(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native void OT_API_depositCheque(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_depositPaymentPlan(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_issueMarketOffer(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7, String jarg8, String jarg9, String jarg10, int jarg11); + public final static native void OT_API_getMarketList(String jarg1, String jarg2); + public final static native void OT_API_getMarketOffers(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_getMarketRecentTrades(String jarg1, String jarg2, String jarg3); + public final static native void OT_API_getNym_MarketOffers(String jarg1, String jarg2); + public final static native void OT_API_cancelMarketOffer(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native void OT_API_cancelPaymentPlan(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_PopMessageBuffer(); + public final static native void OT_API_FlushMessageBuffer(); + public final static native String OT_API_Message_GetCommand(String jarg1); + public final static native int OT_API_Message_GetSuccess(String jarg1); + public final static native int OT_API_Message_GetDepth(String jarg1); + public final static native int OT_API_Message_GetTransactionSuccess(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native int OT_API_Message_GetBalanceAgreementSuccess(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String OT_API_Message_GetLedger(String jarg1); + public final static native String OT_API_Message_GetNewAssetTypeID(String jarg1); + public final static native String OT_API_Message_GetNewIssuerAcctID(String jarg1); + public final static native String OT_API_Message_GetNewAcctID(String jarg1); + public final static native int OT_API_ConnectServer(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native int OT_API_ProcessSockets(); + public final static native int PACK_MESSAGE_PACK_get(); + public final static native int PACK_PROTOCOL_BUFFERS_get(); + public final static native int PACK_TYPE_ERROR_get(); + public final static native int STORE_FILESYSTEM_get(); + public final static native int STORE_TYPE_SUBCLASS_get(); + public final static native int STORED_OBJ_STRING_get(); + public final static native int STORED_OBJ_BLOB_get(); + public final static native int STORED_OBJ_STRING_MAP_get(); + public final static native int STORED_OBJ_WALLET_DATA_get(); + public final static native int STORED_OBJ_BITCOIN_ACCT_get(); + public final static native int STORED_OBJ_BITCOIN_SERVER_get(); + public final static native int STORED_OBJ_RIPPLE_SERVER_get(); + public final static native int STORED_OBJ_LOOM_SERVER_get(); + public final static native int STORED_OBJ_SERVER_INFO_get(); + public final static native int STORED_OBJ_CONTACT_NYM_get(); + public final static native int STORED_OBJ_CONTACT_ACCT_get(); + public final static native int STORED_OBJ_CONTACT_get(); + public final static native int STORED_OBJ_ADDRESS_BOOK_get(); + public final static native int STORED_OBJ_MARKET_DATA_get(); + public final static native int STORED_OBJ_MARKET_LIST_get(); + public final static native int STORED_OBJ_BID_DATA_get(); + public final static native int STORED_OBJ_ASK_DATA_get(); + public final static native int STORED_OBJ_OFFER_LIST_MARKET_get(); + public final static native int STORED_OBJ_TRADE_DATA_MARKET_get(); + public final static native int STORED_OBJ_TRADE_LIST_MARKET_get(); + public final static native int STORED_OBJ_OFFER_DATA_NYM_get(); + public final static native int STORED_OBJ_OFFER_LIST_NYM_get(); + public final static native int STORED_OBJ_TRADE_DATA_NYM_get(); + public final static native int STORED_OBJ_TRADE_LIST_NYM_get(); + public final static native int STORED_OBJ_ERROR_get(); + public final static native void delete_Storable(long jarg1); + public final static native long Storable_Create(int jarg1, int jarg2); + public final static native long Storable_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native long Storage_GetPacker__SWIG_0(long jarg1, Storage jarg1_, int jarg2); + public final static native long Storage_GetPacker__SWIG_1(long jarg1, Storage jarg1_); + public final static native boolean Storage_Init__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7); + public final static native boolean Storage_Init__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native boolean Storage_Init__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_Init__SWIG_3(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean Storage_Init__SWIG_4(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native boolean Storage_Init__SWIG_5(long jarg1, Storage jarg1_, String jarg2); + public final static native boolean Storage_Init__SWIG_6(long jarg1, Storage jarg1_); + public final static native boolean Storage_Exists__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_Exists__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean Storage_Exists__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native boolean Storage_Exists__SWIG_3(long jarg1, Storage jarg1_, String jarg2); + public final static native void delete_Storage(long jarg1); + public final static native boolean Storage_StoreString__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native boolean Storage_StoreString__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_StoreString__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean Storage_StoreString__SWIG_3(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native String Storage_QueryString__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String Storage_QueryString__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native String Storage_QueryString__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native String Storage_QueryString__SWIG_3(long jarg1, Storage jarg1_, String jarg2); + public final static native boolean Storage_StorePlainString__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native boolean Storage_StorePlainString__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_StorePlainString__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean Storage_StorePlainString__SWIG_3(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native String Storage_QueryPlainString__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native String Storage_QueryPlainString__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native String Storage_QueryPlainString__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native String Storage_QueryPlainString__SWIG_3(long jarg1, Storage jarg1_, String jarg2); + public final static native boolean Storage_StoreObject__SWIG_0(long jarg1, Storage jarg1_, long jarg2, Storable jarg2_, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native boolean Storage_StoreObject__SWIG_1(long jarg1, Storage jarg1_, long jarg2, Storable jarg2_, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_StoreObject__SWIG_2(long jarg1, Storage jarg1_, long jarg2, Storable jarg2_, String jarg3, String jarg4); + public final static native boolean Storage_StoreObject__SWIG_3(long jarg1, Storage jarg1_, long jarg2, Storable jarg2_, String jarg3); + public final static native long Storage_QueryObject__SWIG_0(long jarg1, Storage jarg1_, int jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native long Storage_QueryObject__SWIG_1(long jarg1, Storage jarg1_, int jarg2, String jarg3, String jarg4, String jarg5); + public final static native long Storage_QueryObject__SWIG_2(long jarg1, Storage jarg1_, int jarg2, String jarg3, String jarg4); + public final static native long Storage_QueryObject__SWIG_3(long jarg1, Storage jarg1_, int jarg2, String jarg3); + public final static native boolean Storage_EraseValueByKey__SWIG_0(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean Storage_EraseValueByKey__SWIG_1(long jarg1, Storage jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean Storage_EraseValueByKey__SWIG_2(long jarg1, Storage jarg1_, String jarg2, String jarg3); + public final static native boolean Storage_EraseValueByKey__SWIG_3(long jarg1, Storage jarg1_, String jarg2); + public final static native long Storage_CreateObject(long jarg1, Storage jarg1_, int jarg2); + public final static native long Storage_Create(int jarg1, int jarg2); + public final static native int Storage_GetType(long jarg1, Storage jarg1_); + public final static native boolean InitDefaultStorage__SWIG_0(int jarg1, int jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7, String jarg8); + public final static native boolean InitDefaultStorage__SWIG_1(int jarg1, int jarg2, String jarg3, String jarg4, String jarg5, String jarg6, String jarg7); + public final static native boolean InitDefaultStorage__SWIG_2(int jarg1, int jarg2, String jarg3, String jarg4, String jarg5, String jarg6); + public final static native boolean InitDefaultStorage__SWIG_3(int jarg1, int jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean InitDefaultStorage__SWIG_4(int jarg1, int jarg2, String jarg3, String jarg4); + public final static native boolean InitDefaultStorage__SWIG_5(int jarg1, int jarg2, String jarg3); + public final static native boolean InitDefaultStorage__SWIG_6(int jarg1, int jarg2); + public final static native long GetDefaultStorage(); + public final static native long CreateStorageContext__SWIG_0(int jarg1, int jarg2); + public final static native long CreateStorageContext__SWIG_1(int jarg1); + public final static native long CreateObject(int jarg1); + public final static native boolean Exists__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native boolean Exists__SWIG_1(String jarg1, String jarg2, String jarg3); + public final static native boolean Exists__SWIG_2(String jarg1, String jarg2); + public final static native boolean Exists__SWIG_3(String jarg1); + public final static native boolean StoreString__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean StoreString__SWIG_1(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native boolean StoreString__SWIG_2(String jarg1, String jarg2, String jarg3); + public final static native boolean StoreString__SWIG_3(String jarg1, String jarg2); + public final static native String QueryString__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String QueryString__SWIG_1(String jarg1, String jarg2, String jarg3); + public final static native String QueryString__SWIG_2(String jarg1, String jarg2); + public final static native String QueryString__SWIG_3(String jarg1); + public final static native boolean StorePlainString__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean StorePlainString__SWIG_1(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native boolean StorePlainString__SWIG_2(String jarg1, String jarg2, String jarg3); + public final static native boolean StorePlainString__SWIG_3(String jarg1, String jarg2); + public final static native String QueryPlainString__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native String QueryPlainString__SWIG_1(String jarg1, String jarg2, String jarg3); + public final static native String QueryPlainString__SWIG_2(String jarg1, String jarg2); + public final static native String QueryPlainString__SWIG_3(String jarg1); + public final static native boolean StoreObject__SWIG_0(long jarg1, Storable jarg1_, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native boolean StoreObject__SWIG_1(long jarg1, Storable jarg1_, String jarg2, String jarg3, String jarg4); + public final static native boolean StoreObject__SWIG_2(long jarg1, Storable jarg1_, String jarg2, String jarg3); + public final static native boolean StoreObject__SWIG_3(long jarg1, Storable jarg1_, String jarg2); + public final static native long QueryObject__SWIG_0(int jarg1, String jarg2, String jarg3, String jarg4, String jarg5); + public final static native long QueryObject__SWIG_1(int jarg1, String jarg2, String jarg3, String jarg4); + public final static native long QueryObject__SWIG_2(int jarg1, String jarg2, String jarg3); + public final static native long QueryObject__SWIG_3(int jarg1, String jarg2); + public final static native boolean EraseValueByKey__SWIG_0(String jarg1, String jarg2, String jarg3, String jarg4); + public final static native boolean EraseValueByKey__SWIG_1(String jarg1, String jarg2, String jarg3); + public final static native boolean EraseValueByKey__SWIG_2(String jarg1, String jarg2); + public final static native boolean EraseValueByKey__SWIG_3(String jarg1); + public final static native void delete_OTDBString(long jarg1); + public final static native void OTDBString_m_string_set(long jarg1, OTDBString jarg1_, String jarg2); + public final static native String OTDBString_m_string_get(long jarg1, OTDBString jarg1_); + public final static native long OTDBString_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_Blob(long jarg1); + public final static native void Blob_m_memBuffer_set(long jarg1, Blob jarg1_, long jarg2); + public final static native long Blob_m_memBuffer_get(long jarg1, Blob jarg1_); + public final static native long Blob_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_StringMap(long jarg1); + public final static native void StringMap_the_map_set(long jarg1, StringMap jarg1_, long jarg2); + public final static native long StringMap_the_map_get(long jarg1, StringMap jarg1_); + public final static native void StringMap_SetValue(long jarg1, StringMap jarg1_, String jarg2, String jarg3); + public final static native String StringMap_GetValue(long jarg1, StringMap jarg1_, String jarg2); + public final static native long StringMap_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_Displayable(long jarg1); + public final static native void Displayable_gui_label_set(long jarg1, Displayable jarg1_, String jarg2); + public final static native String Displayable_gui_label_get(long jarg1, Displayable jarg1_); + public final static native long Displayable_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_MarketData(long jarg1); + public final static native void MarketData_gui_label_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_gui_label_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_server_id_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_server_id_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_market_id_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_market_id_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_asset_type_id_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_asset_type_id_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_currency_type_id_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_currency_type_id_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_scale_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_scale_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_total_assets_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_total_assets_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_number_bids_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_number_bids_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_number_asks_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_number_asks_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_last_sale_price_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_last_sale_price_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_current_bid_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_current_bid_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_current_ask_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_current_ask_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_volume_trades_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_volume_trades_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_volume_assets_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_volume_assets_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_volume_currency_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_volume_currency_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_recent_highest_bid_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_recent_highest_bid_get(long jarg1, MarketData jarg1_); + public final static native void MarketData_recent_lowest_ask_set(long jarg1, MarketData jarg1_, String jarg2); + public final static native String MarketData_recent_lowest_ask_get(long jarg1, MarketData jarg1_); + public final static native long MarketData_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_MarketList(long jarg1); + public final static native long MarketList_GetMarketDataCount(long jarg1, MarketList jarg1_); + public final static native long MarketList_GetMarketData(long jarg1, MarketList jarg1_, long jarg2); + public final static native boolean MarketList_RemoveMarketData(long jarg1, MarketList jarg1_, long jarg2); + public final static native boolean MarketList_AddMarketData(long jarg1, MarketList jarg1_, long jarg2, MarketData jarg2_); + public final static native long MarketList_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_OfferDataMarket(long jarg1); + public final static native void OfferDataMarket_gui_label_set(long jarg1, OfferDataMarket jarg1_, String jarg2); + public final static native String OfferDataMarket_gui_label_get(long jarg1, OfferDataMarket jarg1_); + public final static native void OfferDataMarket_transaction_id_set(long jarg1, OfferDataMarket jarg1_, String jarg2); + public final static native String OfferDataMarket_transaction_id_get(long jarg1, OfferDataMarket jarg1_); + public final static native void OfferDataMarket_price_per_scale_set(long jarg1, OfferDataMarket jarg1_, String jarg2); + public final static native String OfferDataMarket_price_per_scale_get(long jarg1, OfferDataMarket jarg1_); + public final static native void OfferDataMarket_available_assets_set(long jarg1, OfferDataMarket jarg1_, String jarg2); + public final static native String OfferDataMarket_available_assets_get(long jarg1, OfferDataMarket jarg1_); + public final static native void OfferDataMarket_minimum_increment_set(long jarg1, OfferDataMarket jarg1_, String jarg2); + public final static native String OfferDataMarket_minimum_increment_get(long jarg1, OfferDataMarket jarg1_); + public final static native long OfferDataMarket_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_BidData(long jarg1); + public final static native void BidData_gui_label_set(long jarg1, BidData jarg1_, String jarg2); + public final static native String BidData_gui_label_get(long jarg1, BidData jarg1_); + public final static native void BidData_transaction_id_set(long jarg1, BidData jarg1_, String jarg2); + public final static native String BidData_transaction_id_get(long jarg1, BidData jarg1_); + public final static native void BidData_price_per_scale_set(long jarg1, BidData jarg1_, String jarg2); + public final static native String BidData_price_per_scale_get(long jarg1, BidData jarg1_); + public final static native void BidData_available_assets_set(long jarg1, BidData jarg1_, String jarg2); + public final static native String BidData_available_assets_get(long jarg1, BidData jarg1_); + public final static native void BidData_minimum_increment_set(long jarg1, BidData jarg1_, String jarg2); + public final static native String BidData_minimum_increment_get(long jarg1, BidData jarg1_); + public final static native long BidData_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_AskData(long jarg1); + public final static native void AskData_gui_label_set(long jarg1, AskData jarg1_, String jarg2); + public final static native String AskData_gui_label_get(long jarg1, AskData jarg1_); + public final static native void AskData_transaction_id_set(long jarg1, AskData jarg1_, String jarg2); + public final static native String AskData_transaction_id_get(long jarg1, AskData jarg1_); + public final static native void AskData_price_per_scale_set(long jarg1, AskData jarg1_, String jarg2); + public final static native String AskData_price_per_scale_get(long jarg1, AskData jarg1_); + public final static native void AskData_available_assets_set(long jarg1, AskData jarg1_, String jarg2); + public final static native String AskData_available_assets_get(long jarg1, AskData jarg1_); + public final static native void AskData_minimum_increment_set(long jarg1, AskData jarg1_, String jarg2); + public final static native String AskData_minimum_increment_get(long jarg1, AskData jarg1_); + public final static native long AskData_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_OfferListMarket(long jarg1); + public final static native long OfferListMarket_GetBidDataCount(long jarg1, OfferListMarket jarg1_); + public final static native long OfferListMarket_GetBidData(long jarg1, OfferListMarket jarg1_, long jarg2); + public final static native boolean OfferListMarket_RemoveBidData(long jarg1, OfferListMarket jarg1_, long jarg2); + public final static native boolean OfferListMarket_AddBidData(long jarg1, OfferListMarket jarg1_, long jarg2, BidData jarg2_); + public final static native long OfferListMarket_GetAskDataCount(long jarg1, OfferListMarket jarg1_); + public final static native long OfferListMarket_GetAskData(long jarg1, OfferListMarket jarg1_, long jarg2); + public final static native boolean OfferListMarket_RemoveAskData(long jarg1, OfferListMarket jarg1_, long jarg2); + public final static native boolean OfferListMarket_AddAskData(long jarg1, OfferListMarket jarg1_, long jarg2, AskData jarg2_); + public final static native long OfferListMarket_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_TradeDataMarket(long jarg1); + public final static native void TradeDataMarket_gui_label_set(long jarg1, TradeDataMarket jarg1_, String jarg2); + public final static native String TradeDataMarket_gui_label_get(long jarg1, TradeDataMarket jarg1_); + public final static native void TradeDataMarket_transaction_id_set(long jarg1, TradeDataMarket jarg1_, String jarg2); + public final static native String TradeDataMarket_transaction_id_get(long jarg1, TradeDataMarket jarg1_); + public final static native void TradeDataMarket_date_set(long jarg1, TradeDataMarket jarg1_, String jarg2); + public final static native String TradeDataMarket_date_get(long jarg1, TradeDataMarket jarg1_); + public final static native void TradeDataMarket_price_set(long jarg1, TradeDataMarket jarg1_, String jarg2); + public final static native String TradeDataMarket_price_get(long jarg1, TradeDataMarket jarg1_); + public final static native void TradeDataMarket_amount_sold_set(long jarg1, TradeDataMarket jarg1_, String jarg2); + public final static native String TradeDataMarket_amount_sold_get(long jarg1, TradeDataMarket jarg1_); + public final static native long TradeDataMarket_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_TradeListMarket(long jarg1); + public final static native long TradeListMarket_GetTradeDataMarketCount(long jarg1, TradeListMarket jarg1_); + public final static native long TradeListMarket_GetTradeDataMarket(long jarg1, TradeListMarket jarg1_, long jarg2); + public final static native boolean TradeListMarket_RemoveTradeDataMarket(long jarg1, TradeListMarket jarg1_, long jarg2); + public final static native boolean TradeListMarket_AddTradeDataMarket(long jarg1, TradeListMarket jarg1_, long jarg2, TradeDataMarket jarg2_); + public final static native long TradeListMarket_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_OfferDataNym(long jarg1); + public final static native void OfferDataNym_gui_label_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_gui_label_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_valid_from_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_valid_from_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_valid_to_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_valid_to_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_server_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_server_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_asset_type_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_asset_type_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_asset_acct_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_asset_acct_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_currency_type_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_currency_type_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_currency_acct_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_currency_acct_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_selling_set(long jarg1, OfferDataNym jarg1_, boolean jarg2); + public final static native boolean OfferDataNym_selling_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_scale_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_scale_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_price_per_scale_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_price_per_scale_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_transaction_id_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_transaction_id_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_total_assets_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_total_assets_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_finished_so_far_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_finished_so_far_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_minimum_increment_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_minimum_increment_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_stop_sign_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_stop_sign_get(long jarg1, OfferDataNym jarg1_); + public final static native void OfferDataNym_stop_price_set(long jarg1, OfferDataNym jarg1_, String jarg2); + public final static native String OfferDataNym_stop_price_get(long jarg1, OfferDataNym jarg1_); + public final static native long OfferDataNym_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_OfferListNym(long jarg1); + public final static native long OfferListNym_GetOfferDataNymCount(long jarg1, OfferListNym jarg1_); + public final static native long OfferListNym_GetOfferDataNym(long jarg1, OfferListNym jarg1_, long jarg2); + public final static native boolean OfferListNym_RemoveOfferDataNym(long jarg1, OfferListNym jarg1_, long jarg2); + public final static native boolean OfferListNym_AddOfferDataNym(long jarg1, OfferListNym jarg1_, long jarg2, OfferDataNym jarg2_); + public final static native long OfferListNym_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_TradeDataNym(long jarg1); + public final static native void TradeDataNym_gui_label_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_gui_label_get(long jarg1, TradeDataNym jarg1_); + public final static native void TradeDataNym_transaction_id_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_transaction_id_get(long jarg1, TradeDataNym jarg1_); + public final static native void TradeDataNym_completed_count_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_completed_count_get(long jarg1, TradeDataNym jarg1_); + public final static native void TradeDataNym_date_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_date_get(long jarg1, TradeDataNym jarg1_); + public final static native void TradeDataNym_price_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_price_get(long jarg1, TradeDataNym jarg1_); + public final static native void TradeDataNym_amount_sold_set(long jarg1, TradeDataNym jarg1_, String jarg2); + public final static native String TradeDataNym_amount_sold_get(long jarg1, TradeDataNym jarg1_); + public final static native long TradeDataNym_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_TradeListNym(long jarg1); + public final static native long TradeListNym_GetTradeDataNymCount(long jarg1, TradeListNym jarg1_); + public final static native long TradeListNym_GetTradeDataNym(long jarg1, TradeListNym jarg1_, long jarg2); + public final static native boolean TradeListNym_RemoveTradeDataNym(long jarg1, TradeListNym jarg1_, long jarg2); + public final static native boolean TradeListNym_AddTradeDataNym(long jarg1, TradeListNym jarg1_, long jarg2, TradeDataNym jarg2_); + public final static native long TradeListNym_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_Acct(long jarg1); + public final static native void Acct_gui_label_set(long jarg1, Acct jarg1_, String jarg2); + public final static native String Acct_gui_label_get(long jarg1, Acct jarg1_); + public final static native void Acct_acct_id_set(long jarg1, Acct jarg1_, String jarg2); + public final static native String Acct_acct_id_get(long jarg1, Acct jarg1_); + public final static native void Acct_server_id_set(long jarg1, Acct jarg1_, String jarg2); + public final static native String Acct_server_id_get(long jarg1, Acct jarg1_); + public final static native long Acct_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_BitcoinAcct(long jarg1); + public final static native void BitcoinAcct_gui_label_set(long jarg1, BitcoinAcct jarg1_, String jarg2); + public final static native String BitcoinAcct_gui_label_get(long jarg1, BitcoinAcct jarg1_); + public final static native void BitcoinAcct_acct_id_set(long jarg1, BitcoinAcct jarg1_, String jarg2); + public final static native String BitcoinAcct_acct_id_get(long jarg1, BitcoinAcct jarg1_); + public final static native void BitcoinAcct_server_id_set(long jarg1, BitcoinAcct jarg1_, String jarg2); + public final static native String BitcoinAcct_server_id_get(long jarg1, BitcoinAcct jarg1_); + public final static native void BitcoinAcct_bitcoin_acct_name_set(long jarg1, BitcoinAcct jarg1_, String jarg2); + public final static native String BitcoinAcct_bitcoin_acct_name_get(long jarg1, BitcoinAcct jarg1_); + public final static native long BitcoinAcct_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_ServerInfo(long jarg1); + public final static native void ServerInfo_gui_label_set(long jarg1, ServerInfo jarg1_, String jarg2); + public final static native String ServerInfo_gui_label_get(long jarg1, ServerInfo jarg1_); + public final static native void ServerInfo_server_id_set(long jarg1, ServerInfo jarg1_, String jarg2); + public final static native String ServerInfo_server_id_get(long jarg1, ServerInfo jarg1_); + public final static native void ServerInfo_server_type_set(long jarg1, ServerInfo jarg1_, String jarg2); + public final static native String ServerInfo_server_type_get(long jarg1, ServerInfo jarg1_); + public final static native long ServerInfo_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_Server(long jarg1); + public final static native void Server_gui_label_set(long jarg1, Server jarg1_, String jarg2); + public final static native String Server_gui_label_get(long jarg1, Server jarg1_); + public final static native void Server_server_id_set(long jarg1, Server jarg1_, String jarg2); + public final static native String Server_server_id_get(long jarg1, Server jarg1_); + public final static native void Server_server_type_set(long jarg1, Server jarg1_, String jarg2); + public final static native String Server_server_type_get(long jarg1, Server jarg1_); + public final static native void Server_server_host_set(long jarg1, Server jarg1_, String jarg2); + public final static native String Server_server_host_get(long jarg1, Server jarg1_); + public final static native void Server_server_port_set(long jarg1, Server jarg1_, String jarg2); + public final static native String Server_server_port_get(long jarg1, Server jarg1_); + public final static native long Server_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_BitcoinServer(long jarg1); + public final static native void BitcoinServer_gui_label_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_gui_label_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_server_id_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_server_id_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_server_type_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_server_type_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_server_host_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_server_host_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_server_port_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_server_port_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_bitcoin_username_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_bitcoin_username_get(long jarg1, BitcoinServer jarg1_); + public final static native void BitcoinServer_bitcoin_password_set(long jarg1, BitcoinServer jarg1_, String jarg2); + public final static native String BitcoinServer_bitcoin_password_get(long jarg1, BitcoinServer jarg1_); + public final static native long BitcoinServer_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_RippleServer(long jarg1); + public final static native void RippleServer_gui_label_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_gui_label_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_server_id_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_server_id_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_server_type_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_server_type_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_server_host_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_server_host_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_server_port_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_server_port_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_ripple_username_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_ripple_username_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_ripple_password_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_ripple_password_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_namefield_id_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_namefield_id_get(long jarg1, RippleServer jarg1_); + public final static native void RippleServer_passfield_id_set(long jarg1, RippleServer jarg1_, String jarg2); + public final static native String RippleServer_passfield_id_get(long jarg1, RippleServer jarg1_); + public final static native long RippleServer_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_LoomServer(long jarg1); + public final static native void LoomServer_gui_label_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_gui_label_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_server_id_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_server_id_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_server_type_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_server_type_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_server_host_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_server_host_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_server_port_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_server_port_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_loom_username_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_loom_username_get(long jarg1, LoomServer jarg1_); + public final static native void LoomServer_namefield_id_set(long jarg1, LoomServer jarg1_, String jarg2); + public final static native String LoomServer_namefield_id_get(long jarg1, LoomServer jarg1_); + public final static native long LoomServer_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_ContactNym(long jarg1); + public final static native void ContactNym_gui_label_set(long jarg1, ContactNym jarg1_, String jarg2); + public final static native String ContactNym_gui_label_get(long jarg1, ContactNym jarg1_); + public final static native void ContactNym_nym_type_set(long jarg1, ContactNym jarg1_, String jarg2); + public final static native String ContactNym_nym_type_get(long jarg1, ContactNym jarg1_); + public final static native void ContactNym_nym_id_set(long jarg1, ContactNym jarg1_, String jarg2); + public final static native String ContactNym_nym_id_get(long jarg1, ContactNym jarg1_); + public final static native void ContactNym_public_key_set(long jarg1, ContactNym jarg1_, String jarg2); + public final static native String ContactNym_public_key_get(long jarg1, ContactNym jarg1_); + public final static native void ContactNym_memo_set(long jarg1, ContactNym jarg1_, String jarg2); + public final static native String ContactNym_memo_get(long jarg1, ContactNym jarg1_); + public final static native long ContactNym_GetServerInfoCount(long jarg1, ContactNym jarg1_); + public final static native long ContactNym_GetServerInfo(long jarg1, ContactNym jarg1_, long jarg2); + public final static native boolean ContactNym_RemoveServerInfo(long jarg1, ContactNym jarg1_, long jarg2); + public final static native boolean ContactNym_AddServerInfo(long jarg1, ContactNym jarg1_, long jarg2, ServerInfo jarg2_); + public final static native long ContactNym_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_WalletData(long jarg1); + public final static native long WalletData_GetBitcoinServerCount(long jarg1, WalletData jarg1_); + public final static native long WalletData_GetBitcoinServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_RemoveBitcoinServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_AddBitcoinServer(long jarg1, WalletData jarg1_, long jarg2, BitcoinServer jarg2_); + public final static native long WalletData_GetBitcoinAcctCount(long jarg1, WalletData jarg1_); + public final static native long WalletData_GetBitcoinAcct(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_RemoveBitcoinAcct(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_AddBitcoinAcct(long jarg1, WalletData jarg1_, long jarg2, BitcoinAcct jarg2_); + public final static native long WalletData_GetRippleServerCount(long jarg1, WalletData jarg1_); + public final static native long WalletData_GetRippleServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_RemoveRippleServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_AddRippleServer(long jarg1, WalletData jarg1_, long jarg2, RippleServer jarg2_); + public final static native long WalletData_GetLoomServerCount(long jarg1, WalletData jarg1_); + public final static native long WalletData_GetLoomServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_RemoveLoomServer(long jarg1, WalletData jarg1_, long jarg2); + public final static native boolean WalletData_AddLoomServer(long jarg1, WalletData jarg1_, long jarg2, LoomServer jarg2_); + public final static native long WalletData_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_ContactAcct(long jarg1); + public final static native void ContactAcct_gui_label_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_gui_label_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_server_type_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_server_type_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_server_id_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_server_id_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_asset_type_id_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_asset_type_id_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_acct_id_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_acct_id_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_nym_id_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_nym_id_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_memo_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_memo_get(long jarg1, ContactAcct jarg1_); + public final static native void ContactAcct_public_key_set(long jarg1, ContactAcct jarg1_, String jarg2); + public final static native String ContactAcct_public_key_get(long jarg1, ContactAcct jarg1_); + public final static native long ContactAcct_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_Contact(long jarg1); + public final static native void Contact_gui_label_set(long jarg1, Contact jarg1_, String jarg2); + public final static native String Contact_gui_label_get(long jarg1, Contact jarg1_); + public final static native void Contact_contact_id_set(long jarg1, Contact jarg1_, String jarg2); + public final static native String Contact_contact_id_get(long jarg1, Contact jarg1_); + public final static native void Contact_email_set(long jarg1, Contact jarg1_, String jarg2); + public final static native String Contact_email_get(long jarg1, Contact jarg1_); + public final static native void Contact_memo_set(long jarg1, Contact jarg1_, String jarg2); + public final static native String Contact_memo_get(long jarg1, Contact jarg1_); + public final static native void Contact_public_key_set(long jarg1, Contact jarg1_, String jarg2); + public final static native String Contact_public_key_get(long jarg1, Contact jarg1_); + public final static native long Contact_GetContactNymCount(long jarg1, Contact jarg1_); + public final static native long Contact_GetContactNym(long jarg1, Contact jarg1_, long jarg2); + public final static native boolean Contact_RemoveContactNym(long jarg1, Contact jarg1_, long jarg2); + public final static native boolean Contact_AddContactNym(long jarg1, Contact jarg1_, long jarg2, ContactNym jarg2_); + public final static native long Contact_GetContactAcctCount(long jarg1, Contact jarg1_); + public final static native long Contact_GetContactAcct(long jarg1, Contact jarg1_, long jarg2); + public final static native boolean Contact_RemoveContactAcct(long jarg1, Contact jarg1_, long jarg2); + public final static native boolean Contact_AddContactAcct(long jarg1, Contact jarg1_, long jarg2, ContactAcct jarg2_); + public final static native long Contact_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native void delete_AddressBook(long jarg1); + public final static native long AddressBook_GetContactCount(long jarg1, AddressBook jarg1_); + public final static native long AddressBook_GetContact(long jarg1, AddressBook jarg1_, long jarg2); + public final static native boolean AddressBook_RemoveContact(long jarg1, AddressBook jarg1_, long jarg2); + public final static native boolean AddressBook_AddContact(long jarg1, AddressBook jarg1_, long jarg2, Contact jarg2_); + public final static native long AddressBook_ot_dynamic_cast(long jarg1, Storable jarg1_); + public final static native long OTDBString_SWIGUpcast(long jarg1); + public final static native long Blob_SWIGUpcast(long jarg1); + public final static native long StringMap_SWIGUpcast(long jarg1); + public final static native long Displayable_SWIGUpcast(long jarg1); + public final static native long MarketData_SWIGUpcast(long jarg1); + public final static native long MarketList_SWIGUpcast(long jarg1); + public final static native long OfferDataMarket_SWIGUpcast(long jarg1); + public final static native long BidData_SWIGUpcast(long jarg1); + public final static native long AskData_SWIGUpcast(long jarg1); + public final static native long OfferListMarket_SWIGUpcast(long jarg1); + public final static native long TradeDataMarket_SWIGUpcast(long jarg1); + public final static native long TradeListMarket_SWIGUpcast(long jarg1); + public final static native long OfferDataNym_SWIGUpcast(long jarg1); + public final static native long OfferListNym_SWIGUpcast(long jarg1); + public final static native long TradeDataNym_SWIGUpcast(long jarg1); + public final static native long TradeListNym_SWIGUpcast(long jarg1); + public final static native long Acct_SWIGUpcast(long jarg1); + public final static native long BitcoinAcct_SWIGUpcast(long jarg1); + public final static native long ServerInfo_SWIGUpcast(long jarg1); + public final static native long Server_SWIGUpcast(long jarg1); + public final static native long BitcoinServer_SWIGUpcast(long jarg1); + public final static native long RippleServer_SWIGUpcast(long jarg1); + public final static native long LoomServer_SWIGUpcast(long jarg1); + public final static native long ContactNym_SWIGUpcast(long jarg1); + public final static native long WalletData_SWIGUpcast(long jarg1); + public final static native long ContactAcct_SWIGUpcast(long jarg1); + public final static native long Contact_SWIGUpcast(long jarg1); + public final static native long AddressBook_SWIGUpcast(long jarg1); + + public static String SwigDirector_OTCallback_runOne(OTCallback self) { + return self.runOne(); + } + public static String SwigDirector_OTCallback_runTwo(OTCallback self) { + return self.runTwo(); + } + + private final static native void swig_module_init(); + static { + swig_module_init(); + } +} diff --git a/testwallet/otapiPINVOKE.cs b/testwallet/otapiPINVOKE.cs new file mode 100644 index 000000000..74e6803a0 --- /dev/null +++ b/testwallet/otapiPINVOKE.cs @@ -0,0 +1,2152 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + + +using System; +using System.Runtime.InteropServices; + +class otapiPINVOKE { + + protected class SWIGExceptionHelper { + + public delegate void ExceptionDelegate(string message); + public delegate void ExceptionArgumentDelegate(string message, string paramName); + + static ExceptionDelegate applicationDelegate = new ExceptionDelegate(SetPendingApplicationException); + static ExceptionDelegate arithmeticDelegate = new ExceptionDelegate(SetPendingArithmeticException); + static ExceptionDelegate divideByZeroDelegate = new ExceptionDelegate(SetPendingDivideByZeroException); + static ExceptionDelegate indexOutOfRangeDelegate = new ExceptionDelegate(SetPendingIndexOutOfRangeException); + static ExceptionDelegate invalidCastDelegate = new ExceptionDelegate(SetPendingInvalidCastException); + static ExceptionDelegate invalidOperationDelegate = new ExceptionDelegate(SetPendingInvalidOperationException); + static ExceptionDelegate ioDelegate = new ExceptionDelegate(SetPendingIOException); + static ExceptionDelegate nullReferenceDelegate = new ExceptionDelegate(SetPendingNullReferenceException); + static ExceptionDelegate outOfMemoryDelegate = new ExceptionDelegate(SetPendingOutOfMemoryException); + static ExceptionDelegate overflowDelegate = new ExceptionDelegate(SetPendingOverflowException); + static ExceptionDelegate systemDelegate = new ExceptionDelegate(SetPendingSystemException); + + static ExceptionArgumentDelegate argumentDelegate = new ExceptionArgumentDelegate(SetPendingArgumentException); + static ExceptionArgumentDelegate argumentNullDelegate = new ExceptionArgumentDelegate(SetPendingArgumentNullException); + static ExceptionArgumentDelegate argumentOutOfRangeDelegate = new ExceptionArgumentDelegate(SetPendingArgumentOutOfRangeException); + + [DllImport("otapi", EntryPoint="SWIGRegisterExceptionCallbacks_otapi")] + public static extern void SWIGRegisterExceptionCallbacks_otapi( + ExceptionDelegate applicationDelegate, + ExceptionDelegate arithmeticDelegate, + ExceptionDelegate divideByZeroDelegate, + ExceptionDelegate indexOutOfRangeDelegate, + ExceptionDelegate invalidCastDelegate, + ExceptionDelegate invalidOperationDelegate, + ExceptionDelegate ioDelegate, + ExceptionDelegate nullReferenceDelegate, + ExceptionDelegate outOfMemoryDelegate, + ExceptionDelegate overflowDelegate, + ExceptionDelegate systemExceptionDelegate); + + [DllImport("otapi", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_otapi")] + public static extern void SWIGRegisterExceptionCallbacksArgument_otapi( + ExceptionArgumentDelegate argumentDelegate, + ExceptionArgumentDelegate argumentNullDelegate, + ExceptionArgumentDelegate argumentOutOfRangeDelegate); + + static void SetPendingApplicationException(string message) { + SWIGPendingException.Set(new System.ApplicationException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingArithmeticException(string message) { + SWIGPendingException.Set(new System.ArithmeticException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingDivideByZeroException(string message) { + SWIGPendingException.Set(new System.DivideByZeroException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingIndexOutOfRangeException(string message) { + SWIGPendingException.Set(new System.IndexOutOfRangeException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingInvalidCastException(string message) { + SWIGPendingException.Set(new System.InvalidCastException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingInvalidOperationException(string message) { + SWIGPendingException.Set(new System.InvalidOperationException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingIOException(string message) { + SWIGPendingException.Set(new System.IO.IOException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingNullReferenceException(string message) { + SWIGPendingException.Set(new System.NullReferenceException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingOutOfMemoryException(string message) { + SWIGPendingException.Set(new System.OutOfMemoryException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingOverflowException(string message) { + SWIGPendingException.Set(new System.OverflowException(message, SWIGPendingException.Retrieve())); + } + static void SetPendingSystemException(string message) { + SWIGPendingException.Set(new System.SystemException(message, SWIGPendingException.Retrieve())); + } + + static void SetPendingArgumentException(string message, string paramName) { + SWIGPendingException.Set(new System.ArgumentException(message, paramName, SWIGPendingException.Retrieve())); + } + static void SetPendingArgumentNullException(string message, string paramName) { + Exception e = SWIGPendingException.Retrieve(); + if (e != null) message = message + " Inner Exception: " + e.Message; + SWIGPendingException.Set(new System.ArgumentNullException(paramName, message)); + } + static void SetPendingArgumentOutOfRangeException(string message, string paramName) { + Exception e = SWIGPendingException.Retrieve(); + if (e != null) message = message + " Inner Exception: " + e.Message; + SWIGPendingException.Set(new System.ArgumentOutOfRangeException(paramName, message)); + } + + static SWIGExceptionHelper() { + SWIGRegisterExceptionCallbacks_otapi( + applicationDelegate, + arithmeticDelegate, + divideByZeroDelegate, + indexOutOfRangeDelegate, + invalidCastDelegate, + invalidOperationDelegate, + ioDelegate, + nullReferenceDelegate, + outOfMemoryDelegate, + overflowDelegate, + systemDelegate); + + SWIGRegisterExceptionCallbacksArgument_otapi( + argumentDelegate, + argumentNullDelegate, + argumentOutOfRangeDelegate); + } + } + + protected static SWIGExceptionHelper swigExceptionHelper = new SWIGExceptionHelper(); + + public class SWIGPendingException { + [ThreadStatic] + private static Exception pendingException = null; + private static int numExceptionsPending = 0; + + public static bool Pending { + get { + bool pending = false; + if (numExceptionsPending > 0) + if (pendingException != null) + pending = true; + return pending; + } + } + + public static void Set(Exception e) { + if (pendingException != null) + throw new ApplicationException("FATAL: An earlier pending exception from unmanaged code was missed and thus not thrown (" + pendingException.ToString() + ")", e); + pendingException = e; + lock(typeof(otapiPINVOKE)) { + numExceptionsPending++; + } + } + + public static Exception Retrieve() { + Exception e = null; + if (numExceptionsPending > 0) { + if (pendingException != null) { + e = pendingException; + pendingException = null; + lock(typeof(otapiPINVOKE)) { + numExceptionsPending--; + } + } + } + return e; + } + } + + + protected class SWIGStringHelper { + + public delegate string SWIGStringDelegate(string message); + static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString); + + [DllImport("otapi", EntryPoint="SWIGRegisterStringCallback_otapi")] + public static extern void SWIGRegisterStringCallback_otapi(SWIGStringDelegate stringDelegate); + + static string CreateString(string cString) { + return cString; + } + + static SWIGStringHelper() { + SWIGRegisterStringCallback_otapi(stringDelegate); + } + } + + static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); + + + static otapiPINVOKE() { + } + + + [DllImport("otapi", EntryPoint="CSharp_new_OTCallback")] + public static extern IntPtr new_OTCallback(); + + [DllImport("otapi", EntryPoint="CSharp_delete_OTCallback")] + public static extern void delete_OTCallback(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCallback_runOne")] + public static extern string OTCallback_runOne(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCallback_runOneSwigExplicitOTCallback")] + public static extern string OTCallback_runOneSwigExplicitOTCallback(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCallback_runTwo")] + public static extern string OTCallback_runTwo(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCallback_runTwoSwigExplicitOTCallback")] + public static extern string OTCallback_runTwoSwigExplicitOTCallback(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCallback_director_connect")] + public static extern void OTCallback_director_connect(HandleRef jarg1, OTCallback.SwigDelegateOTCallback_0 delegate0, OTCallback.SwigDelegateOTCallback_1 delegate1); + + [DllImport("otapi", EntryPoint="CSharp_new_OTCaller")] + public static extern IntPtr new_OTCaller(); + + [DllImport("otapi", EntryPoint="CSharp_delete_OTCaller")] + public static extern void delete_OTCaller(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_GetPassword")] + public static extern string OTCaller_GetPassword(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_delCallback")] + public static extern void OTCaller_delCallback(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_setCallback")] + public static extern void OTCaller_setCallback(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_isCallbackSet")] + public static extern bool OTCaller_isCallbackSet(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_callOne")] + public static extern void OTCaller_callOne(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTCaller_callTwo")] + public static extern void OTCaller_callTwo(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Set_PasswordCallback")] + public static extern bool OT_API_Set_PasswordCallback(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Init")] + public static extern int OT_API_Init(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadWallet")] + public static extern int OT_API_LoadWallet(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SwitchWallet")] + public static extern int OT_API_SwitchWallet(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetMemlogSize")] + public static extern int OT_API_GetMemlogSize(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetMemlogAtIndex")] + public static extern string OT_API_GetMemlogAtIndex(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_PeekMemlogFront")] + public static extern string OT_API_PeekMemlogFront(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_PeekMemlogBack")] + public static extern string OT_API_PeekMemlogBack(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_PopMemlogFront")] + public static extern int OT_API_PopMemlogFront(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_PopMemlogBack")] + public static extern int OT_API_PopMemlogBack(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_CreateNym")] + public static extern string OT_API_CreateNym(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_AddServerContract")] + public static extern int OT_API_AddServerContract(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_AddAssetContract")] + public static extern int OT_API_AddAssetContract(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetServerCount")] + public static extern int OT_API_GetServerCount(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAssetTypeCount")] + public static extern int OT_API_GetAssetTypeCount(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountCount")] + public static extern int OT_API_GetAccountCount(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNymCount")] + public static extern int OT_API_GetNymCount(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetServer_ID")] + public static extern string OT_API_GetServer_ID(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetServer_Name")] + public static extern string OT_API_GetServer_Name(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAssetType_ID")] + public static extern string OT_API_GetAssetType_ID(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAssetType_Name")] + public static extern string OT_API_GetAssetType_Name(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_ID")] + public static extern string OT_API_GetAccountWallet_ID(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_Name")] + public static extern string OT_API_GetAccountWallet_Name(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_Balance")] + public static extern string OT_API_GetAccountWallet_Balance(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_Type")] + public static extern string OT_API_GetAccountWallet_Type(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_AssetTypeID")] + public static extern string OT_API_GetAccountWallet_AssetTypeID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_ServerID")] + public static extern string OT_API_GetAccountWallet_ServerID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetAccountWallet_NymID")] + public static extern string OT_API_GetAccountWallet_NymID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_VerifyAccountReceipt")] + public static extern int OT_API_VerifyAccountReceipt(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_TransactionNumCount")] + public static extern int OT_API_GetNym_TransactionNumCount(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_ID")] + public static extern string OT_API_GetNym_ID(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_Name")] + public static extern string OT_API_GetNym_Name(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_Stats")] + public static extern string OT_API_GetNym_Stats(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_IsNym_RegisteredAtServer")] + public static extern int OT_API_IsNym_RegisteredAtServer(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_MailCount")] + public static extern int OT_API_GetNym_MailCount(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_MailContentsByIndex")] + public static extern string OT_API_GetNym_MailContentsByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_MailSenderIDByIndex")] + public static extern string OT_API_GetNym_MailSenderIDByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_MailServerIDByIndex")] + public static extern string OT_API_GetNym_MailServerIDByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Nym_RemoveMailByIndex")] + public static extern int OT_API_Nym_RemoveMailByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Nym_VerifyMailByIndex")] + public static extern int OT_API_Nym_VerifyMailByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_OutmailCount")] + public static extern int OT_API_GetNym_OutmailCount(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_OutmailContentsByIndex")] + public static extern string OT_API_GetNym_OutmailContentsByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_OutmailRecipientIDByIndex")] + public static extern string OT_API_GetNym_OutmailRecipientIDByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GetNym_OutmailServerIDByIndex")] + public static extern string OT_API_GetNym_OutmailServerIDByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Nym_RemoveOutmailByIndex")] + public static extern int OT_API_Nym_RemoveOutmailByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Nym_VerifyOutmailByIndex")] + public static extern int OT_API_Nym_VerifyOutmailByIndex(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_CanRemoveServer")] + public static extern int OT_API_Wallet_CanRemoveServer(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_RemoveServer")] + public static extern int OT_API_Wallet_RemoveServer(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_CanRemoveAssetType")] + public static extern int OT_API_Wallet_CanRemoveAssetType(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_RemoveAssetType")] + public static extern int OT_API_Wallet_RemoveAssetType(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_CanRemoveNym")] + public static extern int OT_API_Wallet_CanRemoveNym(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_RemoveNym")] + public static extern int OT_API_Wallet_RemoveNym(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_CanRemoveAccount")] + public static extern int OT_API_Wallet_CanRemoveAccount(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_ImportNym")] + public static extern string OT_API_Wallet_ImportNym(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SetNym_Name")] + public static extern int OT_API_SetNym_Name(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SetAccountWallet_Name")] + public static extern int OT_API_SetAccountWallet_Name(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SetAssetType_Name")] + public static extern int OT_API_SetAssetType_Name(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SetServer_Name")] + public static extern int OT_API_SetServer_Name(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_VerifyAndRetrieveXMLContents")] + public static extern string OT_API_VerifyAndRetrieveXMLContents(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_WriteCheque")] + public static extern string OT_API_WriteCheque(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7, string jarg8); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_ProposePaymentPlan")] + public static extern string OT_API_ProposePaymentPlan(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7, string jarg8, string jarg9, string jarg10, string jarg11, string jarg12, string jarg13, string jarg14, string jarg15); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_ConfirmPaymentPlan")] + public static extern string OT_API_ConfirmPaymentPlan(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadUserPubkey")] + public static extern string OT_API_LoadUserPubkey(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadPubkey")] + public static extern string OT_API_LoadPubkey(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_VerifyUserPrivateKey")] + public static extern int OT_API_VerifyUserPrivateKey(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadPurse")] + public static extern string OT_API_LoadPurse(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadMint")] + public static extern string OT_API_LoadMint(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadAssetContract")] + public static extern string OT_API_LoadAssetContract(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadServerContract")] + public static extern string OT_API_LoadServerContract(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Mint_IsStillGood")] + public static extern int OT_API_Mint_IsStillGood(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_IsBasketCurrency")] + public static extern int OT_API_IsBasketCurrency(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Basket_GetMemberCount")] + public static extern int OT_API_Basket_GetMemberCount(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Basket_GetMemberType")] + public static extern string OT_API_Basket_GetMemberType(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Basket_GetMinimumTransferAmount")] + public static extern string OT_API_Basket_GetMinimumTransferAmount(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Basket_GetMemberMinimumTransferAmount")] + public static extern string OT_API_Basket_GetMemberMinimumTransferAmount(string jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadAssetAccount")] + public static extern string OT_API_LoadAssetAccount(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadInbox")] + public static extern string OT_API_LoadInbox(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadOutbox")] + public static extern string OT_API_LoadOutbox(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_GetCount")] + public static extern int OT_API_Ledger_GetCount(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_CreateResponse")] + public static extern string OT_API_Ledger_CreateResponse(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_GetTransactionByIndex")] + public static extern string OT_API_Ledger_GetTransactionByIndex(string jarg1, string jarg2, string jarg3, string jarg4, int jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_GetTransactionByID")] + public static extern string OT_API_Ledger_GetTransactionByID(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_GetTransactionIDByIndex")] + public static extern string OT_API_Ledger_GetTransactionIDByIndex(string jarg1, string jarg2, string jarg3, string jarg4, int jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_AddTransaction")] + public static extern string OT_API_Ledger_AddTransaction(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_CreateResponse")] + public static extern string OT_API_Transaction_CreateResponse(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, int jarg6); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Ledger_FinalizeResponse")] + public static extern string OT_API_Ledger_FinalizeResponse(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetType")] + public static extern string OT_API_Transaction_GetType(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetVoucher")] + public static extern string OT_API_Transaction_GetVoucher(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetSuccess")] + public static extern int OT_API_Transaction_GetSuccess(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetBalanceAgreementSuccess")] + public static extern int OT_API_Transaction_GetBalanceAgreementSuccess(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetDateSigned")] + public static extern string OT_API_Transaction_GetDateSigned(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetAmount")] + public static extern string OT_API_Transaction_GetAmount(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Pending_GetNote")] + public static extern string OT_API_Pending_GetNote(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetSenderUserID")] + public static extern string OT_API_Transaction_GetSenderUserID(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetSenderAcctID")] + public static extern string OT_API_Transaction_GetSenderAcctID(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetRecipientUserID")] + public static extern string OT_API_Transaction_GetRecipientUserID(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetRecipientAcctID")] + public static extern string OT_API_Transaction_GetRecipientAcctID(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Transaction_GetDisplayReferenceToNum")] + public static extern string OT_API_Transaction_GetDisplayReferenceToNum(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_CreatePurse")] + public static extern string OT_API_CreatePurse(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_SavePurse")] + public static extern int OT_API_SavePurse(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Purse_GetTotalValue")] + public static extern string OT_API_Purse_GetTotalValue(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Purse_Count")] + public static extern int OT_API_Purse_Count(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Purse_Peek")] + public static extern string OT_API_Purse_Peek(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Purse_Pop")] + public static extern string OT_API_Purse_Pop(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Purse_Push")] + public static extern string OT_API_Purse_Push(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Wallet_ImportPurse")] + public static extern int OT_API_Wallet_ImportPurse(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_exchangePurse")] + public static extern void OT_API_exchangePurse(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_ChangeOwner")] + public static extern string OT_API_Token_ChangeOwner(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetID")] + public static extern string OT_API_Token_GetID(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetDenomination")] + public static extern string OT_API_Token_GetDenomination(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetSeries")] + public static extern int OT_API_Token_GetSeries(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetValidFrom")] + public static extern string OT_API_Token_GetValidFrom(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetValidTo")] + public static extern string OT_API_Token_GetValidTo(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetAssetID")] + public static extern string OT_API_Token_GetAssetID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Token_GetServerID")] + public static extern string OT_API_Token_GetServerID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_checkServerID")] + public static extern void OT_API_checkServerID(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_createUserAccount")] + public static extern void OT_API_createUserAccount(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_deleteUserAccount")] + public static extern void OT_API_deleteUserAccount(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_deleteAssetAccount")] + public static extern void OT_API_deleteAssetAccount(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_checkUser")] + public static extern void OT_API_checkUser(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_sendUserMessage")] + public static extern void OT_API_sendUserMessage(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getRequest")] + public static extern void OT_API_getRequest(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getTransactionNumber")] + public static extern void OT_API_getTransactionNumber(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_issueAssetType")] + public static extern void OT_API_issueAssetType(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getContract")] + public static extern void OT_API_getContract(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getMint")] + public static extern void OT_API_getMint(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_createAssetAccount")] + public static extern void OT_API_createAssetAccount(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getAccount")] + public static extern void OT_API_getAccount(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GenerateBasketCreation")] + public static extern string OT_API_GenerateBasketCreation(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_AddBasketCreationItem")] + public static extern string OT_API_AddBasketCreationItem(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_issueBasket")] + public static extern void OT_API_issueBasket(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_GenerateBasketExchange")] + public static extern string OT_API_GenerateBasketExchange(string jarg1, string jarg2, string jarg3, string jarg4, int jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_AddBasketExchangeItem")] + public static extern string OT_API_AddBasketExchangeItem(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_exchangeBasket")] + public static extern void OT_API_exchangeBasket(string jarg1, string jarg2, string jarg3, string jarg4, int jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_notarizeWithdrawal")] + public static extern void OT_API_notarizeWithdrawal(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_notarizeDeposit")] + public static extern void OT_API_notarizeDeposit(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_notarizeTransfer")] + public static extern void OT_API_notarizeTransfer(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getInbox")] + public static extern void OT_API_getInbox(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getOutbox")] + public static extern void OT_API_getOutbox(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getNymbox")] + public static extern void OT_API_getNymbox(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_LoadNymbox")] + public static extern string OT_API_LoadNymbox(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_processInbox")] + public static extern void OT_API_processInbox(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_processNymbox")] + public static extern void OT_API_processNymbox(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_withdrawVoucher")] + public static extern void OT_API_withdrawVoucher(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_depositCheque")] + public static extern void OT_API_depositCheque(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_depositPaymentPlan")] + public static extern void OT_API_depositPaymentPlan(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_issueMarketOffer")] + public static extern void OT_API_issueMarketOffer(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7, string jarg8, string jarg9, string jarg10, int jarg11); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getMarketList")] + public static extern void OT_API_getMarketList(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getMarketOffers")] + public static extern void OT_API_getMarketOffers(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getMarketRecentTrades")] + public static extern void OT_API_getMarketRecentTrades(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_getNym_MarketOffers")] + public static extern void OT_API_getNym_MarketOffers(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_cancelMarketOffer")] + public static extern void OT_API_cancelMarketOffer(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_cancelPaymentPlan")] + public static extern void OT_API_cancelPaymentPlan(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_PopMessageBuffer")] + public static extern string OT_API_PopMessageBuffer(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_FlushMessageBuffer")] + public static extern void OT_API_FlushMessageBuffer(); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetCommand")] + public static extern string OT_API_Message_GetCommand(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetSuccess")] + public static extern int OT_API_Message_GetSuccess(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetDepth")] + public static extern int OT_API_Message_GetDepth(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetTransactionSuccess")] + public static extern int OT_API_Message_GetTransactionSuccess(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetBalanceAgreementSuccess")] + public static extern int OT_API_Message_GetBalanceAgreementSuccess(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetLedger")] + public static extern string OT_API_Message_GetLedger(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetNewAssetTypeID")] + public static extern string OT_API_Message_GetNewAssetTypeID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetNewIssuerAcctID")] + public static extern string OT_API_Message_GetNewIssuerAcctID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_Message_GetNewAcctID")] + public static extern string OT_API_Message_GetNewAcctID(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_ConnectServer")] + public static extern int OT_API_ConnectServer(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_OT_API_ProcessSockets")] + public static extern int OT_API_ProcessSockets(); + + [DllImport("otapi", EntryPoint="CSharp_delete_Storable")] + public static extern void delete_Storable(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Storable_Create")] + public static extern IntPtr Storable_Create(int jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storable_ot_dynamic_cast")] + public static extern IntPtr Storable_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Storage_GetPacker__SWIG_0")] + public static extern IntPtr Storage_GetPacker__SWIG_0(HandleRef jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_GetPacker__SWIG_1")] + public static extern IntPtr Storage_GetPacker__SWIG_1(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_0")] + public static extern bool Storage_Init__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_1")] + public static extern bool Storage_Init__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_2")] + public static extern bool Storage_Init__SWIG_2(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_3")] + public static extern bool Storage_Init__SWIG_3(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_4")] + public static extern bool Storage_Init__SWIG_4(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_5")] + public static extern bool Storage_Init__SWIG_5(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Init__SWIG_6")] + public static extern bool Storage_Init__SWIG_6(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Exists__SWIG_0")] + public static extern bool Storage_Exists__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Exists__SWIG_1")] + public static extern bool Storage_Exists__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Exists__SWIG_2")] + public static extern bool Storage_Exists__SWIG_2(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Exists__SWIG_3")] + public static extern bool Storage_Exists__SWIG_3(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_delete_Storage")] + public static extern void delete_Storage(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreString__SWIG_0")] + public static extern bool Storage_StoreString__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreString__SWIG_1")] + public static extern bool Storage_StoreString__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreString__SWIG_2")] + public static extern bool Storage_StoreString__SWIG_2(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreString__SWIG_3")] + public static extern bool Storage_StoreString__SWIG_3(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryString__SWIG_0")] + public static extern string Storage_QueryString__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryString__SWIG_1")] + public static extern string Storage_QueryString__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryString__SWIG_2")] + public static extern string Storage_QueryString__SWIG_2(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryString__SWIG_3")] + public static extern string Storage_QueryString__SWIG_3(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StorePlainString__SWIG_0")] + public static extern bool Storage_StorePlainString__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StorePlainString__SWIG_1")] + public static extern bool Storage_StorePlainString__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StorePlainString__SWIG_2")] + public static extern bool Storage_StorePlainString__SWIG_2(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StorePlainString__SWIG_3")] + public static extern bool Storage_StorePlainString__SWIG_3(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryPlainString__SWIG_0")] + public static extern string Storage_QueryPlainString__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryPlainString__SWIG_1")] + public static extern string Storage_QueryPlainString__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryPlainString__SWIG_2")] + public static extern string Storage_QueryPlainString__SWIG_2(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryPlainString__SWIG_3")] + public static extern string Storage_QueryPlainString__SWIG_3(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreObject__SWIG_0")] + public static extern bool Storage_StoreObject__SWIG_0(HandleRef jarg1, HandleRef jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreObject__SWIG_1")] + public static extern bool Storage_StoreObject__SWIG_1(HandleRef jarg1, HandleRef jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreObject__SWIG_2")] + public static extern bool Storage_StoreObject__SWIG_2(HandleRef jarg1, HandleRef jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_StoreObject__SWIG_3")] + public static extern bool Storage_StoreObject__SWIG_3(HandleRef jarg1, HandleRef jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryObject__SWIG_0")] + public static extern IntPtr Storage_QueryObject__SWIG_0(HandleRef jarg1, int jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryObject__SWIG_1")] + public static extern IntPtr Storage_QueryObject__SWIG_1(HandleRef jarg1, int jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryObject__SWIG_2")] + public static extern IntPtr Storage_QueryObject__SWIG_2(HandleRef jarg1, int jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_QueryObject__SWIG_3")] + public static extern IntPtr Storage_QueryObject__SWIG_3(HandleRef jarg1, int jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_EraseValueByKey__SWIG_0")] + public static extern bool Storage_EraseValueByKey__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_Storage_EraseValueByKey__SWIG_1")] + public static extern bool Storage_EraseValueByKey__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Storage_EraseValueByKey__SWIG_2")] + public static extern bool Storage_EraseValueByKey__SWIG_2(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Storage_EraseValueByKey__SWIG_3")] + public static extern bool Storage_EraseValueByKey__SWIG_3(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_CreateObject")] + public static extern IntPtr Storage_CreateObject(HandleRef jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_Create")] + public static extern IntPtr Storage_Create(int jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Storage_GetType")] + public static extern int Storage_GetType(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_0")] + public static extern bool InitDefaultStorage__SWIG_0(int jarg1, int jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7, string jarg8); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_1")] + public static extern bool InitDefaultStorage__SWIG_1(int jarg1, int jarg2, string jarg3, string jarg4, string jarg5, string jarg6, string jarg7); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_2")] + public static extern bool InitDefaultStorage__SWIG_2(int jarg1, int jarg2, string jarg3, string jarg4, string jarg5, string jarg6); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_3")] + public static extern bool InitDefaultStorage__SWIG_3(int jarg1, int jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_4")] + public static extern bool InitDefaultStorage__SWIG_4(int jarg1, int jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_5")] + public static extern bool InitDefaultStorage__SWIG_5(int jarg1, int jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_InitDefaultStorage__SWIG_6")] + public static extern bool InitDefaultStorage__SWIG_6(int jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_GetDefaultStorage")] + public static extern IntPtr GetDefaultStorage(); + + [DllImport("otapi", EntryPoint="CSharp_CreateStorageContext__SWIG_0")] + public static extern IntPtr CreateStorageContext__SWIG_0(int jarg1, int jarg2); + + [DllImport("otapi", EntryPoint="CSharp_CreateStorageContext__SWIG_1")] + public static extern IntPtr CreateStorageContext__SWIG_1(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_CreateObject")] + public static extern IntPtr CreateObject(int jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Exists__SWIG_0")] + public static extern bool Exists__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_Exists__SWIG_1")] + public static extern bool Exists__SWIG_1(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_Exists__SWIG_2")] + public static extern bool Exists__SWIG_2(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Exists__SWIG_3")] + public static extern bool Exists__SWIG_3(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StoreString__SWIG_0")] + public static extern bool StoreString__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_StoreString__SWIG_1")] + public static extern bool StoreString__SWIG_1(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_StoreString__SWIG_2")] + public static extern bool StoreString__SWIG_2(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_StoreString__SWIG_3")] + public static extern bool StoreString__SWIG_3(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_QueryString__SWIG_0")] + public static extern string QueryString__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_QueryString__SWIG_1")] + public static extern string QueryString__SWIG_1(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_QueryString__SWIG_2")] + public static extern string QueryString__SWIG_2(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_QueryString__SWIG_3")] + public static extern string QueryString__SWIG_3(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StorePlainString__SWIG_0")] + public static extern bool StorePlainString__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_StorePlainString__SWIG_1")] + public static extern bool StorePlainString__SWIG_1(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_StorePlainString__SWIG_2")] + public static extern bool StorePlainString__SWIG_2(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_StorePlainString__SWIG_3")] + public static extern bool StorePlainString__SWIG_3(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_QueryPlainString__SWIG_0")] + public static extern string QueryPlainString__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_QueryPlainString__SWIG_1")] + public static extern string QueryPlainString__SWIG_1(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_QueryPlainString__SWIG_2")] + public static extern string QueryPlainString__SWIG_2(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_QueryPlainString__SWIG_3")] + public static extern string QueryPlainString__SWIG_3(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StoreObject__SWIG_0")] + public static extern bool StoreObject__SWIG_0(HandleRef jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_StoreObject__SWIG_1")] + public static extern bool StoreObject__SWIG_1(HandleRef jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_StoreObject__SWIG_2")] + public static extern bool StoreObject__SWIG_2(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_StoreObject__SWIG_3")] + public static extern bool StoreObject__SWIG_3(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_QueryObject__SWIG_0")] + public static extern IntPtr QueryObject__SWIG_0(int jarg1, string jarg2, string jarg3, string jarg4, string jarg5); + + [DllImport("otapi", EntryPoint="CSharp_QueryObject__SWIG_1")] + public static extern IntPtr QueryObject__SWIG_1(int jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_QueryObject__SWIG_2")] + public static extern IntPtr QueryObject__SWIG_2(int jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_QueryObject__SWIG_3")] + public static extern IntPtr QueryObject__SWIG_3(int jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_EraseValueByKey__SWIG_0")] + public static extern bool EraseValueByKey__SWIG_0(string jarg1, string jarg2, string jarg3, string jarg4); + + [DllImport("otapi", EntryPoint="CSharp_EraseValueByKey__SWIG_1")] + public static extern bool EraseValueByKey__SWIG_1(string jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_EraseValueByKey__SWIG_2")] + public static extern bool EraseValueByKey__SWIG_2(string jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_EraseValueByKey__SWIG_3")] + public static extern bool EraseValueByKey__SWIG_3(string jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_OTDBString")] + public static extern void delete_OTDBString(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTDBString_m_string_set")] + public static extern void OTDBString_m_string_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OTDBString_m_string_get")] + public static extern string OTDBString_m_string_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTDBString_ot_dynamic_cast")] + public static extern IntPtr OTDBString_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_Blob")] + public static extern void delete_Blob(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Blob_m_memBuffer_set")] + public static extern void Blob_m_memBuffer_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Blob_m_memBuffer_get")] + public static extern IntPtr Blob_m_memBuffer_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Blob_ot_dynamic_cast")] + public static extern IntPtr Blob_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_StringMap")] + public static extern void delete_StringMap(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_the_map_set")] + public static extern void StringMap_the_map_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_the_map_get")] + public static extern IntPtr StringMap_the_map_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_SetValue")] + public static extern void StringMap_SetValue(HandleRef jarg1, string jarg2, string jarg3); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_GetValue")] + public static extern string StringMap_GetValue(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_ot_dynamic_cast")] + public static extern IntPtr StringMap_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_Displayable")] + public static extern void delete_Displayable(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Displayable_gui_label_set")] + public static extern void Displayable_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Displayable_gui_label_get")] + public static extern string Displayable_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Displayable_ot_dynamic_cast")] + public static extern IntPtr Displayable_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_MarketData")] + public static extern void delete_MarketData(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_gui_label_set")] + public static extern void MarketData_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_gui_label_get")] + public static extern string MarketData_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_server_id_set")] + public static extern void MarketData_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_server_id_get")] + public static extern string MarketData_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_market_id_set")] + public static extern void MarketData_market_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_market_id_get")] + public static extern string MarketData_market_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_asset_type_id_set")] + public static extern void MarketData_asset_type_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_asset_type_id_get")] + public static extern string MarketData_asset_type_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_currency_type_id_set")] + public static extern void MarketData_currency_type_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_currency_type_id_get")] + public static extern string MarketData_currency_type_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_scale_set")] + public static extern void MarketData_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_scale_get")] + public static extern string MarketData_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_total_assets_set")] + public static extern void MarketData_total_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_total_assets_get")] + public static extern string MarketData_total_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_number_bids_set")] + public static extern void MarketData_number_bids_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_number_bids_get")] + public static extern string MarketData_number_bids_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_number_asks_set")] + public static extern void MarketData_number_asks_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_number_asks_get")] + public static extern string MarketData_number_asks_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_last_sale_price_set")] + public static extern void MarketData_last_sale_price_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_last_sale_price_get")] + public static extern string MarketData_last_sale_price_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_current_bid_set")] + public static extern void MarketData_current_bid_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_current_bid_get")] + public static extern string MarketData_current_bid_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_current_ask_set")] + public static extern void MarketData_current_ask_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_current_ask_get")] + public static extern string MarketData_current_ask_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_trades_set")] + public static extern void MarketData_volume_trades_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_trades_get")] + public static extern string MarketData_volume_trades_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_assets_set")] + public static extern void MarketData_volume_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_assets_get")] + public static extern string MarketData_volume_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_currency_set")] + public static extern void MarketData_volume_currency_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_volume_currency_get")] + public static extern string MarketData_volume_currency_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_recent_highest_bid_set")] + public static extern void MarketData_recent_highest_bid_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_recent_highest_bid_get")] + public static extern string MarketData_recent_highest_bid_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_recent_lowest_ask_set")] + public static extern void MarketData_recent_lowest_ask_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_recent_lowest_ask_get")] + public static extern string MarketData_recent_lowest_ask_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_ot_dynamic_cast")] + public static extern IntPtr MarketData_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_MarketList")] + public static extern void delete_MarketList(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_GetMarketDataCount")] + public static extern uint MarketList_GetMarketDataCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_GetMarketData")] + public static extern IntPtr MarketList_GetMarketData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_RemoveMarketData")] + public static extern bool MarketList_RemoveMarketData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_AddMarketData")] + public static extern bool MarketList_AddMarketData(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_ot_dynamic_cast")] + public static extern IntPtr MarketList_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_OfferDataMarket")] + public static extern void delete_OfferDataMarket(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_gui_label_set")] + public static extern void OfferDataMarket_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_gui_label_get")] + public static extern string OfferDataMarket_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_transaction_id_set")] + public static extern void OfferDataMarket_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_transaction_id_get")] + public static extern string OfferDataMarket_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_price_per_scale_set")] + public static extern void OfferDataMarket_price_per_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_price_per_scale_get")] + public static extern string OfferDataMarket_price_per_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_available_assets_set")] + public static extern void OfferDataMarket_available_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_available_assets_get")] + public static extern string OfferDataMarket_available_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_minimum_increment_set")] + public static extern void OfferDataMarket_minimum_increment_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_minimum_increment_get")] + public static extern string OfferDataMarket_minimum_increment_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_ot_dynamic_cast")] + public static extern IntPtr OfferDataMarket_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_BidData")] + public static extern void delete_BidData(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_gui_label_set")] + public static extern void BidData_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BidData_gui_label_get")] + public static extern string BidData_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_transaction_id_set")] + public static extern void BidData_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BidData_transaction_id_get")] + public static extern string BidData_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_price_per_scale_set")] + public static extern void BidData_price_per_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BidData_price_per_scale_get")] + public static extern string BidData_price_per_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_available_assets_set")] + public static extern void BidData_available_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BidData_available_assets_get")] + public static extern string BidData_available_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_minimum_increment_set")] + public static extern void BidData_minimum_increment_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BidData_minimum_increment_get")] + public static extern string BidData_minimum_increment_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_ot_dynamic_cast")] + public static extern IntPtr BidData_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_AskData")] + public static extern void delete_AskData(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_gui_label_set")] + public static extern void AskData_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AskData_gui_label_get")] + public static extern string AskData_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_transaction_id_set")] + public static extern void AskData_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AskData_transaction_id_get")] + public static extern string AskData_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_price_per_scale_set")] + public static extern void AskData_price_per_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AskData_price_per_scale_get")] + public static extern string AskData_price_per_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_available_assets_set")] + public static extern void AskData_available_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AskData_available_assets_get")] + public static extern string AskData_available_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_minimum_increment_set")] + public static extern void AskData_minimum_increment_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AskData_minimum_increment_get")] + public static extern string AskData_minimum_increment_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_ot_dynamic_cast")] + public static extern IntPtr AskData_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_OfferListMarket")] + public static extern void delete_OfferListMarket(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_GetBidDataCount")] + public static extern uint OfferListMarket_GetBidDataCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_GetBidData")] + public static extern IntPtr OfferListMarket_GetBidData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_RemoveBidData")] + public static extern bool OfferListMarket_RemoveBidData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_AddBidData")] + public static extern bool OfferListMarket_AddBidData(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_GetAskDataCount")] + public static extern uint OfferListMarket_GetAskDataCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_GetAskData")] + public static extern IntPtr OfferListMarket_GetAskData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_RemoveAskData")] + public static extern bool OfferListMarket_RemoveAskData(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_AddAskData")] + public static extern bool OfferListMarket_AddAskData(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_ot_dynamic_cast")] + public static extern IntPtr OfferListMarket_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_TradeDataMarket")] + public static extern void delete_TradeDataMarket(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_gui_label_set")] + public static extern void TradeDataMarket_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_gui_label_get")] + public static extern string TradeDataMarket_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_transaction_id_set")] + public static extern void TradeDataMarket_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_transaction_id_get")] + public static extern string TradeDataMarket_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_date_set")] + public static extern void TradeDataMarket_date_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_date_get")] + public static extern string TradeDataMarket_date_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_price_set")] + public static extern void TradeDataMarket_price_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_price_get")] + public static extern string TradeDataMarket_price_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_amount_sold_set")] + public static extern void TradeDataMarket_amount_sold_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_amount_sold_get")] + public static extern string TradeDataMarket_amount_sold_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_ot_dynamic_cast")] + public static extern IntPtr TradeDataMarket_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_TradeListMarket")] + public static extern void delete_TradeListMarket(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_GetTradeDataMarketCount")] + public static extern uint TradeListMarket_GetTradeDataMarketCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_GetTradeDataMarket")] + public static extern IntPtr TradeListMarket_GetTradeDataMarket(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_RemoveTradeDataMarket")] + public static extern bool TradeListMarket_RemoveTradeDataMarket(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_AddTradeDataMarket")] + public static extern bool TradeListMarket_AddTradeDataMarket(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_ot_dynamic_cast")] + public static extern IntPtr TradeListMarket_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_OfferDataNym")] + public static extern void delete_OfferDataNym(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_gui_label_set")] + public static extern void OfferDataNym_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_gui_label_get")] + public static extern string OfferDataNym_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_valid_from_set")] + public static extern void OfferDataNym_valid_from_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_valid_from_get")] + public static extern string OfferDataNym_valid_from_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_valid_to_set")] + public static extern void OfferDataNym_valid_to_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_valid_to_get")] + public static extern string OfferDataNym_valid_to_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_server_id_set")] + public static extern void OfferDataNym_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_server_id_get")] + public static extern string OfferDataNym_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_asset_type_id_set")] + public static extern void OfferDataNym_asset_type_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_asset_type_id_get")] + public static extern string OfferDataNym_asset_type_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_asset_acct_id_set")] + public static extern void OfferDataNym_asset_acct_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_asset_acct_id_get")] + public static extern string OfferDataNym_asset_acct_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_currency_type_id_set")] + public static extern void OfferDataNym_currency_type_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_currency_type_id_get")] + public static extern string OfferDataNym_currency_type_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_currency_acct_id_set")] + public static extern void OfferDataNym_currency_acct_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_currency_acct_id_get")] + public static extern string OfferDataNym_currency_acct_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_selling_set")] + public static extern void OfferDataNym_selling_set(HandleRef jarg1, bool jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_selling_get")] + public static extern bool OfferDataNym_selling_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_scale_set")] + public static extern void OfferDataNym_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_scale_get")] + public static extern string OfferDataNym_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_price_per_scale_set")] + public static extern void OfferDataNym_price_per_scale_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_price_per_scale_get")] + public static extern string OfferDataNym_price_per_scale_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_transaction_id_set")] + public static extern void OfferDataNym_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_transaction_id_get")] + public static extern string OfferDataNym_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_total_assets_set")] + public static extern void OfferDataNym_total_assets_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_total_assets_get")] + public static extern string OfferDataNym_total_assets_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_finished_so_far_set")] + public static extern void OfferDataNym_finished_so_far_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_finished_so_far_get")] + public static extern string OfferDataNym_finished_so_far_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_minimum_increment_set")] + public static extern void OfferDataNym_minimum_increment_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_minimum_increment_get")] + public static extern string OfferDataNym_minimum_increment_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_stop_sign_set")] + public static extern void OfferDataNym_stop_sign_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_stop_sign_get")] + public static extern string OfferDataNym_stop_sign_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_stop_price_set")] + public static extern void OfferDataNym_stop_price_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_stop_price_get")] + public static extern string OfferDataNym_stop_price_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_ot_dynamic_cast")] + public static extern IntPtr OfferDataNym_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_OfferListNym")] + public static extern void delete_OfferListNym(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_GetOfferDataNymCount")] + public static extern uint OfferListNym_GetOfferDataNymCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_GetOfferDataNym")] + public static extern IntPtr OfferListNym_GetOfferDataNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_RemoveOfferDataNym")] + public static extern bool OfferListNym_RemoveOfferDataNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_AddOfferDataNym")] + public static extern bool OfferListNym_AddOfferDataNym(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_ot_dynamic_cast")] + public static extern IntPtr OfferListNym_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_TradeDataNym")] + public static extern void delete_TradeDataNym(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_gui_label_set")] + public static extern void TradeDataNym_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_gui_label_get")] + public static extern string TradeDataNym_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_transaction_id_set")] + public static extern void TradeDataNym_transaction_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_transaction_id_get")] + public static extern string TradeDataNym_transaction_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_completed_count_set")] + public static extern void TradeDataNym_completed_count_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_completed_count_get")] + public static extern string TradeDataNym_completed_count_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_date_set")] + public static extern void TradeDataNym_date_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_date_get")] + public static extern string TradeDataNym_date_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_price_set")] + public static extern void TradeDataNym_price_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_price_get")] + public static extern string TradeDataNym_price_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_amount_sold_set")] + public static extern void TradeDataNym_amount_sold_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_amount_sold_get")] + public static extern string TradeDataNym_amount_sold_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_ot_dynamic_cast")] + public static extern IntPtr TradeDataNym_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_TradeListNym")] + public static extern void delete_TradeListNym(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_GetTradeDataNymCount")] + public static extern uint TradeListNym_GetTradeDataNymCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_GetTradeDataNym")] + public static extern IntPtr TradeListNym_GetTradeDataNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_RemoveTradeDataNym")] + public static extern bool TradeListNym_RemoveTradeDataNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_AddTradeDataNym")] + public static extern bool TradeListNym_AddTradeDataNym(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_ot_dynamic_cast")] + public static extern IntPtr TradeListNym_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_Acct")] + public static extern void delete_Acct(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Acct_gui_label_set")] + public static extern void Acct_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Acct_gui_label_get")] + public static extern string Acct_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Acct_acct_id_set")] + public static extern void Acct_acct_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Acct_acct_id_get")] + public static extern string Acct_acct_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Acct_server_id_set")] + public static extern void Acct_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Acct_server_id_get")] + public static extern string Acct_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Acct_ot_dynamic_cast")] + public static extern IntPtr Acct_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_BitcoinAcct")] + public static extern void delete_BitcoinAcct(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_gui_label_set")] + public static extern void BitcoinAcct_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_gui_label_get")] + public static extern string BitcoinAcct_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_acct_id_set")] + public static extern void BitcoinAcct_acct_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_acct_id_get")] + public static extern string BitcoinAcct_acct_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_server_id_set")] + public static extern void BitcoinAcct_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_server_id_get")] + public static extern string BitcoinAcct_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_bitcoin_acct_name_set")] + public static extern void BitcoinAcct_bitcoin_acct_name_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_bitcoin_acct_name_get")] + public static extern string BitcoinAcct_bitcoin_acct_name_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_ot_dynamic_cast")] + public static extern IntPtr BitcoinAcct_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_ServerInfo")] + public static extern void delete_ServerInfo(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_gui_label_set")] + public static extern void ServerInfo_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_gui_label_get")] + public static extern string ServerInfo_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_server_id_set")] + public static extern void ServerInfo_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_server_id_get")] + public static extern string ServerInfo_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_server_type_set")] + public static extern void ServerInfo_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_server_type_get")] + public static extern string ServerInfo_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_ot_dynamic_cast")] + public static extern IntPtr ServerInfo_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_Server")] + public static extern void delete_Server(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_gui_label_set")] + public static extern void Server_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Server_gui_label_get")] + public static extern string Server_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_id_set")] + public static extern void Server_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_id_get")] + public static extern string Server_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_type_set")] + public static extern void Server_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_type_get")] + public static extern string Server_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_host_set")] + public static extern void Server_server_host_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_host_get")] + public static extern string Server_server_host_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_port_set")] + public static extern void Server_server_port_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Server_server_port_get")] + public static extern string Server_server_port_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_ot_dynamic_cast")] + public static extern IntPtr Server_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_BitcoinServer")] + public static extern void delete_BitcoinServer(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_gui_label_set")] + public static extern void BitcoinServer_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_gui_label_get")] + public static extern string BitcoinServer_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_id_set")] + public static extern void BitcoinServer_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_id_get")] + public static extern string BitcoinServer_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_type_set")] + public static extern void BitcoinServer_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_type_get")] + public static extern string BitcoinServer_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_host_set")] + public static extern void BitcoinServer_server_host_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_host_get")] + public static extern string BitcoinServer_server_host_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_port_set")] + public static extern void BitcoinServer_server_port_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_server_port_get")] + public static extern string BitcoinServer_server_port_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_bitcoin_username_set")] + public static extern void BitcoinServer_bitcoin_username_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_bitcoin_username_get")] + public static extern string BitcoinServer_bitcoin_username_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_bitcoin_password_set")] + public static extern void BitcoinServer_bitcoin_password_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_bitcoin_password_get")] + public static extern string BitcoinServer_bitcoin_password_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_ot_dynamic_cast")] + public static extern IntPtr BitcoinServer_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_RippleServer")] + public static extern void delete_RippleServer(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_gui_label_set")] + public static extern void RippleServer_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_gui_label_get")] + public static extern string RippleServer_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_id_set")] + public static extern void RippleServer_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_id_get")] + public static extern string RippleServer_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_type_set")] + public static extern void RippleServer_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_type_get")] + public static extern string RippleServer_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_host_set")] + public static extern void RippleServer_server_host_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_host_get")] + public static extern string RippleServer_server_host_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_port_set")] + public static extern void RippleServer_server_port_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_server_port_get")] + public static extern string RippleServer_server_port_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_ripple_username_set")] + public static extern void RippleServer_ripple_username_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_ripple_username_get")] + public static extern string RippleServer_ripple_username_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_ripple_password_set")] + public static extern void RippleServer_ripple_password_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_ripple_password_get")] + public static extern string RippleServer_ripple_password_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_namefield_id_set")] + public static extern void RippleServer_namefield_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_namefield_id_get")] + public static extern string RippleServer_namefield_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_passfield_id_set")] + public static extern void RippleServer_passfield_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_passfield_id_get")] + public static extern string RippleServer_passfield_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_ot_dynamic_cast")] + public static extern IntPtr RippleServer_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_LoomServer")] + public static extern void delete_LoomServer(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_gui_label_set")] + public static extern void LoomServer_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_gui_label_get")] + public static extern string LoomServer_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_id_set")] + public static extern void LoomServer_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_id_get")] + public static extern string LoomServer_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_type_set")] + public static extern void LoomServer_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_type_get")] + public static extern string LoomServer_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_host_set")] + public static extern void LoomServer_server_host_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_host_get")] + public static extern string LoomServer_server_host_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_port_set")] + public static extern void LoomServer_server_port_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_server_port_get")] + public static extern string LoomServer_server_port_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_loom_username_set")] + public static extern void LoomServer_loom_username_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_loom_username_get")] + public static extern string LoomServer_loom_username_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_namefield_id_set")] + public static extern void LoomServer_namefield_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_namefield_id_get")] + public static extern string LoomServer_namefield_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_ot_dynamic_cast")] + public static extern IntPtr LoomServer_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_ContactNym")] + public static extern void delete_ContactNym(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_gui_label_set")] + public static extern void ContactNym_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_gui_label_get")] + public static extern string ContactNym_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_nym_type_set")] + public static extern void ContactNym_nym_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_nym_type_get")] + public static extern string ContactNym_nym_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_nym_id_set")] + public static extern void ContactNym_nym_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_nym_id_get")] + public static extern string ContactNym_nym_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_public_key_set")] + public static extern void ContactNym_public_key_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_public_key_get")] + public static extern string ContactNym_public_key_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_memo_set")] + public static extern void ContactNym_memo_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_memo_get")] + public static extern string ContactNym_memo_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_GetServerInfoCount")] + public static extern uint ContactNym_GetServerInfoCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_GetServerInfo")] + public static extern IntPtr ContactNym_GetServerInfo(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_RemoveServerInfo")] + public static extern bool ContactNym_RemoveServerInfo(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_AddServerInfo")] + public static extern bool ContactNym_AddServerInfo(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_ot_dynamic_cast")] + public static extern IntPtr ContactNym_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_WalletData")] + public static extern void delete_WalletData(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetBitcoinServerCount")] + public static extern uint WalletData_GetBitcoinServerCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetBitcoinServer")] + public static extern IntPtr WalletData_GetBitcoinServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_RemoveBitcoinServer")] + public static extern bool WalletData_RemoveBitcoinServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_AddBitcoinServer")] + public static extern bool WalletData_AddBitcoinServer(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetBitcoinAcctCount")] + public static extern uint WalletData_GetBitcoinAcctCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetBitcoinAcct")] + public static extern IntPtr WalletData_GetBitcoinAcct(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_RemoveBitcoinAcct")] + public static extern bool WalletData_RemoveBitcoinAcct(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_AddBitcoinAcct")] + public static extern bool WalletData_AddBitcoinAcct(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetRippleServerCount")] + public static extern uint WalletData_GetRippleServerCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetRippleServer")] + public static extern IntPtr WalletData_GetRippleServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_RemoveRippleServer")] + public static extern bool WalletData_RemoveRippleServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_AddRippleServer")] + public static extern bool WalletData_AddRippleServer(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetLoomServerCount")] + public static extern uint WalletData_GetLoomServerCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_GetLoomServer")] + public static extern IntPtr WalletData_GetLoomServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_RemoveLoomServer")] + public static extern bool WalletData_RemoveLoomServer(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_AddLoomServer")] + public static extern bool WalletData_AddLoomServer(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_ot_dynamic_cast")] + public static extern IntPtr WalletData_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_ContactAcct")] + public static extern void delete_ContactAcct(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_gui_label_set")] + public static extern void ContactAcct_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_gui_label_get")] + public static extern string ContactAcct_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_server_type_set")] + public static extern void ContactAcct_server_type_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_server_type_get")] + public static extern string ContactAcct_server_type_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_server_id_set")] + public static extern void ContactAcct_server_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_server_id_get")] + public static extern string ContactAcct_server_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_asset_type_id_set")] + public static extern void ContactAcct_asset_type_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_asset_type_id_get")] + public static extern string ContactAcct_asset_type_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_acct_id_set")] + public static extern void ContactAcct_acct_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_acct_id_get")] + public static extern string ContactAcct_acct_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_nym_id_set")] + public static extern void ContactAcct_nym_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_nym_id_get")] + public static extern string ContactAcct_nym_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_memo_set")] + public static extern void ContactAcct_memo_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_memo_get")] + public static extern string ContactAcct_memo_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_public_key_set")] + public static extern void ContactAcct_public_key_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_public_key_get")] + public static extern string ContactAcct_public_key_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_ot_dynamic_cast")] + public static extern IntPtr ContactAcct_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_Contact")] + public static extern void delete_Contact(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_gui_label_set")] + public static extern void Contact_gui_label_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_gui_label_get")] + public static extern string Contact_gui_label_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_contact_id_set")] + public static extern void Contact_contact_id_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_contact_id_get")] + public static extern string Contact_contact_id_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_email_set")] + public static extern void Contact_email_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_email_get")] + public static extern string Contact_email_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_memo_set")] + public static extern void Contact_memo_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_memo_get")] + public static extern string Contact_memo_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_public_key_set")] + public static extern void Contact_public_key_set(HandleRef jarg1, string jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_public_key_get")] + public static extern string Contact_public_key_get(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_GetContactNymCount")] + public static extern uint Contact_GetContactNymCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_GetContactNym")] + public static extern IntPtr Contact_GetContactNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_RemoveContactNym")] + public static extern bool Contact_RemoveContactNym(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_AddContactNym")] + public static extern bool Contact_AddContactNym(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_GetContactAcctCount")] + public static extern uint Contact_GetContactAcctCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_GetContactAcct")] + public static extern IntPtr Contact_GetContactAcct(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_RemoveContactAcct")] + public static extern bool Contact_RemoveContactAcct(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_AddContactAcct")] + public static extern bool Contact_AddContactAcct(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_Contact_ot_dynamic_cast")] + public static extern IntPtr Contact_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_delete_AddressBook")] + public static extern void delete_AddressBook(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_GetContactCount")] + public static extern uint AddressBook_GetContactCount(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_GetContact")] + public static extern IntPtr AddressBook_GetContact(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_RemoveContact")] + public static extern bool AddressBook_RemoveContact(HandleRef jarg1, uint jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_AddContact")] + public static extern bool AddressBook_AddContact(HandleRef jarg1, HandleRef jarg2); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_ot_dynamic_cast")] + public static extern IntPtr AddressBook_ot_dynamic_cast(HandleRef jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OTDBString_SWIGUpcast")] + public static extern IntPtr OTDBString_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Blob_SWIGUpcast")] + public static extern IntPtr Blob_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_StringMap_SWIGUpcast")] + public static extern IntPtr StringMap_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Displayable_SWIGUpcast")] + public static extern IntPtr Displayable_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketData_SWIGUpcast")] + public static extern IntPtr MarketData_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_MarketList_SWIGUpcast")] + public static extern IntPtr MarketList_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataMarket_SWIGUpcast")] + public static extern IntPtr OfferDataMarket_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BidData_SWIGUpcast")] + public static extern IntPtr BidData_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AskData_SWIGUpcast")] + public static extern IntPtr AskData_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListMarket_SWIGUpcast")] + public static extern IntPtr OfferListMarket_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataMarket_SWIGUpcast")] + public static extern IntPtr TradeDataMarket_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListMarket_SWIGUpcast")] + public static extern IntPtr TradeListMarket_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferDataNym_SWIGUpcast")] + public static extern IntPtr OfferDataNym_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_OfferListNym_SWIGUpcast")] + public static extern IntPtr OfferListNym_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeDataNym_SWIGUpcast")] + public static extern IntPtr TradeDataNym_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_TradeListNym_SWIGUpcast")] + public static extern IntPtr TradeListNym_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Acct_SWIGUpcast")] + public static extern IntPtr Acct_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinAcct_SWIGUpcast")] + public static extern IntPtr BitcoinAcct_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ServerInfo_SWIGUpcast")] + public static extern IntPtr ServerInfo_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Server_SWIGUpcast")] + public static extern IntPtr Server_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_BitcoinServer_SWIGUpcast")] + public static extern IntPtr BitcoinServer_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_RippleServer_SWIGUpcast")] + public static extern IntPtr RippleServer_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_LoomServer_SWIGUpcast")] + public static extern IntPtr LoomServer_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactNym_SWIGUpcast")] + public static extern IntPtr ContactNym_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_WalletData_SWIGUpcast")] + public static extern IntPtr WalletData_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_ContactAcct_SWIGUpcast")] + public static extern IntPtr ContactAcct_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_Contact_SWIGUpcast")] + public static extern IntPtr Contact_SWIGUpcast(IntPtr jarg1); + + [DllImport("otapi", EntryPoint="CSharp_AddressBook_SWIGUpcast")] + public static extern IntPtr AddressBook_SWIGUpcast(IntPtr jarg1); +} diff --git a/testwallet/otapi_im.d b/testwallet/otapi_im.d new file mode 100644 index 000000000..9581c7269 --- /dev/null +++ b/testwallet/otapi_im.d @@ -0,0 +1,1580 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * Do not make changes to this file unless you know what you are doing--modify + * the SWIG interface file instead. + * ----------------------------------------------------------------------------- */ + +module otapi_im; + +static import std.conv; + +static import std.conv; +static import std.string; + + +private { + version(linux) { + version = Nix; + } else version(darwin) { + version = Nix; + } else version(OSX) { + version = Nix; + } else version(FreeBSD) { + version = Nix; + version = freebsd; + } else version(freebsd) { + version = Nix; + } else version(Unix) { + version = Nix; + } else version(Posix) { + version = Nix; + } + + version(Tango) { + static import tango.stdc.string; + static import tango.stdc.stringz; + + version (PhobosCompatibility) { + } else { + alias char[] string; + alias wchar[] wstring; + alias dchar[] dstring; + } + } else { + version(D_Version2) { + static import std.conv; + } + static import std.string; + static import std.c.string; + } + + version(D_Version2) { + mixin("alias const(char)* CCPTR;"); + } else { + alias char* CCPTR; + } + + CCPTR swigToCString(string str) { + version(Tango) { + return tango.stdc.stringz.toStringz(str); + } else { + return std.string.toStringz(str); + } + } + + string swigToDString(CCPTR cstr) { + version(Tango) { + return tango.stdc.stringz.fromStringz(cstr); + } else { + version(D_Version2) { + mixin("return std.conv.to!string(cstr);"); + } else { + return std.c.string.toString(cstr); + } + } + } +} + +class SwigSwigSharedLibLoadException : Exception { + this(in string[] libNames, in string[] reasons) { + string msg = "Failed to load one or more shared libraries:"; + foreach(i, n; libNames) { + msg ~= "\n\t" ~ n ~ " - "; + if(i < reasons.length) + msg ~= reasons[i]; + else + msg ~= "Unknown"; + } + super(msg); + } +} + +class SwigSymbolLoadException : Exception { + this(string SwigSharedLibName, string symbolName) { + super("Failed to load symbol " ~ symbolName ~ " from shared library " ~ SwigSharedLibName); + _symbolName = symbolName; + } + + string symbolName() { + return _symbolName; + } + +private: + string _symbolName; +} + +private { + version(Nix) { + version(freebsd) { + // the dl* functions are in libc on FreeBSD + } + else { + pragma(lib, "dl"); + } + + version(Tango) { + import tango.sys.Common; + } else version(linux) { + import std.c.linux.linux; + } else { + extern(C) { + const RTLD_NOW = 2; + + void *dlopen(CCPTR file, int mode); + int dlclose(void* handle); + void *dlsym(void* handle, CCPTR name); + CCPTR dlerror(); + } + } + + alias void* SwigSharedLibHandle; + + SwigSharedLibHandle swigLoadSharedLib(string libName) { + return dlopen(swigToCString(libName), RTLD_NOW); + } + + void swigUnloadSharedLib(SwigSharedLibHandle hlib) { + dlclose(hlib); + } + + void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { + return dlsym(hlib, swigToCString(symbolName)); + } + + string swigGetErrorStr() { + CCPTR err = dlerror(); + if (err is null) { + return "Unknown Error"; + } + return swigToDString(err); + } + } else version(Windows) { + alias ushort WORD; + alias uint DWORD; + alias CCPTR LPCSTR; + alias void* HMODULE; + alias void* HLOCAL; + alias int function() FARPROC; + struct VA_LIST {} + + extern (Windows) { + HMODULE LoadLibraryA(LPCSTR); + FARPROC GetProcAddress(HMODULE, LPCSTR); + void FreeLibrary(HMODULE); + DWORD GetLastError(); + DWORD FormatMessageA(DWORD, in void*, DWORD, DWORD, LPCSTR, DWORD, VA_LIST*); + HLOCAL LocalFree(HLOCAL); + } + + DWORD MAKELANGID(WORD p, WORD s) { + return (((cast(WORD)s) << 10) | cast(WORD)p); + } + + enum { + LANG_NEUTRAL = 0, + SUBLANG_DEFAULT = 1, + FORMAT_MESSAGE_ALLOCATE_BUFFER = 256, + FORMAT_MESSAGE_IGNORE_INSERTS = 512, + FORMAT_MESSAGE_FROM_SYSTEM = 4096 + } + + alias HMODULE SwigSharedLibHandle; + + SwigSharedLibHandle swigLoadSharedLib(string libName) { + return LoadLibraryA(swigToCString(libName)); + } + + void swigUnloadSharedLib(SwigSharedLibHandle hlib) { + FreeLibrary(hlib); + } + + void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { + return GetProcAddress(hlib, swigToCString(symbolName)); + } + + string swigGetErrorStr() { + DWORD errcode = GetLastError(); + + LPCSTR msgBuf; + DWORD i = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + null, + errcode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + cast(LPCSTR)&msgBuf, + 0, + null); + + string text = swigToDString(msgBuf); + LocalFree(cast(HLOCAL)msgBuf); + + if (i >= 2) { + i -= 2; + } + return text[0 .. i]; + } + } else { + static assert(0, "Operating system not supported by the wrapper loading code."); + } + + final class SwigSharedLib { + void load(string[] names) { + if (_hlib !is null) return; + + string[] failedLibs; + string[] reasons; + + foreach(n; names) { + _hlib = swigLoadSharedLib(n); + if (_hlib is null) { + failedLibs ~= n; + reasons ~= swigGetErrorStr(); + continue; + } + _name = n; + break; + } + + if (_hlib is null) { + throw new SwigSwigSharedLibLoadException(failedLibs, reasons); + } + } + + void* loadSymbol(string symbolName, bool doThrow = true) { + void* sym = swigGetSymbol(_hlib, symbolName); + if(doThrow && (sym is null)) { + throw new SwigSymbolLoadException(_name, symbolName); + } + return sym; + } + + void unload() { + if(_hlib !is null) { + swigUnloadSharedLib(_hlib); + _hlib = null; + } + } + + private: + string _name; + SwigSharedLibHandle _hlib; + } +} + +static this() { + string[] possibleFileNames; + version (Posix) { + version (OSX) { + possibleFileNames ~= ["libotapi_wrap.dylib", "libotapi_wrap.bundle"]; + } + possibleFileNames ~= ["libotapi_wrap.so"]; + } else version (Windows) { + possibleFileNames ~= ["otapi_wrap.dll", "libotapi_wrap.so"]; + } else { + static assert(false, "Operating system not supported by the wrapper loading code."); + } + + auto library = new SwigSharedLib; + library.load(possibleFileNames); + + string bindCode(string functionPointer, string symbol) { + return functionPointer ~ " = cast(typeof(" ~ functionPointer ~ + "))library.loadSymbol(`" ~ symbol ~ "`);"; + } + + //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) + mixin(bindCode("swigRegisterExceptionCallbacks", "SWIGRegisterExceptionCallbacks_otapi")); + //#endif // SWIG_D_NO_EXCEPTION_HELPER + //#if !defined(SWIG_D_NO_STRING_HELPER) + mixin(bindCode("swigRegisterStringCallback", "SWIGRegisterStringCallback_otapi")); + //#endif // SWIG_D_NO_STRING_HELPER + + mixin(bindCode("new_OTCallback", "D_new_OTCallback")); + mixin(bindCode("delete_OTCallback", "D_delete_OTCallback")); + mixin(bindCode("OTCallback_runOne", "D_OTCallback_runOne")); + mixin(bindCode("OTCallback_runOneSwigExplicitOTCallback", "D_OTCallback_runOneSwigExplicitOTCallback")); + mixin(bindCode("OTCallback_runTwo", "D_OTCallback_runTwo")); + mixin(bindCode("OTCallback_runTwoSwigExplicitOTCallback", "D_OTCallback_runTwoSwigExplicitOTCallback")); + mixin(bindCode("OTCallback_director_connect", "D_OTCallback_director_connect")); + mixin(bindCode("new_OTCaller", "D_new_OTCaller")); + mixin(bindCode("delete_OTCaller", "D_delete_OTCaller")); + mixin(bindCode("OTCaller_GetPassword", "D_OTCaller_GetPassword")); + mixin(bindCode("OTCaller_delCallback", "D_OTCaller_delCallback")); + mixin(bindCode("OTCaller_setCallback", "D_OTCaller_setCallback")); + mixin(bindCode("OTCaller_isCallbackSet", "D_OTCaller_isCallbackSet")); + mixin(bindCode("OTCaller_callOne", "D_OTCaller_callOne")); + mixin(bindCode("OTCaller_callTwo", "D_OTCaller_callTwo")); + mixin(bindCode("OT_API_Set_PasswordCallback", "D_OT_API_Set_PasswordCallback")); + mixin(bindCode("OT_API_Init", "D_OT_API_Init")); + mixin(bindCode("OT_API_LoadWallet", "D_OT_API_LoadWallet")); + mixin(bindCode("OT_API_SwitchWallet", "D_OT_API_SwitchWallet")); + mixin(bindCode("OT_API_GetMemlogSize", "D_OT_API_GetMemlogSize")); + mixin(bindCode("OT_API_GetMemlogAtIndex", "D_OT_API_GetMemlogAtIndex")); + mixin(bindCode("OT_API_PeekMemlogFront", "D_OT_API_PeekMemlogFront")); + mixin(bindCode("OT_API_PeekMemlogBack", "D_OT_API_PeekMemlogBack")); + mixin(bindCode("OT_API_PopMemlogFront", "D_OT_API_PopMemlogFront")); + mixin(bindCode("OT_API_PopMemlogBack", "D_OT_API_PopMemlogBack")); + mixin(bindCode("OT_API_CreateNym", "D_OT_API_CreateNym")); + mixin(bindCode("OT_API_AddServerContract", "D_OT_API_AddServerContract")); + mixin(bindCode("OT_API_AddAssetContract", "D_OT_API_AddAssetContract")); + mixin(bindCode("OT_API_GetServerCount", "D_OT_API_GetServerCount")); + mixin(bindCode("OT_API_GetAssetTypeCount", "D_OT_API_GetAssetTypeCount")); + mixin(bindCode("OT_API_GetAccountCount", "D_OT_API_GetAccountCount")); + mixin(bindCode("OT_API_GetNymCount", "D_OT_API_GetNymCount")); + mixin(bindCode("OT_API_GetServer_ID", "D_OT_API_GetServer_ID")); + mixin(bindCode("OT_API_GetServer_Name", "D_OT_API_GetServer_Name")); + mixin(bindCode("OT_API_GetAssetType_ID", "D_OT_API_GetAssetType_ID")); + mixin(bindCode("OT_API_GetAssetType_Name", "D_OT_API_GetAssetType_Name")); + mixin(bindCode("OT_API_GetAccountWallet_ID", "D_OT_API_GetAccountWallet_ID")); + mixin(bindCode("OT_API_GetAccountWallet_Name", "D_OT_API_GetAccountWallet_Name")); + mixin(bindCode("OT_API_GetAccountWallet_Balance", "D_OT_API_GetAccountWallet_Balance")); + mixin(bindCode("OT_API_GetAccountWallet_Type", "D_OT_API_GetAccountWallet_Type")); + mixin(bindCode("OT_API_GetAccountWallet_AssetTypeID", "D_OT_API_GetAccountWallet_AssetTypeID")); + mixin(bindCode("OT_API_GetAccountWallet_ServerID", "D_OT_API_GetAccountWallet_ServerID")); + mixin(bindCode("OT_API_GetAccountWallet_NymID", "D_OT_API_GetAccountWallet_NymID")); + mixin(bindCode("OT_API_VerifyAccountReceipt", "D_OT_API_VerifyAccountReceipt")); + mixin(bindCode("OT_API_GetNym_TransactionNumCount", "D_OT_API_GetNym_TransactionNumCount")); + mixin(bindCode("OT_API_GetNym_ID", "D_OT_API_GetNym_ID")); + mixin(bindCode("OT_API_GetNym_Name", "D_OT_API_GetNym_Name")); + mixin(bindCode("OT_API_GetNym_Stats", "D_OT_API_GetNym_Stats")); + mixin(bindCode("OT_API_IsNym_RegisteredAtServer", "D_OT_API_IsNym_RegisteredAtServer")); + mixin(bindCode("OT_API_GetNym_MailCount", "D_OT_API_GetNym_MailCount")); + mixin(bindCode("OT_API_GetNym_MailContentsByIndex", "D_OT_API_GetNym_MailContentsByIndex")); + mixin(bindCode("OT_API_GetNym_MailSenderIDByIndex", "D_OT_API_GetNym_MailSenderIDByIndex")); + mixin(bindCode("OT_API_GetNym_MailServerIDByIndex", "D_OT_API_GetNym_MailServerIDByIndex")); + mixin(bindCode("OT_API_Nym_RemoveMailByIndex", "D_OT_API_Nym_RemoveMailByIndex")); + mixin(bindCode("OT_API_Nym_VerifyMailByIndex", "D_OT_API_Nym_VerifyMailByIndex")); + mixin(bindCode("OT_API_GetNym_OutmailCount", "D_OT_API_GetNym_OutmailCount")); + mixin(bindCode("OT_API_GetNym_OutmailContentsByIndex", "D_OT_API_GetNym_OutmailContentsByIndex")); + mixin(bindCode("OT_API_GetNym_OutmailRecipientIDByIndex", "D_OT_API_GetNym_OutmailRecipientIDByIndex")); + mixin(bindCode("OT_API_GetNym_OutmailServerIDByIndex", "D_OT_API_GetNym_OutmailServerIDByIndex")); + mixin(bindCode("OT_API_Nym_RemoveOutmailByIndex", "D_OT_API_Nym_RemoveOutmailByIndex")); + mixin(bindCode("OT_API_Nym_VerifyOutmailByIndex", "D_OT_API_Nym_VerifyOutmailByIndex")); + mixin(bindCode("OT_API_Wallet_CanRemoveServer", "D_OT_API_Wallet_CanRemoveServer")); + mixin(bindCode("OT_API_Wallet_RemoveServer", "D_OT_API_Wallet_RemoveServer")); + mixin(bindCode("OT_API_Wallet_CanRemoveAssetType", "D_OT_API_Wallet_CanRemoveAssetType")); + mixin(bindCode("OT_API_Wallet_RemoveAssetType", "D_OT_API_Wallet_RemoveAssetType")); + mixin(bindCode("OT_API_Wallet_CanRemoveNym", "D_OT_API_Wallet_CanRemoveNym")); + mixin(bindCode("OT_API_Wallet_RemoveNym", "D_OT_API_Wallet_RemoveNym")); + mixin(bindCode("OT_API_Wallet_CanRemoveAccount", "D_OT_API_Wallet_CanRemoveAccount")); + mixin(bindCode("OT_API_Wallet_RemoveAccount", "D_OT_API_Wallet_RemoveAccount")); + mixin(bindCode("OT_API_Wallet_ImportNym", "D_OT_API_Wallet_ImportNym")); + mixin(bindCode("OT_API_SetNym_Name", "D_OT_API_SetNym_Name")); + mixin(bindCode("OT_API_SetAccountWallet_Name", "D_OT_API_SetAccountWallet_Name")); + mixin(bindCode("OT_API_SetAssetType_Name", "D_OT_API_SetAssetType_Name")); + mixin(bindCode("OT_API_SetServer_Name", "D_OT_API_SetServer_Name")); + mixin(bindCode("OT_API_VerifyAndRetrieveXMLContents", "D_OT_API_VerifyAndRetrieveXMLContents")); + mixin(bindCode("OT_API_WriteCheque", "D_OT_API_WriteCheque")); + mixin(bindCode("OT_API_WritePaymentPlan", "D_OT_API_WritePaymentPlan")); + mixin(bindCode("OT_API_LoadUserPubkey", "D_OT_API_LoadUserPubkey")); + mixin(bindCode("OT_API_LoadPubkey", "D_OT_API_LoadPubkey")); + mixin(bindCode("OT_API_VerifyUserPrivateKey", "D_OT_API_VerifyUserPrivateKey")); + mixin(bindCode("OT_API_LoadPurse", "D_OT_API_LoadPurse")); + mixin(bindCode("OT_API_LoadMint", "D_OT_API_LoadMint")); + mixin(bindCode("OT_API_LoadAssetContract", "D_OT_API_LoadAssetContract")); + mixin(bindCode("OT_API_LoadServerContract", "D_OT_API_LoadServerContract")); + mixin(bindCode("OT_API_IsBasketCurrency", "D_OT_API_IsBasketCurrency")); + mixin(bindCode("OT_API_Basket_GetMemberCount", "D_OT_API_Basket_GetMemberCount")); + mixin(bindCode("OT_API_Basket_GetMemberType", "D_OT_API_Basket_GetMemberType")); + mixin(bindCode("OT_API_Basket_GetMinimumTransferAmount", "D_OT_API_Basket_GetMinimumTransferAmount")); + mixin(bindCode("OT_API_Basket_GetMemberMinimumTransferAmount", "D_OT_API_Basket_GetMemberMinimumTransferAmount")); + mixin(bindCode("OT_API_LoadAssetAccount", "D_OT_API_LoadAssetAccount")); + mixin(bindCode("OT_API_LoadInbox", "D_OT_API_LoadInbox")); + mixin(bindCode("OT_API_LoadOutbox", "D_OT_API_LoadOutbox")); + mixin(bindCode("OT_API_Ledger_GetCount", "D_OT_API_Ledger_GetCount")); + mixin(bindCode("OT_API_Ledger_CreateResponse", "D_OT_API_Ledger_CreateResponse")); + mixin(bindCode("OT_API_Ledger_GetTransactionByIndex", "D_OT_API_Ledger_GetTransactionByIndex")); + mixin(bindCode("OT_API_Ledger_GetTransactionByID", "D_OT_API_Ledger_GetTransactionByID")); + mixin(bindCode("OT_API_Ledger_GetTransactionIDByIndex", "D_OT_API_Ledger_GetTransactionIDByIndex")); + mixin(bindCode("OT_API_Ledger_AddTransaction", "D_OT_API_Ledger_AddTransaction")); + mixin(bindCode("OT_API_Transaction_CreateResponse", "D_OT_API_Transaction_CreateResponse")); + mixin(bindCode("OT_API_Ledger_FinalizeResponse", "D_OT_API_Ledger_FinalizeResponse")); + mixin(bindCode("OT_API_Transaction_GetType", "D_OT_API_Transaction_GetType")); + mixin(bindCode("OT_API_Transaction_GetVoucher", "D_OT_API_Transaction_GetVoucher")); + mixin(bindCode("OT_API_Transaction_GetSuccess", "D_OT_API_Transaction_GetSuccess")); + mixin(bindCode("OT_API_Transaction_GetDateSigned", "D_OT_API_Transaction_GetDateSigned")); + mixin(bindCode("OT_API_Transaction_GetAmount", "D_OT_API_Transaction_GetAmount")); + mixin(bindCode("OT_API_Pending_GetNote", "D_OT_API_Pending_GetNote")); + mixin(bindCode("OT_API_Transaction_GetSenderUserID", "D_OT_API_Transaction_GetSenderUserID")); + mixin(bindCode("OT_API_Transaction_GetSenderAcctID", "D_OT_API_Transaction_GetSenderAcctID")); + mixin(bindCode("OT_API_Transaction_GetRecipientUserID", "D_OT_API_Transaction_GetRecipientUserID")); + mixin(bindCode("OT_API_Transaction_GetRecipientAcctID", "D_OT_API_Transaction_GetRecipientAcctID")); + mixin(bindCode("OT_API_Transaction_GetDisplayReferenceToNum", "D_OT_API_Transaction_GetDisplayReferenceToNum")); + mixin(bindCode("OT_API_CreatePurse", "D_OT_API_CreatePurse")); + mixin(bindCode("OT_API_SavePurse", "D_OT_API_SavePurse")); + mixin(bindCode("OT_API_Purse_GetTotalValue", "D_OT_API_Purse_GetTotalValue")); + mixin(bindCode("OT_API_Purse_Count", "D_OT_API_Purse_Count")); + mixin(bindCode("OT_API_Purse_Peek", "D_OT_API_Purse_Peek")); + mixin(bindCode("OT_API_Purse_Pop", "D_OT_API_Purse_Pop")); + mixin(bindCode("OT_API_Purse_Push", "D_OT_API_Purse_Push")); + mixin(bindCode("OT_API_Wallet_ImportPurse", "D_OT_API_Wallet_ImportPurse")); + mixin(bindCode("OT_API_exchangePurse", "D_OT_API_exchangePurse")); + mixin(bindCode("OT_API_Token_ChangeOwner", "D_OT_API_Token_ChangeOwner")); + mixin(bindCode("OT_API_Token_GetID", "D_OT_API_Token_GetID")); + mixin(bindCode("OT_API_Token_GetDenomination", "D_OT_API_Token_GetDenomination")); + mixin(bindCode("OT_API_Token_GetSeries", "D_OT_API_Token_GetSeries")); + mixin(bindCode("OT_API_Token_GetValidFrom", "D_OT_API_Token_GetValidFrom")); + mixin(bindCode("OT_API_Token_GetValidTo", "D_OT_API_Token_GetValidTo")); + mixin(bindCode("OT_API_Token_GetAssetID", "D_OT_API_Token_GetAssetID")); + mixin(bindCode("OT_API_Token_GetServerID", "D_OT_API_Token_GetServerID")); + mixin(bindCode("OT_API_checkServerID", "D_OT_API_checkServerID")); + mixin(bindCode("OT_API_createUserAccount", "D_OT_API_createUserAccount")); + mixin(bindCode("OT_API_checkUser", "D_OT_API_checkUser")); + mixin(bindCode("OT_API_sendUserMessage", "D_OT_API_sendUserMessage")); + mixin(bindCode("OT_API_getRequest", "D_OT_API_getRequest")); + mixin(bindCode("OT_API_getTransactionNumber", "D_OT_API_getTransactionNumber")); + mixin(bindCode("OT_API_issueAssetType", "D_OT_API_issueAssetType")); + mixin(bindCode("OT_API_getContract", "D_OT_API_getContract")); + mixin(bindCode("OT_API_getMint", "D_OT_API_getMint")); + mixin(bindCode("OT_API_createAssetAccount", "D_OT_API_createAssetAccount")); + mixin(bindCode("OT_API_getAccount", "D_OT_API_getAccount")); + mixin(bindCode("OT_API_GenerateBasketCreation", "D_OT_API_GenerateBasketCreation")); + mixin(bindCode("OT_API_AddBasketCreationItem", "D_OT_API_AddBasketCreationItem")); + mixin(bindCode("OT_API_issueBasket", "D_OT_API_issueBasket")); + mixin(bindCode("OT_API_GenerateBasketExchange", "D_OT_API_GenerateBasketExchange")); + mixin(bindCode("OT_API_AddBasketExchangeItem", "D_OT_API_AddBasketExchangeItem")); + mixin(bindCode("OT_API_exchangeBasket", "D_OT_API_exchangeBasket")); + mixin(bindCode("OT_API_notarizeWithdrawal", "D_OT_API_notarizeWithdrawal")); + mixin(bindCode("OT_API_notarizeDeposit", "D_OT_API_notarizeDeposit")); + mixin(bindCode("OT_API_notarizeTransfer", "D_OT_API_notarizeTransfer")); + mixin(bindCode("OT_API_getInbox", "D_OT_API_getInbox")); + mixin(bindCode("OT_API_getOutbox", "D_OT_API_getOutbox")); + mixin(bindCode("OT_API_getNymbox", "D_OT_API_getNymbox")); + mixin(bindCode("OT_API_LoadNymbox", "D_OT_API_LoadNymbox")); + mixin(bindCode("OT_API_processInbox", "D_OT_API_processInbox")); + mixin(bindCode("OT_API_processNymbox", "D_OT_API_processNymbox")); + mixin(bindCode("OT_API_withdrawVoucher", "D_OT_API_withdrawVoucher")); + mixin(bindCode("OT_API_depositCheque", "D_OT_API_depositCheque")); + mixin(bindCode("OT_API_depositPaymentPlan", "D_OT_API_depositPaymentPlan")); + mixin(bindCode("OT_API_issueMarketOffer", "D_OT_API_issueMarketOffer")); + mixin(bindCode("OT_API_getMarketList", "D_OT_API_getMarketList")); + mixin(bindCode("OT_API_getMarketOffers", "D_OT_API_getMarketOffers")); + mixin(bindCode("OT_API_getMarketRecentTrades", "D_OT_API_getMarketRecentTrades")); + mixin(bindCode("OT_API_getNym_MarketOffers", "D_OT_API_getNym_MarketOffers")); + mixin(bindCode("OT_API_cancelNymMarketOffer", "D_OT_API_cancelNymMarketOffer")); + mixin(bindCode("OT_API_getOffer_Trades", "D_OT_API_getOffer_Trades")); + mixin(bindCode("OT_API_PopMessageBuffer", "D_OT_API_PopMessageBuffer")); + mixin(bindCode("OT_API_FlushMessageBuffer", "D_OT_API_FlushMessageBuffer")); + mixin(bindCode("OT_API_Message_GetCommand", "D_OT_API_Message_GetCommand")); + mixin(bindCode("OT_API_Message_GetSuccess", "D_OT_API_Message_GetSuccess")); + mixin(bindCode("OT_API_Message_GetTransactionSuccess", "D_OT_API_Message_GetTransactionSuccess")); + mixin(bindCode("OT_API_Message_GetLedger", "D_OT_API_Message_GetLedger")); + mixin(bindCode("OT_API_Message_GetNewAssetTypeID", "D_OT_API_Message_GetNewAssetTypeID")); + mixin(bindCode("OT_API_Message_GetNewIssuerAcctID", "D_OT_API_Message_GetNewIssuerAcctID")); + mixin(bindCode("OT_API_Message_GetNewAcctID", "D_OT_API_Message_GetNewAcctID")); + mixin(bindCode("OT_API_ConnectServer", "D_OT_API_ConnectServer")); + mixin(bindCode("OT_API_ProcessSockets", "D_OT_API_ProcessSockets")); + mixin(bindCode("delete_Storable", "D_delete_Storable")); + mixin(bindCode("Storable_Create", "D_Storable_Create")); + mixin(bindCode("Storable_ot_dynamic_cast", "D_Storable_ot_dynamic_cast")); + mixin(bindCode("Storage_Init__SWIG_0", "D_Storage_Init__SWIG_0")); + mixin(bindCode("Storage_Init__SWIG_1", "D_Storage_Init__SWIG_1")); + mixin(bindCode("Storage_Init__SWIG_2", "D_Storage_Init__SWIG_2")); + mixin(bindCode("Storage_Init__SWIG_3", "D_Storage_Init__SWIG_3")); + mixin(bindCode("Storage_Init__SWIG_4", "D_Storage_Init__SWIG_4")); + mixin(bindCode("Storage_Init__SWIG_5", "D_Storage_Init__SWIG_5")); + mixin(bindCode("Storage_Init__SWIG_6", "D_Storage_Init__SWIG_6")); + mixin(bindCode("Storage_Exists__SWIG_0", "D_Storage_Exists__SWIG_0")); + mixin(bindCode("Storage_Exists__SWIG_1", "D_Storage_Exists__SWIG_1")); + mixin(bindCode("Storage_Exists__SWIG_2", "D_Storage_Exists__SWIG_2")); + mixin(bindCode("Storage_Exists__SWIG_3", "D_Storage_Exists__SWIG_3")); + mixin(bindCode("delete_Storage", "D_delete_Storage")); + mixin(bindCode("Storage_StoreString__SWIG_0", "D_Storage_StoreString__SWIG_0")); + mixin(bindCode("Storage_StoreString__SWIG_1", "D_Storage_StoreString__SWIG_1")); + mixin(bindCode("Storage_StoreString__SWIG_2", "D_Storage_StoreString__SWIG_2")); + mixin(bindCode("Storage_StoreString__SWIG_3", "D_Storage_StoreString__SWIG_3")); + mixin(bindCode("Storage_QueryString__SWIG_0", "D_Storage_QueryString__SWIG_0")); + mixin(bindCode("Storage_QueryString__SWIG_1", "D_Storage_QueryString__SWIG_1")); + mixin(bindCode("Storage_QueryString__SWIG_2", "D_Storage_QueryString__SWIG_2")); + mixin(bindCode("Storage_QueryString__SWIG_3", "D_Storage_QueryString__SWIG_3")); + mixin(bindCode("Storage_StorePlainString__SWIG_0", "D_Storage_StorePlainString__SWIG_0")); + mixin(bindCode("Storage_StorePlainString__SWIG_1", "D_Storage_StorePlainString__SWIG_1")); + mixin(bindCode("Storage_StorePlainString__SWIG_2", "D_Storage_StorePlainString__SWIG_2")); + mixin(bindCode("Storage_StorePlainString__SWIG_3", "D_Storage_StorePlainString__SWIG_3")); + mixin(bindCode("Storage_QueryPlainString__SWIG_0", "D_Storage_QueryPlainString__SWIG_0")); + mixin(bindCode("Storage_QueryPlainString__SWIG_1", "D_Storage_QueryPlainString__SWIG_1")); + mixin(bindCode("Storage_QueryPlainString__SWIG_2", "D_Storage_QueryPlainString__SWIG_2")); + mixin(bindCode("Storage_QueryPlainString__SWIG_3", "D_Storage_QueryPlainString__SWIG_3")); + mixin(bindCode("Storage_StoreObject__SWIG_0", "D_Storage_StoreObject__SWIG_0")); + mixin(bindCode("Storage_StoreObject__SWIG_1", "D_Storage_StoreObject__SWIG_1")); + mixin(bindCode("Storage_StoreObject__SWIG_2", "D_Storage_StoreObject__SWIG_2")); + mixin(bindCode("Storage_StoreObject__SWIG_3", "D_Storage_StoreObject__SWIG_3")); + mixin(bindCode("Storage_QueryObject__SWIG_0", "D_Storage_QueryObject__SWIG_0")); + mixin(bindCode("Storage_QueryObject__SWIG_1", "D_Storage_QueryObject__SWIG_1")); + mixin(bindCode("Storage_QueryObject__SWIG_2", "D_Storage_QueryObject__SWIG_2")); + mixin(bindCode("Storage_QueryObject__SWIG_3", "D_Storage_QueryObject__SWIG_3")); + mixin(bindCode("Storage_CreateObject", "D_Storage_CreateObject")); + mixin(bindCode("Storage_Create", "D_Storage_Create")); + mixin(bindCode("Storage_GetType", "D_Storage_GetType")); + mixin(bindCode("InitDefaultStorage__SWIG_0", "D_InitDefaultStorage__SWIG_0")); + mixin(bindCode("InitDefaultStorage__SWIG_1", "D_InitDefaultStorage__SWIG_1")); + mixin(bindCode("InitDefaultStorage__SWIG_2", "D_InitDefaultStorage__SWIG_2")); + mixin(bindCode("InitDefaultStorage__SWIG_3", "D_InitDefaultStorage__SWIG_3")); + mixin(bindCode("InitDefaultStorage__SWIG_4", "D_InitDefaultStorage__SWIG_4")); + mixin(bindCode("InitDefaultStorage__SWIG_5", "D_InitDefaultStorage__SWIG_5")); + mixin(bindCode("InitDefaultStorage__SWIG_6", "D_InitDefaultStorage__SWIG_6")); + mixin(bindCode("GetDefaultStorage", "D_GetDefaultStorage")); + mixin(bindCode("CreateStorageContext__SWIG_0", "D_CreateStorageContext__SWIG_0")); + mixin(bindCode("CreateStorageContext__SWIG_1", "D_CreateStorageContext__SWIG_1")); + mixin(bindCode("CreateObject", "D_CreateObject")); + mixin(bindCode("Exists__SWIG_0", "D_Exists__SWIG_0")); + mixin(bindCode("Exists__SWIG_1", "D_Exists__SWIG_1")); + mixin(bindCode("Exists__SWIG_2", "D_Exists__SWIG_2")); + mixin(bindCode("Exists__SWIG_3", "D_Exists__SWIG_3")); + mixin(bindCode("StoreString__SWIG_0", "D_StoreString__SWIG_0")); + mixin(bindCode("StoreString__SWIG_1", "D_StoreString__SWIG_1")); + mixin(bindCode("StoreString__SWIG_2", "D_StoreString__SWIG_2")); + mixin(bindCode("StoreString__SWIG_3", "D_StoreString__SWIG_3")); + mixin(bindCode("QueryString__SWIG_0", "D_QueryString__SWIG_0")); + mixin(bindCode("QueryString__SWIG_1", "D_QueryString__SWIG_1")); + mixin(bindCode("QueryString__SWIG_2", "D_QueryString__SWIG_2")); + mixin(bindCode("QueryString__SWIG_3", "D_QueryString__SWIG_3")); + mixin(bindCode("StorePlainString__SWIG_0", "D_StorePlainString__SWIG_0")); + mixin(bindCode("StorePlainString__SWIG_1", "D_StorePlainString__SWIG_1")); + mixin(bindCode("StorePlainString__SWIG_2", "D_StorePlainString__SWIG_2")); + mixin(bindCode("StorePlainString__SWIG_3", "D_StorePlainString__SWIG_3")); + mixin(bindCode("QueryPlainString__SWIG_0", "D_QueryPlainString__SWIG_0")); + mixin(bindCode("QueryPlainString__SWIG_1", "D_QueryPlainString__SWIG_1")); + mixin(bindCode("QueryPlainString__SWIG_2", "D_QueryPlainString__SWIG_2")); + mixin(bindCode("QueryPlainString__SWIG_3", "D_QueryPlainString__SWIG_3")); + mixin(bindCode("StoreObject__SWIG_0", "D_StoreObject__SWIG_0")); + mixin(bindCode("StoreObject__SWIG_1", "D_StoreObject__SWIG_1")); + mixin(bindCode("StoreObject__SWIG_2", "D_StoreObject__SWIG_2")); + mixin(bindCode("StoreObject__SWIG_3", "D_StoreObject__SWIG_3")); + mixin(bindCode("QueryObject__SWIG_0", "D_QueryObject__SWIG_0")); + mixin(bindCode("QueryObject__SWIG_1", "D_QueryObject__SWIG_1")); + mixin(bindCode("QueryObject__SWIG_2", "D_QueryObject__SWIG_2")); + mixin(bindCode("QueryObject__SWIG_3", "D_QueryObject__SWIG_3")); + mixin(bindCode("delete_OTDBString", "D_delete_OTDBString")); + mixin(bindCode("OTDBString_m_string_set", "D_OTDBString_m_string_set")); + mixin(bindCode("OTDBString_m_string_get", "D_OTDBString_m_string_get")); + mixin(bindCode("OTDBString_ot_dynamic_cast", "D_OTDBString_ot_dynamic_cast")); + mixin(bindCode("OTDBString_Upcast", "D_OTDBString_Upcast")); + mixin(bindCode("delete_Blob", "D_delete_Blob")); + mixin(bindCode("Blob_m_memBuffer_set", "D_Blob_m_memBuffer_set")); + mixin(bindCode("Blob_m_memBuffer_get", "D_Blob_m_memBuffer_get")); + mixin(bindCode("Blob_ot_dynamic_cast", "D_Blob_ot_dynamic_cast")); + mixin(bindCode("Blob_Upcast", "D_Blob_Upcast")); + mixin(bindCode("delete_StringMap", "D_delete_StringMap")); + mixin(bindCode("StringMap_the_map_set", "D_StringMap_the_map_set")); + mixin(bindCode("StringMap_the_map_get", "D_StringMap_the_map_get")); + mixin(bindCode("StringMap_SetValue", "D_StringMap_SetValue")); + mixin(bindCode("StringMap_GetValue", "D_StringMap_GetValue")); + mixin(bindCode("StringMap_ot_dynamic_cast", "D_StringMap_ot_dynamic_cast")); + mixin(bindCode("StringMap_Upcast", "D_StringMap_Upcast")); + mixin(bindCode("delete_Displayable", "D_delete_Displayable")); + mixin(bindCode("Displayable_gui_label_set", "D_Displayable_gui_label_set")); + mixin(bindCode("Displayable_gui_label_get", "D_Displayable_gui_label_get")); + mixin(bindCode("Displayable_ot_dynamic_cast", "D_Displayable_ot_dynamic_cast")); + mixin(bindCode("Displayable_Upcast", "D_Displayable_Upcast")); + mixin(bindCode("delete_MarketData", "D_delete_MarketData")); + mixin(bindCode("MarketData_gui_label_set", "D_MarketData_gui_label_set")); + mixin(bindCode("MarketData_gui_label_get", "D_MarketData_gui_label_get")); + mixin(bindCode("MarketData_server_id_set", "D_MarketData_server_id_set")); + mixin(bindCode("MarketData_server_id_get", "D_MarketData_server_id_get")); + mixin(bindCode("MarketData_asset_type_id_set", "D_MarketData_asset_type_id_set")); + mixin(bindCode("MarketData_asset_type_id_get", "D_MarketData_asset_type_id_get")); + mixin(bindCode("MarketData_currency_type_id_set", "D_MarketData_currency_type_id_set")); + mixin(bindCode("MarketData_currency_type_id_get", "D_MarketData_currency_type_id_get")); + mixin(bindCode("MarketData_scale_set", "D_MarketData_scale_set")); + mixin(bindCode("MarketData_scale_get", "D_MarketData_scale_get")); + mixin(bindCode("MarketData_total_assets_set", "D_MarketData_total_assets_set")); + mixin(bindCode("MarketData_total_assets_get", "D_MarketData_total_assets_get")); + mixin(bindCode("MarketData_number_bids_set", "D_MarketData_number_bids_set")); + mixin(bindCode("MarketData_number_bids_get", "D_MarketData_number_bids_get")); + mixin(bindCode("MarketData_number_asks_set", "D_MarketData_number_asks_set")); + mixin(bindCode("MarketData_number_asks_get", "D_MarketData_number_asks_get")); + mixin(bindCode("MarketData_last_sale_price_set", "D_MarketData_last_sale_price_set")); + mixin(bindCode("MarketData_last_sale_price_get", "D_MarketData_last_sale_price_get")); + mixin(bindCode("MarketData_current_bid_set", "D_MarketData_current_bid_set")); + mixin(bindCode("MarketData_current_bid_get", "D_MarketData_current_bid_get")); + mixin(bindCode("MarketData_current_ask_set", "D_MarketData_current_ask_set")); + mixin(bindCode("MarketData_current_ask_get", "D_MarketData_current_ask_get")); + mixin(bindCode("MarketData_volume_trades_set", "D_MarketData_volume_trades_set")); + mixin(bindCode("MarketData_volume_trades_get", "D_MarketData_volume_trades_get")); + mixin(bindCode("MarketData_volume_assets_set", "D_MarketData_volume_assets_set")); + mixin(bindCode("MarketData_volume_assets_get", "D_MarketData_volume_assets_get")); + mixin(bindCode("MarketData_volume_currency_set", "D_MarketData_volume_currency_set")); + mixin(bindCode("MarketData_volume_currency_get", "D_MarketData_volume_currency_get")); + mixin(bindCode("MarketData_recent_highest_bid_set", "D_MarketData_recent_highest_bid_set")); + mixin(bindCode("MarketData_recent_highest_bid_get", "D_MarketData_recent_highest_bid_get")); + mixin(bindCode("MarketData_recent_lowest_ask_set", "D_MarketData_recent_lowest_ask_set")); + mixin(bindCode("MarketData_recent_lowest_ask_get", "D_MarketData_recent_lowest_ask_get")); + mixin(bindCode("MarketData_ot_dynamic_cast", "D_MarketData_ot_dynamic_cast")); + mixin(bindCode("MarketData_Upcast", "D_MarketData_Upcast")); + mixin(bindCode("delete_MarketList", "D_delete_MarketList")); + mixin(bindCode("MarketList_GetMarketDataCount", "D_MarketList_GetMarketDataCount")); + mixin(bindCode("MarketList_GetMarketData", "D_MarketList_GetMarketData")); + mixin(bindCode("MarketList_RemoveMarketData", "D_MarketList_RemoveMarketData")); + mixin(bindCode("MarketList_AddMarketData", "D_MarketList_AddMarketData")); + mixin(bindCode("MarketList_ot_dynamic_cast", "D_MarketList_ot_dynamic_cast")); + mixin(bindCode("MarketList_Upcast", "D_MarketList_Upcast")); + mixin(bindCode("delete_OfferDataMarket", "D_delete_OfferDataMarket")); + mixin(bindCode("OfferDataMarket_gui_label_set", "D_OfferDataMarket_gui_label_set")); + mixin(bindCode("OfferDataMarket_gui_label_get", "D_OfferDataMarket_gui_label_get")); + mixin(bindCode("OfferDataMarket_transaction_id_set", "D_OfferDataMarket_transaction_id_set")); + mixin(bindCode("OfferDataMarket_transaction_id_get", "D_OfferDataMarket_transaction_id_get")); + mixin(bindCode("OfferDataMarket_price_per_scale_set", "D_OfferDataMarket_price_per_scale_set")); + mixin(bindCode("OfferDataMarket_price_per_scale_get", "D_OfferDataMarket_price_per_scale_get")); + mixin(bindCode("OfferDataMarket_available_assets_set", "D_OfferDataMarket_available_assets_set")); + mixin(bindCode("OfferDataMarket_available_assets_get", "D_OfferDataMarket_available_assets_get")); + mixin(bindCode("OfferDataMarket_minimum_increment_set", "D_OfferDataMarket_minimum_increment_set")); + mixin(bindCode("OfferDataMarket_minimum_increment_get", "D_OfferDataMarket_minimum_increment_get")); + mixin(bindCode("OfferDataMarket_ot_dynamic_cast", "D_OfferDataMarket_ot_dynamic_cast")); + mixin(bindCode("OfferDataMarket_Upcast", "D_OfferDataMarket_Upcast")); + mixin(bindCode("delete_OfferListMarket", "D_delete_OfferListMarket")); + mixin(bindCode("OfferListMarket_GetBidDataCount", "D_OfferListMarket_GetBidDataCount")); + mixin(bindCode("OfferListMarket_GetBidData", "D_OfferListMarket_GetBidData")); + mixin(bindCode("OfferListMarket_RemoveBidData", "D_OfferListMarket_RemoveBidData")); + mixin(bindCode("OfferListMarket_AddBidData", "D_OfferListMarket_AddBidData")); + mixin(bindCode("OfferListMarket_GetAskDataCount", "D_OfferListMarket_GetAskDataCount")); + mixin(bindCode("OfferListMarket_GetAskData", "D_OfferListMarket_GetAskData")); + mixin(bindCode("OfferListMarket_RemoveAskData", "D_OfferListMarket_RemoveAskData")); + mixin(bindCode("OfferListMarket_AddAskData", "D_OfferListMarket_AddAskData")); + mixin(bindCode("OfferListMarket_ot_dynamic_cast", "D_OfferListMarket_ot_dynamic_cast")); + mixin(bindCode("OfferListMarket_Upcast", "D_OfferListMarket_Upcast")); + mixin(bindCode("delete_TradeDataMarket", "D_delete_TradeDataMarket")); + mixin(bindCode("TradeDataMarket_gui_label_set", "D_TradeDataMarket_gui_label_set")); + mixin(bindCode("TradeDataMarket_gui_label_get", "D_TradeDataMarket_gui_label_get")); + mixin(bindCode("TradeDataMarket_transaction_id_set", "D_TradeDataMarket_transaction_id_set")); + mixin(bindCode("TradeDataMarket_transaction_id_get", "D_TradeDataMarket_transaction_id_get")); + mixin(bindCode("TradeDataMarket_date_set", "D_TradeDataMarket_date_set")); + mixin(bindCode("TradeDataMarket_date_get", "D_TradeDataMarket_date_get")); + mixin(bindCode("TradeDataMarket_price_set", "D_TradeDataMarket_price_set")); + mixin(bindCode("TradeDataMarket_price_get", "D_TradeDataMarket_price_get")); + mixin(bindCode("TradeDataMarket_amount_sold_set", "D_TradeDataMarket_amount_sold_set")); + mixin(bindCode("TradeDataMarket_amount_sold_get", "D_TradeDataMarket_amount_sold_get")); + mixin(bindCode("TradeDataMarket_ot_dynamic_cast", "D_TradeDataMarket_ot_dynamic_cast")); + mixin(bindCode("TradeDataMarket_Upcast", "D_TradeDataMarket_Upcast")); + mixin(bindCode("delete_TradeListMarket", "D_delete_TradeListMarket")); + mixin(bindCode("TradeListMarket_GetTradeDataMarketCount", "D_TradeListMarket_GetTradeDataMarketCount")); + mixin(bindCode("TradeListMarket_GetTradeDataMarket", "D_TradeListMarket_GetTradeDataMarket")); + mixin(bindCode("TradeListMarket_RemoveTradeDataMarket", "D_TradeListMarket_RemoveTradeDataMarket")); + mixin(bindCode("TradeListMarket_AddTradeDataMarket", "D_TradeListMarket_AddTradeDataMarket")); + mixin(bindCode("TradeListMarket_ot_dynamic_cast", "D_TradeListMarket_ot_dynamic_cast")); + mixin(bindCode("TradeListMarket_Upcast", "D_TradeListMarket_Upcast")); + mixin(bindCode("delete_OfferDataNym", "D_delete_OfferDataNym")); + mixin(bindCode("OfferDataNym_gui_label_set", "D_OfferDataNym_gui_label_set")); + mixin(bindCode("OfferDataNym_gui_label_get", "D_OfferDataNym_gui_label_get")); + mixin(bindCode("OfferDataNym_valid_from_set", "D_OfferDataNym_valid_from_set")); + mixin(bindCode("OfferDataNym_valid_from_get", "D_OfferDataNym_valid_from_get")); + mixin(bindCode("OfferDataNym_valid_to_set", "D_OfferDataNym_valid_to_set")); + mixin(bindCode("OfferDataNym_valid_to_get", "D_OfferDataNym_valid_to_get")); + mixin(bindCode("OfferDataNym_server_id_set", "D_OfferDataNym_server_id_set")); + mixin(bindCode("OfferDataNym_server_id_get", "D_OfferDataNym_server_id_get")); + mixin(bindCode("OfferDataNym_asset_type_id_set", "D_OfferDataNym_asset_type_id_set")); + mixin(bindCode("OfferDataNym_asset_type_id_get", "D_OfferDataNym_asset_type_id_get")); + mixin(bindCode("OfferDataNym_currency_type_id_set", "D_OfferDataNym_currency_type_id_set")); + mixin(bindCode("OfferDataNym_currency_type_id_get", "D_OfferDataNym_currency_type_id_get")); + mixin(bindCode("OfferDataNym_selling_set", "D_OfferDataNym_selling_set")); + mixin(bindCode("OfferDataNym_selling_get", "D_OfferDataNym_selling_get")); + mixin(bindCode("OfferDataNym_scale_set", "D_OfferDataNym_scale_set")); + mixin(bindCode("OfferDataNym_scale_get", "D_OfferDataNym_scale_get")); + mixin(bindCode("OfferDataNym_price_per_scale_set", "D_OfferDataNym_price_per_scale_set")); + mixin(bindCode("OfferDataNym_price_per_scale_get", "D_OfferDataNym_price_per_scale_get")); + mixin(bindCode("OfferDataNym_transaction_id_set", "D_OfferDataNym_transaction_id_set")); + mixin(bindCode("OfferDataNym_transaction_id_get", "D_OfferDataNym_transaction_id_get")); + mixin(bindCode("OfferDataNym_total_assets_set", "D_OfferDataNym_total_assets_set")); + mixin(bindCode("OfferDataNym_total_assets_get", "D_OfferDataNym_total_assets_get")); + mixin(bindCode("OfferDataNym_finished_so_far_set", "D_OfferDataNym_finished_so_far_set")); + mixin(bindCode("OfferDataNym_finished_so_far_get", "D_OfferDataNym_finished_so_far_get")); + mixin(bindCode("OfferDataNym_minimum_increment_set", "D_OfferDataNym_minimum_increment_set")); + mixin(bindCode("OfferDataNym_minimum_increment_get", "D_OfferDataNym_minimum_increment_get")); + mixin(bindCode("OfferDataNym_stop_sign_set", "D_OfferDataNym_stop_sign_set")); + mixin(bindCode("OfferDataNym_stop_sign_get", "D_OfferDataNym_stop_sign_get")); + mixin(bindCode("OfferDataNym_stop_price_set", "D_OfferDataNym_stop_price_set")); + mixin(bindCode("OfferDataNym_stop_price_get", "D_OfferDataNym_stop_price_get")); + mixin(bindCode("OfferDataNym_ot_dynamic_cast", "D_OfferDataNym_ot_dynamic_cast")); + mixin(bindCode("OfferDataNym_Upcast", "D_OfferDataNym_Upcast")); + mixin(bindCode("delete_OfferListNym", "D_delete_OfferListNym")); + mixin(bindCode("OfferListNym_GetOfferDataNymCount", "D_OfferListNym_GetOfferDataNymCount")); + mixin(bindCode("OfferListNym_GetOfferDataNym", "D_OfferListNym_GetOfferDataNym")); + mixin(bindCode("OfferListNym_RemoveOfferDataNym", "D_OfferListNym_RemoveOfferDataNym")); + mixin(bindCode("OfferListNym_AddOfferDataNym", "D_OfferListNym_AddOfferDataNym")); + mixin(bindCode("OfferListNym_ot_dynamic_cast", "D_OfferListNym_ot_dynamic_cast")); + mixin(bindCode("OfferListNym_Upcast", "D_OfferListNym_Upcast")); + mixin(bindCode("delete_TradeDataNym", "D_delete_TradeDataNym")); + mixin(bindCode("TradeDataNym_gui_label_set", "D_TradeDataNym_gui_label_set")); + mixin(bindCode("TradeDataNym_gui_label_get", "D_TradeDataNym_gui_label_get")); + mixin(bindCode("TradeDataNym_transaction_id_set", "D_TradeDataNym_transaction_id_set")); + mixin(bindCode("TradeDataNym_transaction_id_get", "D_TradeDataNym_transaction_id_get")); + mixin(bindCode("TradeDataNym_completed_count_set", "D_TradeDataNym_completed_count_set")); + mixin(bindCode("TradeDataNym_completed_count_get", "D_TradeDataNym_completed_count_get")); + mixin(bindCode("TradeDataNym_date_set", "D_TradeDataNym_date_set")); + mixin(bindCode("TradeDataNym_date_get", "D_TradeDataNym_date_get")); + mixin(bindCode("TradeDataNym_price_set", "D_TradeDataNym_price_set")); + mixin(bindCode("TradeDataNym_price_get", "D_TradeDataNym_price_get")); + mixin(bindCode("TradeDataNym_amount_sold_set", "D_TradeDataNym_amount_sold_set")); + mixin(bindCode("TradeDataNym_amount_sold_get", "D_TradeDataNym_amount_sold_get")); + mixin(bindCode("TradeDataNym_ot_dynamic_cast", "D_TradeDataNym_ot_dynamic_cast")); + mixin(bindCode("TradeDataNym_Upcast", "D_TradeDataNym_Upcast")); + mixin(bindCode("delete_TradeListNym", "D_delete_TradeListNym")); + mixin(bindCode("TradeListNym_GetTradeDataNymCount", "D_TradeListNym_GetTradeDataNymCount")); + mixin(bindCode("TradeListNym_GetTradeDataNym", "D_TradeListNym_GetTradeDataNym")); + mixin(bindCode("TradeListNym_RemoveTradeDataNym", "D_TradeListNym_RemoveTradeDataNym")); + mixin(bindCode("TradeListNym_AddTradeDataNym", "D_TradeListNym_AddTradeDataNym")); + mixin(bindCode("TradeListNym_ot_dynamic_cast", "D_TradeListNym_ot_dynamic_cast")); + mixin(bindCode("TradeListNym_Upcast", "D_TradeListNym_Upcast")); + mixin(bindCode("delete_Acct", "D_delete_Acct")); + mixin(bindCode("Acct_gui_label_set", "D_Acct_gui_label_set")); + mixin(bindCode("Acct_gui_label_get", "D_Acct_gui_label_get")); + mixin(bindCode("Acct_acct_id_set", "D_Acct_acct_id_set")); + mixin(bindCode("Acct_acct_id_get", "D_Acct_acct_id_get")); + mixin(bindCode("Acct_server_id_set", "D_Acct_server_id_set")); + mixin(bindCode("Acct_server_id_get", "D_Acct_server_id_get")); + mixin(bindCode("Acct_ot_dynamic_cast", "D_Acct_ot_dynamic_cast")); + mixin(bindCode("Acct_Upcast", "D_Acct_Upcast")); + mixin(bindCode("delete_BitcoinAcct", "D_delete_BitcoinAcct")); + mixin(bindCode("BitcoinAcct_gui_label_set", "D_BitcoinAcct_gui_label_set")); + mixin(bindCode("BitcoinAcct_gui_label_get", "D_BitcoinAcct_gui_label_get")); + mixin(bindCode("BitcoinAcct_acct_id_set", "D_BitcoinAcct_acct_id_set")); + mixin(bindCode("BitcoinAcct_acct_id_get", "D_BitcoinAcct_acct_id_get")); + mixin(bindCode("BitcoinAcct_server_id_set", "D_BitcoinAcct_server_id_set")); + mixin(bindCode("BitcoinAcct_server_id_get", "D_BitcoinAcct_server_id_get")); + mixin(bindCode("BitcoinAcct_bitcoin_acct_name_set", "D_BitcoinAcct_bitcoin_acct_name_set")); + mixin(bindCode("BitcoinAcct_bitcoin_acct_name_get", "D_BitcoinAcct_bitcoin_acct_name_get")); + mixin(bindCode("BitcoinAcct_ot_dynamic_cast", "D_BitcoinAcct_ot_dynamic_cast")); + mixin(bindCode("BitcoinAcct_Upcast", "D_BitcoinAcct_Upcast")); + mixin(bindCode("delete_ServerInfo", "D_delete_ServerInfo")); + mixin(bindCode("ServerInfo_gui_label_set", "D_ServerInfo_gui_label_set")); + mixin(bindCode("ServerInfo_gui_label_get", "D_ServerInfo_gui_label_get")); + mixin(bindCode("ServerInfo_server_id_set", "D_ServerInfo_server_id_set")); + mixin(bindCode("ServerInfo_server_id_get", "D_ServerInfo_server_id_get")); + mixin(bindCode("ServerInfo_server_type_set", "D_ServerInfo_server_type_set")); + mixin(bindCode("ServerInfo_server_type_get", "D_ServerInfo_server_type_get")); + mixin(bindCode("ServerInfo_ot_dynamic_cast", "D_ServerInfo_ot_dynamic_cast")); + mixin(bindCode("ServerInfo_Upcast", "D_ServerInfo_Upcast")); + mixin(bindCode("delete_Server", "D_delete_Server")); + mixin(bindCode("Server_gui_label_set", "D_Server_gui_label_set")); + mixin(bindCode("Server_gui_label_get", "D_Server_gui_label_get")); + mixin(bindCode("Server_server_id_set", "D_Server_server_id_set")); + mixin(bindCode("Server_server_id_get", "D_Server_server_id_get")); + mixin(bindCode("Server_server_type_set", "D_Server_server_type_set")); + mixin(bindCode("Server_server_type_get", "D_Server_server_type_get")); + mixin(bindCode("Server_server_host_set", "D_Server_server_host_set")); + mixin(bindCode("Server_server_host_get", "D_Server_server_host_get")); + mixin(bindCode("Server_server_port_set", "D_Server_server_port_set")); + mixin(bindCode("Server_server_port_get", "D_Server_server_port_get")); + mixin(bindCode("Server_ot_dynamic_cast", "D_Server_ot_dynamic_cast")); + mixin(bindCode("Server_Upcast", "D_Server_Upcast")); + mixin(bindCode("delete_BitcoinServer", "D_delete_BitcoinServer")); + mixin(bindCode("BitcoinServer_gui_label_set", "D_BitcoinServer_gui_label_set")); + mixin(bindCode("BitcoinServer_gui_label_get", "D_BitcoinServer_gui_label_get")); + mixin(bindCode("BitcoinServer_server_id_set", "D_BitcoinServer_server_id_set")); + mixin(bindCode("BitcoinServer_server_id_get", "D_BitcoinServer_server_id_get")); + mixin(bindCode("BitcoinServer_server_type_set", "D_BitcoinServer_server_type_set")); + mixin(bindCode("BitcoinServer_server_type_get", "D_BitcoinServer_server_type_get")); + mixin(bindCode("BitcoinServer_server_host_set", "D_BitcoinServer_server_host_set")); + mixin(bindCode("BitcoinServer_server_host_get", "D_BitcoinServer_server_host_get")); + mixin(bindCode("BitcoinServer_server_port_set", "D_BitcoinServer_server_port_set")); + mixin(bindCode("BitcoinServer_server_port_get", "D_BitcoinServer_server_port_get")); + mixin(bindCode("BitcoinServer_bitcoin_username_set", "D_BitcoinServer_bitcoin_username_set")); + mixin(bindCode("BitcoinServer_bitcoin_username_get", "D_BitcoinServer_bitcoin_username_get")); + mixin(bindCode("BitcoinServer_bitcoin_password_set", "D_BitcoinServer_bitcoin_password_set")); + mixin(bindCode("BitcoinServer_bitcoin_password_get", "D_BitcoinServer_bitcoin_password_get")); + mixin(bindCode("BitcoinServer_ot_dynamic_cast", "D_BitcoinServer_ot_dynamic_cast")); + mixin(bindCode("BitcoinServer_Upcast", "D_BitcoinServer_Upcast")); + mixin(bindCode("delete_ContactNym", "D_delete_ContactNym")); + mixin(bindCode("ContactNym_gui_label_set", "D_ContactNym_gui_label_set")); + mixin(bindCode("ContactNym_gui_label_get", "D_ContactNym_gui_label_get")); + mixin(bindCode("ContactNym_nym_type_set", "D_ContactNym_nym_type_set")); + mixin(bindCode("ContactNym_nym_type_get", "D_ContactNym_nym_type_get")); + mixin(bindCode("ContactNym_nym_id_set", "D_ContactNym_nym_id_set")); + mixin(bindCode("ContactNym_nym_id_get", "D_ContactNym_nym_id_get")); + mixin(bindCode("ContactNym_public_key_set", "D_ContactNym_public_key_set")); + mixin(bindCode("ContactNym_public_key_get", "D_ContactNym_public_key_get")); + mixin(bindCode("ContactNym_memo_set", "D_ContactNym_memo_set")); + mixin(bindCode("ContactNym_memo_get", "D_ContactNym_memo_get")); + mixin(bindCode("ContactNym_GetServerInfoCount", "D_ContactNym_GetServerInfoCount")); + mixin(bindCode("ContactNym_GetServerInfo", "D_ContactNym_GetServerInfo")); + mixin(bindCode("ContactNym_RemoveServerInfo", "D_ContactNym_RemoveServerInfo")); + mixin(bindCode("ContactNym_AddServerInfo", "D_ContactNym_AddServerInfo")); + mixin(bindCode("ContactNym_ot_dynamic_cast", "D_ContactNym_ot_dynamic_cast")); + mixin(bindCode("ContactNym_Upcast", "D_ContactNym_Upcast")); + mixin(bindCode("delete_WalletData", "D_delete_WalletData")); + mixin(bindCode("WalletData_GetBitcoinServerCount", "D_WalletData_GetBitcoinServerCount")); + mixin(bindCode("WalletData_GetBitcoinServer", "D_WalletData_GetBitcoinServer")); + mixin(bindCode("WalletData_RemoveBitcoinServer", "D_WalletData_RemoveBitcoinServer")); + mixin(bindCode("WalletData_AddBitcoinServer", "D_WalletData_AddBitcoinServer")); + mixin(bindCode("WalletData_GetBitcoinAcctCount", "D_WalletData_GetBitcoinAcctCount")); + mixin(bindCode("WalletData_GetBitcoinAcct", "D_WalletData_GetBitcoinAcct")); + mixin(bindCode("WalletData_RemoveBitcoinAcct", "D_WalletData_RemoveBitcoinAcct")); + mixin(bindCode("WalletData_AddBitcoinAcct", "D_WalletData_AddBitcoinAcct")); + mixin(bindCode("WalletData_ot_dynamic_cast", "D_WalletData_ot_dynamic_cast")); + mixin(bindCode("WalletData_Upcast", "D_WalletData_Upcast")); + mixin(bindCode("delete_ContactAcct", "D_delete_ContactAcct")); + mixin(bindCode("ContactAcct_gui_label_set", "D_ContactAcct_gui_label_set")); + mixin(bindCode("ContactAcct_gui_label_get", "D_ContactAcct_gui_label_get")); + mixin(bindCode("ContactAcct_server_type_set", "D_ContactAcct_server_type_set")); + mixin(bindCode("ContactAcct_server_type_get", "D_ContactAcct_server_type_get")); + mixin(bindCode("ContactAcct_server_id_set", "D_ContactAcct_server_id_set")); + mixin(bindCode("ContactAcct_server_id_get", "D_ContactAcct_server_id_get")); + mixin(bindCode("ContactAcct_asset_type_id_set", "D_ContactAcct_asset_type_id_set")); + mixin(bindCode("ContactAcct_asset_type_id_get", "D_ContactAcct_asset_type_id_get")); + mixin(bindCode("ContactAcct_acct_id_set", "D_ContactAcct_acct_id_set")); + mixin(bindCode("ContactAcct_acct_id_get", "D_ContactAcct_acct_id_get")); + mixin(bindCode("ContactAcct_nym_id_set", "D_ContactAcct_nym_id_set")); + mixin(bindCode("ContactAcct_nym_id_get", "D_ContactAcct_nym_id_get")); + mixin(bindCode("ContactAcct_memo_set", "D_ContactAcct_memo_set")); + mixin(bindCode("ContactAcct_memo_get", "D_ContactAcct_memo_get")); + mixin(bindCode("ContactAcct_public_key_set", "D_ContactAcct_public_key_set")); + mixin(bindCode("ContactAcct_public_key_get", "D_ContactAcct_public_key_get")); + mixin(bindCode("ContactAcct_ot_dynamic_cast", "D_ContactAcct_ot_dynamic_cast")); + mixin(bindCode("ContactAcct_Upcast", "D_ContactAcct_Upcast")); + mixin(bindCode("delete_Contact", "D_delete_Contact")); + mixin(bindCode("Contact_gui_label_set", "D_Contact_gui_label_set")); + mixin(bindCode("Contact_gui_label_get", "D_Contact_gui_label_get")); + mixin(bindCode("Contact_contact_id_set", "D_Contact_contact_id_set")); + mixin(bindCode("Contact_contact_id_get", "D_Contact_contact_id_get")); + mixin(bindCode("Contact_email_set", "D_Contact_email_set")); + mixin(bindCode("Contact_email_get", "D_Contact_email_get")); + mixin(bindCode("Contact_memo_set", "D_Contact_memo_set")); + mixin(bindCode("Contact_memo_get", "D_Contact_memo_get")); + mixin(bindCode("Contact_public_key_set", "D_Contact_public_key_set")); + mixin(bindCode("Contact_public_key_get", "D_Contact_public_key_get")); + mixin(bindCode("Contact_GetContactNymCount", "D_Contact_GetContactNymCount")); + mixin(bindCode("Contact_GetContactNym", "D_Contact_GetContactNym")); + mixin(bindCode("Contact_RemoveContactNym", "D_Contact_RemoveContactNym")); + mixin(bindCode("Contact_AddContactNym", "D_Contact_AddContactNym")); + mixin(bindCode("Contact_GetContactAcctCount", "D_Contact_GetContactAcctCount")); + mixin(bindCode("Contact_GetContactAcct", "D_Contact_GetContactAcct")); + mixin(bindCode("Contact_RemoveContactAcct", "D_Contact_RemoveContactAcct")); + mixin(bindCode("Contact_AddContactAcct", "D_Contact_AddContactAcct")); + mixin(bindCode("Contact_ot_dynamic_cast", "D_Contact_ot_dynamic_cast")); + mixin(bindCode("Contact_Upcast", "D_Contact_Upcast")); + mixin(bindCode("delete_AddressBook", "D_delete_AddressBook")); + mixin(bindCode("AddressBook_GetContactCount", "D_AddressBook_GetContactCount")); + mixin(bindCode("AddressBook_GetContact", "D_AddressBook_GetContact")); + mixin(bindCode("AddressBook_RemoveContact", "D_AddressBook_RemoveContact")); + mixin(bindCode("AddressBook_AddContact", "D_AddressBook_AddContact")); + mixin(bindCode("AddressBook_ot_dynamic_cast", "D_AddressBook_ot_dynamic_cast")); + mixin(bindCode("AddressBook_Upcast", "D_AddressBook_Upcast")); +} + +//#if !defined(SWIG_D_NO_EXCEPTION_HELPER) +extern(C) void function( + SwigExceptionCallback exceptionCallback, + SwigExceptionCallback illegalArgumentCallback, + SwigExceptionCallback illegalElementCallback, + SwigExceptionCallback ioCallback, + SwigExceptionCallback noSuchElementCallback) swigRegisterExceptionCallbacks; +//#endif // SWIG_D_NO_EXCEPTION_HELPER + +//#if !defined(SWIG_D_NO_STRING_HELPER) +extern(C) void function(SwigStringCallback callback) swigRegisterStringCallback; +//#endif // SWIG_D_NO_STRING_HELPER + + +mixin template SwigOperatorDefinitions() { + public override bool opEquals(Object o) { + if (auto rhs = cast(typeof(this))o) { + if (swigCPtr == rhs.swigCPtr) return true; + static if (is(typeof(swigOpEquals(rhs)))) { + return swigOpEquals(rhs); + } else { + return false; + } + } + return super.opEquals(o); + } + + + public override int opCmp(Object o) { + static if (__traits(compiles, swigOpLt(typeof(this).init) && + swigOpEquals(typeof(this).init))) { + if (auto rhs = cast(typeof(this))o) { + if (swigOpLt(rhs)) { + return -1; + } else if (swigOpEquals(rhs)) { + return 0; + } else { + return 1; + } + } + } + return super.opCmp(o); + } + + private template swigOpBinary(string operator, string name) { + enum swigOpBinary = `public void opOpAssign(string op, T)(T rhs) if (op == "` ~ operator ~ + `" && __traits(compiles, swigOp` ~ name ~ `Assign(rhs))) { swigOp` ~ name ~ `Assign(rhs);}` ~ + `public auto opBinary(string op, T)(T rhs) if (op == "` ~ operator ~ + `" && __traits(compiles, swigOp` ~ name ~ `(rhs))) { return swigOp` ~ name ~ `(rhs);}`; + } + mixin(swigOpBinary!("+", "Add")); + mixin(swigOpBinary!("-", "Sub")); + mixin(swigOpBinary!("*", "Mul")); + mixin(swigOpBinary!("/", "Div")); + mixin(swigOpBinary!("%", "Mod")); + mixin(swigOpBinary!("&", "And")); + mixin(swigOpBinary!("|", "Or")); + mixin(swigOpBinary!("^", "Xor")); + mixin(swigOpBinary!("<<", "Shl")); + mixin(swigOpBinary!(">>", "Shr")); + + private template swigOpUnary(string operator, string name) { + enum swigOpUnary = `public auto opUnary(string op)() if (op == "` ~ operator ~ + `" && __traits(compiles, swigOp` ~ name ~ `())) { return swigOp` ~ name ~ `();}`; + } + mixin(swigOpUnary!("+", "Pos")); + mixin(swigOpUnary!("-", "Neg")); + mixin(swigOpUnary!("~", "Com")); + mixin(swigOpUnary!("++", "Inc")); + mixin(swigOpUnary!("--", "Dec")); + + +} + + +private class SwigExceptionHelper { + static this() { + // The D1/Tango version maps C++ exceptions to multiple exception types. + swigRegisterExceptionCallbacks( + &setException, + &setException, + &setException, + &setException, + &setException + ); + } + + static void setException(char* message) { + auto exception = new object.Exception(std.conv.to!string(message).idup); + exception.next = SwigPendingException.retrieve(); + SwigPendingException.set(exception); + } +} + +package struct SwigPendingException { +public: + static this() { + m_sPendingCount = 0; + m_sPendingException = null; + } + + static bool isPending() { + bool pending = false; + if (m_sPendingCount > 0) { + if (m_sPendingException !is null) { + pending = true; + } + } + return pending; + } + + static void set(object.Exception e) { + if (m_sPendingException !is null) { + throw new object.Exception("FATAL: An earlier pending exception from C/C++ code " ~ + "was missed and thus not thrown (" ~ m_sPendingException.classinfo.name ~ + ": " ~ m_sPendingException.msg ~ ")!", e); + } + + m_sPendingException = e; + synchronized { + ++m_sPendingCount; + } + } + + static object.Exception retrieve() { + object.Exception e = null; + if (m_sPendingCount > 0) { + if (m_sPendingException !is null) { + e = m_sPendingException; + m_sPendingException = null; + synchronized { + --m_sPendingCount; + } + } + } + return e; + } + +private: + // The pending exception counter is stored thread-global. + static shared int m_sPendingCount; + + // The reference to the pending exception (if any) is stored thread-local. + static object.Exception m_sPendingException; +} +alias void function(const char* message) SwigExceptionCallback; + + +private class SwigStringHelper { + static this() { + swigRegisterStringCallback(&createString); + } + + static const(char)* createString(const(char*) cString) { + // We are effectively dup'ing the string here. + // TODO: Is this also correct for D2/Phobos? + return std.string.toStringz(std.conv.to!string(cString)); + } +} +alias const(char)* function(const(char*) cString) SwigStringCallback; + +alias extern(C) const(char)* function(void*) SwigDirector_OTCallback_Callback0; +alias extern(C) const(char)* function(void*) SwigDirector_OTCallback_Callback1; +extern(C) void* function() new_OTCallback; +extern(C) void function(void* jarg1) delete_OTCallback; +extern(C) const(char)* function(void* jarg1) OTCallback_runOne; +extern(C) const(char)* function(void* jarg1) OTCallback_runOneSwigExplicitOTCallback; +extern(C) const(char)* function(void* jarg1) OTCallback_runTwo; +extern(C) const(char)* function(void* jarg1) OTCallback_runTwoSwigExplicitOTCallback; +extern(C) void function(void* cObject, void* dObject, SwigDirector_OTCallback_Callback0 callback0, SwigDirector_OTCallback_Callback1 callback1) OTCallback_director_connect; +extern(C) void* function() new_OTCaller; +extern(C) void function(void* jarg1) delete_OTCaller; +extern(C) const(char)* function(void* jarg1) OTCaller_GetPassword; +extern(C) void function(void* jarg1) OTCaller_delCallback; +extern(C) void function(void* jarg1, void* jarg2) OTCaller_setCallback; +extern(C) uint function(void* jarg1) OTCaller_isCallbackSet; +extern(C) void function(void* jarg1) OTCaller_callOne; +extern(C) void function(void* jarg1) OTCaller_callTwo; +extern(C) uint function(void* jarg1) OT_API_Set_PasswordCallback; +extern(C) int function(const(char)* jarg1) OT_API_Init; +extern(C) int function(const(char)* jarg1) OT_API_LoadWallet; +extern(C) int function(const(char)* jarg1, const(char)* jarg2) OT_API_SwitchWallet; +extern(C) int function() OT_API_GetMemlogSize; +extern(C) const(char)* function(int jarg1) OT_API_GetMemlogAtIndex; +extern(C) const(char)* function() OT_API_PeekMemlogFront; +extern(C) const(char)* function() OT_API_PeekMemlogBack; +extern(C) int function() OT_API_PopMemlogFront; +extern(C) int function() OT_API_PopMemlogBack; +extern(C) const(char)* function() OT_API_CreateNym; +extern(C) int function(const(char)* jarg1) OT_API_AddServerContract; +extern(C) int function(const(char)* jarg1) OT_API_AddAssetContract; +extern(C) int function() OT_API_GetServerCount; +extern(C) int function() OT_API_GetAssetTypeCount; +extern(C) int function() OT_API_GetAccountCount; +extern(C) int function() OT_API_GetNymCount; +extern(C) const(char)* function(int jarg1) OT_API_GetServer_ID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetServer_Name; +extern(C) const(char)* function(int jarg1) OT_API_GetAssetType_ID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAssetType_Name; +extern(C) const(char)* function(int jarg1) OT_API_GetAccountWallet_ID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_Name; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_Balance; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_Type; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_AssetTypeID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_ServerID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetAccountWallet_NymID; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_VerifyAccountReceipt; +extern(C) int function(const(char)* jarg1, const(char)* jarg2) OT_API_GetNym_TransactionNumCount; +extern(C) const(char)* function(int jarg1) OT_API_GetNym_ID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetNym_Name; +extern(C) const(char)* function(const(char)* jarg1) OT_API_GetNym_Stats; +extern(C) int function(const(char)* jarg1, const(char)* jarg2) OT_API_IsNym_RegisteredAtServer; +extern(C) int function(const(char)* jarg1) OT_API_GetNym_MailCount; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_MailContentsByIndex; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_MailSenderIDByIndex; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_MailServerIDByIndex; +extern(C) int function(const(char)* jarg1, int jarg2) OT_API_Nym_RemoveMailByIndex; +extern(C) int function(const(char)* jarg1, int jarg2) OT_API_Nym_VerifyMailByIndex; +extern(C) int function(const(char)* jarg1) OT_API_GetNym_OutmailCount; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_OutmailContentsByIndex; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_OutmailRecipientIDByIndex; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_GetNym_OutmailServerIDByIndex; +extern(C) int function(const(char)* jarg1, int jarg2) OT_API_Nym_RemoveOutmailByIndex; +extern(C) int function(const(char)* jarg1, int jarg2) OT_API_Nym_VerifyOutmailByIndex; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_CanRemoveServer; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_RemoveServer; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_CanRemoveAssetType; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_RemoveAssetType; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_CanRemoveNym; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_RemoveNym; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_CanRemoveAccount; +extern(C) int function(const(char)* jarg1) OT_API_Wallet_RemoveAccount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) OT_API_Wallet_ImportNym; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_SetNym_Name; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_SetAccountWallet_Name; +extern(C) int function(const(char)* jarg1, const(char)* jarg2) OT_API_SetAssetType_Name; +extern(C) int function(const(char)* jarg1, const(char)* jarg2) OT_API_SetServer_Name; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) OT_API_VerifyAndRetrieveXMLContents; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7, const(char)* jarg8) OT_API_WriteCheque; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7, const(char)* jarg8, const(char)* jarg9, const(char)* jarg10, const(char)* jarg11, const(char)* jarg12, const(char)* jarg13, const(char)* jarg14, const(char)* jarg15) OT_API_WritePaymentPlan; +extern(C) const(char)* function(const(char)* jarg1) OT_API_LoadUserPubkey; +extern(C) const(char)* function(const(char)* jarg1) OT_API_LoadPubkey; +extern(C) int function(const(char)* jarg1) OT_API_VerifyUserPrivateKey; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_LoadPurse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) OT_API_LoadMint; +extern(C) const(char)* function(const(char)* jarg1) OT_API_LoadAssetContract; +extern(C) const(char)* function(const(char)* jarg1) OT_API_LoadServerContract; +extern(C) int function(const(char)* jarg1) OT_API_IsBasketCurrency; +extern(C) int function(const(char)* jarg1) OT_API_Basket_GetMemberCount; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_Basket_GetMemberType; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Basket_GetMinimumTransferAmount; +extern(C) const(char)* function(const(char)* jarg1, int jarg2) OT_API_Basket_GetMemberMinimumTransferAmount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_LoadAssetAccount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_LoadInbox; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_LoadOutbox; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Ledger_GetCount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Ledger_CreateResponse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, int jarg5) OT_API_Ledger_GetTransactionByIndex; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_Ledger_GetTransactionByID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, int jarg5) OT_API_Ledger_GetTransactionIDByIndex; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_Ledger_AddTransaction; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, int jarg6) OT_API_Transaction_CreateResponse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Ledger_FinalizeResponse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetType; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetVoucher; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetSuccess; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetDateSigned; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetAmount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Pending_GetNote; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetSenderUserID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetSenderAcctID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetRecipientUserID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetRecipientAcctID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Transaction_GetDisplayReferenceToNum; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_CreatePurse; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_SavePurse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Purse_GetTotalValue; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Purse_Count; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Purse_Peek; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Purse_Pop; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_Purse_Push; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Wallet_ImportPurse; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_exchangePurse; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_Token_ChangeOwner; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Token_GetID; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Token_GetDenomination; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Token_GetSeries; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Token_GetValidFrom; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_Token_GetValidTo; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Token_GetAssetID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Token_GetServerID; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_checkServerID; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_createUserAccount; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_checkUser; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_sendUserMessage; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_getRequest; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_getTransactionNumber; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_issueAssetType; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getContract; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getMint; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_createAssetAccount; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getAccount; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) OT_API_GenerateBasketCreation; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_AddBasketCreationItem; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_issueBasket; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, int jarg5) OT_API_GenerateBasketExchange; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_AddBasketExchangeItem; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, int jarg5) OT_API_exchangeBasket; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_notarizeWithdrawal; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_notarizeDeposit; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) OT_API_notarizeTransfer; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getInbox; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getOutbox; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_getNymbox; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) OT_API_LoadNymbox; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_processInbox; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_processNymbox; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) OT_API_withdrawVoucher; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_depositCheque; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_depositPaymentPlan; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7, const(char)* jarg8, const(char)* jarg9, const(char)* jarg10, int jarg11) OT_API_issueMarketOffer; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_getMarketList; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_getMarketOffers; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_getMarketRecentTrades; +extern(C) void function(const(char)* jarg1, const(char)* jarg2) OT_API_getNym_MarketOffers; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_cancelNymMarketOffer; +extern(C) void function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) OT_API_getOffer_Trades; +extern(C) const(char)* function() OT_API_PopMessageBuffer; +extern(C) void function() OT_API_FlushMessageBuffer; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Message_GetCommand; +extern(C) int function(const(char)* jarg1) OT_API_Message_GetSuccess; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) OT_API_Message_GetTransactionSuccess; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Message_GetLedger; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Message_GetNewAssetTypeID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Message_GetNewIssuerAcctID; +extern(C) const(char)* function(const(char)* jarg1) OT_API_Message_GetNewAcctID; +extern(C) int function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) OT_API_ConnectServer; +extern(C) int function() OT_API_ProcessSockets; +extern(C) void function(void* jarg1) delete_Storable; +extern(C) void* function(int jarg1, int jarg2) Storable_Create; +extern(C) void* function(void* jarg1) Storable_ot_dynamic_cast; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7) Storage_Init__SWIG_0; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) Storage_Init__SWIG_1; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_Init__SWIG_2; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_Init__SWIG_3; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_Init__SWIG_4; +extern(C) uint function(void* jarg1, const(char)* jarg2) Storage_Init__SWIG_5; +extern(C) uint function(void* jarg1) Storage_Init__SWIG_6; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_Exists__SWIG_0; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_Exists__SWIG_1; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_Exists__SWIG_2; +extern(C) uint function(void* jarg1, const(char)* jarg2) Storage_Exists__SWIG_3; +extern(C) void function(void* jarg1) delete_Storage; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) Storage_StoreString__SWIG_0; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_StoreString__SWIG_1; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_StoreString__SWIG_2; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_StoreString__SWIG_3; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_QueryString__SWIG_0; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_QueryString__SWIG_1; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_QueryString__SWIG_2; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2) Storage_QueryString__SWIG_3; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) Storage_StorePlainString__SWIG_0; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_StorePlainString__SWIG_1; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_StorePlainString__SWIG_2; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_StorePlainString__SWIG_3; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_QueryPlainString__SWIG_0; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_QueryPlainString__SWIG_1; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2, const(char)* jarg3) Storage_QueryPlainString__SWIG_2; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2) Storage_QueryPlainString__SWIG_3; +extern(C) uint function(void* jarg1, void* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) Storage_StoreObject__SWIG_0; +extern(C) uint function(void* jarg1, void* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_StoreObject__SWIG_1; +extern(C) uint function(void* jarg1, void* jarg2, const(char)* jarg3, const(char)* jarg4) Storage_StoreObject__SWIG_2; +extern(C) uint function(void* jarg1, void* jarg2, const(char)* jarg3) Storage_StoreObject__SWIG_3; +extern(C) void* function(void* jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) Storage_QueryObject__SWIG_0; +extern(C) void* function(void* jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) Storage_QueryObject__SWIG_1; +extern(C) void* function(void* jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4) Storage_QueryObject__SWIG_2; +extern(C) void* function(void* jarg1, int jarg2, const(char)* jarg3) Storage_QueryObject__SWIG_3; +extern(C) void* function(void* jarg1, int jarg2) Storage_CreateObject; +extern(C) void* function(int jarg1, int jarg2) Storage_Create; +extern(C) int function(void* jarg1) Storage_GetType; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7, const(char)* jarg8) InitDefaultStorage__SWIG_0; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6, const(char)* jarg7) InitDefaultStorage__SWIG_1; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5, const(char)* jarg6) InitDefaultStorage__SWIG_2; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) InitDefaultStorage__SWIG_3; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3, const(char)* jarg4) InitDefaultStorage__SWIG_4; +extern(C) uint function(int jarg1, int jarg2, const(char)* jarg3) InitDefaultStorage__SWIG_5; +extern(C) uint function(int jarg1, int jarg2) InitDefaultStorage__SWIG_6; +extern(C) void* function() GetDefaultStorage; +extern(C) void* function(int jarg1, int jarg2) CreateStorageContext__SWIG_0; +extern(C) void* function(int jarg1) CreateStorageContext__SWIG_1; +extern(C) void* function(int jarg1) CreateObject; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) Exists__SWIG_0; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) Exists__SWIG_1; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2) Exists__SWIG_2; +extern(C) uint function(const(char)* jarg1) Exists__SWIG_3; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) StoreString__SWIG_0; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) StoreString__SWIG_1; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) StoreString__SWIG_2; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2) StoreString__SWIG_3; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) QueryString__SWIG_0; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) QueryString__SWIG_1; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) QueryString__SWIG_2; +extern(C) const(char)* function(const(char)* jarg1) QueryString__SWIG_3; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) StorePlainString__SWIG_0; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) StorePlainString__SWIG_1; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) StorePlainString__SWIG_2; +extern(C) uint function(const(char)* jarg1, const(char)* jarg2) StorePlainString__SWIG_3; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) QueryPlainString__SWIG_0; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2, const(char)* jarg3) QueryPlainString__SWIG_1; +extern(C) const(char)* function(const(char)* jarg1, const(char)* jarg2) QueryPlainString__SWIG_2; +extern(C) const(char)* function(const(char)* jarg1) QueryPlainString__SWIG_3; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) StoreObject__SWIG_0; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) StoreObject__SWIG_1; +extern(C) uint function(void* jarg1, const(char)* jarg2, const(char)* jarg3) StoreObject__SWIG_2; +extern(C) uint function(void* jarg1, const(char)* jarg2) StoreObject__SWIG_3; +extern(C) void* function(int jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4, const(char)* jarg5) QueryObject__SWIG_0; +extern(C) void* function(int jarg1, const(char)* jarg2, const(char)* jarg3, const(char)* jarg4) QueryObject__SWIG_1; +extern(C) void* function(int jarg1, const(char)* jarg2, const(char)* jarg3) QueryObject__SWIG_2; +extern(C) void* function(int jarg1, const(char)* jarg2) QueryObject__SWIG_3; +extern(C) void function(void* jarg1) delete_OTDBString; +extern(C) void function(void* jarg1, const(char)* jarg2) OTDBString_m_string_set; +extern(C) const(char)* function(void* jarg1) OTDBString_m_string_get; +extern(C) void* function(void* jarg1) OTDBString_ot_dynamic_cast; +extern(C) void* function(void* objectRef) OTDBString_Upcast; +extern(C) void function(void* jarg1) delete_Blob; +extern(C) void function(void* jarg1, void* jarg2) Blob_m_memBuffer_set; +extern(C) void* function(void* jarg1) Blob_m_memBuffer_get; +extern(C) void* function(void* jarg1) Blob_ot_dynamic_cast; +extern(C) void* function(void* objectRef) Blob_Upcast; +extern(C) void function(void* jarg1) delete_StringMap; +extern(C) void function(void* jarg1, void* jarg2) StringMap_the_map_set; +extern(C) void* function(void* jarg1) StringMap_the_map_get; +extern(C) void function(void* jarg1, const(char)* jarg2, const(char)* jarg3) StringMap_SetValue; +extern(C) const(char)* function(void* jarg1, const(char)* jarg2) StringMap_GetValue; +extern(C) void* function(void* jarg1) StringMap_ot_dynamic_cast; +extern(C) void* function(void* objectRef) StringMap_Upcast; +extern(C) void function(void* jarg1) delete_Displayable; +extern(C) void function(void* jarg1, const(char)* jarg2) Displayable_gui_label_set; +extern(C) const(char)* function(void* jarg1) Displayable_gui_label_get; +extern(C) void* function(void* jarg1) Displayable_ot_dynamic_cast; +extern(C) void* function(void* objectRef) Displayable_Upcast; +extern(C) void function(void* jarg1) delete_MarketData; +extern(C) void function(void* jarg1, const(char)* jarg2) MarketData_gui_label_set; +extern(C) const(char)* function(void* jarg1) MarketData_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) MarketData_server_id_set; +extern(C) const(char)* function(void* jarg1) MarketData_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) MarketData_asset_type_id_set; +extern(C) const(char)* function(void* jarg1) MarketData_asset_type_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) MarketData_currency_type_id_set; +extern(C) const(char)* function(void* jarg1) MarketData_currency_type_id_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_scale_set; +extern(C) void* function(void* jarg1) MarketData_scale_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_total_assets_set; +extern(C) void* function(void* jarg1) MarketData_total_assets_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_number_bids_set; +extern(C) void* function(void* jarg1) MarketData_number_bids_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_number_asks_set; +extern(C) void* function(void* jarg1) MarketData_number_asks_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_last_sale_price_set; +extern(C) void* function(void* jarg1) MarketData_last_sale_price_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_current_bid_set; +extern(C) void* function(void* jarg1) MarketData_current_bid_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_current_ask_set; +extern(C) void* function(void* jarg1) MarketData_current_ask_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_volume_trades_set; +extern(C) void* function(void* jarg1) MarketData_volume_trades_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_volume_assets_set; +extern(C) void* function(void* jarg1) MarketData_volume_assets_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_volume_currency_set; +extern(C) void* function(void* jarg1) MarketData_volume_currency_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_recent_highest_bid_set; +extern(C) void* function(void* jarg1) MarketData_recent_highest_bid_get; +extern(C) void function(void* jarg1, void* jarg2) MarketData_recent_lowest_ask_set; +extern(C) void* function(void* jarg1) MarketData_recent_lowest_ask_get; +extern(C) void* function(void* jarg1) MarketData_ot_dynamic_cast; +extern(C) void* function(void* objectRef) MarketData_Upcast; +extern(C) void function(void* jarg1) delete_MarketList; +extern(C) size_t function(void* jarg1) MarketList_GetMarketDataCount; +extern(C) void* function(void* jarg1, size_t jarg2) MarketList_GetMarketData; +extern(C) uint function(void* jarg1, size_t jarg2) MarketList_RemoveMarketData; +extern(C) uint function(void* jarg1, void* jarg2) MarketList_AddMarketData; +extern(C) void* function(void* jarg1) MarketList_ot_dynamic_cast; +extern(C) void* function(void* objectRef) MarketList_Upcast; +extern(C) void function(void* jarg1) delete_OfferDataMarket; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataMarket_gui_label_set; +extern(C) const(char)* function(void* jarg1) OfferDataMarket_gui_label_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataMarket_transaction_id_set; +extern(C) void* function(void* jarg1) OfferDataMarket_transaction_id_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataMarket_price_per_scale_set; +extern(C) void* function(void* jarg1) OfferDataMarket_price_per_scale_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataMarket_available_assets_set; +extern(C) void* function(void* jarg1) OfferDataMarket_available_assets_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataMarket_minimum_increment_set; +extern(C) void* function(void* jarg1) OfferDataMarket_minimum_increment_get; +extern(C) void* function(void* jarg1) OfferDataMarket_ot_dynamic_cast; +extern(C) void* function(void* objectRef) OfferDataMarket_Upcast; +extern(C) void function(void* jarg1) delete_OfferListMarket; +extern(C) size_t function(void* jarg1) OfferListMarket_GetBidDataCount; +extern(C) void* function(void* jarg1, size_t jarg2) OfferListMarket_GetBidData; +extern(C) uint function(void* jarg1, size_t jarg2) OfferListMarket_RemoveBidData; +extern(C) uint function(void* jarg1, void* jarg2) OfferListMarket_AddBidData; +extern(C) size_t function(void* jarg1) OfferListMarket_GetAskDataCount; +extern(C) void* function(void* jarg1, size_t jarg2) OfferListMarket_GetAskData; +extern(C) uint function(void* jarg1, size_t jarg2) OfferListMarket_RemoveAskData; +extern(C) uint function(void* jarg1, void* jarg2) OfferListMarket_AddAskData; +extern(C) void* function(void* jarg1) OfferListMarket_ot_dynamic_cast; +extern(C) void* function(void* objectRef) OfferListMarket_Upcast; +extern(C) void function(void* jarg1) delete_TradeDataMarket; +extern(C) void function(void* jarg1, const(char)* jarg2) TradeDataMarket_gui_label_set; +extern(C) const(char)* function(void* jarg1) TradeDataMarket_gui_label_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataMarket_transaction_id_set; +extern(C) void* function(void* jarg1) TradeDataMarket_transaction_id_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataMarket_date_set; +extern(C) void* function(void* jarg1) TradeDataMarket_date_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataMarket_price_set; +extern(C) void* function(void* jarg1) TradeDataMarket_price_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataMarket_amount_sold_set; +extern(C) void* function(void* jarg1) TradeDataMarket_amount_sold_get; +extern(C) void* function(void* jarg1) TradeDataMarket_ot_dynamic_cast; +extern(C) void* function(void* objectRef) TradeDataMarket_Upcast; +extern(C) void function(void* jarg1) delete_TradeListMarket; +extern(C) size_t function(void* jarg1) TradeListMarket_GetTradeDataMarketCount; +extern(C) void* function(void* jarg1, size_t jarg2) TradeListMarket_GetTradeDataMarket; +extern(C) uint function(void* jarg1, size_t jarg2) TradeListMarket_RemoveTradeDataMarket; +extern(C) uint function(void* jarg1, void* jarg2) TradeListMarket_AddTradeDataMarket; +extern(C) void* function(void* jarg1) TradeListMarket_ot_dynamic_cast; +extern(C) void* function(void* objectRef) TradeListMarket_Upcast; +extern(C) void function(void* jarg1) delete_OfferDataNym; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataNym_gui_label_set; +extern(C) const(char)* function(void* jarg1) OfferDataNym_gui_label_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_valid_from_set; +extern(C) void* function(void* jarg1) OfferDataNym_valid_from_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_valid_to_set; +extern(C) void* function(void* jarg1) OfferDataNym_valid_to_get; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataNym_server_id_set; +extern(C) const(char)* function(void* jarg1) OfferDataNym_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataNym_asset_type_id_set; +extern(C) const(char)* function(void* jarg1) OfferDataNym_asset_type_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataNym_currency_type_id_set; +extern(C) const(char)* function(void* jarg1) OfferDataNym_currency_type_id_get; +extern(C) void function(void* jarg1, uint jarg2) OfferDataNym_selling_set; +extern(C) uint function(void* jarg1) OfferDataNym_selling_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_scale_set; +extern(C) void* function(void* jarg1) OfferDataNym_scale_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_price_per_scale_set; +extern(C) void* function(void* jarg1) OfferDataNym_price_per_scale_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_transaction_id_set; +extern(C) void* function(void* jarg1) OfferDataNym_transaction_id_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_total_assets_set; +extern(C) void* function(void* jarg1) OfferDataNym_total_assets_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_finished_so_far_set; +extern(C) void* function(void* jarg1) OfferDataNym_finished_so_far_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_minimum_increment_set; +extern(C) void* function(void* jarg1) OfferDataNym_minimum_increment_get; +extern(C) void function(void* jarg1, const(char)* jarg2) OfferDataNym_stop_sign_set; +extern(C) const(char)* function(void* jarg1) OfferDataNym_stop_sign_get; +extern(C) void function(void* jarg1, void* jarg2) OfferDataNym_stop_price_set; +extern(C) void* function(void* jarg1) OfferDataNym_stop_price_get; +extern(C) void* function(void* jarg1) OfferDataNym_ot_dynamic_cast; +extern(C) void* function(void* objectRef) OfferDataNym_Upcast; +extern(C) void function(void* jarg1) delete_OfferListNym; +extern(C) size_t function(void* jarg1) OfferListNym_GetOfferDataNymCount; +extern(C) void* function(void* jarg1, size_t jarg2) OfferListNym_GetOfferDataNym; +extern(C) uint function(void* jarg1, size_t jarg2) OfferListNym_RemoveOfferDataNym; +extern(C) uint function(void* jarg1, void* jarg2) OfferListNym_AddOfferDataNym; +extern(C) void* function(void* jarg1) OfferListNym_ot_dynamic_cast; +extern(C) void* function(void* objectRef) OfferListNym_Upcast; +extern(C) void function(void* jarg1) delete_TradeDataNym; +extern(C) void function(void* jarg1, const(char)* jarg2) TradeDataNym_gui_label_set; +extern(C) const(char)* function(void* jarg1) TradeDataNym_gui_label_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataNym_transaction_id_set; +extern(C) void* function(void* jarg1) TradeDataNym_transaction_id_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataNym_completed_count_set; +extern(C) void* function(void* jarg1) TradeDataNym_completed_count_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataNym_date_set; +extern(C) void* function(void* jarg1) TradeDataNym_date_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataNym_price_set; +extern(C) void* function(void* jarg1) TradeDataNym_price_get; +extern(C) void function(void* jarg1, void* jarg2) TradeDataNym_amount_sold_set; +extern(C) void* function(void* jarg1) TradeDataNym_amount_sold_get; +extern(C) void* function(void* jarg1) TradeDataNym_ot_dynamic_cast; +extern(C) void* function(void* objectRef) TradeDataNym_Upcast; +extern(C) void function(void* jarg1) delete_TradeListNym; +extern(C) size_t function(void* jarg1) TradeListNym_GetTradeDataNymCount; +extern(C) void* function(void* jarg1, size_t jarg2) TradeListNym_GetTradeDataNym; +extern(C) uint function(void* jarg1, size_t jarg2) TradeListNym_RemoveTradeDataNym; +extern(C) uint function(void* jarg1, void* jarg2) TradeListNym_AddTradeDataNym; +extern(C) void* function(void* jarg1) TradeListNym_ot_dynamic_cast; +extern(C) void* function(void* objectRef) TradeListNym_Upcast; +extern(C) void function(void* jarg1) delete_Acct; +extern(C) void function(void* jarg1, const(char)* jarg2) Acct_gui_label_set; +extern(C) const(char)* function(void* jarg1) Acct_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Acct_acct_id_set; +extern(C) const(char)* function(void* jarg1) Acct_acct_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Acct_server_id_set; +extern(C) const(char)* function(void* jarg1) Acct_server_id_get; +extern(C) void* function(void* jarg1) Acct_ot_dynamic_cast; +extern(C) void* function(void* objectRef) Acct_Upcast; +extern(C) void function(void* jarg1) delete_BitcoinAcct; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinAcct_gui_label_set; +extern(C) const(char)* function(void* jarg1) BitcoinAcct_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinAcct_acct_id_set; +extern(C) const(char)* function(void* jarg1) BitcoinAcct_acct_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinAcct_server_id_set; +extern(C) const(char)* function(void* jarg1) BitcoinAcct_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinAcct_bitcoin_acct_name_set; +extern(C) const(char)* function(void* jarg1) BitcoinAcct_bitcoin_acct_name_get; +extern(C) void* function(void* jarg1) BitcoinAcct_ot_dynamic_cast; +extern(C) void* function(void* objectRef) BitcoinAcct_Upcast; +extern(C) void function(void* jarg1) delete_ServerInfo; +extern(C) void function(void* jarg1, const(char)* jarg2) ServerInfo_gui_label_set; +extern(C) const(char)* function(void* jarg1) ServerInfo_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ServerInfo_server_id_set; +extern(C) const(char)* function(void* jarg1) ServerInfo_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ServerInfo_server_type_set; +extern(C) const(char)* function(void* jarg1) ServerInfo_server_type_get; +extern(C) void* function(void* jarg1) ServerInfo_ot_dynamic_cast; +extern(C) void* function(void* objectRef) ServerInfo_Upcast; +extern(C) void function(void* jarg1) delete_Server; +extern(C) void function(void* jarg1, const(char)* jarg2) Server_gui_label_set; +extern(C) const(char)* function(void* jarg1) Server_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Server_server_id_set; +extern(C) const(char)* function(void* jarg1) Server_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Server_server_type_set; +extern(C) const(char)* function(void* jarg1) Server_server_type_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Server_server_host_set; +extern(C) const(char)* function(void* jarg1) Server_server_host_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Server_server_port_set; +extern(C) const(char)* function(void* jarg1) Server_server_port_get; +extern(C) void* function(void* jarg1) Server_ot_dynamic_cast; +extern(C) void* function(void* objectRef) Server_Upcast; +extern(C) void function(void* jarg1) delete_BitcoinServer; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_gui_label_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_server_id_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_server_type_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_server_type_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_server_host_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_server_host_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_server_port_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_server_port_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_bitcoin_username_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_bitcoin_username_get; +extern(C) void function(void* jarg1, const(char)* jarg2) BitcoinServer_bitcoin_password_set; +extern(C) const(char)* function(void* jarg1) BitcoinServer_bitcoin_password_get; +extern(C) void* function(void* jarg1) BitcoinServer_ot_dynamic_cast; +extern(C) void* function(void* objectRef) BitcoinServer_Upcast; +extern(C) void function(void* jarg1) delete_ContactNym; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactNym_gui_label_set; +extern(C) const(char)* function(void* jarg1) ContactNym_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactNym_nym_type_set; +extern(C) const(char)* function(void* jarg1) ContactNym_nym_type_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactNym_nym_id_set; +extern(C) const(char)* function(void* jarg1) ContactNym_nym_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactNym_public_key_set; +extern(C) const(char)* function(void* jarg1) ContactNym_public_key_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactNym_memo_set; +extern(C) const(char)* function(void* jarg1) ContactNym_memo_get; +extern(C) size_t function(void* jarg1) ContactNym_GetServerInfoCount; +extern(C) void* function(void* jarg1, size_t jarg2) ContactNym_GetServerInfo; +extern(C) uint function(void* jarg1, size_t jarg2) ContactNym_RemoveServerInfo; +extern(C) uint function(void* jarg1, void* jarg2) ContactNym_AddServerInfo; +extern(C) void* function(void* jarg1) ContactNym_ot_dynamic_cast; +extern(C) void* function(void* objectRef) ContactNym_Upcast; +extern(C) void function(void* jarg1) delete_WalletData; +extern(C) size_t function(void* jarg1) WalletData_GetBitcoinServerCount; +extern(C) void* function(void* jarg1, size_t jarg2) WalletData_GetBitcoinServer; +extern(C) uint function(void* jarg1, size_t jarg2) WalletData_RemoveBitcoinServer; +extern(C) uint function(void* jarg1, void* jarg2) WalletData_AddBitcoinServer; +extern(C) size_t function(void* jarg1) WalletData_GetBitcoinAcctCount; +extern(C) void* function(void* jarg1, size_t jarg2) WalletData_GetBitcoinAcct; +extern(C) uint function(void* jarg1, size_t jarg2) WalletData_RemoveBitcoinAcct; +extern(C) uint function(void* jarg1, void* jarg2) WalletData_AddBitcoinAcct; +extern(C) void* function(void* jarg1) WalletData_ot_dynamic_cast; +extern(C) void* function(void* objectRef) WalletData_Upcast; +extern(C) void function(void* jarg1) delete_ContactAcct; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_gui_label_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_server_type_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_server_type_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_server_id_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_server_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_asset_type_id_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_asset_type_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_acct_id_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_acct_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_nym_id_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_nym_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_memo_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_memo_get; +extern(C) void function(void* jarg1, const(char)* jarg2) ContactAcct_public_key_set; +extern(C) const(char)* function(void* jarg1) ContactAcct_public_key_get; +extern(C) void* function(void* jarg1) ContactAcct_ot_dynamic_cast; +extern(C) void* function(void* objectRef) ContactAcct_Upcast; +extern(C) void function(void* jarg1) delete_Contact; +extern(C) void function(void* jarg1, const(char)* jarg2) Contact_gui_label_set; +extern(C) const(char)* function(void* jarg1) Contact_gui_label_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Contact_contact_id_set; +extern(C) const(char)* function(void* jarg1) Contact_contact_id_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Contact_email_set; +extern(C) const(char)* function(void* jarg1) Contact_email_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Contact_memo_set; +extern(C) const(char)* function(void* jarg1) Contact_memo_get; +extern(C) void function(void* jarg1, const(char)* jarg2) Contact_public_key_set; +extern(C) const(char)* function(void* jarg1) Contact_public_key_get; +extern(C) size_t function(void* jarg1) Contact_GetContactNymCount; +extern(C) void* function(void* jarg1, size_t jarg2) Contact_GetContactNym; +extern(C) uint function(void* jarg1, size_t jarg2) Contact_RemoveContactNym; +extern(C) uint function(void* jarg1, void* jarg2) Contact_AddContactNym; +extern(C) size_t function(void* jarg1) Contact_GetContactAcctCount; +extern(C) void* function(void* jarg1, size_t jarg2) Contact_GetContactAcct; +extern(C) uint function(void* jarg1, size_t jarg2) Contact_RemoveContactAcct; +extern(C) uint function(void* jarg1, void* jarg2) Contact_AddContactAcct; +extern(C) void* function(void* jarg1) Contact_ot_dynamic_cast; +extern(C) void* function(void* objectRef) Contact_Upcast; +extern(C) void function(void* jarg1) delete_AddressBook; +extern(C) size_t function(void* jarg1) AddressBook_GetContactCount; +extern(C) void* function(void* jarg1, size_t jarg2) AddressBook_GetContact; +extern(C) uint function(void* jarg1, size_t jarg2) AddressBook_RemoveContact; +extern(C) uint function(void* jarg1, void* jarg2) AddressBook_AddContact; +extern(C) void* function(void* jarg1) AddressBook_ot_dynamic_cast; +extern(C) void* function(void* objectRef) AddressBook_Upcast; diff --git a/testwallet/php_otapi.h b/testwallet/php_otapi.h new file mode 100644 index 000000000..df1d20a85 --- /dev/null +++ b/testwallet/php_otapi.h @@ -0,0 +1,562 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 2.0.4 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + +#ifndef PHP_OTAPI_H +#define PHP_OTAPI_H + +extern zend_module_entry otapi_module_entry; +#define phpext_otapi_ptr &otapi_module_entry + +#ifdef PHP_WIN32 +# define PHP_OTAPI_API __declspec(dllexport) +#else +# define PHP_OTAPI_API +#endif + +#ifdef ZTS +#include "TSRM.h" +#endif + +PHP_MINIT_FUNCTION(otapi); +PHP_MSHUTDOWN_FUNCTION(otapi); +PHP_RINIT_FUNCTION(otapi); +PHP_RSHUTDOWN_FUNCTION(otapi); +PHP_MINFO_FUNCTION(otapi); + +ZEND_NAMED_FUNCTION(_wrap_new_OTCallback); +ZEND_NAMED_FUNCTION(_wrap_OTCallback_runOne); +ZEND_NAMED_FUNCTION(_wrap_OTCallback_runTwo); +ZEND_NAMED_FUNCTION(_wrap_new_OTCaller); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_GetPassword); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_delCallback); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_setCallback); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_isCallbackSet); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_callOne); +ZEND_NAMED_FUNCTION(_wrap_OTCaller_callTwo); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Set_PasswordCallback); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Init); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadWallet); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SwitchWallet); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetMemlogSize); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetMemlogAtIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_PeekMemlogFront); +ZEND_NAMED_FUNCTION(_wrap_OT_API_PeekMemlogBack); +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMemlogFront); +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMemlogBack); +ZEND_NAMED_FUNCTION(_wrap_OT_API_CreateNym); +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddServerContract); +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddAssetContract); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServerCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetTypeCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNymCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServer_ID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetServer_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetType_ID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAssetType_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_ID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Balance); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_Type); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_AssetTypeID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_ServerID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetAccountWallet_NymID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyAccountReceipt); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_TransactionNumCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_ID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_Stats); +ZEND_NAMED_FUNCTION(_wrap_OT_API_IsNym_RegisteredAtServer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailContentsByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailSenderIDByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_MailServerIDByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_RemoveMailByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_VerifyMailByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailContentsByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailRecipientIDByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GetNym_OutmailServerIDByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_RemoveOutmailByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Nym_VerifyOutmailByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveServer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveServer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveAssetType); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveAssetType); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveNym); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_RemoveNym); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_CanRemoveAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_ImportNym); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetNym_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetAccountWallet_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetAssetType_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SetServer_Name); +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyAndRetrieveXMLContents); +ZEND_NAMED_FUNCTION(_wrap_OT_API_WriteCheque); +ZEND_NAMED_FUNCTION(_wrap_OT_API_ProposePaymentPlan); +ZEND_NAMED_FUNCTION(_wrap_OT_API_ConfirmPaymentPlan); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadUserPubkey); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadPubkey); +ZEND_NAMED_FUNCTION(_wrap_OT_API_VerifyUserPrivateKey); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadPurse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadMint); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadAssetContract); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadServerContract); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Mint_IsStillGood); +ZEND_NAMED_FUNCTION(_wrap_OT_API_IsBasketCurrency); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberType); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMinimumTransferAmount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Basket_GetMemberMinimumTransferAmount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadAssetAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadInbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadOutbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetCount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_CreateResponse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionByID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_GetTransactionIDByIndex); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_AddTransaction); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_CreateResponse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Ledger_FinalizeResponse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetType); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetVoucher); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSuccess); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetBalanceAgreementSuccess); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetDateSigned); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetAmount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Pending_GetNote); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSenderUserID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetSenderAcctID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetRecipientUserID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetRecipientAcctID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Transaction_GetDisplayReferenceToNum); +ZEND_NAMED_FUNCTION(_wrap_OT_API_CreatePurse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_SavePurse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_GetTotalValue); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Count); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Peek); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Pop); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Purse_Push); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Wallet_ImportPurse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_exchangePurse); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_ChangeOwner); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetDenomination); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetSeries); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetValidFrom); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetValidTo); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetAssetID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Token_GetServerID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_checkServerID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_createUserAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_deleteUserAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_deleteAssetAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_checkUser); +ZEND_NAMED_FUNCTION(_wrap_OT_API_sendUserMessage); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getRequest); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getTransactionNumber); +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueAssetType); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getContract); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMint); +ZEND_NAMED_FUNCTION(_wrap_OT_API_createAssetAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getAccount); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GenerateBasketCreation); +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddBasketCreationItem); +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueBasket); +ZEND_NAMED_FUNCTION(_wrap_OT_API_GenerateBasketExchange); +ZEND_NAMED_FUNCTION(_wrap_OT_API_AddBasketExchangeItem); +ZEND_NAMED_FUNCTION(_wrap_OT_API_exchangeBasket); +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeWithdrawal); +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeDeposit); +ZEND_NAMED_FUNCTION(_wrap_OT_API_notarizeTransfer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getInbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getOutbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getNymbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_LoadNymbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_processInbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_processNymbox); +ZEND_NAMED_FUNCTION(_wrap_OT_API_withdrawVoucher); +ZEND_NAMED_FUNCTION(_wrap_OT_API_depositCheque); +ZEND_NAMED_FUNCTION(_wrap_OT_API_depositPaymentPlan); +ZEND_NAMED_FUNCTION(_wrap_OT_API_issueMarketOffer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketList); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketOffers); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getMarketRecentTrades); +ZEND_NAMED_FUNCTION(_wrap_OT_API_getNym_MarketOffers); +ZEND_NAMED_FUNCTION(_wrap_OT_API_cancelMarketOffer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_cancelPaymentPlan); +ZEND_NAMED_FUNCTION(_wrap_OT_API_PopMessageBuffer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_FlushMessageBuffer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetCommand); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetSuccess); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetDepth); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetTransactionSuccess); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetBalanceAgreementSuccess); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetLedger); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewAssetTypeID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewIssuerAcctID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_Message_GetNewAcctID); +ZEND_NAMED_FUNCTION(_wrap_OT_API_ConnectServer); +ZEND_NAMED_FUNCTION(_wrap_OT_API_ProcessSockets); +ZEND_NAMED_FUNCTION(_wrap_Storable_Create); +ZEND_NAMED_FUNCTION(_wrap_Storable_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Storage_GetPacker); +ZEND_NAMED_FUNCTION(_wrap_Storage_Init); +ZEND_NAMED_FUNCTION(_wrap_Storage_Exists); +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreString); +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryString); +ZEND_NAMED_FUNCTION(_wrap_Storage_StorePlainString); +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryPlainString); +ZEND_NAMED_FUNCTION(_wrap_Storage_StoreObject); +ZEND_NAMED_FUNCTION(_wrap_Storage_QueryObject); +ZEND_NAMED_FUNCTION(_wrap_Storage_EraseValueByKey); +ZEND_NAMED_FUNCTION(_wrap_Storage_CreateObject); +ZEND_NAMED_FUNCTION(_wrap_Storage_Create); +ZEND_NAMED_FUNCTION(_wrap_Storage_GetType); +ZEND_NAMED_FUNCTION(_wrap_InitDefaultStorage); +ZEND_NAMED_FUNCTION(_wrap_GetDefaultStorage); +ZEND_NAMED_FUNCTION(_wrap_CreateStorageContext); +ZEND_NAMED_FUNCTION(_wrap_CreateObject); +ZEND_NAMED_FUNCTION(_wrap_Exists); +ZEND_NAMED_FUNCTION(_wrap_StoreString); +ZEND_NAMED_FUNCTION(_wrap_QueryString); +ZEND_NAMED_FUNCTION(_wrap_StorePlainString); +ZEND_NAMED_FUNCTION(_wrap_QueryPlainString); +ZEND_NAMED_FUNCTION(_wrap_StoreObject); +ZEND_NAMED_FUNCTION(_wrap_QueryObject); +ZEND_NAMED_FUNCTION(_wrap_EraseValueByKey); +ZEND_NAMED_FUNCTION(_wrap_OTDBString_m_string_set); +ZEND_NAMED_FUNCTION(_wrap_OTDBString_m_string_get); +ZEND_NAMED_FUNCTION(_wrap_OTDBString_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Blob_m_memBuffer_set); +ZEND_NAMED_FUNCTION(_wrap_Blob_m_memBuffer_get); +ZEND_NAMED_FUNCTION(_wrap_Blob_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_StringMap_the_map_set); +ZEND_NAMED_FUNCTION(_wrap_StringMap_the_map_get); +ZEND_NAMED_FUNCTION(_wrap_StringMap_SetValue); +ZEND_NAMED_FUNCTION(_wrap_StringMap_GetValue); +ZEND_NAMED_FUNCTION(_wrap_StringMap_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Displayable_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_Displayable_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_Displayable_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_MarketData_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_market_id_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_market_id_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_asset_type_id_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_asset_type_id_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_currency_type_id_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_currency_type_id_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_scale_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_scale_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_total_assets_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_total_assets_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_bids_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_bids_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_asks_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_number_asks_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_last_sale_price_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_last_sale_price_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_bid_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_bid_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_ask_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_current_ask_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_trades_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_trades_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_assets_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_assets_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_currency_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_volume_currency_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_highest_bid_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_highest_bid_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_lowest_ask_set); +ZEND_NAMED_FUNCTION(_wrap_MarketData_recent_lowest_ask_get); +ZEND_NAMED_FUNCTION(_wrap_MarketData_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_MarketList_GetMarketDataCount); +ZEND_NAMED_FUNCTION(_wrap_MarketList_GetMarketData); +ZEND_NAMED_FUNCTION(_wrap_MarketList_RemoveMarketData); +ZEND_NAMED_FUNCTION(_wrap_MarketList_AddMarketData); +ZEND_NAMED_FUNCTION(_wrap_MarketList_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_price_per_scale_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_price_per_scale_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_available_assets_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_available_assets_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_minimum_increment_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_minimum_increment_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataMarket_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_BidData_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_BidData_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_BidData_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_BidData_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_BidData_price_per_scale_set); +ZEND_NAMED_FUNCTION(_wrap_BidData_price_per_scale_get); +ZEND_NAMED_FUNCTION(_wrap_BidData_available_assets_set); +ZEND_NAMED_FUNCTION(_wrap_BidData_available_assets_get); +ZEND_NAMED_FUNCTION(_wrap_BidData_minimum_increment_set); +ZEND_NAMED_FUNCTION(_wrap_BidData_minimum_increment_get); +ZEND_NAMED_FUNCTION(_wrap_BidData_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_AskData_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_AskData_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_AskData_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_AskData_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_AskData_price_per_scale_set); +ZEND_NAMED_FUNCTION(_wrap_AskData_price_per_scale_get); +ZEND_NAMED_FUNCTION(_wrap_AskData_available_assets_set); +ZEND_NAMED_FUNCTION(_wrap_AskData_available_assets_get); +ZEND_NAMED_FUNCTION(_wrap_AskData_minimum_increment_set); +ZEND_NAMED_FUNCTION(_wrap_AskData_minimum_increment_get); +ZEND_NAMED_FUNCTION(_wrap_AskData_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetBidDataCount); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetBidData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_RemoveBidData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_AddBidData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetAskDataCount); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_GetAskData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_RemoveAskData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_AddAskData); +ZEND_NAMED_FUNCTION(_wrap_OfferListMarket_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_date_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_date_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_price_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_price_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_amount_sold_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_amount_sold_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataMarket_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_GetTradeDataMarketCount); +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_GetTradeDataMarket); +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_RemoveTradeDataMarket); +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_AddTradeDataMarket); +ZEND_NAMED_FUNCTION(_wrap_TradeListMarket_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_from_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_from_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_to_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_valid_to_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_type_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_type_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_acct_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_asset_acct_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_type_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_type_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_acct_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_currency_acct_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_selling_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_selling_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_scale_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_scale_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_price_per_scale_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_price_per_scale_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_total_assets_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_total_assets_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_finished_so_far_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_finished_so_far_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_minimum_increment_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_minimum_increment_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_sign_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_sign_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_price_set); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_stop_price_get); +ZEND_NAMED_FUNCTION(_wrap_OfferDataNym_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_GetOfferDataNymCount); +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_GetOfferDataNym); +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_RemoveOfferDataNym); +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_AddOfferDataNym); +ZEND_NAMED_FUNCTION(_wrap_OfferListNym_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_transaction_id_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_transaction_id_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_completed_count_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_completed_count_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_date_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_date_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_price_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_price_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_amount_sold_set); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_amount_sold_get); +ZEND_NAMED_FUNCTION(_wrap_TradeDataNym_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_GetTradeDataNymCount); +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_GetTradeDataNym); +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_RemoveTradeDataNym); +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_AddTradeDataNym); +ZEND_NAMED_FUNCTION(_wrap_TradeListNym_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Acct_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_Acct_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_Acct_acct_id_set); +ZEND_NAMED_FUNCTION(_wrap_Acct_acct_id_get); +ZEND_NAMED_FUNCTION(_wrap_Acct_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_Acct_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_Acct_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_acct_id_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_acct_id_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_bitcoin_acct_name_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_bitcoin_acct_name_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinAcct_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_ServerInfo_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Server_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_Server_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_Server_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_Server_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_Server_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_Server_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_Server_server_host_set); +ZEND_NAMED_FUNCTION(_wrap_Server_server_host_get); +ZEND_NAMED_FUNCTION(_wrap_Server_server_port_set); +ZEND_NAMED_FUNCTION(_wrap_Server_server_port_get); +ZEND_NAMED_FUNCTION(_wrap_Server_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_host_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_host_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_port_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_server_port_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_username_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_username_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_password_set); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_bitcoin_password_get); +ZEND_NAMED_FUNCTION(_wrap_BitcoinServer_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_host_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_host_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_port_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_server_port_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_username_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_username_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_password_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ripple_password_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_namefield_id_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_namefield_id_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_passfield_id_set); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_passfield_id_get); +ZEND_NAMED_FUNCTION(_wrap_RippleServer_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_host_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_host_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_port_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_server_port_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_loom_username_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_loom_username_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_namefield_id_set); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_namefield_id_get); +ZEND_NAMED_FUNCTION(_wrap_LoomServer_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_type_set); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_type_get); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_id_set); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_nym_id_get); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_public_key_set); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_public_key_get); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_memo_set); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_memo_get); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_GetServerInfoCount); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_GetServerInfo); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_RemoveServerInfo); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_AddServerInfo); +ZEND_NAMED_FUNCTION(_wrap_ContactNym_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinServerCount); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveBitcoinServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddBitcoinServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinAcctCount); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetBitcoinAcct); +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveBitcoinAcct); +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddBitcoinAcct); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetRippleServerCount); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetRippleServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveRippleServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddRippleServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetLoomServerCount); +ZEND_NAMED_FUNCTION(_wrap_WalletData_GetLoomServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_RemoveLoomServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_AddLoomServer); +ZEND_NAMED_FUNCTION(_wrap_WalletData_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_type_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_type_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_id_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_server_id_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_asset_type_id_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_asset_type_id_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_acct_id_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_acct_id_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_nym_id_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_nym_id_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_memo_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_memo_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_public_key_set); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_public_key_get); +ZEND_NAMED_FUNCTION(_wrap_ContactAcct_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_Contact_gui_label_set); +ZEND_NAMED_FUNCTION(_wrap_Contact_gui_label_get); +ZEND_NAMED_FUNCTION(_wrap_Contact_contact_id_set); +ZEND_NAMED_FUNCTION(_wrap_Contact_contact_id_get); +ZEND_NAMED_FUNCTION(_wrap_Contact_email_set); +ZEND_NAMED_FUNCTION(_wrap_Contact_email_get); +ZEND_NAMED_FUNCTION(_wrap_Contact_memo_set); +ZEND_NAMED_FUNCTION(_wrap_Contact_memo_get); +ZEND_NAMED_FUNCTION(_wrap_Contact_public_key_set); +ZEND_NAMED_FUNCTION(_wrap_Contact_public_key_get); +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactNymCount); +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactNym); +ZEND_NAMED_FUNCTION(_wrap_Contact_RemoveContactNym); +ZEND_NAMED_FUNCTION(_wrap_Contact_AddContactNym); +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactAcctCount); +ZEND_NAMED_FUNCTION(_wrap_Contact_GetContactAcct); +ZEND_NAMED_FUNCTION(_wrap_Contact_RemoveContactAcct); +ZEND_NAMED_FUNCTION(_wrap_Contact_AddContactAcct); +ZEND_NAMED_FUNCTION(_wrap_Contact_ot_dynamic_cast); +ZEND_NAMED_FUNCTION(_wrap_AddressBook_GetContactCount); +ZEND_NAMED_FUNCTION(_wrap_AddressBook_GetContact); +ZEND_NAMED_FUNCTION(_wrap_AddressBook_RemoveContact); +ZEND_NAMED_FUNCTION(_wrap_AddressBook_AddContact); +ZEND_NAMED_FUNCTION(_wrap_AddressBook_ot_dynamic_cast); +#endif /* PHP_OTAPI_H */ diff --git a/testwallet/runme.java b/testwallet/runme.java new file mode 100644 index 000000000..2802c3e3d --- /dev/null +++ b/testwallet/runme.java @@ -0,0 +1,87 @@ +//package com.wrapper.core; + +// runme.java + +//import otapi; +//import com.wrapper.core.jni.otapi; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.logging.Level; +import java.util.logging.Logger; + + +public class runme { + +/* + * + * Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\~\Open-Transactions\testwallet\JNI_API_Windows.dll: Can't find dependent libraries + at java.lang.ClassLoader$NativeLibrary.load(Native Method) + at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803) + at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728) + at java.lang.Runtime.loadLibrary0(Runtime.java:823) + at java.lang.System.loadLibrary(System.java:1028) + at com.wrapper.core.runme.main(runme.java:26) +Java Result: 1 + */ + + public static WalletData getWalletData() { + + WalletData walletData = null; + + if (otapi.Exists("moneychanger", "gui_wallet.dat")) { + walletData = WalletData.ot_dynamic_cast(otapi.QueryObject(StoredObjectType.STORED_OBJ_WALLET_DATA, "moneychanger", "gui_wallet.dat")); + } else { + walletData = WalletData.ot_dynamic_cast(otapi.CreateObject(StoredObjectType.STORED_OBJ_WALLET_DATA)); + } + + return walletData; + } + + public static void main(String argv[]) throws IOException { + +// String message ="Subject:The subject ends here\nMessage start"; + + + // if(message.startsWith("Subject") || message.startsWith("subject")) +// System.out.println(message.substring(0, message.indexOf("\n"))); + +// addDirToRuntime("C:\\~\\OpenSSl-Win32"); +// addDirToRuntime("C:\\~\\Open-Transactions\\testwallet"); + System.loadLibrary("otapi"); + + otapi.OT_API_Init("/Users/Chris/Projects/Open-Transactions/testwallet/data_folder"); + + otapi.OT_API_LoadWallet("wallet.xml"); + + WalletData theWalletData = getWalletData(); + + + + +// System.out.println(otapi.fact(4)); + } + public static void addDirToRuntime(String s) throws IOException { + try { + + Field field = ClassLoader.class.getDeclaredField("usr_paths"); + field.setAccessible(true); + String[] paths = (String[])field.get(null); + for (int i = 0; i < paths.length; i++) { + if (s.equals(paths[i])) { + return; + } + } + String[] tmp = new String[paths.length+1]; + System.arraycopy(paths,0,tmp,0,paths.length); + tmp[paths.length] = s; + field.set(null,tmp); + System.setProperty("java.library.path", s + File.pathSeparator + System.getProperty("java.library.path") ); + } catch (IllegalAccessException e) { + throw new IOException("Failed to get permissions to set library path"); + } catch (NoSuchFieldException e) { + throw new IOException("Failed to get field handle to set library path"); + } + } + +} diff --git a/testwallet/silver.xml b/testwallet/silver.xml new file mode 100644 index 000000000..b3ab3652d --- /dev/null +++ b/testwallet/silver.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + DIGITAL SILVER GRAMS are payable to bearer in physical silver grams, + at any exchange provider supporting our contract in any denomination + they support, or through one of our direct agents in 1000 oz bars. + + + + Silver Grams are audited monthly by highly trusted people. + + + + In order to obtain Silver Grams, you must + purchase them from an exchange provider or receive them in trade. + The issuer only accepts direct bail-in of physical silver from an + authorized exchange provider. + + + + In order to redeem Silver Grams, you must use an exchange provider. + If none are available you must make sure you trust this issuer + and make sure this contract is enforceable in your jurisdiction, + and make sure you are trading in a BASKET currency so that you + are not entirely reliant on a single issuer. + Silver Grams are redeemable to exchange providers in 1 oz coins. + + + + Issuance and redemption will be performed at no charge. + + + + The Issuer reserves the right to buy back all outstanding + currency, thereby terminating the use of this instrument. + + + + Silver and its maker, God, are solely liable to perform according to + the conditions specified in this contract. + + + + Float - the total quantity of Silver is created by God. + The quantity of silver that enters the market yearly is strictly + regulated by His wisdom. + + Any server operator using this contract will not issue any more + silver digital currency than he actually has in physical silver. + + + + The purchase, redemption and trading of digital assets normally + are done on the basis of strong privacy. + + + + + +- -----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAO14L19TJgzcMA0GCSqGSIb3DQEBBQUAMFcxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHRmFpcmZheDERMA8G +A1UEChMIWm9yay5vcmcxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTAwOTI5MDUyMzAx +WhcNMjAwOTI2MDUyMzAxWjBeMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2lu +aWExEDAOBgNVBAcTB0ZhaXJmYXgxETAPBgNVBAoTCFpvcmsub3JnMRcwFQYDVQQD +Ew5zaGVsbC56b3JrLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3vD9 +fO4ov4854L8wXrgfv2tltDz0ieVrTNSLuy1xuQyb//+MwZ0EYwu8jMMQrqbUaYG6 +y8zJu32yBKrBNPPwJ+fJE+tfgVg860dGVbwMd4KhpkKtppJXmZaGqLqvELaXa4Uw +9N3qg/faj0NMEDIBhv/tD/B5U65vH+U0JlRJ07kCAwEAAaMzMDEwCQYDVR0TBAIw +ADAkBgNVHREEHTAbgg5zaGVsbC56b3JrLm9yZ4IJbG9jYWxob3N0MA0GCSqGSIb3 +DQEBBQUAA4GBALLXPa/naWsiXsw0JwlSiG7aOmvMF2romUkcr6uObhN7sghd38M0 +l2kKTiptnA8txrri8RhqmQgOgiyKFCKBkxY7/XGot62cE8Y1+lqGXlhu2UHm6NjA +pRKvng75J2HTjmmsbCHy+nexn4t44wssfPYlGPD8sGwmO24u9tRfdzJE +- -----END CERTIFICATE----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDn6yYURBADM3qphMoDpvpp3Lk2KW0bpA+i1ne6Hwm24lW9w1dIJrw8CEc+S +vAEhoGOAJNTO209NFYxcM+sA8XHp5aJpFHSbI536sfzbSVe3/MwdJ8JZXtbzcbHv +ToBs1wScGTet2SGL6I9S3p7XUfprCYezBPRMCPOTxqR8pptotYOGXZoPZQCg/y0q +CZjPJclqDY8Hf0X+DWnOMAkEAI4GnOpSq838/oElDAuZcLOvpTqTZ922pG1EJQmj +Vh4P6br3ocrWnJSonkqFPLjihsVwGumO/hkyptrgqRV/vR9BmK1LKz901VaXbXPZ +Lcns+XAg5sXxZcz87Dl4AduTF59ahHkc2bR7HqrvzRkXoQ/Q4ViLOifFISXXPKx8 +3OazA/9Ip4W+gr8e/oub7MQFJZcyOfcN1KDFIjnObVIabpIlKPcTeEHGvd/WUHOJ +PQQr1+WGZY1W9UjLo171ssL2/x2bXaqJ4Ukgf4aQpRb5lUqekCKgine6eUA1XjTw +J+a/J3xP54/iEuqdDZYGuX5j0/EJCqbY7gggPNkDNH82XdfQ+7QzUmFjaGVsIFdp +bGxtZXIgW2NlcnRpZmljYXRpb25dIDxyYWNoZWxAd2lsbG1lci5vcmc+iE4EEBEC +AA4FAjn6yYUECwMCAQIZAQAKCRC30ABpXpgYMFTFAJ0WqZwUXbD0H7YCGR7rI8jB +Rh8E2wCePBrQBC1+shZrXCY0proYCkYfWdA= +=UObU +- -----END PGP PUBLIC KEY BLOCK----- + + + +- -----BEGIN PGP PUBLIC KEY BLOCK----- +Version: PGP Desktop 10.0.1 - not licensed for commercial use: www.pgp.com + +mQGiBDmhGRERBAC9F7VF7ZNcwhffdFS2Sg0AcsF9gdhEEggZmBT1ezM5BYEO4lvN +EJjezFilNxMLE3mP9E95mtRUEEtIx4ViyAGjVPwRBVQA2BNf+rbvCReBhhlJTFkN +GOSHd65k4mDCflJAn7EX2OpST9tEAhpBs82w4OxlHIxmnav8iyD0O07sHwCgzYJI +Xv3TEqERh0eDPEQ80MqGYEkD/Aj12tRhZYhYlVtEmJ4MrET9Ezuyhn8kQv89iBNK +u2mN//LK4cqfJos1SJ3qXT16AHQQvfI0AUsI1ZQ+piq9pZ+sUMwpRnoQHM5SKux5 +UYcIM9aklW0zYAt+WjyrQBhN0eW0uzF40NVZHIH592dz/1RbNKf0hSDKBeCERTxk +/zRDA/9rgvwyclIq4VTgA9AgwHC+JrKwbtJsawb4eYZPSbDe/pl2bQT9haTuLBKs +Olz57Er5Vto6DWb1hs8gzb107u7CGYholr/tyjiPRhDvOcVQpZudkCE/1UXpawT/ +P4tPUvrBIVNK5SmHVRz6nsJxMxYm6Pr14+t8mgS1jrr/TxFTW7Q+U3lzdGVtaWNz +IE9wZW5QR1AgU09YIFtvcGVyYXRvcl0gKGRzczEpIDxzZXJ2ZXJAc3lzdGVtaWNz +LmNvbT6IVgQTEQIAFgUCOaEZEQQLCgQDAxUDAgMWAgECF4AACgkQKfOLUygtdArw +3QCeJ8bEfVFS2etPkFus6esJfZ0+2OUAoK4AIIjFB+9CsoEkCn4dJBRTUKen +=L806 +- -----END PGP PUBLIC KEY BLOCK----- + + + diff --git a/testwallet/test.php b/testwallet/test.php new file mode 100755 index 000000000..c53d4d56d --- /dev/null +++ b/testwallet/test.php @@ -0,0 +1,11 @@ + " . var_dump($ot_init); +echo "OT_SwitchWallet => " . var_dump($switch_wallet); + +?> diff --git a/testwallet/testclient.cpp b/testwallet/testclient.cpp new file mode 100644 index 000000000..87e479bce --- /dev/null +++ b/testwallet/testclient.cpp @@ -0,0 +1,1002 @@ +/************************************************************************************ + * + * testclient.cpp (the actual command line test client that encapsulates OTClient) + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 + =VjLJ + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include +#include + + +extern "C" +{ +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +#include "SSL-Example/SFSocket.h" +} + + +#ifdef _WIN32 +void OT_Sleep(int nMS); +#endif + +#include "OTIdentifier.h" +#include "OTString.h" +#include "OTClient.h" +#include "OTServerConnection.h" +#include "OTMessage.h" +#include "OTString.h" +#include "OTWallet.h" +#include "OTPseudonym.h" +#include "OTEnvelope.h" +#include "OTCheque.h" +#include "OTAgreement.h" +#include "OpenTransactions.h" +#include "OTPaymentPlan.h" +#include "OTLog.h" + + + +// This global variable contains an OTWallet, an OTClient, etc. +// It's the C++ high-level interace to OT. +// Any client software will have an instance of this. +OT_API g_OT_API; +// Note: Must call OT_API::Init() followed by g_OT_API.Init() in the main function, before using OT. + + +extern OTPseudonym *g_pTemporaryNym; + + +// TODO REALLY NEED to move this crap to a config file... +// ALso, FYI, the below paths may not work unless you put a fully-qualified path (which I haven't.) +#define KEY_PASSWORD "test" // RIGHT NOW THE PASSWORD FOR CONNECTING TO THE SERVER IS HARDCODED HERE. TODO: config file, password prompt. + +#ifdef _WIN32 + +#define SERVER_PATH_DEFAULT "C:\\~\\Open-Transactions\\testwallet\\data_folder" +#define CA_FILE "certs\\special\\ca.crt" +#define KEY_FILE "certs\\special\\client.pem" + +#else + +#define SERVER_PATH_DEFAULT "./data_folder" +//#define SERVER_PATH_DEFAULT "/home/ben/git-work/Open-Transactions/testwallet/data_folder" +#define CA_FILE "certs/special/ca.crt" +#define KEY_FILE "certs/special/client.pem" + +#endif + +// NOTE: this SSL connection is entirely different from the user's cert/pubkey that he uses for his UserID while +// talking to the server. I may be using the same key for that, but this code here is not about my wallet talking +// to its mint. Rather, it's about an SSL client app talking to an SSL server, at a lower layer, before my app's +// intelligence takes over. Just like when you use SSH to connect somewhere on a terminal. There is some immediate +// key negotiation going on. Once connected, you might run software that asks you for a public key, which could be +// AN ENTIRELY DIFFERENT PUBLIC KEY. THAT is where, metaphorically, your Public Key / User ID comes into play. + + + + + + +int main (int argc, char **argv) +{ + OTLog::vOutput(0, "\n\nWelcome to Open Transactions... Test Client -- version %s\n" + "(transport build: OTMessage -> TCP -> SSL)\n" + "IF YOU PREFER TO USE ZMQ (message based), then rebuild from main folder like this:\n" + "cd ..; make clean; make\n\n", + OTLog::Version()); + + OT_API::InitOTAPI(); + + // ----------------------------------------------------------------------- + // The beginnings of an INI file!! + + OTString strPath; + + { + CSimpleIniA ini; // We're assuming this file is on the path. + SI_Error rc = ini.LoadFile("./.ot_ini"); // todo: stop hardcoding. + + if (rc >=0) + { + const char * pVal = ini.GetValue("paths", "client_path", SERVER_PATH_DEFAULT); // todo stop hardcoding. + + if (NULL != pVal) + strPath.Set(pVal); + else + strPath.Set(SERVER_PATH_DEFAULT); + } + else + { + strPath.Set(SERVER_PATH_DEFAULT); + } + } + // ----------------------------------------------------------------------- + + OTString strCAFile, strKeyFile, strSSLPassword; + + if (argc < 2) + { + OTLog::vOutput(0, "\n==> USAGE: %s \n\n" +#if defined (FELLOW_TRAVELER) + "(Password defaults to '%s' if left blank.)\n" + "(Folder defaults to '%s' if left blank.)\n" +#else + "(The test password is always 'test'.\n'cd data_folder' then 'pwd' to see the absolute path.)\n" +#endif + "\n\n", argv[0] +#if defined (FELLOW_TRAVELER) + , KEY_PASSWORD, + strPath.Get() +#endif + ); + +#if defined (FELLOW_TRAVELER) + strSSLPassword.Set(KEY_PASSWORD); + + OTString strClientPath(strPath.Get()); + g_OT_API.Init(strClientPath); // SSL gets initialized in here, before any keys are loaded. +#else + exit(1); +#endif + } + else if (argc < 3) + { + OTLog::vOutput(0, "\n==> USAGE: %s \n\n" +#if defined (FELLOW_TRAVELER) + "(Folder defaults to '%s' if left blank.)\n" +#endif + "\n\n", argv[0] +#if defined (FELLOW_TRAVELER) + , strPath.Get() +#endif + ); + +#if defined (FELLOW_TRAVELER) + strSSLPassword.Set(argv[1]); + + OTString strClientPath(strPath.Get()); + g_OT_API.Init(strClientPath); // SSL gets initialized in here, before any keys are loaded. +#else + exit(1); +#endif + } + else + { + strSSLPassword.Set(argv[1]); + + OTString strClientPath(argv[2]); + g_OT_API.Init(strClientPath); // SSL gets initialized in here, before any keys are loaded. + } + + OTLog::vOutput::(0, "Using as path to data folder: %s\n", OTLog::Path()); + + strCAFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), CA_FILE); + strKeyFile.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), KEY_FILE); + + + // ------------------------------------------------------------------------------ + + // + // Basically, loop: + // + // 1) Present a prompt, and get a user string of input. Wait for that. + // + // 2) Process it out as an OTMessage to the server. It goes down the pipe. + // + // 3) Sleep for 1 second. + // + // 4) Awake and check for messages to be read in response from the server. + // Loop. As long as there are any responses there, then process and handle + // them all. + // Then continue back up to the prompt at step (1). + + char buf[200] = ""; + int retVal = 0; + + int nExpectResponse = 0; + + OTLog::Output(0, "You may wish to 'load' then 'connect' then 'stat'.\n"); + OTLog::vOutput(4, "Starting client loop. u_header size in C code is %d.\n", OT_CMD_HEADER_SIZE); + + + for(;;) + { + buf[0] = 0; // Making it fresh again. + + nExpectResponse = 0; + + // 1) Present a prompt, and get a user string of input. Wait for that. + OTLog::Output(0, "\nWallet> "); + + if (NULL == fgets(buf, sizeof(buf)-10, stdin)) // Leaving myself 10 extra bytes at the end for safety's sake. + break; + + OTLog::Output(0, ".\n..\n...\n....\n.....\n......\n.......\n........\n.........\n..........\n" + "...........\n............\n.............\n"); + + // so we can process the user input + std::string strLine = buf; + + // 1.5 The one command that doesn't involve a message to the server (so far) + // is the command to load the wallet from disk (which we do before we can + // do anything else.) That and maybe the message to CONNECT to the server. + // Load wallet.xml + if (strLine.compare(0,4,"load") == 0) + { + OTLog::Output(0, "User has instructed to load wallet.xml...\n"); + g_OT_API.GetWallet()->LoadWallet("wallet.xml"); + +// g_OT_API.GetWallet()->SaveWallet("NEWwallet.xml"); // todo remove this test code. + + continue; + } + + else if (strLine.compare(0,5,"clear") == 0) + { + if (NULL == g_pTemporaryNym) + { + OTLog::Output(0, "No Nym yet available. Try 'load'.\n"); + continue; + } + + g_pTemporaryNym->RemoveAllNumbers(); + + g_pTemporaryNym->SaveSignedNymfile(*g_pTemporaryNym); + + OTLog::Output(0, "Successfully removed all issued and transaction numbers. Saving nym...\n"); + + continue; + } + + else if (strLine.compare(0,7,"payment") == 0) + { + if (NULL == g_pTemporaryNym) + { + OTLog::Output(0, "No Nym yet available to sign the payment plan with. Try 'load'.\n"); + continue; + } + + OTLog::Output(0, "Enter your Asset Account ID that the payments will come from: "); + OTString strTemp; + strTemp.OTfgets(std::cin); + + const OTIdentifier ACCOUNT_ID(strTemp), USER_ID(*g_pTemporaryNym); + OTAccount * pAccount = g_OT_API.GetWallet()->GetAccount(ACCOUNT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "That account isn't loaded right now. Try 'load'.\n"); + continue; + } + + // To write a payment plan, like a cheque, we need to burn one of our transaction numbers. (Presumably + // the wallet is also storing a couple of these, since they are needed to perform any transaction.) + // + // I don't have to contact the server to write a payment plan -- as long as I already have a transaction + // number I can use to write it. Otherwise I'd have to ask the server to send me one first. + OTString strServerID(pAccount->GetRealServerID()); + long lTransactionNumber=0; + + if (false == g_pTemporaryNym->GetNextTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber)) + { + OTLog::Output(0, "Payment Plans are written offline, but you still need a transaction number\n" + "(and you have none, currently.) Try using 'n' to request another transaction number.\n"); + continue; + } + + // ----------------------------------------------------------------------- + + OTString str_RECIPIENT_USER_ID, str_RECIPIENT_ACCT_ID, strConsideration; + + // Get the Recipient Nym ID + OTLog::Output(0, "Enter the Recipient's User ID (NymID): "); + str_RECIPIENT_USER_ID.OTfgets(std::cin); + + + // THEN GET AN ACCOUNT ID in that same asset type + OTLog::Output(0, "Enter the Recipient's ACCOUNT ID (of the same asset type as your account): "); + str_RECIPIENT_ACCT_ID.OTfgets(std::cin); + + OTLog::Output(0, "Enter a memo describing consideration for the payment plan: "); + strConsideration.OTfgets(std::cin); + + const OTIdentifier RECIPIENT_USER_ID(str_RECIPIENT_USER_ID), + RECIPIENT_ACCT_ID(str_RECIPIENT_ACCT_ID); + + + OTPaymentPlan thePlan(pAccount->GetRealServerID(), pAccount->GetAssetTypeID(), + pAccount->GetRealAccountID(), pAccount->GetUserID(), + RECIPIENT_ACCT_ID, RECIPIENT_USER_ID); + + // ----------------------------------------------------------------------- + + // Valid date range (in seconds) + OTLog::Output(0, + " 6 minutes == 360 Seconds\n" + "10 minutes == 600 Seconds\n" + "1 hour == 3600 Seconds\n" + "1 day == 86400 Seconds\n" + "30 days == 2592000 Seconds\n" + "3 months == 7776000 Seconds\n" + "6 months == 15552000 Seconds\n\n" + ); + + long lExpirationInSeconds = 86400; + OTLog::vOutput(0, "How many seconds before payment plan expires? (defaults to 1 day: %ld): ", lExpirationInSeconds); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + lExpirationInSeconds = atol(strTemp.Get()); + + + // ----------------------------------------------------------------------- + + time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + + OTLog::vOutput(0, "Payment plan becomes valid for processing STARTING date\n" + "(defaults to now, in seconds) [%ld]: ", VALID_FROM); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 2) + VALID_FROM = atol(strTemp.Get()); + + const time_t VALID_TO = VALID_FROM + lExpirationInSeconds; // now + 86400 + + // ----------------------------------------------------------------------- + + bool bSuccessSetAgreement = thePlan.SetAgreement(lTransactionNumber, strConsideration, VALID_FROM, VALID_TO); + + if (!bSuccessSetAgreement) + { + OTLog::Output(0, "Failed trying to set the agreement!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + g_pTemporaryNym->AddTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber, true); // bSave=true + + continue; + } + + bool bSuccessSetInitialPayment = true; // the default, in case user chooses not to even have this payment. + bool bSuccessSetPaymentPlan = true; // the default, in case user chooses not to have a payment plan + // ----------------------------------------------------------------------- + + OTLog::Output(0, "What is the Initial Payment Amount, if any? [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + long lInitialPayment = atol(strTemp.Get()); + + if (lInitialPayment > 0) + { + time_t PAYMENT_DELAY = 60; // 60 seconds. + + OTLog::vOutput(0, "From the Start Date forward, how long until the Initial Payment should charge?\n" + "(defaults to one minute, in seconds) [%d]: ", PAYMENT_DELAY); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_DELAY = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + bSuccessSetInitialPayment = thePlan.SetInitialPayment(lInitialPayment, PAYMENT_DELAY); + } + + if (!bSuccessSetInitialPayment) + { + OTLog::Output(0, "Failed trying to set the initial payment!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + g_pTemporaryNym->AddTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber, true); // bSave=true + + continue; + } + + // ----------------------------------------------------------------------- + + OTLog::Output(0, "What is the regular payment amount, if any? [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + long lRegularPayment = atol(strTemp.Get()); + + if (lRegularPayment > 0) // If there are regular payments. + { + // ----------------------------------------------------------------------- + + time_t PAYMENT_DELAY = 120; // 120 seconds. + + OTLog::vOutput(0, "From the Start Date forward, how long until the Regular Payments start?\n" + "(defaults to two minutes, in seconds) [%d]: ", PAYMENT_DELAY); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_DELAY = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + time_t PAYMENT_PERIOD = 30; // 30 seconds. + + OTLog::vOutput(0, "Once payments begin, how much time should elapse between each payment?\n" + "(defaults to thirty seconds) [%d]: ", PAYMENT_PERIOD); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if ((strTemp.GetLength() > 1) && atol(strTemp.Get())>0) + PAYMENT_PERIOD = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + time_t PLAN_LENGTH = 0; // 0 seconds (for no max length). + + OTLog::vOutput(0, "From start date, do you want the plan to expire after a certain maximum time?\n" + "(defaults to 0 for no) [%d]: ", PLAN_LENGTH); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + PLAN_LENGTH = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + OTLog::Output(0, "Should there be some maximum number of payments? (Zero for no maximum.) [0]: "); + strTemp.Release(); strTemp.OTfgets(std::cin); + int nMaxPayments = atoi(strTemp.Get()); + + bSuccessSetPaymentPlan = thePlan.SetPaymentPlan(lRegularPayment, PAYMENT_DELAY, PAYMENT_PERIOD, PLAN_LENGTH, nMaxPayments); + } + + if (!bSuccessSetPaymentPlan) + { + OTLog::Output(0, "Failed trying to set the payment plan!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + g_pTemporaryNym->AddTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber, true); // bSave=true + + continue; + } + + thePlan.SignContract(*g_pTemporaryNym); + thePlan.SaveContract(); + + OTString strPlan(thePlan); + + OTLog::vOutput(0, "\n\n(Make sure Both Parties sign the payment plan before submitting to server):\n\n\n%s\n", + strPlan.Get()); + + continue; + } + + + else if (strLine.compare(0,6,"cheque") == 0) + { + if (NULL == g_pTemporaryNym) + { + OTLog::Output(0, "No Nym yet available to sign the cheque with. Try 'load'.\n"); + continue; + } + + + OTLog::Output(0, "Enter the ID for your Asset Account that the cheque will be drawn on: "); + OTString strTemp; + strTemp.OTfgets(std::cin); + + const OTIdentifier ACCOUNT_ID(strTemp), USER_ID(*g_pTemporaryNym); + OTAccount * pAccount = g_OT_API.GetWallet()->GetAccount(ACCOUNT_ID); + + if (NULL == pAccount) + { + OTLog::Output(0, "That account isn't loaded right now. Try 'load'.\n"); + continue; + } + + // To write a cheque, we need to burn one of our transaction numbers. (Presumably the wallet + // is also storing a couple of these, since they are needed to perform any transaction.) + // + // I don't have to contact the server to write a cheque -- as long as I already have a transaction + // number I can use to write it. Otherwise I'd have to ask the server to send me one first. + OTString strServerID(pAccount->GetRealServerID()); + long lTransactionNumber=0; + + if (false == g_pTemporaryNym->GetNextTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber)) + { + OTLog::Output(0, "Cheques are written offline, but you still need a transaction number\n" + "(and you have none, currently.) Try using 'n' to request another transaction number.\n"); + continue; + } + + + OTCheque theCheque(pAccount->GetRealServerID(), pAccount->GetAssetTypeID()); + + // Recipient + OTLog::Output(0, "Enter a User ID for the recipient of this cheque (defaults to blank): "); + OTString strRecipientUserID; + strRecipientUserID.OTfgets(std::cin); + const OTIdentifier RECIPIENT_USER_ID(strRecipientUserID.Get()); + + // Amount + OTLog::Output(0, "Enter an amount: "); + strTemp.Release(); + strTemp.OTfgets(std::cin); + const long lAmount = atol(strTemp.Get()); + + // ----------------------------------------------------------------------- + + // Memo + OTLog::Output(0, "Enter a memo for your check: "); + OTString strChequeMemo; + strChequeMemo.OTfgets(std::cin); + + // ----------------------------------------------------------------------- + + // Valid date range (in seconds) + OTLog::Output(0, + " 6 minutes == 360 Seconds\n" + "10 minutes == 600 Seconds\n" + "1 hour == 3600 Seconds\n" + "1 day == 86400 Seconds\n" + "30 days == 2592000 Seconds\n" + "3 months == 7776000 Seconds\n" + "6 months == 15552000 Seconds\n\n" + ); + + long lExpirationInSeconds = 3600; + OTLog::vOutput(0, "How many seconds before cheque expires? (defaults to 1 hour: %ld): ", lExpirationInSeconds); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 1) + lExpirationInSeconds = atol(strTemp.Get()); + + + // ----------------------------------------------------------------------- + + time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + + OTLog::vOutput(0, "Cheque may be cashed STARTING date (defaults to now, in seconds) [%ld]: ", VALID_FROM); + strTemp.Release(); + strTemp.OTfgets(std::cin); + + if (strTemp.GetLength() > 2) + VALID_FROM = atol(strTemp.Get()); + + + const time_t VALID_TO = VALID_FROM + lExpirationInSeconds; // now + 3600 + + // ----------------------------------------------------------------------- + + bool bIssueCheque = theCheque.IssueCheque(lAmount, lTransactionNumber, VALID_FROM, VALID_TO, + ACCOUNT_ID, USER_ID, strChequeMemo, + (strRecipientUserID.GetLength() > 2) ? &(RECIPIENT_USER_ID) : NULL); + + if (bIssueCheque) + { + theCheque.SignContract(*g_pTemporaryNym); + theCheque.SaveContract(); + + OTString strCheque(theCheque); + + OTLog::vOutput(0, "\n\nOUTPUT:\n\n\n%s\n", strCheque.Get()); + } + else + { + OTLog::Output(0, "Failed trying to issue the cheque!\n"); + + // IF FAILED, ADD TRANSACTION NUMBER BACK TO LIST OF AVAILABLE NUMBERS. + g_pTemporaryNym->AddTransactionNum(*g_pTemporaryNym, strServerID, lTransactionNumber, true); // bSave=true + } + + continue; + } + + else if (strLine.compare(0,7,"decrypt") == 0) + { + if (NULL == g_pTemporaryNym) + { + OTLog::Output(0, "No Nym yet available to decrypt with.\n"); + continue; + } + + OTLog::Output(0, "Enter text to be decrypted:\n> "); + + OTASCIIArmor theArmoredText; + char decode_buffer[200]; // Safe since we only read sizeof - 1 + + do { + decode_buffer[0] = 0; + if (NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) + { + theArmoredText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + } while (strlen(decode_buffer)>1); + + + OTEnvelope theEnvelope(theArmoredText); + OTString strDecodedText; + + theEnvelope.Open(*g_pTemporaryNym, strDecodedText); + + OTLog::vOutput(0, "\n\nDECRYPTED TEXT:\n\n%s\n\n", strDecodedText.Get()); + + continue; + } + + else if (strLine.compare(0,6,"decode") == 0) + { + OTLog::Output(0, "Enter text to be decoded:\n> "); + + OTASCIIArmor theArmoredText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + if (NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) + { + theArmoredText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (strlen(decode_buffer)>1); + + OTString strDecodedText(theArmoredText); + + OTLog::vOutput(0, "\n\nDECODED TEXT:\n\n%s\n\n", strDecodedText.Get()); + + continue; + } + + else if (strLine.compare(0,6,"encode") == 0) + { + OTLog::Output(0, "Enter text to be ascii-encoded (terminate with ~ on a new line):\n> "); + + OTString strDecodedText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strDecodedText.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTASCIIArmor theArmoredText(strDecodedText); + + OTLog::vOutput(0, "\n\nENCODED TEXT:\n\n%s\n\n", theArmoredText.Get()); + + continue; + } + + else if (strLine.compare(0,4,"hash") == 0) + { + OTLog::Output(0, "Enter text to be hashed (terminate with ~ on a new line):\n> "); + + OTString strDecodedText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strDecodedText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTIdentifier theIdentifier; + theIdentifier.CalculateDigest(strDecodedText); + + OTString strHash(theIdentifier); + + OTLog::vOutput(0, "\n\nMESSAGE DIGEST:\n\n%s\n\n", strHash.Get()); + + continue; + } + + else if (strLine.compare(0,4,"stat") == 0) + { + OTLog::Output(0, "User has instructed to display wallet contents...\n"); + + OTString strStat; + g_OT_API.GetWallet()->DisplayStatistics(strStat); + OTLog::vOutput(0, "%s\n", strStat.Get()); + + continue; + } + + else if (strLine.compare(0,4,"help") == 0) + { + OTLog::Output(0, "User has instructed to display the help file...\n"); + + system("more ../docs/CLIENT-COMMANDS.txt"); + + continue; + } + + else if (strLine.compare(0,4,"quit") == 0) + { + OTLog::Output(0, "User has instructed to exit the wallet...\n"); + + break; + } + + // 1.6 Connect to the first server in the wallet. (assuming it loaded a server contract.) + else if (strLine.compare(0,7,"connect") == 0) + { + OTLog::Output(0, "User has instructed to connect to the first server available in the wallet.\n"); + + if (NULL == g_pTemporaryNym) + { + OTLog::Output(0, "No Nym yet available to connect with. Try 'load'.\n"); + continue; + } + + // Wallet, after loading, should contain a list of server + // contracts. Let's pull the hostname and port out of + // the first contract, and connect to that server. + bool bConnected = g_OT_API.GetClient()->ConnectToTheFirstServerOnList(*g_pTemporaryNym, strCAFile, strKeyFile, strSSLPassword); + + if (bConnected) + OTLog::Output(0, "Success. (Connected to the first notary server on your wallet's list.)\n"); + else { + OTLog::Output(0, "Either the wallet is not loaded, or there was an error connecting to server.\n"); + } + + continue; + } + + if (!g_OT_API.GetClient()->IsConnected()) + { + OTLog::Output(0, "(You are not connected to a notary server--you cannot send commands.)\n"); + continue; + } + + // 2) Process it out as an OTMessage to the server. It goes down the pipe. + g_OT_API.GetClient()->ProcessMessageOut(buf, &nExpectResponse); + + // 3) Sleep for 1 second. +#ifdef _WIN32 + OT_Sleep(1000); +#else + sleep (1); +#endif + + bool bFoundMessage = false; + + // 4) While there are messages to be read in response from the server, + // then process and handle them all. + do + { + OTMessage * pMsg = new OTMessage; + + OT_ASSERT(NULL != pMsg); + + // If this returns true, that means a Message was + // received and processed into an OTMessage object (theMsg) + bFoundMessage = g_OT_API.GetClient()->ProcessInBuffer(*pMsg); + + if (true == bFoundMessage) + { +// OTString strReply; +// theMsg.SaveContract(strReply); +// OTLog::vOutput(0, "\n\n**********************************************\n" +// "Successfully in-processed server response.\n\n%s\n", strReply.Get()); + g_OT_API.GetClient()->ProcessServerReply(*pMsg); // the Client takes ownership and will handle cleanup. + } + else + { + delete pMsg; + pMsg = NULL; + } + + + } while (true == bFoundMessage); + } // for + + OTLog::Output(0, "Finished running client.\n"); + +#ifdef _WIN32 + WSACleanup(); +#endif + + return retVal; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testwallet/testread.cpp b/testwallet/testread.cpp new file mode 100644 index 000000000..fe08c1eeb --- /dev/null +++ b/testwallet/testread.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include "BitcoinAcct.pb.h" +using namespace std; + +// Iterates though all people in the Wallet and prints info about them. +void ListBitcoinAccts(const OT_GUI::Wallet& wallet) +{ + for (int i = 0; i < wallet.bitcoin_acct_size(); i++) + { + const OT_GUI::BitcoinAcct& bitcoin_acct = wallet.bitcoin_acct(i); + + cout << "BitcoinAcct ID: " << bitcoin_acct.bitcoin_id() << endl; + + if (bitcoin_acct.has_bitcoin_name()) + { + cout << " Name: " << bitcoin_acct.bitcoin_name() << endl; + } + + if (bitcoin_acct.has_gui_label()) + { + cout << " GUI Label: " << bitcoin_acct.gui_label() << endl; + } + } +} + +// Main function: Reads the entire address book from a file and prints all +// the information inside. +int main(int argc, char* argv[]) { + // Verify that the version of the library that we linked against is + // compatible with the version of the headers we compiled against. + GOOGLE_PROTOBUF_VERIFY_VERSION; + + if (argc != 2) { + cerr << "Usage: " << argv[0] << " WALLET_FILE" << endl; + return -1; + } + + OT_GUI::Wallet wallet; + + { + // Read the existing wallet. + fstream input(argv[1], ios::in | ios::binary); + if (!wallet.ParseFromIstream(&input)) { + cerr << "Failed to parse wallet." << endl; + return -1; + } + } + + ListBitcoinAccts(wallet); + + // Optional: Delete all global objects allocated by libprotobuf. + google::protobuf::ShutdownProtobufLibrary(); + + return 0; +} diff --git a/testwallet/testwallet.xcodeproj/project.pbxproj b/testwallet/testwallet.xcodeproj/project.pbxproj new file mode 100644 index 000000000..192ed0661 --- /dev/null +++ b/testwallet/testwallet.xcodeproj/project.pbxproj @@ -0,0 +1,291 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 83083A2B126BEA3300A7EE9E /* OTWallet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83083A29126BEA3300A7EE9E /* OTWallet.cpp */; }; + 830EC8DB11F8B8FE00198F04 /* OTServerConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 830EC8D911F8B8FE00198F04 /* OTServerConnection.cpp */; }; + 8392376011BB395400AF54AF /* OTClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392375F11BB395400AF54AF /* OTClient.cpp */; }; + 83923E6E11BE027E00AF54AF /* SFSocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 83923BCC11BDA44200AF54AF /* SFSocket.c */; }; + 83C5F2FD122DE66100964E36 /* OpenTransactions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83C5F2FB122DE66100964E36 /* OpenTransactions.cpp */; }; + 83C5F386122DED4800964E36 /* testclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 830EC8E311F8BF0A00198F04 /* testclient.cpp */; }; + 83C5F50B122E10D600964E36 /* libOTLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 83C5F50A122E10D600964E36 /* libOTLib.a */; }; + 8DD76F6A0486A84900D96B5E /* testwallet.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* testwallet.1 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 8DD76F6A0486A84900D96B5E /* testwallet.1 in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 83083A29126BEA3300A7EE9E /* OTWallet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OTWallet.cpp; path = ../OTLib/OTWallet.cpp; sourceTree = SOURCE_ROOT; }; + 83083A2A126BEA3300A7EE9E /* OTWallet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OTWallet.h; path = ../OTLib/OTWallet.h; sourceTree = SOURCE_ROOT; }; + 830EC8D911F8B8FE00198F04 /* OTServerConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTServerConnection.cpp; sourceTree = ""; }; + 830EC8DA11F8B8FE00198F04 /* OTServerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTServerConnection.h; sourceTree = ""; }; + 830EC8E311F8BF0A00198F04 /* testclient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = testclient.cpp; sourceTree = ""; }; + 8392375E11BB395400AF54AF /* OTClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTClient.h; sourceTree = ""; }; + 8392375F11BB395400AF54AF /* OTClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTClient.cpp; sourceTree = ""; }; + 83923BCC11BDA44200AF54AF /* SFSocket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SFSocket.c; sourceTree = ""; }; + 83923BCD11BDA44200AF54AF /* SFSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSocket.h; sourceTree = ""; }; + 83BCB1FB11B0AE1400E6A0B2 /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = ""; }; + 83C095BB11B2860700FDCACD /* wallet.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = wallet.xml; sourceTree = ""; }; + 83C5F2FB122DE66100964E36 /* OpenTransactions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenTransactions.cpp; sourceTree = ""; }; + 83C5F2FC122DE66100964E36 /* OpenTransactions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenTransactions.h; sourceTree = ""; }; + 83C5F50A122E10D600964E36 /* libOTLib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libOTLib.a; path = ../OTLib/libOTLib.a; sourceTree = SOURCE_ROOT; }; + 83E651D7122E32E700320598 /* Makefile.OT_API */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.OT_API; sourceTree = ""; }; + 83E651D8122E32E700320598 /* Makefile.testwallet */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.testwallet; sourceTree = ""; }; + 8DD76F6C0486A84900D96B5E /* testwallet */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testwallet; sourceTree = BUILT_PRODUCTS_DIR; }; + C6859E8B029090EE04C91782 /* testwallet.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = testwallet.1; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83C5F50B122E10D600964E36 /* libOTLib.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* testwallet */ = { + isa = PBXGroup; + children = ( + 83E651D7122E32E700320598 /* Makefile.OT_API */, + 83E651D8122E32E700320598 /* Makefile.testwallet */, + 83C5F50A122E10D600964E36 /* libOTLib.a */, + 83C095BB11B2860700FDCACD /* wallet.xml */, + 83923BC311BDA44200AF54AF /* SSL-Example */, + 08FB7795FE84155DC02AAC07 /* Source */, + C6859E8C029090F304C91782 /* Documentation */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = testwallet; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 83083A29126BEA3300A7EE9E /* OTWallet.cpp */, + 83083A2A126BEA3300A7EE9E /* OTWallet.h */, + 830EC8E311F8BF0A00198F04 /* testclient.cpp */, + 83C5F2FC122DE66100964E36 /* OpenTransactions.h */, + 83C5F2FB122DE66100964E36 /* OpenTransactions.cpp */, + 8392375E11BB395400AF54AF /* OTClient.h */, + 8392375F11BB395400AF54AF /* OTClient.cpp */, + 830EC8D911F8B8FE00198F04 /* OTServerConnection.cpp */, + 830EC8DA11F8B8FE00198F04 /* OTServerConnection.h */, + 83BCB1FB11B0AE1400E6A0B2 /* main.h */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* testwallet */, + ); + name = Products; + sourceTree = ""; + }; + 83923BC311BDA44200AF54AF /* SSL-Example */ = { + isa = PBXGroup; + children = ( + 83923BCC11BDA44200AF54AF /* SFSocket.c */, + 83923BCD11BDA44200AF54AF /* SFSocket.h */, + ); + path = "SSL-Example"; + sourceTree = ""; + }; + C6859E8C029090F304C91782 /* Documentation */ = { + isa = PBXGroup; + children = ( + C6859E8B029090EE04C91782 /* testwallet.1 */, + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* testwallet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "testwallet" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = testwallet; + productInstallPath = "$(HOME)/bin"; + productName = testwallet; + productReference = 8DD76F6C0486A84900D96B5E /* testwallet */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "testwallet" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* testwallet */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* testwallet */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8392376011BB395400AF54AF /* OTClient.cpp in Sources */, + 83923E6E11BE027E00AF54AF /* SFSocket.c in Sources */, + 830EC8DB11F8B8FE00198F04 /* OTServerConnection.cpp in Sources */, + 83C5F2FD122DE66100964E36 /* OpenTransactions.cpp in Sources */, + 83C5F386122DED4800964E36 /* testclient.cpp in Sources */, + 83083A2B126BEA3300A7EE9E /* OTWallet.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_GLIBCXX_DEBUG=1", + "_GLIBCXX_DEBUG_PEDANTIC=1", + ); + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../OTLib/OTLib/build/Debug\"", + "\"$(SRCROOT)/../OTLib/build/Debug\"", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/../OTLib\"", + ); + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PRODUCT_NAME = testwallet; + }; + name = Debug; + }; + 1DEB923308733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../OTLib/OTLib/build/Debug\"", + "\"$(SRCROOT)/../OTLib/build/Debug\"", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/../OTLib\"", + ); + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PRODUCT_NAME = testwallet; + }; + name = Release; + }; + 1DEB923608733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/OTLib\""; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Debug; + }; + 1DEB923708733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/OTLib\""; + OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)"; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "testwallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug */, + 1DEB923308733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "testwallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug */, + 1DEB923708733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/testwallet/testwallet/applink.c b/testwallet/testwallet/applink.c new file mode 100755 index 000000000..7789bd930 --- /dev/null +++ b/testwallet/testwallet/applink.c @@ -0,0 +1,94 @@ +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +#include +#include +#include + +static void *app_stdin(void) { return stdin; } +static void *app_stdout(void) { return stdout; } +static void *app_stderr(void) { return stderr; } +static int app_feof(FILE *fp) { return feof(fp); } +static int app_ferror(FILE *fp) { return ferror(fp); } +static void app_clearerr(FILE *fp) { clearerr(fp); } +static int app_fileno(FILE *fp) { return _fileno(fp); } +static int app_fsetmod(FILE *fp,char mod) +{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +#if defined(__BORLANDC__) +__stdcall /* __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. */ +#else +__cdecl +#endif +OPENSSL_Applink(void) +{ static int once=1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX}; + + if (once) + { OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/testwallet/testwallet/stdafx.cpp b/testwallet/testwallet/stdafx.cpp new file mode 100755 index 000000000..270034523 --- /dev/null +++ b/testwallet/testwallet/stdafx.cpp @@ -0,0 +1,16 @@ +// stdafx.cpp : source file that includes just the standard includes +// testwallet.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#include +#include + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file + +void OT_Sleep(int nMS) +{ + Sleep(nMS); +} diff --git a/testwallet/testwallet/stdafx.h b/testwallet/testwallet/stdafx.h new file mode 100755 index 000000000..9936e2a16 --- /dev/null +++ b/testwallet/testwallet/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include + +#include + + + +// TODO: reference additional headers your program requires here diff --git a/testwallet/testwallet/targetver.h b/testwallet/testwallet/targetver.h new file mode 100755 index 000000000..90e767bfc --- /dev/null +++ b/testwallet/testwallet/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/testwallet/testwallet/testwallet.cpp b/testwallet/testwallet/testwallet.cpp new file mode 100755 index 000000000..45a57b5e3 --- /dev/null +++ b/testwallet/testwallet/testwallet.cpp @@ -0,0 +1,11 @@ +// testwallet.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" + +/* +int _tmain(int argc, _TCHAR* argv[]) +{ + return 0; +} +*/ diff --git a/testwallet/testwallet/testwallet.vcxproj b/testwallet/testwallet/testwallet.vcxproj new file mode 100644 index 000000000..56f0bf963 --- /dev/null +++ b/testwallet/testwallet/testwallet.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + TCP Debug + Win32 + + + TCP Release + Win32 + + + + {F2881EAA-A190-474E-A2CE-65C8B191DB14} + Win32Proj + testwallet + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + true + C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\Debug;$(LibraryPath) + C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\XmlRpcC4Win;C:\~\Open-Transactions\OTLib;$(IncludePath) + + + true + C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\TCP Debug;$(LibraryPath) + C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(IncludePath) + + + false + C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\XmlRpcC4Win;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\Release;$(LibraryPath) + + + C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\OTLib;$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include + C:\~\OpenSSL-Win32\lib\VC\static;C:\~\Open-Transactions\OTLib\OTLib\TCP Release;$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Console + true + winmm.lib;wininet.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;%(AdditionalDependencies) + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Console + true + winmm.lib;wininet.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;OT_ZMQ_MODE;%(PreprocessorDefinitions) + MultiThreaded + + + Console + true + true + true + winmm.lib;wininet.lib;ws2_32.lib;libeay32MT.lib;ssleay32MT.lib;OTLib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + + + winmm.lib;wininet.lib;ws2_32.lib;libeay32MT.lib;ssleay32MT.lib;OTLib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + true + true + + + + + + + + + + + + true + true + + + + + + + true + true + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/testwallet/testwrite.cpp b/testwallet/testwrite.cpp new file mode 100644 index 000000000..e9425ad2d --- /dev/null +++ b/testwallet/testwrite.cpp @@ -0,0 +1,72 @@ +#include +#include +#include +#include "BitcoinAcct.pb.h" +using namespace std; + +// This function fills in a BitcoinAcct message based on user input. +void PromptForAddress(OT_GUI::BitcoinAcct* person) +{ + cin.ignore(256, '\n'); + + cout << "Enter Bitcoin Acct Name (blank for default): "; + getline(cin, *person->mutable_bitcoin_name()); + + cout << "Enter Bitcoin Acct ID (required): "; + string email; + getline(cin, email); + if (!email.empty()) { + person->set_bitcoin_id(email); + } + + cout << "Enter GUI label (blank for none): "; + string gui_label; + getline(cin, gui_label); + if (!gui_label.empty()) { + person->set_gui_label(gui_label); + } +} + +// Main function: Reads the entire address book from a file, +// adds one person based on user input, then writes it back out to the same +// file. +int main(int argc, char* argv[]) { + // Verify that the version of the library that we linked against is + // compatible with the version of the headers we compiled against. + GOOGLE_PROTOBUF_VERIFY_VERSION; + + if (argc != 2) { + cerr << "Usage: " << argv[0] << " WALLET_FILE" << endl; + return -1; + } + + OT_GUI::Wallet wallet; + + { + // Read the existing wallet. + fstream input(argv[1], ios::in | ios::binary); + if (!input) { + cout << argv[1] << ": File not found. Creating a new file." << endl; + } else if (!wallet.ParseFromIstream(&input)) { + cerr << "Failed to parse GUI wallet." << endl; + return -1; + } + } + + // Add a bitcoin acct. + PromptForAddress(wallet.add_bitcoin_acct()); + + { + // Write the new wallet back to disk. + fstream output(argv[1], ios::out | ios::trunc | ios::binary); + if (!wallet.SerializeToOstream(&output)) { + cerr << "Failed to write GUI wallet." << endl; + return -1; + } + } + + // Optional: Delete all global objects allocated by libprotobuf. + google::protobuf::ShutdownProtobufLibrary(); + + return 0; +} \ No newline at end of file diff --git a/testwallet/xmlrpcxx_client.cpp b/testwallet/xmlrpcxx_client.cpp new file mode 100644 index 000000000..6aa622de1 --- /dev/null +++ b/testwallet/xmlrpcxx_client.cpp @@ -0,0 +1,2767 @@ +/************************************************************************************ + * + * xmlrpcxx_client.cpp (the XmlRpc++ version of the client -- Web Services version.) + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA256 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * http://wiki.github.com/FellowTraveler/Open-Transactions/wiki + * http://wiki.github.com/FellowTraveler/Moneychanger/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.10 (Darwin) + + iQIcBAEBCAAGBQJNsV9NAAoJEAMIAO35UbuOB3IP/12THBedTYrR2F2hkhYKK+0H + YlVwRJyFnX3uKjDkYx2fpB2yNaMPPyiQRFpQBpiUxB2wSMHelM+m4YxVegx7h15s + nD+jMLeVnlhgfKYsVZZiCKT58HXVsuGDc/iycXBBIQYBjCzbeCCG0vyEapR+sCwF + eGR5l7yGbcMWaVqjPawqSMe/5Ie0wstWMrNAkLlWHRn/ISXb8vMusaxCe9kSeUX8 + 7ZSZ0ojy3gLTZnUHFFZ2RaMepVB9jVoMSdVG89mEHX383foTuaxedjI2Wsw6J8YR + D7PFp6PLGhm1eqArmotCj5NeV9lleULdnvR7T4QwzOZjI65kMwi/e1W6GyvzT3RZ + RrLaZwiagcyKTXyEX5qSBQfSVNwC761rgNTG0fCBrBmDbQxet4A6Y+ZMxZmE0QXb + Xch/g4g9Lki0TrSOx0zSAAcpLCIrqdvGX2jcmmJ/Ex4ZhzVhMvtkGfui9bUaY2bU + bdu1GY0CfmElZ7+wXh2AutkMscRtnu62VSdGjrqry3KJMBWbtxNA9Q+U+NipWnYN + yisBlQBADkXNtkL3EXEqX6OnjGfHNZ3G1bwuELcZjoOL+K0aQKCojRf8Ii5DW0A3 + niqzq/dwpt45VaQ+uYSG7Sg19FNvADg+WILdFcyszfS8Wks6BsKYzHUc5zbf3SFc + JaOXLV9Ss58mj57JpNp8 +=VjLJ +-----END PGP SIGNATURE----- + **************************************************************/ + + + +#define KEY_PASSWORD "test" + + +#define OT_OPTIONS_FILE_DEFAULT "command-line-ot.opt" +#define OT_INI_FILE_DEFAULT "ot_init.cfg" +#define OT_PROMPT_HELPFILE "CLIENT-COMMANDS.txt" + +// --------------------------------------------------------------------------- + +#ifdef _WIN32 +#define OT_FOLDER_DEFAULT "C:\\~\\Open-Transactions" +#define MAIN_PATH_DEFAULT "C:\\~\\Open-Transactions\\client_data" + +#define CA_FILE "certs\\special\\ca.crt" +#define KEY_FILE "certs\\special\\client.pem" + +// --------------------------------------------------------------------------- + +#else + +#define OT_FOLDER_DEFAULT "~/.ot" +#define MAIN_PATH_DEFAULT "~/.ot/client_data" + +#define CA_FILE "certs/special/ca.crt" +#define KEY_FILE "certs/special/client.pem" + +#endif + +// --------------------------------------------------------------------------- + +#include +#include +#include + + +#include + +#include + + +extern "C" +{ +#ifdef _WIN32 +#include +#else +#include +#endif +} + + + +#include "SimpleIni.h" + + + +// --------------------------------------------------------------------------- + +#if defined(OT_ZMQ_MODE) + +#include + + +// If you build in tcp/ssl mode, this file will build even if you don't have this library. +// But if you build in xml/rpc/http mode, +//#ifdef _WIN32 +//#include "timxmlrpc.h" // XmlRpcC4Win +//#else +//#include "XmlRpc.h" // xmlrpcpp +//using namespace XmlRpc; +//#endif + +#endif +// --------------------------------------------------------------------------- + +#ifdef _WIN32 +void OT_Sleep(int nMS); +#endif + +// --------------------------------------------------------------------------- + + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTASCIIArmor.h" +#include "OTClient.h" +#include "OTServerConnection.h" +#include "OTMessage.h" +#include "OTString.h" +#include "OTWallet.h" +#include "OTPseudonym.h" +#include "OTEnvelope.h" +#include "OTPurse.h" +#include "OTCheque.h" +#include "OpenTransactions.h" +#include "OTPaymentPlan.h" +#include "OTLog.h" + +// --------------------------------------------------------------------------- + + + +// This global variable contains an OTWallet, an OTClient, etc. +// It's the C++ high-level interace to OT. +// Any client software will have an instance of this. +OT_API g_OT_API; +// Note: Must call OT_API::Init() followed by g_OT_API.Init() in the main function, before using OT. + + +// --------------------------------------------------------------------------- + +/* + OT by default will look here: "~/.ot/ot_init.cfg" + + Inside that file are these contents: + [paths] + client_path=~/.ot/client_data + server_path=~/.ot/server_data + + If none of the snazzy ini files or config files, or client_data/server_data folders + are found, then the default locations are ./client_data and ./server_data + MEANING: If it can't find it in your $HOME/.ot/ot_init.cfg file, then it looks + in the current directory instead. + + (I'm REMOVING the option to pass the location in on the command line, at least without a switch.) + */ + + + +#include "anyoption.h" + + +void HandleCommandLineArguments( int argc, char* argv[], AnyOption * opt ); + + +/* + + --server (SERVER_ID) + + USAGE: ot -COMMAND [AMOUNT] [--from ACCT/NYM/ASSET] [--to ACCT or NYM] + + ot -w 100 (WITHDRAW 100 FROM DEFAULT ACCOUNT.) + ot -d 100 (DEPOSIT FROM DEFAULT PURSE TO DEFAULT ACCOUNT.) + ot -t 100 --to j43k (TRANSFER 100 FROM DEFAULT ACCT TO ACCT STARTING WITH j43k) + ot -t 100 --from qwer --to j43k (TRANSFER 100 from ACCT STARTING WITH qwer TO ACCT starting j43k) + + */ + + +void OT_Main_Cleanup() +{ +#ifdef _WIN32 + WSACleanup(); +#endif +} + + + +// If false, error happened, usually based on what user just attemped. +// +bool SetupPointersForWalletMyNymAndServerContract(std::string & str_ServerID, + std::string & str_MyNym, + OTPseudonym *& pMyNym, + OTWallet *& pWallet, + OTServerContract *& pServerContract) +{ + // If we got down here, that means there were no commands on the command line + // (That's why we dropped into the OT prompt.) + // However, there still may have been OPTIONS -- and if so, we'll go ahead and + // load the wallet. (If there were NOT ANY OPTIONS, then we do NOT load the wallet, + // although there is a COMMAND for doing that.) + // + const OTString strTheWalletFilename("wallet.xml"); // todo stop hardcoding. + + g_OT_API.LoadWallet(strTheWalletFilename); +// g_OT_API.GetWallet()->SaveWallet("NEWwallet.xml"); // todo remove this test code. + + // ----------------------------------------------------- + // + pWallet = g_OT_API.GetWallet(); + + if (NULL == pWallet) + { + OTLog::Output(0, "The wallet object is still NULL, somehow. Please load it.\n"); + return false; + } + + // Below this point, pWallet is available :-) + // ----------------------------------------------------- + + if (str_ServerID.size() > 0 ) + { + const OTIdentifier SERVER_ID(str_ServerID.c_str()); + + pServerContract = pWallet->GetServerContract(SERVER_ID); + // If failure, then we try PARTIAL match. + if (NULL == pServerContract) + pServerContract = pWallet->GetServerContractPartialMatch(str_ServerID); + + if (NULL == pServerContract) + { + OTLog::Output(0, "Unable to find a server contract. Please use the option: --server SERVER_ID\n" + "(Where SERVER_ID is the server ID. Partial matches ARE accepted.)\n" + "Also, see default values located in ~/.ot/comand-line-ot.opt \n"); + return false; + } + + } + // Below this point, pServerContract MAY be available, but also may be NULL. + // + // ------------------------------------------------------------------------------ + + if ( str_MyNym.size() > 0 ) + { + const OTIdentifier MY_NYM_ID(str_MyNym.c_str()); + + pMyNym = pWallet->GetNymByID(MY_NYM_ID); + // If failure, then we try PARTIAL match. + if (NULL == pMyNym) + pMyNym = pWallet->GetNymByIDPartialMatch( str_MyNym ); + + if (NULL == pMyNym) + { + OTLog::Output(0, "Unable to find My Nym. Please use the option: --mynym USER_ID\n" + "(Where USER_ID is the Nym's ID. Partial matches ARE accepted.)\n" + "Also, see default values located in ~/.ot/comand-line-ot.opt \n"); + return false; + } + } // Below this point, pMyNym MIGHT be a valid pointer, or MIGHT be NULL. + + // Below THIS point, there's no guarantee of pWallet, though it MIGHT be there. + // Same with pServerContract. (MIGHT be there.) + + return true; +} + + + + + + + + +void HandleCommandLineArguments( int argc, char* argv[], AnyOption * opt) +{ + if (NULL == opt) + return; + + + /* 1. CREATE AN OBJECT */ +// AnyOption *opt = new AnyOption(); +// OT_ASSERT(NULL != opt); +// OTCleanup theOptionAngel(opt); + + // ----------------------------------------------------- + /* 2. SET PREFERENCES */ + //opt->noPOSIX(); /* do not check for POSIX style character options */ + //opt->setVerbose(); /* print warnings about unknown options */ + //opt->autoUsagePrint(true); /* print usage for bad options */ + + // ----------------------------------------------------- + /* 3. SET THE USAGE/HELP */ + opt->addUsage( "" ); + opt->addUsage( "OT CLI Usage: " ); + opt->addUsage( "" ); + opt->addUsage( "ot --stat (Prints the wallet contents)" ); + opt->addUsage( "ot [-h|-?|--help] (Prints this help) " ); + opt->addUsage( "The '|' symbol means use --balance or -b, use --withdraw or -w, etc." ); + opt->addUsage( "The brackets '[]' show required arguments, where default values are" ); + opt->addUsage( "normally expected to be found in: ~/.ot/command-line-ot.opt" ); + opt->addUsage( "ot --balance | -b [--myacct ] (Display account balance)" ); + opt->addUsage( "ot --withdraw | -w [--myacct ] (Withdraw as CASH)" ); + opt->addUsage( "ot --transfer | -t [--myacct ] [--hisacct ]" ); + opt->addUsage( "ot --cheque | -c [--myacct ] [--hisnym ]" ); + opt->addUsage( "ot --voucher | -v [--myacct ] [--hisnym ]" ); + opt->addUsage( "ot --depositcheque [--myacct ] (Deposit a cheque.)" ); + opt->addUsage( "ot --depositpurse [--myacct ] (Deposit a cash purse.)" ); + opt->addUsage( "ot --deposittokens [--myacct ] (Deposit individual cash tokens.)" ); + opt->addUsage( "ot --inbox | -i [--myacct ] (Display the inbox.)" ); + opt->addUsage( "ot --sign | -s [--mynym ] (Sign a contract.)" ); + opt->addUsage( "ot --verify [--mynym ] (Verify a signature.)" ); + opt->addUsage( "ot --purse | -p (Display a purse.)"); + opt->addUsage( " Arguments: [--mynym ] [--mypurse ]" ); + opt->addUsage( "ot --refresh | -r [--myacct ] (Download account files from server.)"); + opt->addUsage( "ot --refreshnym [--mynym ] (Download nym files from server.)"); + opt->addUsage( "ot --marketoffer [--mynym ] (Place an offer on a market.)" ); + opt->addUsage( "Also, [--server ] will work with all of the above." ); + opt->addUsage( "" ); + opt->addUsage( "Recurring payments:" ); + opt->addUsage( "ot --proposeplan (Merchant)" ); + opt->addUsage( " Arguments: [--mynym ] [--myacct ] (continued.)" ); + opt->addUsage( " Continued: [--hisnym ] [--hisacct ]"); + opt->addUsage( "ot --confirmplan (Customer)" ); + opt->addUsage( "ot --activateplan (Customer again)" ); + opt->addUsage( " Arguments: [--mynym ] [--myacct ]" ); + opt->addUsage( "" ); + + // ----------------------------------------------------- + /* 4. SET THE OPTION STRINGS/CHARACTERS */ + // + // COMMAND LINE *AND* RESOURCE FILE + +// opt->setOption( "server" ); /* an option (takes an argument), supporting only long form */ + + // ----------------------------------------------------- + + // COMMAND LINE ONLY + /* for options that will be checked only on the command and line not in option/resource file */ +// opt->setCommandFlag( "zip" , 'z'); /* a flag (takes no argument), supporting long and short form */ + opt->setCommandOption("withdraw" , 'w'); // withdraw from acct to purse, myacct, topurse + opt->setCommandOption("transfer" , 't'); // transfer acct-to-acct, myacct, toacct + opt->setCommandOption("cheque" , 'c'); // write a cheque myacct, tonym + opt->setCommandOption("voucher" , 'v'); // withdraw voucher myacct, tonym + opt->setCommandFlag( "marketoffer" ); // add an offer to the market. + opt->setCommandFlag( "balance" , 'b'); // Display account balance + opt->setCommandFlag( "depositcheque" ); // deposit a cheque to myacct + opt->setCommandFlag( "depositpurse" ); // deposit cash purse to myacct + opt->setCommandFlag( "deposittokens" ); // deposit individual cash tokens to myacct + opt->setCommandFlag( "proposeplan" ); // Merchant proposes a payment plan. + opt->setCommandFlag( "confirmplan" ); // Customer confirms a payment plan. + opt->setCommandFlag( "activateplan" ); // Customer activates a payment plan. + opt->setCommandFlag( "inbox" , 'i'); // displays inbox (for ACCT_ID...) + opt->setCommandFlag( "sign" , 's'); // sign a contract mynym + opt->setCommandFlag( "verify" ); // verify a signature + opt->setCommandFlag( "purse" , 'p'); // display purse contents. + opt->setCommandFlag( "refresh" , 'r'); // refresh intermediary files from server + verify against last receipt. + opt->setCommandFlag( "refreshnym" ); // refresh intermediary files from server + verify against last receipt. + opt->setCommandFlag( "stat" ); // print out the wallet contents. + + opt->setCommandFlag("help", 'h'); // the Help screen. + opt->setCommandFlag('?'); // the Help screen. + + /* + --myacct (ACCT ID) + --mynym (NYM ID) + --mypurse (ASSET TYPE ID) + + --toacct (ACCT ID) + --tonym (NYM ID) + --topurse (ASSET TYPE ID) + */ + opt->setCommandOption("server"); + + opt->setCommandOption("myacct"); + opt->setCommandOption("mynym"); + opt->setCommandOption("mypurse"); + opt->setCommandOption("hisacct"); + opt->setCommandOption("hisnym"); + opt->setCommandOption("hispurse"); + + // NOTE: Above and Below me are IDs. This interface should allow PARTIAL IDs. + // ----------------------------------------------------- + + // RESOURCE FILE ONLY + /* for options that will be checked only from the option/resource file */ + opt->setFileOption( "defaultserver" ); /* an option (takes an argument), supporting only long form */ + + opt->setFileOption( "defaultmyacct" ); /* an option (takes an argument), supporting only long form */ + opt->setFileOption( "defaultmynym" ); /* an option (takes an argument), supporting only long form */ + opt->setFileOption( "defaultmypurse" ); /* an option (takes an argument), supporting only long form */ + opt->setFileOption( "defaulthisacct" ); /* an option (takes an argument), supporting only long form */ + opt->setFileOption( "defaulthisnym" ); /* an option (takes an argument), supporting only long form */ + opt->setFileOption( "defaulthispurse" ); /* an option (takes an argument), supporting only long form */ +/* + --defaultmyacct (ACCT ID) + --defaultmynym (NYM ID) + --defaultmypurse (ASSET TYPE ID) + + --defaulttoacct (ACCT ID) + --defaulttonym (NYM ID) + --defaulttopurse (ASSET TYPE ID) +*/ + + // ----------------------------------------------------- + /* 5. PROCESS THE COMMANDLINE AND RESOURCE FILE */ + + /* read options from a option/resource file with ':' separated options or flags, one per line */ + OTString strIniRAWFileDefault, strIniFileDefault; + strIniRAWFileDefault.Format("%s%s%s", OT_FOLDER_DEFAULT, OTLog::PathSeparator(), OT_OPTIONS_FILE_DEFAULT); + OTLog::TransformFilePath(strIniRAWFileDefault.Get(), strIniFileDefault); + + // ----------------------------------------------------- + opt->processFile( strIniFileDefault.Get() ); + // ----------------------------------------------------- + opt->processCommandArgs( argc, argv ); +} + + + +/* + I'm starting to need this in possibly multiple places below, so I + made a function to avoid duplicating code. These are values such + as "my account ID" and "his NymID" that are provided on the command + line, and which also can be defaulted in a config file in ~/.ot + */ +void CollectDefaultedCLValues(AnyOption *opt, + std::string & str_ServerID, + std::string & str_MyAcct, + std::string & str_MyNym, + std::string & str_MyPurse, + std::string & str_HisAcct, + std::string & str_HisNym, + std::string & str_HisPurse) +{ + OT_ASSERT(NULL != opt); + + cerr << endl; + + // First we pre-set all the values based on the defaults from the options file. + // + if( opt->getValue( "defaultserver" ) != NULL ) + cerr << "Server default: " << (str_ServerID = opt->getValue( "defaultserver" )) << endl; + + if( opt->getValue( "defaultmyacct" ) != NULL ) + cerr << "MyAcct default: " << (str_MyAcct = opt->getValue( "defaultmyacct" )) << endl; + if( opt->getValue( "defaultmynym" ) != NULL ) + cerr << "MyNym default: " << (str_MyNym = opt->getValue( "defaultmynym" )) << endl; + if( opt->getValue( "defaultmypurse" ) != NULL ) + cerr << "MyPurse default: " << (str_MyPurse = opt->getValue( "defaultmypurse" )) << endl; + + if( opt->getValue( "defaulthisacct" ) != NULL ) + cerr << "HisAcct default: " << (str_HisAcct = opt->getValue( "defaulthisacct" )) << endl; + if( opt->getValue( "defaulthisnym" ) != NULL ) + cerr << "HisNym default: " << (str_HisNym = opt->getValue( "defaulthisnym" )) << endl; + if( opt->getValue( "defaulthispurse" ) != NULL ) + cerr << "HisPurse default: " << (str_HisPurse = opt->getValue( "defaulthispurse" )) << endl; + + // -------------- + // Next, we overwrite those with any that were passed in on the command line. + + if( opt->getValue( "server" ) != NULL ) + cerr << "Server from command-line: " << (str_ServerID = opt->getValue( "server" )) << endl; + + if( opt->getValue( "myacct" ) != NULL ) + cerr << "MyAcct from command-line: " << (str_MyAcct = opt->getValue( "myacct" )) << endl; + if( opt->getValue( "mynym" ) != NULL ) + cerr << "MyNym from command-line: " << (str_MyNym = opt->getValue( "mynym" )) << endl; + if( opt->getValue( "mypurse" ) != NULL ) + cerr << "MyPurse from command-line: " << (str_MyPurse = opt->getValue( "mypurse" )) << endl; + + if( opt->getValue( "hisacct" ) != NULL ) + cerr << "HisAcct from command-line: " << (str_HisAcct = opt->getValue( "hisacct" )) << endl; + if( opt->getValue( "hisnym" ) != NULL ) + cerr << "HisNym from command-line: " << (str_HisNym = opt->getValue( "hisnym" )) << endl; + if( opt->getValue( "hispurse" ) != NULL ) + cerr << "HisPurse from command-line: " << (str_HisPurse = opt->getValue( "hispurse" )) << endl; +} + + + + +// --------- MAIN FUNCTION ------------- + + +int main(int argc, char* argv[]) +{ + OTLog::vOutput(0, "\n\nWelcome to Open Transactions... Test Client -- version %s\n" + "(transport build: OTMessage -> OTEnvelope -> ZMQ )\n", + OTLog::Version()); + + OT_API::InitOTAPI(); + + // ************************************************************************** + // The beginnings of an INI file!! + +//#define OT_FOLDER_DEFAULT "~/.ot" +//#define OT_INI_FILE_DEFAULT "ot_init.cfg" +// + OTString strIniRAWFileDefault, strIniFileDefault; + strIniRAWFileDefault.Format("%s%s%s", OT_FOLDER_DEFAULT, OTLog::PathSeparator(), OT_INI_FILE_DEFAULT); + OTLog::TransformFilePath(strIniRAWFileDefault.Get(), strIniFileDefault); + // ------------------------------------------------------------------- + + OTString strPath, strRawPath(MAIN_PATH_DEFAULT); + + { + CSimpleIniA ini; + + SI_Error rc = ini.LoadFile(strIniFileDefault.Get()); + + if (rc >=0) + { + { + const char * pVal = ini.GetValue("paths", "client_path", MAIN_PATH_DEFAULT); // todo stop hardcoding. + + if (NULL != pVal) + { + strRawPath.Set(pVal); + OTLog::vOutput(0, "Reading the ini file (%s): \n Found OT client_path: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + else + { + strRawPath.Set(MAIN_PATH_DEFAULT); + OTLog::vOutput(0, "There's no client_data path in the ini file (%s).\n Therefore, using: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + } + } + else + { + strRawPath.Set(MAIN_PATH_DEFAULT); + OTLog::vOutput(0, "Unable to load ini file (%s) to find client_data path. \n Will assume that client data_folder is at path: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + } + // ************************************************************************** + + + OTString strCAFile, strKeyFile; //, strSSLPassword; + + OTLog::TransformFilePath(strRawPath.Get(), strPath); + // ------------------------------------------------------------------- + + g_OT_API.Init(strPath); // SSL gets initialized in here, before any keys are loaded. + + OTLog::vOutput(0, "Using client_data path: %s\n", OTLog::Path()); + + strCAFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), CA_FILE); + strKeyFile.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), KEY_FILE); + + + //  Prepare our context and socket + zmq::context_t context(1); + + // ----------------------------------------------------------------------- + + AnyOption *opt = new AnyOption(); + OT_ASSERT(NULL != opt); + OTCleanup theOptionAngel(opt); + + // Process the command line args + // + HandleCommandLineArguments( argc, argv, opt); + + + // command line values such as account ID, Nym ID, etc. + // Also available as defaults in a config file in the ~/.ot folder + // + std::string str_ServerID; + + std::string str_MyAcct; + std::string str_MyNym; + std::string str_MyPurse; + + std::string str_HisAcct; + std::string str_HisNym; + std::string str_HisPurse; + + CollectDefaultedCLValues(opt, + str_ServerID, + str_MyAcct, + str_MyNym, + str_MyPurse, + str_HisAcct, + str_HisNym, + str_HisPurse); + + // ----------------------------------------------------- + /* USAGE SCREEN (HELP) */ + // + if( opt->getFlag( "help" ) || opt->getFlag( 'h' ) || opt->getFlag( '?' ) ) + { + opt->printUsage(); + + OT_Main_Cleanup(); + return 0; + } + // ----------------------------------------------------- + + bool bIsCommandProvided = false; + + // See if there's a COMMAND chosen at command line. + // + if ( opt ->hasOptions()) + { + // Below are COMMANDS (only one of them can be true...) + // + + if( opt->getValue( 'w' ) != NULL || opt->getValue( "withdraw" ) != NULL ) + { bIsCommandProvided = true; cout << "withdraw amount = " << opt->getValue( 'w' ) << endl ; } + else if( opt->getValue( 't' ) != NULL || opt->getValue( "transfer" ) != NULL ) + { bIsCommandProvided = true; cout << "transfer amount = " << opt->getValue( 't' ) << endl ; } + else if( opt->getValue( 'c' ) != NULL || opt->getValue( "cheque" ) != NULL ) + { bIsCommandProvided = true; cout << "cheque amount = " << opt->getValue( 'c' ) << endl ; } + else if( opt->getFlag( "marketoffer" ) == true ) + { bIsCommandProvided = true; cout << "marketoffer flag set " << endl ; } + else if( opt->getValue( 'v' ) != NULL || opt->getValue( "voucher" ) != NULL ) + { bIsCommandProvided = true; cout << "voucher amount = " << opt->getValue( 'v' ) << endl ; } + else if( opt->getFlag( "depositcheque" ) ) + { bIsCommandProvided = true; cout << "deposit cheque flag set " << endl ; } + else if( opt->getFlag( "depositpurse" ) ) + { bIsCommandProvided = true; cout << "deposit purse flag set " << endl ; } + else if( opt->getFlag( "deposittokens" ) ) + { bIsCommandProvided = true; cout << "deposit tokens flag set " << endl ; } + else if( opt->getFlag( "proposepaymentplan" ) ) + { bIsCommandProvided = true; cout << "proposepaymentplan flag set " << endl ; } + else if( opt->getFlag( "confirmpaymentplan" ) ) + { bIsCommandProvided = true; cout << "confirm payment plan flag set " << endl ; } + else if( opt->getFlag( "activatepaymentplan" ) ) + { bIsCommandProvided = true; cout << "activate payment plan flag set " << endl ; } + else if( opt->getFlag( 'b' ) || opt->getFlag( "balance" ) ) + { bIsCommandProvided = true; cout << "balance flag set " << endl ; } + else if( opt->getFlag( 'i' ) || opt->getFlag( "inbox" ) ) + { bIsCommandProvided = true; cout << "inbox flag set " << endl ; } + else if( opt->getFlag( 'p' ) || opt->getFlag( "purse" ) ) + { bIsCommandProvided = true; cout << "purse flag set " << endl ; } + else if( opt->getFlag( 's' ) || opt->getFlag( "sign" )) + { bIsCommandProvided = true; cout << "sign flag set " << endl ; } + else if( opt->getFlag( "verify" ) ) + { bIsCommandProvided = true; cout << "verify flag set " << endl; } + else if( opt->getFlag( "stat" ) ) + { bIsCommandProvided = true; cout << "stat flag set " << endl ; } + else if( opt->getFlag( 'r' ) || opt->getFlag( "refresh" ) ) + { bIsCommandProvided = true; cout << "refresh flag set " << endl ; } + else if( opt->getFlag( "refreshnym" ) ) + { bIsCommandProvided = true; cout << "refreshnym flag set " << endl ; } + + cout << endl ; + } + else + bIsCommandProvided = false; + + // ----------------------------------------------------- + // + if( false == bIsCommandProvided) // If no command was provided (though other command-line options may have been...) + { // then print some helpful information, and drop into the OT prompt. (Loop.) +// opt->printUsage(); + + OTLog::Output(0, "\nLOOKING FOR INSTRUCTIONS for the OT COMMAND LINE?\n" + "Try: quit\n" + "Followed by: ot -?\n" + "or: ot -h\n" + "or: ot --help\n" + "\n" + "(NOW ENTERING OT PROMPT) \n" + "Type \"Help\" at the OT> prompt to see contents of ~/.ot/CLIENT-COMMANDS.txt\n\n"); + + // This causes us to drop into the OT prompt. + } + else // Else a command WAS provided at the command line, so we execute a single time, once just for that command. + { + OTWallet * pWallet = NULL; + OTServerContract * pServerContract = NULL; + OTPseudonym * pMyNym = NULL; + + // This will load the wallet and, if Nym or Server IDs were provided, load those up as well. + // (They may still be NULL after this call, however.) + // + if (false == SetupPointersForWalletMyNymAndServerContract(str_ServerID, str_MyNym, + pMyNym, pWallet, pServerContract)) + { + OT_Main_Cleanup(); + return 0; + } + + // Below this point, pWallet is available :-) + // ----------------------------------------------------- + + // Later I can split the below commands into "those that need a server contract" + // and "those that don't need a server contract", and put this code between them. + // That's what the OT Prompt loop does. For now I'm making things easy here by just + // making it a blanket requirement. + // + if (NULL == pServerContract) + { + OTLog::Output(0, "Unable to find a server contract to use. Please use the option: --server SERVER_ID\n" + "(Where SERVER_ID is the Server's ID. Partial matches ARE accepted.)\n"); + + OT_Main_Cleanup(); + return 0; + } + + const OTIdentifier theServerID(*pServerContract); + const OTString strServerID(theServerID); + + // ----------------------------------------------------- + + int nServerPort = 0; + OTString strServerHostname; + + // ------------------------------------------------------------------------------ + // You can't just connect to any hostname and port. + // Instead, you give me the Server Contract, and *I'll* look up all that stuff FOR you... + // (We verify this up here, but use it at the bottom of the function once the message is set up.) + // + + if (false == pServerContract->GetConnectInfo(strServerHostname, nServerPort)) + { + OTLog::vError("Failed retrieving connection info from server contract: %s\n", + strServerID.Get()); + OT_Main_Cleanup(); + return 0; + } + + + // Below this point, pWallet and pServerContract are both available. + // + // *********************************************************** + + OTAccount * pMyAccount = NULL; + OTAccount * pHisAccount = NULL; + + if( str_MyAcct.size() > 0 ) + { + const OTIdentifier MY_ACCOUNT_ID(str_MyAcct.c_str()); + + pMyAccount = pWallet->GetAccount(MY_ACCOUNT_ID); + // If failure, then we try PARTIAL match. + if (NULL == pMyAccount) + pMyAccount = pWallet->GetAccountPartialMatch( str_MyAcct ); + + if (NULL == pMyAccount) + { + OTLog::vOutput(0, "Unable to find myacct: %s\n", str_MyAcct.c_str()); + OT_Main_Cleanup(); + return 0; + } + } + // ------------------------------------------------------------------------- + // TODO: I wouldn't have HIS account in MY wallet -- I'd only have his account ID. + // Therefore need to be able to retrieve this info from the ADDRESS BOOK (in order + // to be able to do PARTIAL MATCHES...) + // + if ( str_HisAcct.size() > 0 ) + { + const OTIdentifier HIS_ACCOUNT_ID(str_HisAcct.c_str()); + + pHisAccount = pWallet->GetAccount(HIS_ACCOUNT_ID); + // If failure, then we try PARTIAL match. + if (NULL == pHisAccount) + pHisAccount = pWallet->GetAccountPartialMatch( str_HisAcct ); + + if (NULL != pHisAccount) + { + OTString strTemp; + pHisAccount->GetPurportedAccountID().GetString(strTemp); + + str_HisAcct = strTemp.Get(); + OTLog::vOutput(0, "Using as hisacct: %s\n", str_HisAcct.c_str()); + } + } + + // *********************************************************** + + OTPseudonym * pHisNym = NULL; + + // I put this here too since I think it's required in all cases. + // + if (NULL == pMyNym) // Todo maybe move this check to the commands below (ONLY the ones that use a nym.) + { + OTLog::Output(0, "Unable to find My Nym. Please use the option: --mynym USER_ID\n" + "(Where USER_ID is the Nym's ID. Partial matches ARE accepted.)\n"); + OT_Main_Cleanup(); + return 0; + } + + const OTIdentifier MY_NYM_ID(*pMyNym); + + // ----------------------------------------------- + + if ( str_HisNym.size() > 0 ) + { + const OTIdentifier HIS_NYM_ID(str_HisNym.c_str()); + + pHisNym = pWallet->GetNymByID(HIS_NYM_ID); + // If failure, then we try PARTIAL match. + if (NULL == pHisNym) + pHisNym = pWallet->GetNymByIDPartialMatch( str_HisNym ); + + if (NULL != pHisNym) + { + OTString strTemp; + pHisNym->GetIdentifier(strTemp); + + str_HisNym = strTemp.Get(); + OTLog::vOutput(0, "Using as 'HIS' nym: %s\n", str_HisNym.c_str()); + } + } + + // Below this point, if Nyms or Accounts were specified, they are now available. + // (Pointers might be null, though currently My Nym is required to be there.) + // + // *********************************************************** + + OTIdentifier thePurseAssetTypeID; + OTAssetContract * pMyAssetContract = NULL; + + if ( str_MyPurse.size() > 0 ) + { + const OTIdentifier MY_ASSET_TYPE_ID(str_MyPurse.c_str()); + + pMyAssetContract = pWallet->GetAssetContract(MY_ASSET_TYPE_ID); + // If failure, then we try PARTIAL match. + if (NULL == pMyAssetContract) + pMyAssetContract = pWallet->GetAssetContractPartialMatch( str_MyPurse ); + + if (NULL == pMyAssetContract) + { + OTLog::vOutput(0, "Unable to find My Asset Type: %s\n", str_MyPurse.c_str()); + OT_Main_Cleanup(); + return 0; + } + + pMyAssetContract->GetIdentifier(thePurseAssetTypeID); + } + else + thePurseAssetTypeID = pMyAccount->GetAssetTypeID(); + + + // TODO: put "His Asset Contract" here, copied from above, if it turns out to be necessary. + + + // BELOW THIS POINT, pMyAssetContract MIGHT be NULL, or MIGHT be an asset type specified by the user. + // There's no guarantee that it's available, but if it IS, then it WILL be available below this point. + // -------------------------------------------------------------------------- + + + // Also, pAccount and pMyAssetContract have not be validated AGAINST EACH OTHER (yet)... + + + + // ----------------------------------------------------- + /* GET THE ACTUAL ARGUMENTS AFTER THE OPTIONS */ + // +// for( int i = 0 ; i < opt->getArgc() ; i++ ){ +// cout << "arg = " << opt->getArgv( i ) << endl ; +// } + + + bool bSendCommand = false; // Determines whether to actually send a message to the server. + + OTMessage theMessage; + + // If we can match the user's request to a client command, + // AND theClient object is able to process that request into + // theMessage, then we send it down the pipe. + + + // In lieu of maintaining a constant connection to the server, in ZMQ mode, the + // client updates its internal "connection" object to make sure the right pointers + // are in place (since in ZMQ mode, each message could be from a different nym + // and to a different server.) + // + g_OT_API.GetClient()->SetFocusToServerAndNym(*pServerContract, *pMyNym, &OT_API::TransportCallback); + // NOTE -- This MAY be unnecessary for ProcessUserCommand (since these args are passed + // in there already) but it's definitely necessary soon after for ProcessServerReply() + // (which comes next.) + + +// (OTClient::OT_CLIENT_CMD_TYPE requestedCommand, +// OTMessage & theMessage, +// OTPseudonym & theNym, +// OTServerContract & theServer, +// OTAccount * pAccount/*=NULL*/, +// lAmount +// OTAssetContract * pMyAssetType/*=NULL*/, +// OTAccount * pHisAcct/*=NULL*/, +// OTPseudonym * pHisNym/*=NULL*/) + + + // COMMANDS + + if( opt->getValue( 'w' ) != NULL || opt->getValue( "withdraw" ) != NULL ) + { + const long lAmount = atol(opt->getValue( 'w' )); + + OTLog::Output(0, "(User has instructed to withdraw cash...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeWithdrawal, theMessage, + *pMyNym, *pServerContract, + pMyAccount, lAmount)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing withdraw command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + else if( opt->getValue( 't' ) != NULL || opt->getValue( "transfer" ) != NULL ) + { + const long lAmount = atol(opt->getValue( 't' )); + + OTIdentifier HIS_ACCT_ID((str_HisAcct.size() > 0) ? str_HisAcct.c_str():"aaaaaaaa"); + + OTLog::Output(0, "User has instructed to send a Transfer command (Notarize Transactions)...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeTransfer, theMessage, + *pMyNym, *pServerContract, + pMyAccount, lAmount, NULL, // asset contract + NULL, // his Nym + (str_HisAcct.size() > 0) ? &HIS_ACCT_ID : NULL)) // his acct + { + bSendCommand = true; + } + else + OTLog::Error("Error processing notarizeTransactions (transfer) command in ProcessMessage.\n"); + } + else if( opt->getValue( 'c' ) != NULL || opt->getValue( "cheque" ) != NULL ) + { + OTLog::Output(0, "(User has instructed to write a cheque...)\n"); + + const long lAmount = atol(opt->getValue( 'c' )); + + OTIdentifier HIS_NYM_ID ((str_HisNym.size() > 0) ? str_HisNym.c_str():"aaaaaaaa"); // todo hardcoding + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::writeCheque, theMessage, + *pMyNym, *pServerContract, + pMyAccount, lAmount, NULL, // asset contract + (str_HisNym.size() > 0) ? &HIS_NYM_ID : NULL); + } + else if( opt->getValue( 'v' ) != NULL || opt->getValue( "voucher" ) != NULL ) + { + OTLog::Output(0, "(User has instructed to withdraw a voucher...)\n"); + + const long lAmount = atol(opt->getValue( 'v' )); + + OTIdentifier HIS_NYM_ID ((str_HisNym.size() > 0) ? str_HisNym.c_str():"aaaaaaaa"); + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::withdrawVoucher, theMessage, + *pMyNym, *pServerContract, + pMyAccount, lAmount, NULL, // asset contract + (str_HisNym.size() > 0) ? &HIS_NYM_ID : NULL)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing withdraw voucher command in ProcessMessage.\n"); + + } + + // make an offer and put it onto a market. + else if (opt->getValue( "marketoffer" ) != NULL) + { + OTLog::Output(0, "(User has instructed to send a marketOffer command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::marketOffer, theMessage, + *pMyNym, *pServerContract, + NULL)) // for now, keeping it simple. Can add options later. + { + bSendCommand = true; + } + else + OTLog::Error("Error processing marketOffer command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + + // ******************************************************** + /* + bool ProcessUserCommand(OT_CLIENT_CMD_TYPE requestedCommand, + OTMessage & theMessage, + OTPseudonym & theNym, +// OTAssetContract & theContract, + OTServerContract & theServer, + OTAccount * pAccount=NULL, + long lTransactionAmount = 0, + OTAssetContract * pMyAssetType=NULL, + OTIdentifier * pHisAcctID=NULL, + OTIdentifier * pHisNymID=NULL); + */ + else if(opt->getFlag( "proposepaymentplan" ) ) + { + OTLog::Output(0, "(User has instructed to propose a payment plan...)\n"); + + OTIdentifier HIS_NYM_ID ((str_HisNym.size() > 0) ? str_HisNym.c_str():"aaaaaaaa"); + OTIdentifier HIS_ACCT_ID((str_HisAcct.size() > 0) ? str_HisAcct.c_str():"aaaaaaaa"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::proposePaymentPlan, theMessage, + *pMyNym, *pServerContract, + pMyAccount, 0, pMyAssetContract, + (str_HisNym.size() > 0) ? &HIS_NYM_ID : NULL, + (str_HisAcct.size() > 0) ? &HIS_ACCT_ID : NULL + ); + } + // ------------------------------------------------------------------------ + else if(opt->getFlag( "confirmpaymentplan" ) ) + { + OTLog::Output(0, "(User has instructed to confirm a payment plan...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::confirmPaymentPlan, theMessage, + *pMyNym, *pServerContract, + NULL); // the account info is already on the plan, right? + } + // ------------------------------------------------------------------------ + else if(opt->getFlag( "activatepaymentplan" ) ) + { + OTLog::Output(0, "(User has instructed to activate a payment plan...)\n"); + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::paymentPlan, theMessage, + *pMyNym, *pServerContract, + pMyAccount)) // if user DOES specify an account (unnecessary) + { // then OT will verify that they match, and error otherwise. + bSendCommand = true; + } + else + OTLog::Error("Error processing activate payment plan command in ProcessMessage.\n"); + } + // ******************************************************* + + else if(opt->getFlag( "depositcheque" ) ) + { + OTLog::Output(0, "(User has instructed to deposit a cheque...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeCheque, theMessage, + *pMyNym, *pServerContract, + pMyAccount)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing deposit cheque command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + else if (opt->getFlag( "depositpurse" ) ) + { + OTLog::Output(0, "(User has instructed to deposit a cash purse...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizePurse, theMessage, + *pMyNym, *pServerContract, + pMyAccount, + 0, // amount (unused here) + pMyAssetContract)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing deposit purse command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + else if(opt->getFlag( "deposittokens" ) ) + { + OTLog::Output(0, "(User has instructed to deposit individual cash tokens...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeDeposit, theMessage, + *pMyNym, *pServerContract, + pMyAccount)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing deposit cash tokens command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + else if( opt->getFlag( 'i' ) || opt->getFlag( "inbox" ) ) + { + cout << "DISPLAY INBOX CONTENTS HERE... (When I code this. What can I say? Use the GUI.)" << endl ; + } + else if( opt->getFlag( 's' ) || opt->getFlag( "sign" )) + { + OTLog::Output(0, "(User has instructed to sign a contract...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::signContract, theMessage, + *pMyNym, *pServerContract, + NULL); + } + else if( opt->getFlag( 'p' ) || opt->getFlag( "purse" ) ) + { + cout << "User wants to display purse contents (not coded yet here.)" << endl ; + } + else if( opt->getFlag( "verify" ) ) + { + cout << "User wants to verify a signature on a contract (not coded yet here) " << endl ; + } + else if( opt->getFlag( "stat" ) ) + { + OTLog::Output(0, "User has instructed to display wallet contents...\n"); + + OTString strStat; + pWallet->DisplayStatistics(strStat); + OTLog::vOutput(0, "%s\n", strStat.Get()); + } + else if(opt->getFlag( 'b' ) || opt->getFlag( "balance" ) ) + { + OTLog::vOutput(0, "\n ACCT BALANCE (server-side): %ld\n\n", pMyAccount->GetBalance()); + + OTPurse * pPurse = g_OT_API.LoadPurse(theServerID, thePurseAssetTypeID, MY_NYM_ID); + OTCleanup thePurseAngel(pPurse); + if (NULL != pPurse) + OTLog::vOutput(0, " CASH PURSE (client-side): %ld\n", pPurse->GetTotalValue()); + } + else if( opt->getFlag( 'r' ) || opt->getFlag( "refresh" ) ) + { + OTLog::Output(0, "(User has instructed to download intermediary files for an asset account...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getAccount, theMessage, + *pMyNym, *pServerContract, + pMyAccount)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing getAccount command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + else if( opt->getFlag( "refreshnym" ) ) + { + OTLog::Output(0, "(User has instructed to download intermediary files for a Nym...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getNymbox, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::Error("Error processing getNymbox command in ProcessMessage.\n"); + // ------------------------------------------------------------------------ + } + + // ---------------------------------------------------------------------- + // + + const OTPseudonym * pServerNym = pServerContract->GetContractPublicNym(); + + if ((NULL == pServerNym) || (false == pServerNym->VerifyPseudonym())) + { + OTLog::vOutput(0, "The server Nym was NULL or failed to verify on contract: %s\n", + strServerID.Get()); + OT_Main_Cleanup(); + return 0; + } + // + // *********************************************************** + + + if (bSendCommand && pServerNym->VerifyPseudonym()) + { + OTString strEnvelopeContents(theMessage); + + OTEnvelope theEnvelope; + // Seal the string up into an encrypted Envelope + theEnvelope.Seal(*pServerNym, strEnvelopeContents); + + // ----------------------------------- + + OTASCIIArmor ascEnvelope(theEnvelope); // ascEnvelope now contains the base64-encoded string of the sealed envelope contents. + + if (ascEnvelope.Exists()) + { + zmq::socket_t socket(context, ZMQ_REQ); + + OTString strConnectPath; strConnectPath.Format("tcp://%s:%d", // todo stop hardcoding. + strServerHostname.Get(), nServerPort); + socket.connect(strConnectPath.Get()); + + + // -------------------------------- + + zmq::message_t request(ascEnvelope.GetLength()); + memcpy((void*)request.data(), ascEnvelope.Get(), ascEnvelope.GetLength()); + + int nSendTries = 0; + bool bSuccessSending = false; + + // If failure sending, re-tries 5 times GetLatencySendNoTries(), + // with 200 ms delay between each. (Maximum of 1 second.) + // + while ((nSendTries++ < /*5*/OTLog::GetLatencySendNoTries()) && + (false == (bSuccessSending = socket.send(request, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(/*200*/OTLog::GetLatencySendMs()); + + if (bSuccessSending) + { + //  Get the reply. + zmq::message_t reply; + + int nReceiveTries = 0; + bool bSuccessReceiving = false; + + // If failure receiving, re-tries 25 times, with 200 ms delay between each. (Maximum of 5 seconds.) + // + while ((nReceiveTries++ < /*25*/OTLog::GetLatencyReceiveNoTries()) && + (false == (bSuccessReceiving = socket.recv(&reply, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(/*200*/OTLog::GetLatencyReceiveMs()); + + if (bSuccessReceiving) + { + OTASCIIArmor ascServerReply; + ascServerReply.MemSet(static_cast(reply.data()), reply.size()); + + // -------------------------- + + OTString strServerReply; // Maybe should use g_OT_API.GetClient()->GetNym or some such... + OTEnvelope theServerEnvelope; + + if (theServerEnvelope.SetAsciiArmoredData(ascServerReply)) + { + bool bOpened = theServerEnvelope.Open(*pMyNym, strServerReply); + + OTMessage * pServerReply = new OTMessage; + OT_ASSERT(NULL != pServerReply); + + if (bOpened && strServerReply.Exists() && pServerReply->LoadContractFromString(strServerReply)) + { + // Now the fully-loaded message object (from the server, this time) can be processed by the OT library... + g_OT_API.GetClient()->ProcessServerReply(*pServerReply); // Client takes ownership and will handle cleanup. + } + else + { + delete pServerReply; + pServerReply = NULL; + OTLog::Error("Error loading server reply from string.\n"); + } + } + } + else + { + OTLog::Error("Failed trying to receive message from server.\n"); + } + } + else + { + OTLog::Error("Failed trying to send message to server.\n"); + } + } + } // if bSendCommand + + OT_Main_Cleanup(); + return 0; + } // Command line interface (versus below, which is the PROMPT interface.) + + // **************************************************************************** + + + + + + + + + + + + + + + // ----------------------------------------------------------------------- + // + // THE OPEN-TRANSACTIONS PROMPT + // + // OT> + // + // Basically, loop: + // + // 1) Present a prompt, and get a user string of input. Wait for that. + // + // 2) Process it out as an OTMessage to the server. It goes down the pipe. + // + // 3) Sleep for 1 second. + // + // 4) Awake and check for messages to be read in response from the server. + // Loop. As long as there are any responses there, then process and handle + // them all. + // Then continue back up to the prompt at step (1). + + + + OTPseudonym * pMyNym = NULL; + OTWallet * pWallet = NULL; + OTServerContract * pServerContract = NULL; + + // If we got down here, that means there were no commands on the command line + // (That's why we dropped into the OT prompt.) + // However, there still may have been OPTIONS -- and if so, we'll go ahead and + // load the wallet. (If there were NOT ANY OPTIONS, then we do NOT load the wallet, + // although there is a COMMAND for doing that.) + // + if ( (str_ServerID.size() > 0) || (str_MyNym.size() > 0) ) + { + if (false == SetupPointersForWalletMyNymAndServerContract(str_ServerID, str_MyNym, + pMyNym, pWallet, pServerContract)) + { + OT_Main_Cleanup(); + return 0; + } + } + else + OTLog::Output(0, "\nYou may wish to 'load' then 'stat'.\n" + "(FYI, --server SERVER_ID and --mynym NYM_ID were both valid options.)\n" + "Also, see: ~/.ot/command-line-ot.opt for defaults.\n"); + + // Below this point, pWallet is available and loaded, IF opt->HasOptions(). + // Otherwise, pWallet is NOT loaded, and we're waiting for the Load command. + + // Below this point, pMyNym MIGHT be a valid pointer (if it was specified), + // or MIGHT be NULL. Same with pServerContract. (MIGHT be there.) + // + // *********************************************************** + + char buf[200] = ""; + int retVal = 0; + + int nExpectResponse = 0; + + OTLog::vOutput(4, "Starting client loop.\n", OT_CMD_HEADER_SIZE); + + + // Set the logging level for the network transport code. +#ifndef _WIN32 +// XmlRpc::setVerbosity(1); +#endif + + + // ----------------------------------------------------------------------- + + for(;;) + { + buf[0] = 0; // Making it fresh again. + + nExpectResponse = 0; + + // 1) Present a prompt, and get a user string of input. Wait for that. + OTLog::Output(0, "\nOT> "); + + if (NULL == fgets(buf, 190, stdin)) // Leaving myself 10 extra bytes at the end for safety's sake. + break; + + OTLog::Output(0, ".\n..\n...\n....\n.....\n......\n.......\n........\n.........\n..........\n" + "...........\n............\n.............\n"); + + // so we can process the user input + std::string strLine = buf; + + // Load wallet.xml + if (strLine.compare(0,4,"load") == 0) + { + OTLog::Output(0, "User has instructed to load wallet.xml...\n"); + + if (false == SetupPointersForWalletMyNymAndServerContract(str_ServerID, str_MyNym, + pMyNym, pWallet, pServerContract)) + { + OT_Main_Cleanup(); + return 0; + } + + continue; + } + + else if ('\0' == buf[0]) + { + continue; + } + else if (strLine.compare(0,4,"test") == 0) + { + + // TODO: Make sure there's no issues with a known plaintext attack. + // (Not here, but I am doing a similar thing in OTASCIIArmor to maintain a minimum size, + // due to a bug in some other library that I can't recall at this time.) + // + const char * szBlah = "Transaction processor featuring Untraceable Digital Cash, " + "Anonymous Numbered Accounts, Triple-Signed Receipts, Basket Currencies, and Signed " + "XML Contracts. Also supports cheques, invoices, payment plans, markets with trades, " + "and other instruments... it's like PGP for Money.... Uses OpenSSL and Lucre blinded tokens.\n"; + + + OTASCIIArmor theArmoredText(szBlah); + + OTLog::vOutput(0, "Armored text:\n%s\n", theArmoredText.Get()); + + + OTString theFixedText(theArmoredText); + + OTLog::vOutput(0, "Uncompressed, etc text:\n%s\n", theFixedText.Get()); + + /* + OTIdentifier SERVER_ID; + OTString SERVER_NAME; + + OTServerContract * pServerContract = NULL; + + if (NULL == g_OT_API.GetWallet()) + { + OTLog::Output(0, "The wallet object is still NULL, somehow. Please load it.\n"); + continue; + } // Here, for testing, I'm just grabbing the first server in the wallet... + else if (false == g_OT_API.GetWallet()->GetServer(0, SERVER_ID, SERVER_NAME)) + { + OTLog::Output(0, "There are no server contracts in the wallet. Try 'load'.\n"); + continue; + } + + OTMessage theMessage; + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::checkServerID, theMessage, + *pMyNym, *(g_OT_API.GetWallet()->GetServerContract(SERVER_ID)), + NULL)) // NULL pAccount on this command. + { + OTString strEnvelopeContents(theMessage); + + OTEnvelope theEnvelope; + // Seal the string up into an encrypted Envelope + theEnvelope.Seal(*pMyNym, strEnvelopeContents); + + OTASCIIArmor ascEnvelope(theEnvelope); // ascEnvelope now contains the base64-encoded string of the sealed envelope contents. + + if (ascEnvelope.Exists()) + { + OTEnvelope theNewEnvelope(ascEnvelope); + OTString strDecodedText; + + theNewEnvelope.Open(*pMyNym, strDecodedText); + + OTLog::vOutput(0, "\n\nDECRYPTED TEXT:\n\n%s\n\n", strDecodedText.Get()); + } + } + */ + + + /* + OTData theData(szBlah, strlen(szBlah)+1); + +// OTString strBlah(szBlah); + OTASCIIArmor ascTest; + + ascTest.SetData(theData); + + OTLog::vOutput(0, "Armored version:\n\n%s\n", ascTest.Get()); + + OTData theTest; + + bool bSuccess = ascTest.GetData(theTest); + + OTLog::vOutput(0, "Status: %s \n", (bSuccess ? "TRUE" : "FALSE")); + */ + /*{ + OTDB::Storage * pStorage = OTDB::CreateStorageContext(OTDB::STORE_FILESYSTEM, OTDB::PACK_MESSAGE_PACK); + OT_ASSERT(NULL!=pStorage); + + bool bSuccessInit = pStorage->Init("/Users/au/Projects/Open-Transactions/testwallet/data_folder", "wallet.xml"); + + if (bSuccessInit) + { + { + std::string strContents("JUST TESTING OUT THE NEW MessagePack CODE!!!!"); + std::string strRetrieved(""); + bool bSuccessStore = pStorage->StoreString(strContents, "temp", "msgpack.tst"); + strRetrieved = pStorage->QueryString("temp", "msgpack.tst"); + OTLog::vOutput(0, "\nPACKED STRING: Success Store: %s\nQuery: %s\n", + bSuccessStore ? "TRUE" : "FALSE", strRetrieved.c_str()); + } + // -------------------------------------------------- + { + OTDB::BitcoinAcct * pAcct = dynamic_cast(pStorage->CreateObject(OTDB::STORED_OBJ_BITCOIN_ACCT)); + OT_ASSERT(NULL != pAcct); + + pAcct->acct_id = "jkhsdf987345kjhf8lkjhwef987345"; + pAcct->server_id = "87345kjhdfs987sfwertwelkj340598t"; + pAcct->bitcoin_acct_name = "Read-Only Label (Bitcoin Internal acct)"; + pAcct->gui_label = "Editable Label (Moneychanger)"; + + bool bSuccessStore = pStorage->StoreObject(*pAcct, "temp", "msgpack-obj.tst"); + + OTDB::BitcoinAcct * pAcct2 = + dynamic_cast(pStorage->QueryObject(OTDB::STORED_OBJ_BITCOIN_ACCT,"temp", "msgpack-obj.tst")); + OTLog::vOutput(0, "\nBITCOIN ACCOUNT: Success Store: %s\n Success Retrieved: %s\n Address: %s\n Name: %s\n Label: %s\n", + bSuccessStore ? "TRUE" : "FALSE", + (pAcct2 != NULL) ? "TRUE" : "FALSE", + (pAcct2 != NULL) ? pAcct->acct_id.c_str() : "FALSE", + (pAcct2 != NULL) ? pAcct->bitcoin_acct_name.c_str() : "FALSE", + (pAcct2 != NULL) ? pAcct->gui_label.c_str() : "FALSE"); + } + // -------------------------------------------------- + { + std::string strContents("THIS is a test of the PLAIN STRING system...\nAnd hopefully it will work :)\n"); + std::string strRetrieved(""); + bool bSuccessStore = pStorage->StorePlainString(strContents, "temp", "plaintext.txt"); + strRetrieved = pStorage->QueryPlainString("temp", "plaintext.txt"); + OTLog::vOutput(0, "\nPLAIN STRING: Success Store: %s\nQuery: %s\n", + bSuccessStore ? "TRUE" : "FALSE", strRetrieved.c_str()); + } + // -------------------------------------------------- + + + } + + delete pStorage; + }*/ + /*{ + OTDB::Storage * pStorage = OTDB::CreateStorageContext(OTDB::STORE_FILESYSTEM, OTDB::PACK_PROTOCOL_BUFFERS); + OT_ASSERT(NULL!=pStorage); + + bool bSuccessInit = pStorage->Init("/Users/au/Projects/Open-Transactions/testwallet/data_folder", "wallet.xml"); + + if (bSuccessInit) + { + + std::string strContents("JUST TESTING OUT THE NEW Protobuf CODE!!!!"); + std::string strRetrieved(""); + bool bSuccessStore = pStorage->StoreString(strContents, "temp", "protobuf.tst"); + strRetrieved = pStorage->QueryString("temp", "protobuf.tst"); + OTLog::vOutput(0, "--------------------- PROTOBUF BELOW -------------\n\n" + "PACKED STRING: Success Store: %s\nQuery: %s\n", + bSuccessStore ? "TRUE" : "FALSE", strRetrieved.c_str()); + + // -------------------------------------------------- + + OTDB::WalletData * pWallet = dynamic_cast(pStorage->CreateObject(OTDB::STORED_OBJ_WALLET_DATA)); + OT_ASSERT(NULL != pWallet); + + // -------------------------------------------------- + + OTDB::BitcoinAcct * pAcct = dynamic_cast(pStorage->CreateObject(OTDB::STORED_OBJ_BITCOIN_ACCT)); + OT_ASSERT(NULL != pAcct); + + pAcct->acct_id = "jkhsdf987345kjhf8lkjhwef987345"; + pAcct->server_id = "87345kjhdfs987sfwertwelkj340598t"; + pAcct->bitcoin_acct_name = "Read-Only Label (Bitcoin Internal acct)"; + pAcct->gui_label = "Editable Label (Moneychanger)"; + + pWallet->AddBitcoinAcct(*pAcct); // MAKES HIS OWN COPY... (make sure to delete mine.) + + bool bProtoStored = pStorage->StoreObject(*pWallet, "temp", "protobuf-obj.tst"); + + OTLog::vOutput(0, "Storing wallet: %s\n", (bProtoStored ? "SUCCESS" : "FAILURE")); + + // -------------------------- + + OTDB::WalletData * pWallet2 = dynamic_cast(pStorage->QueryObject(OTDB::STORED_OBJ_WALLET_DATA, "temp", "protobuf-obj.tst")); + OT_ASSERT(NULL != pWallet2); + + OTDB::BitcoinAcct * pAcct2 = pWallet2->GetBitcoinAcct(0); + OT_ASSERT(NULL != pAcct2); + + + OTLog::vOutput(0, "\nWALLET, w/ Bitcoin Acct INSIDE: Store: %s\n Success Retrieved: %s\n AcctID: %s\n Name: %s\n Label: %s\n", + bSuccessStore ? "TRUE" : "FALSE", + (pAcct2 != NULL) ? "TRUE" : "FALSE", + (pAcct2 != NULL) ? pAcct->acct_id.c_str() : "FALSE", + (pAcct2 != NULL) ? pAcct->bitcoin_acct_name.c_str() : "FALSE", + (pAcct2 != NULL) ? pAcct->gui_label.c_str() : "FALSE"); + + OTDB::Contact * pContact = NULL; + + OTDB::Storable * pStorable = pStorage->CreateObject(OTDB::STORED_OBJ_CONTACT); + + OT_ASSERT (NULL != pStorable); + + pContact = OTDB::Contact::ot_dynamic_cast(pStorable); + + OT_ASSERT (NULL != pContact); // Will Assert() out here if cast failed. + + OTLog::Output(0, "Dynamic cast success!\n"); + } + + delete pStorage; + }*/ + continue; + } + else if (strLine.compare(0,5,"clear") == 0) + { + if (NULL == pMyNym) + { + OTLog::Output(0, "No Nym yet available. Try 'load'.\n"); + continue; + } + + pMyNym->RemoveAllNumbers(); + + pMyNym->SaveSignedNymfile(*pMyNym); + + OTLog::Output(0, "Successfully removed all issued and transaction numbers. Saving nym...\n"); + continue; + } + + else if (strLine.compare(0,7,"decrypt") == 0) + { + if (NULL == pMyNym) + { + OTLog::Output(0, "No Nym yet available to decrypt with.\n"); + continue; + } + + OTLog::Output(0, "Enter text to be decrypted:\n> "); + + OTASCIIArmor theArmoredText; + char decode_buffer[200]; // Safe since we only read sizeof - 1 + + do { + decode_buffer[0] = 0; + if (NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) + { + theArmoredText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + } while (strlen(decode_buffer)>1); + + + OTEnvelope theEnvelope(theArmoredText); + OTString strDecodedText; + + theEnvelope.Open(*pMyNym, strDecodedText); + + OTLog::vOutput(0, "\n\nDECRYPTED TEXT:\n\n%s\n\n", strDecodedText.Get()); + + continue; + } + + else if (strLine.compare(0,6,"decode") == 0) + { + OTLog::Output(0, "Enter text to be decoded:\n> "); + + OTASCIIArmor theArmoredText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + if (NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) + { + theArmoredText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (strlen(decode_buffer)>1); + + OTString strDecodedText(theArmoredText); + + OTLog::vOutput(0, "\n\nDECODED TEXT:\n\n%s\n\n", strDecodedText.Get()); + + continue; + } + + else if (strLine.compare(0,6,"encode") == 0) + { + OTLog::Output(0, "Enter text to be ascii-encoded (terminate with ~ on a new line):\n> "); + + OTString strDecodedText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strDecodedText.Concatenate("%s", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTASCIIArmor theArmoredText(strDecodedText); + + OTLog::vOutput(0, "\n\nENCODED TEXT:\n\n%s\n\n", theArmoredText.Get()); + + continue; + } + + else if (strLine.compare(0,4,"hash") == 0) + { + OTLog::Output(0, "Enter text to be hashed (terminate with ~ on a new line):\n> "); + + OTString strDecodedText; + char decode_buffer[200]; // Safe since we only read sizeof - 1. + + do { + decode_buffer[0] = 0; + + if ((NULL != fgets(decode_buffer, sizeof(decode_buffer)-1, stdin)) && + (decode_buffer[0] != '~')) + { + strDecodedText.Concatenate("%s\n", decode_buffer); + OTLog::Output(0, "> "); + } + else + { + break; + } + + } while (decode_buffer[0] != '~'); + + OTIdentifier theIdentifier; + theIdentifier.CalculateDigest(strDecodedText); + + OTString strHash(theIdentifier); + + OTLog::vOutput(0, "\n\nMESSAGE DIGEST:\n\n%s\n\n", strHash.Get()); + + continue; + } + + else if (strLine.compare(0,4,"stat") == 0) + { + OTLog::Output(0, "User has instructed to display wallet contents...\n"); + + if (pWallet) + { + OTString strStat; + pWallet->DisplayStatistics(strStat); + OTLog::vOutput(0, "%s\n", strStat.Get()); + } + else + OTLog::Output(0, "No wallet is loaded...\n"); + + continue; + } + + else if (strLine.compare(0,4,"help") == 0) + { + OTLog::Output(0, "User has instructed to display the help file...\n"); + + OTString strRAWFileDefault, strFileDefault; + strRAWFileDefault.Format("%s%s%s", OT_FOLDER_DEFAULT, OTLog::PathSeparator(), OT_PROMPT_HELPFILE); + OTLog::TransformFilePath(strRAWFileDefault.Get(), strFileDefault); + + OTString strResult; + strResult.Format("more %s", strFileDefault.Get()); + system(strResult.Get()); // todo security audit this in case of security issues. + + continue; + } + + else if (strLine.compare(0,4,"quit") == 0) + { + OTLog::Output(0, "User has instructed to exit the wallet...\n"); + + break; + } + + + // ------------------------------------------------------------------------------ + + /* + --myacct (ACCT ID) + --mynym (NYM ID) + --mypurse (ASSET TYPE ID) + + --toacct (ACCT ID) + --tonym (NYM ID) + --topurse (ASSET TYPE ID) + + OTPseudonym * GetNymByIDPartialMatch(const std::string PARTIAL_ID); + OTServerContract * GetServerContractPartialMatch(const std::string PARTIAL_ID); + OTAssetContract * GetAssetContractPartialMatch(const std::string PARTIAL_ID); + OTAccount * GetAccountPartialMatch(const std::string PARTIAL_ID); + */ + + + if (NULL == pServerContract) + { + OTLog::Output(0, "Unable to find a server contract. Please restart using the option: --server SERVER_ID\n" + "(Where SERVER_ID is the server ID. Partial matches ARE accepted.)\n"); + continue; + } + + + // You can't just connect to any hostname and port. + // Instead, you give me the Server Contract, and *I'll* look up all that stuff FOR you... + // (We verify this up here, but use it at the bottom of the function once the message is set up.) + // + int nServerPort = 0; + OTString strServerHostname; + + if (false == pServerContract->GetConnectInfo(strServerHostname, nServerPort)) + { + OTLog::Error("Failed retrieving connection info from server contract.\n"); + continue; + } + + // ------------------------------------------------------------------------------ + + // I put this here too since I think it's required in all cases below. + // + if (NULL == pMyNym) // Todo maybe move this check to the commands below (ONLY the ones that use a nym.) + { + OTLog::Output(0, "Unable to find My Nym. Please restart and use the option:\n" + " --mynym USER_ID\n" + "(Where USER_ID is the Nym's ID. Partial matches ARE accepted.)\n"); + continue; + } + + // ------------------------------------------------------------------------------ + + bool bSendCommand = false; // Determines whether to actually send a message to the server. + + OTMessage theMessage; + + // If we can match the user's request to a client command, + // AND theClient object is able to process that request into + // theMessage, then we send it down the pipe. + + // ******************************************************************************* + + + // In lieu of maintaining a constant connection to the server, in RPC mode, the + // client updates its internal "connection" object to make sure the right pointers + // are in place (since in RPC mode, each message could be from a different nym + // and to a different server.) + // + g_OT_API.GetClient()->SetFocusToServerAndNym(*pServerContract, *pMyNym, &OT_API::TransportCallback); + // NOTE -- This MAY be unnecessary for ProcessUserCommand (since these args are passed + // in there already) but it's definitely necessary soon after for ProcessServerReply() + // (which comes next.) + + // ------------------------------------------------------------------------- + + // 'check server ID' command + if (buf[0] == 'c') + { + OTLog::vOutput(0, "(User has instructed to send a checkServerID command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::checkServerID, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command (so far). + { + bSendCommand = true; + } + else + OTLog::vError("Error processing checkServerID command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // register new user account + else if (buf[0] == 'r') + { + OTLog::Output(0, "(User has instructed to send a createUserAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::createUserAccount, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing createUserAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // ALL MESSAGES BELOW THIS POINT SHOULD ATTACH A REQUEST NUMBER IF THEY EXPECT THE SERVER TO PROCESS THEM. + // (Handled inside ProcessUserCommand) + + // checkUser + else if (buf[0] == 'u') + { + OTLog::Output(0, "(User has instructed to send a checkUser command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::checkUser, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing checkUser command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // register new asset account + else if (buf[0] == 'a') + { + OTLog::Output(0, "(User has instructed to send a createAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::createAccount, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing createAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // issue a new asset type + else if (!strcmp(buf, "issue\n")) + { + OTLog::Output(0, "(User has instructed to send an issueAssetType command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::issueAssetType, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing issueAssetType command in ProcessMessage: %s\n", buf); + // ------------------------------------------------------------------------ + } + + // issue a new basket asset type + else if (!strcmp(buf, "basket\n")) + { + OTLog::Output(0, "(User has instructed to send an issueBasket command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::issueBasket, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing issueBasket command in ProcessMessage: %s\n", buf); + // ------------------------------------------------------------------------ + } + + // exchange in/out of a basket currency + else if (!strcmp(buf, "exchange\n")) + { + OTLog::Output(0, "(User has instructed to send an exchangeBasket command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::exchangeBasket, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing exchangeBasket command in ProcessMessage: %s\n", buf); + // ------------------------------------------------------------------------ + } + + // make an offer and put it onto a market. + else if (!strcmp(buf, "offer\n")) + { + OTLog::Output(0, "(User has instructed to send a marketOffer command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::marketOffer, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing marketOffer command in ProcessMessage: %s\n", buf); + // ------------------------------------------------------------------------ + } + + // Set a Server Contract's client-side name (merely a label.) + else if (!strcmp(buf, "setservername\n")) + { + OTLog::Output(0, "(User wants to set a Server Contract's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::setServerName, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message needed. Local data only. + } + // ------------------------------------------------------------------------ + } + + // Set an Asset Contract's client-side name (merely a label.) + else if (!strcmp(buf, "setassetname\n")) + { + OTLog::Output(0, "(User wants to set an Asset Contract's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::setAssetName, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message needed. Local data only. + } + // ------------------------------------------------------------------------ + } + + // Set a Nym's client-side name (merely a label.) + else if (!strcmp(buf, "setnymname\n")) + { + OTLog::Output(0, "(User wants to set a Nym's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::setNymName, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message needed. Local data only. + } + // ------------------------------------------------------------------------ + } + + // Set an Asset Account's client-side name (merely a label.) + else if (!strcmp(buf, "setaccountname\n")) + { + OTLog::Output(0, "(User wants to set an Asset Account's client-side name...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::setAccountName, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + // bSendCommand = true; // No message needed. Local data only. + } + + // ------------------------------------------------------------------------ + } + + // sendUserMessage + else if (buf[0] == 's') + { + OTLog::Output(0, "(User has instructed to send a sendUserMessage command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::sendUserMessage, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing sendUserMessage command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + + // get nymbox + else if (buf[0] == 'y') + { + OTLog::Output(0, "(User has instructed to send a getNymbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getNymbox, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getNymbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get inbox + else if (buf[0] == 'i') + { + OTLog::Output(0, "(User has instructed to send a getInbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getInbox, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getInbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get outbox + else if (buf[0] == 'o') + { + OTLog::Output(0, "(User has instructed to send a getOutbox command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getOutbox, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getOutbox command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // deposit cheque + else if (buf[0] == 'q') + { + OTLog::Output(0, "User has instructed to deposit a cheque...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeCheque, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::vError("Error processing deposit cheque command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // deposit purse + else if (buf[0] == 'p') + { + OTLog::Output(0, "(User has instructed to deposit a purse containing cash...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizePurse, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::vError("Error processing deposit command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // deposit tokens + else if (buf[0] == 'd') + { + OTLog::Output(0, "(User has instructed to deposit cash tokens...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeDeposit, theMessage, + *pMyNym, *pServerContract, + NULL)) + { + bSendCommand = true; + } + else + OTLog::vError("Error processing deposit command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // withdraw voucher + else if (buf[0] == 'v') + { + OTLog::Output(0, "User has instructed to withdraw a voucher (like a cashier's cheque)...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::withdrawVoucher, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing withdraw voucher command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // withdraw cash + else if (buf[0] == 'w') + { + OTLog::Output(0, "(User has instructed to withdraw cash...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeWithdrawal, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing withdraw command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // activate payment plan + else if (!strcmp(buf, "activate\n")) + { + OTLog::Output(0, "User has instructed to activate a payment plan...\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::paymentPlan, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing payment plan command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get account + else if (!strcmp(buf, "get\n")) + { + OTLog::Output(0, "(User has instructed to send a getAccount command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getAccount, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getAccount command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // get contract + else if (!strcmp(buf, "getcontract\n")) + { + OTLog::Output(0, "(User has instructed to send a getContract command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getContract, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getContract command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // ------------------------------------------------------------------------ + + else if (!strcmp(buf, "propose\n")) + { + OTLog::Output(0, "(User has instructed to propose a payment plan...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::proposePaymentPlan, theMessage, + *pMyNym, *pServerContract, + NULL); // User owns Merchant (recipient) account + continue; + } + + else if (!strcmp(buf, "confirm\n")) + { + OTLog::Output(0, "(User has instructed to confirm a payment plan...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::confirmPaymentPlan, theMessage, + *pMyNym, *pServerContract, + NULL); // the account info is already on the plan, right? + continue; + } + + // ------------------------------------------------------------------------ + + else if (!strcmp(buf, "cheque\n")) + { + OTLog::Output(0, "(User has instructed to write a cheque...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::writeCheque, theMessage, + *pMyNym, *pServerContract, + NULL); // It will ascertain the account inside the call. + continue; + } + + // sign contract + // This doesn't message the server, but it DOES require the user's Nym to be loaded. + else if (!strcmp(buf, "signcontract\n")) + { + OTLog::Output(0, "(User has instructed to sign a contract...)\n"); + + g_OT_API.GetClient()->ProcessUserCommand(OTClient::signContract, theMessage, + *pMyNym, *pServerContract, + NULL); + continue; + } + + // get mint + else if (!strcmp(buf, "getmint\n")) + { + OTLog::Output(0, "(User has instructed to send a getMint command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getMint, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getMint command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // notarize transfer + else if (buf[0] == 't') + { + OTLog::Output(0, "(User has instructed to send a Transfer command (Notarize Transactions) to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::notarizeTransfer, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing notarizeTransactions command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // getRequest + else if (buf[0] == 'g') + { + OTLog::Output(0, "(User has instructed to send a getRequest command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getRequest, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getRequest command in ProcessMessage: %c\n", buf[0]); + // ------------------------------------------------------------------------ + } + + // getTransactionNum + else if (buf[0] == 'n') + { + // I just coded (here) for myself a secret option (for testing)... + // Optionally instead of JUST 'n', I can put n , (without brackets) and + // this code will add that number to my list of issued and transaction numbers. + // I already have the ability to clear the list, so now I can add numbers to it as well. + // (Which adds to both lists.) + // I can also remove a number from the transaction list but LEAVE it on the issued list, + // for example by writing a cheque and throwing it away. + // + // This code is for testing and allows me to find and patch any problems without + // having to re-create my data each time -- speeds up debugging. + // + long lTransactionNumber = ((strlen(buf) > 2) ? atol(&(buf[2])) : 0); + + if (lTransactionNumber > 0) + { + OTString strServerID; + pServerContract->GetIdentifier(strServerID); + + pMyNym->AddTransactionNum(*pMyNym, strServerID, lTransactionNumber, true); // bool bSave=true + + OTLog::vOutput(0, "Transaction number %ld added to both lists (on client side.)\n", + lTransactionNumber); + } + + else + { + OTLog::Output(0, "(User has instructed to send a getTransactionNum command to the server...)\n"); + + // ------------------------------------------------------------------------------ + // if successful setting up the command payload... + + if (g_OT_API.GetClient()->ProcessUserCommand(OTClient::getTransactionNum, theMessage, + *pMyNym, *pServerContract, + NULL)) // NULL pAccount on this command. + { + bSendCommand = true; + } + else + OTLog::vError("Error processing getTransactionNum command in ProcessMessage: %c\n", buf[0]); + } + + // ------------------------------------------------------------------------ + } + + else + { + if( 1 ) + { + //gDebugLog.Write("unknown user command in ProcessMessage in main.cpp"); + OTLog::Output(0, "\n"); + // OTLog::vError( "unknown user command in ProcessMessage in main.cpp: %d\n", buf[0]); + } + continue; + } + + + // ************************************************************************ + + + const OTPseudonym * pServerNym = pServerContract->GetContractPublicNym(); + +// OTString strExtra1("TESTPUBKEYCLI.txt"), strExtra2(*pServerContract); + +// (const_cast(pServerNym))->SavePublicKey(strExtra1); + + if (bSendCommand && (NULL != pServerNym) && pServerNym->VerifyPseudonym()) + { + OTString strEnvelopeContents(theMessage), strEnvelopeContents2(theMessage); + // Save the ready-to-go message into a string. +// theMessage.SaveContract(strEnvelopeContents); + + OTEnvelope theEnvelope;//, theEnvelope2; + // Seal the string up into an encrypted Envelope + theEnvelope.Seal(*pServerNym, strEnvelopeContents); +// theEnvelope2.Seal(*pMyNym, strEnvelopeContents2); + + // ----------------------------------- + + OTASCIIArmor ascEnvelope(theEnvelope); // ascEnvelope now contains the base64-encoded string of the sealed envelope contents. +// OTASCIIArmor ascEnvelope2(theEnvelope2); + + if (ascEnvelope.Exists()) + { +// OTLog::vError("DEBUG Envelope addressed to Nym ID: %s. Contents: \n%s\n Size: %ld, Nym: \n%s\n Server Contract:\n%s\n", +// theIDString.Get(), ascEnvelope.Get(),ascEnvelope.GetLength(), strExtra1.Get(), strExtra2.Get()); +// +// OTEnvelope theTestEnvelope(ascEnvelope2); +// OTString strTestOutput2; +// bool bOpened2 = theTestEnvelope.Open(*pMyNym, strTestOutput2); +// +// OTLog::vError("DEBUG Opening a similar envelope... Contents: \n%s\n", strTestOutput2.Get()); + + + zmq::socket_t socket(context, ZMQ_REQ); + + OTString strConnectPath; strConnectPath.Format("tcp://%s:%d", strServerHostname.Get(), nServerPort); + socket.connect(strConnectPath.Get()); + + // -------------------------------- +// OTPayload thePayload; +// bool bSetEnvelope = thePayload.SetEnvelope(theEnvelope); + +// bool GetEnvelope(OTEnvelope & theEnvelope) const; // Envelope retrieved from payload. +// bool SetEnvelope(const OTEnvelope & theEnvelope); // Envelope copied into payload to prepare for sending. + + + zmq::message_t request(ascEnvelope.GetLength()); + memcpy((void*)request.data(), ascEnvelope.Get(), ascEnvelope.GetLength()); + + int nSendTries = 0; + bool bSuccessSending = false; + + // If failure sending, re-tries 5 times, with 200 ms delay between each. (Maximum of 1 second.) + // + while ((nSendTries++ < 5) && (false == (bSuccessSending = socket.send(request, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(200); // todo stop hardcoding. (For now I needed non-blocking so this is much better than before.) + + // Here's our connection... +//#if defined (linux) +// XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort, 0); // serverhost, port. +//#elif defined (_WIN32) +// XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort, "fellowtraveler"); // serverhost, port, value that crashes if NULL. +//#else +// XmlRpcClient theXmlRpcClient(strServerHostname.Get(), nServerPort); // serverhost, port. +//#endif + + // ----------------------------------------------------------- + // + // Call the OT_XML_RPC method (thus passing the message to the server.) + // +// XmlRpcValue oneArg, result; // oneArg contains the outgoing message; result will contain the server reply. +// oneArg[0] = ascEnvelope.Get(); // Here's where I set the envelope string, as the only argument for the rpc call. +// +// if (theXmlRpcClient.execute("OT_XML_RPC", oneArg, result)) // The actual call to the server. (Hope my envelope string isn't too long for this...) + + if (bSuccessSending) + { + //  Get the reply. + zmq::message_t reply; + + int nReceiveTries = 0; + bool bSuccessReceiving = false; + + // If failure receiving, re-tries 25 times, with 200 ms delay between each. (Maximum of 5 seconds.) + // + while ((nReceiveTries++ < 25) && (false == (bSuccessReceiving = socket.recv(&reply, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(200); // todo stop hardcoding. (And probably change how I send/receive, but for now I needed non-blocking...) + +// std::string str_Result; +// str_Result.reserve(reply.size()); +// str_Result.append(static_cast(reply.data()), reply.size()); + + if (bSuccessReceiving) + { + OTASCIIArmor ascServerReply; + ascServerReply.MemSet(static_cast(reply.data()), reply.size()); + +// OTPayload theRecvPayload; +// theRecvPayload.SetPayloadSize(reply.size()); +// memcpy((void*)theRecvPayload.GetPayloadPointer(), reply.data(), reply.size()); + + // -------------------------- + + OTString strServerReply; // Maybe should use g_OT_API.GetClient()->GetNym or some such... + OTEnvelope theServerEnvelope; + + if (theServerEnvelope.SetAsciiArmoredData(ascServerReply)) + { + bool bOpened = theServerEnvelope.Open(*pMyNym, strServerReply); + + OTMessage * pServerReply = new OTMessage; + OT_ASSERT(NULL != pServerReply); + + if (bOpened && strServerReply.Exists() && pServerReply->LoadContractFromString(strServerReply)) + { + // Now the fully-loaded message object (from the server, this time) can be processed by the OT library... + g_OT_API.GetClient()->ProcessServerReply(*pServerReply); // Client takes ownership and will handle cleanup. + } + else + { + delete pServerReply; + pServerReply = NULL; + OTLog::Error("Error loading server reply from string.\n"); + } + } + } + else + { + OTLog::Error("Failed trying to receive message from server.\n"); + } + } + else + { + OTLog::Error("Failed trying to send message to server.\n"); + } + } + } // if bSendCommand + } // for + + // ----------------------------------------------------------- + + + OTLog::Output(0, "Exiting OT prompt.\n"); + + OT_Main_Cleanup(); + + return 0; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/transaction/Makefile b/transaction/Makefile new file mode 100644 index 000000000..00289016c --- /dev/null +++ b/transaction/Makefile @@ -0,0 +1,321 @@ +# +# Open-Transactions server +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = transaction.exe + +DEBUG_PROGRAM = transaction.debug + + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := ___OT_PLATFORM_UNKNOWN___ + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + + + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + +PLATFORM = $(OT_PLATFORM) +# --------------------------------------------------------------------- + + +OT_INCLUDEDIRS = \ + -I../OTLib/irrxml \ + -I../OTLib \ + -I./SSL-Example \ + -I../OTLib/simpleini \ + -I. + + +OT_LIBDIRS = \ + -L../OTLib + + +API_CSOURCES = SSL-Example/SFSocket.c +API_CXXSOURCES = # empty +API_CFLAGS = # empty +API_LDFLAGS = # empty + + +C_COMPILER = cc + +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +API_LIBS = -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack -lzmq -lOTLibd +# +# FT: I tested this. The above version worked on Linux, and the below version did not. +# +#API_LIBS = -lssl -lcrypto -lOTLib +#API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd + + + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +endif + +# --------------------------------------------------------------------- +# SSL Folders! + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +PLATFORM_LIBDIRS = -L../openssl +PLATFORM_INCLUDEDIRS = -I../openssl/include +else +PLATFORM_LIBDIRS = #empty +PLATFORM_INCLUDEDIRS = #empty +endif + +# --------------------------------------------------------------------- + + +# +# Eventually more platform stuff can go below here, like 64-bit, etc. +# +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +endif +# End DARWIN ------------------------------------------------------------- + + + +ifeq ($(PLATFORM), linux) +API_LDFLAGS += -ldl +C_COMPILER = gcc +endif +# End LINUX ------------------------------------------------------------- + + + + +# --- FreeBSD ---- + +ifeq ($(PLATFORM), freebsd) +endif +# End FreeBSD ------------------------------------------------------------- + + + + + +# --------------------------------------------------------------------- + +# --- TRANSPORT + +# This is not a target, but a command-line option. +# +# So you have to do: make PLATFORM=linux TRANSPORT=ZMQ +# OR: make PLATFORM=darwin TRANSPORT=ZMQ debug +# OR: make PLATFORM=freebsd TRANSPORT=ZMQ +# Etc... +# + +#XMLRPCPP_INCLUDEDIR = -I../xmlrpcpp/src +#XMLRPCPP_LIBDIR = -L../xmlrpcpp/ + +ifeq ($(TRANSPORT), ZMQ) +API_CFLAGS += -DOT_ZMQ_MODE +#API_LDFLAGS += -lXmlRpc +#PLATFORM_INCLUDEDIRS += $(XMLRPCPP_INCLUDEDIR) +#PLATFORM_LIBDIRS += $(XMLRPCPP_LIBDIR) +API_CXXSOURCES += xmlrpcxx_server.cpp +else +API_CXXSOURCES += testserver.cpp +endif + + + +INCLUDEDIRS = $(PLATFORM_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) + +LIBDIRS = $(PLATFORM_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + + +CSOURCES = $(API_CSOURCES) + + +CXXSOURCES = \ + OTClientConnection.cpp \ + OTServer.cpp \ + $(API_CXXSOURCES) + + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +COBJECTS = $(CSOURCES:.c=.o) +CFLAGS = $(INCLUDEDIRS) $(API_CFLAGS) $(FT_FLAGS) -c +DEBUG_FLAGS = -g +CXX = g++ +CC = $(C_COMPILER) + +LIBS = $(API_LIBS) +DEBUG_LIBS = $(API_DEBUG_LIBS) + + +# --- LDFLAGS +# +LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(DEBUG_LIBS) + + + +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +LINK_COMMAND = $(CXX) $(LDFLAGS) -o $(PROGRAM) $(CXXOBJECTS) $(COBJECTS) +DEBUG_LINK_COMMAND = $(CXX) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) $(CXXOBJECTS) $(COBJECTS) +endif +# End DARWIN ------------------------------------------------------------- + +ifeq ($(PLATFORM), linux) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End LINUX ------------------------------------------------------------- + +# --- FreeBSD ---- +ifeq ($(PLATFORM), freebsd) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(COBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End FreeBSD ------------------------------------------------------------- + + + + + +# --------------------------------------------------------------------- + +# --- TARGETS + +# +# Default target: the first target is the default target. +# Just type "make PLATFORM=darwin" to build it. +# + +$(PROGRAM): $(CXXOBJECTS) $(COBJECTS) + $(LINK_COMMAND) + +all: $(PROGRAM) + +debug: CFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + $(DEBUG_LINK_COMMAND) + + +# --------------------------------------------------------------------- + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + + +SSL-Example/SFSocket.o: ./SSL-Example/SFSocket.c ./SSL-Example/SFSocket.h + $(CC) $(CFLAGS) -o ./SSL-Example/SFSocket.o ./SSL-Example/SFSocket.c + +OTServer.o: OTServer.cpp OTServer.h + $(CXX) $(CFLAGS) -o OTServer.o OTServer.cpp +OTClientConnection.o: OTClientConnection.cpp OTClientConnection.h + $(CXX) $(CFLAGS) -o OTClientConnection.o OTClientConnection.cpp + +testserver.o: testserver.cpp + $(CXX) $(CFLAGS) -o testserver.o testserver.cpp +xmlrpcxx_server.o: xmlrpcxx_server.cpp + $(CXX) $(CFLAGS) -o xmlrpcxx_server.o xmlrpcxx_server.cpp + + +# +# Clean target: "make -f Makefile.Linux clean" to remove unwanted objects and executables. +# + +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(COBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) + + diff --git a/transaction/OTClientConnection.cpp b/transaction/OTClientConnection.cpp new file mode 100644 index 000000000..3d3df9f3f --- /dev/null +++ b/transaction/OTClientConnection.cpp @@ -0,0 +1,862 @@ +/************************************************************************************ + * + * OTCLientConnection.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include + + +extern "C" +{ +#ifdef _WIN32 +#include +#define strcasecmp _stricmp +#else +#include +#endif + +#include "SSL-Example/SFSocket.h" +} + +#include "OTStorage.h" + +#include "main.h" +#include "OTDataCheck.h" +#include "OTEnvelope.h" +#include "OTClientConnection.h" +#include "OTServer.h" +#include "OTAsymmetricKey.h" + + +#include "OTPayload.h" +#include "OTLog.h" + + +/* + union u_header + { + BYTE buf[OT_CMD_HEADER_SIZE]; + struct { + BYTE type_id; // 1 byte + BYTE command_id; // 1 byte + BYTE filler[2]; + uint32_t size; // 4 bytes to describe size of payload + BYTE checksum; // 1 byte + } fields; // total of 9 bytes + }; + */ + + + +void SetupHeader( union u_header * pCMD, int nTypeID, int nCmdID, OTPayload & thePayload) +{ + pCMD->fields.type_id = nTypeID; + pCMD->fields.command_id = nCmdID; +// pCMD->fields.size = thePayload.GetSize(); + pCMD->fields.size = htonl(thePayload.GetSize()); // think this is causing problems + pCMD->fields.checksum = CalcChecksum(pCMD->buf, OT_CMD_HEADER_SIZE-1); + + BYTE byChecksum = (BYTE)pCMD->fields.checksum; + int nChecksum = byChecksum; + + uint32_t nTemp = thePayload.GetSize(); + OTLog::vOutput(4, "(Payload size %d, TYPE %d command, checksum: %d...)\n", nTemp, nTypeID, nChecksum); +} + + + +/* +void OTClientConnection::ProcessBuffer() +{ + int err, nread; + union u_header theCMD; + + // clear the header object. + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + // Read the header + for (nread = 0; nread < OT_CMD_HEADER_SIZE; nread += err) + { + err = SFSocketRead(m_pSocket, + theCMD.buf + nread, OT_CMD_HEADER_SIZE - nread); + if (err <= 0) + { + break; + } + else { + OTLog::Output(2, "Reading input from socket...\n"); + } + + } + + if (nread) + { + OTLog::vOutput(4, "\n===> Processing header from client message. First 5 bytes are: %d %d %d %d %d...\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4]); + + // When the server knows for SURE it is receiving a message, + // then wait for 1 second to make sure we have the entire payload + // at once. + // TODO: rewrite socket code so that if a complete command has not yet + // come in, to buffer the data and wait until next time around the loop. + // Because right now, if you have a partial command, it reads it as an error + // and returns, discarding what had already been read. Obviously that will + // not work for a real server. + // In the meantime, this sleep allows me to do testing by insuring that, + // with a second's wait, the server will have time to read the entire message. + sleep(1); + + ProcessMessage(theCMD); + } +} +*/ + +/* + + union u_header + { + BYTE buf[OT_CMD_HEADER_SIZE]; + + struct + { + unsigned char type_id; // 1 byte + unsigned char command_id; // 1 byte + BYTE filler[2]; + uint32_t size; // 4 bytes to describe size of payload + unsigned char checksum; // 1 byte + + } fields; // total of 9 bytes + } + */ + + + +void OTClientConnection::ProcessBuffer() +{ + if (!m_bHaveHeader) + { + int err = 0, nread = 0; + union u_header theCMD; + + // clear the header object. + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + // Read the header + for (nread = 0; nread < OT_CMD_HEADER_SIZE; nread += err) + { + err = SFSocketRead(m_pSocket, + theCMD.buf + nread, OT_CMD_HEADER_SIZE - nread); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 is a disconnect. error is error. otherwise err contains bytes read. +#else + if (err <= 0) +#endif + { + break; + } + else { + OTLog::Output(2, "Reading input from socket...\n"); + } + } + + if (nread == OT_CMD_HEADER_SIZE) + { + uint32_t lOldSize = theCMD.fields.size; + uint32_t lSize = ntohl(lOldSize); // think this might be causing some problems... maybe not. + theCMD.fields.size = lSize; // fix the byte order. + + m_CMD = theCMD; // grab a copy of the header + m_bHaveHeader = true; // We need to remember that we are now in "header mode" + + int nChecksum = theCMD.fields.checksum; + + OTLog::vOutput(2, "\n************************************************************\n===> Reading header from client message.\n" + "First 9 bytes are: %d %d %d %d %d %d %d %d %d.\nSize is: %d...\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4], + theCMD.buf[5], theCMD.buf[6], theCMD.buf[7], theCMD.buf[8], lSize); + + OTLog::vOutput(2, "\nCMD HEADER: CMD TYPE: %d -- CMD NUM: %d\n" + "PAYLOAD SIZE: %d -- CHECKSUM: %d\n", theCMD.fields.type_id, + theCMD.fields.command_id, lSize, nChecksum); + + ReadBytesIntoBuffer(); + + // When the server knows for SURE it is receiving a message, + // then wait for 1 second to make sure we have the entire payload + // at once. + // TODO: rewrite socket code so that if a complete command has not yet + // come in, to buffer the data and wait until next time around the loop. + // Because right now, if you have a partial command, it reads it as an error + // and returns, discarding what had already been read. Obviously that will + // not work for a real server. + // In the meantime, this sleep allows me to do testing by insuring that, + // with a second's wait, the server will have time to read the entire message. + // sleep(1); + + // ProcessMessage(theCMD); + } + } + else { + // If we've finally read enough into our buffer to process the entire mesage, then process it. + if (m_Buffer.GetSize() >= m_CMD.fields.size) + { + ProcessMessage(m_CMD); + m_bHaveHeader = false; + } // otherwise if we haven't read enough, just read a bit more and wait until next time. + else + ReadBytesIntoBuffer(); + } + +} + +// We'll buffer 8K at a time for each user. +// It's smart enough not to read more data than required for the message payload. +// After that it would just start eating into the next header - so it stops. +void OTClientConnection::ReadBytesIntoBuffer() +{ + // At this point, the checksum has already validated. + // Might as well get the PAYLOAD next. + int err = 0; + uint32_t nread = 0; + + const int nBufferSize = 8192; // todo no hardcoding. + unsigned char szBuffer[8300]; // I made this a little bigger just for safety reasons. + + memset(szBuffer, 0, 8299); // just in case. + + //ultimately we want to read until m_Buffer.GetSize equals m_CMD.fields.size + // In this function we'll read up to that or 8192, whichever is smaller. + uint32_t lNumberOfBytesRemaining = m_CMD.fields.size - m_Buffer.GetSize(); + uint32_t nNumberOfBytesToRead = ((lNumberOfBytesRemaining > nBufferSize) ? nBufferSize : lNumberOfBytesRemaining); + + // actually read the payload from the socket into the buffer. + for (nread = 0; nread < nNumberOfBytesToRead; nread += err) + { + err = SFSocketRead(m_pSocket, + szBuffer + nread, + nNumberOfBytesToRead - nread); + + // if we don't read anything more, stop reading and move on +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 means disconnect. error means error. >0 means bytes read. +#else + if (err <= 0) +#endif + break; + } + + // If we read anything, up to 4K, we add it to the m_Buffer. + // This continues happening until m_Buffer.GetSize() == m_CMD.fields.size + // and then other code reads the message from the buffer and processes it. + if (nread) + { + OTData toAddData(szBuffer, nread); + m_Buffer += toAddData; + } +} + + +// If a valid header is received, this function gets called. +// The job of this function is to creae the message, read it, and add it to m_listIn. +// ...and also, if there are unexpected bytes, to flush them in anticipation of the +// next valid message. +void OTClientConnection::ProcessMessage(u_header & theCMD) +{ + bool bSuccess = false; + + OTMessage * pMsg = NULL; + + if ( theCMD.fields.type_id == CMD_TYPE_1 ) + { + OTLog::Output(2, "Received a Type 1 Command...\n"); + + if( IsChecksumValid( theCMD.buf, OT_CMD_HEADER_SIZE ) ) + { + OTLog::Output(2, "Checksum is valid! Processing payload.\n"); + + pMsg = new OTMessage; + + if (ProcessType1Cmd(theCMD, *pMsg )) + { + AddToInputList(*pMsg); + bSuccess = true; + } + else { + delete pMsg; + pMsg = NULL; + } + } + else + { + //gDebugLog.Write("Invalid checksum - Type 1 Command"); + OTLog::vError("Invalid checksum - Type 1 Command, header size: %d\n", OT_CMD_HEADER_SIZE); + } + } + else + { + //gDebugLog.Write("Unknown command type"); + int nCommandType = theCMD.fields.type_id; + OTLog::vError("Unknown command type: %d\n", nCommandType); + } + + + // I added this for error correction. In the event that there are errors, + // just clean out whatever is in the pipe and throw it away. + // Should probably send an Error message back, as well. + if (bSuccess == false) + { + int err = 0, nread = 0; + + char buffer[1024]; + int sizeJunkData = 1024; + + while (1) + { + err = SFSocketRead(m_pSocket, buffer, sizeJunkData); + + if (err > 0) + nread += err; + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 means disconnect. error means error. >0 means bytes read. +#else + if (err <= 0) +#endif + break; + } + + OTLog::vError("Transmission error--%d bytes flushed.\n", nread); + + // we are buffering data from the pipe now, so if we flush the pipe, we + // should flush the buffer too. + m_Buffer.Release(); + } + else + { + // TODO still need to process the commands and send the replies somewhere... + //if (bSuccess = theServer.ProcessUserCommand(theMessage, theReply)) + //{ + // OTLog::vOutput(4, "Successfully processed user command: %s\n", theMessage.m_strCommand.Get()); +// ProcessReply(ssl, theReply); +// } +// else +// { +// OTLog::vError("Unable to process user command in XML, or missing payload, in ProcessMessage.\n"); +// } + } +} + + + +// A certain number of bytes are expected in the payload, according to the header. +// This function tries to read that many bytes, and inserts them into an OTPayload object. +// From there, a simple method call extracts the message, we return true, and the message +// gets added to our internal list for processing. +bool OTClientConnection::ProcessType1Cmd(u_header & theCMD, OTMessage & theMessage) +{ + // At this point, the checksum has already validated. + // Might as well get the PAYLOAD next. +// int err; + uint32_t nread, lSize = theCMD.fields.size; + + // Make sure our byte-order is correct here. +// theCMD.fields.size = ntohl(theCMD.fields.size); // I was doing this twice!! This is already done when the header is first read. + + // setup the buffer we are reading into + OTPayload thePayload; + nread = thePayload.ReadBytesFrom(m_Buffer, lSize); + + /* + // actually read the payload from the socket into the buffer. + for (nread = 0; nread < theCMD.fields.size; nread += err) + { + err = SFSocketRead(m_pSocket, + (unsigned char *)thePayload.GetPayloadPointer() + nread, + theCMD.fields.size - nread); + + // if we don't read anything more, stop reading and move on + if (err <= 0) + break; + } + */ + // TODO fix the buffering so that if a complete command has not yet been received, it saves the other + // bytes instead of discarding them. For now I'll just sleep for a second to make sure the entire command + // was received. +// sleep(1); + + // ------------------------------------------------------------ + + // Try to interpret the command number. + // Right now we support signed messages and encrypted envelopes containing + // signed messages. + switch (theCMD.fields.command_id) { + case TYPE_1_CMD_1: + OTLog::Output(2, "Received Type 1 CMD 1:\nThere is a signed OTMessage in the payload.\n"); + break; + case TYPE_1_CMD_2: + OTLog::Output(2, "Received Type 1 CMD 2:\n" + "There is an encrypted OTEnvelope (containing signed OTMessage) in the payload.\n"); + break; + default: + OTLog::vError("Received unexpected command number %d in OTClientConnection::ProcessType1Cmd\n", + theCMD.fields.command_id); + break; + } + + // ------------------------------------------------------------ + // Hm, that's weird. It was a 0 size payload message. DoS? + if (theCMD.fields.size == 0) + { + OTLog::Output(2, "(The payload was a 0 size.)\n"); + return true; + } + // Uh-oh, somehow the number of bytes read was less than what we expected... + else if (nread < theCMD.fields.size) + { + // TODO: Verify that the amount read matched the amount expected + // if not, we have a problem that needs to be handled. + + // Long term solution is to buffer the data as a comes in and just + // add it to the buffer. + + // Then if we don't have the complete message yet, we just come around next + // time some data is read, and we add that to the buffer, THEN we check to see + // if there are enough bytes yet read to match the amount expected according to + // the header. + // + // Until I can do that, I'm not yet TRULY asynchronous. TODO: lookup a good buffer class. + + OTLog::Error("Number of bytes read did NOT match size in header.\n"); + return false; + } + else + OTLog::vOutput(2, "Loaded a payload, size: %d\n", theCMD.fields.size); + + // ------------------------------------------------------------ + + // Okay so now we've received the expected size from the socket. Let's transfer it + // into an object type that we can manipulate here in code. (Message or Envelope.) + + // a signed OTMessage + if (TYPE_1_CMD_1 == theCMD.fields.command_id) + { +#ifdef _WIN32 + if (OTPAYLOAD_GetMessage(thePayload, theMessage)) +#else + if (thePayload.GetMessage(theMessage)) +#endif + { + OTLog::Output(2, "Successfully retrieved payload message...\n"); + + if (theMessage.ParseRawFile()) + { + OTLog::Output(2, "Successfully parsed payload message.\n"); + + return true; + } + else { + OTLog::Error("Error parsing message.\n"); + return false; + } + + } + else { + OTLog::Error("Error retrieving message from payload.\n"); + return false; + } + + } + + // A base64-encoded envelope, encrypted, and containing a signed message. + else if (TYPE_1_CMD_2 == theCMD.fields.command_id) + { + OTEnvelope theEnvelope; + if (thePayload.GetEnvelope(theEnvelope)) + { + OTLog::Output(2, "Successfully retrieved envelope from payload...\n"); + + OTString strEnvelopeContents; + + // Decrypt the Envelope. + if (m_pServer && theEnvelope.Open(m_pServer->GetServerNym(), strEnvelopeContents)) + { + // All decrypted, now let's load the results into an OTMessage. + // No need to call theMessage.ParseRawFile() after, since + // LoadContractFromString handles it. + // + if (strEnvelopeContents.Exists() && theMessage.LoadContractFromString(strEnvelopeContents)) + { + OTLog::Output(2, "Success loading message out of the envelope contents and parsing it.\n"); + return true; + } + else + { + OTLog::Error("Error loading message from envelope contents.\n"); + return false; + } + } + else + { + OTLog::Error("Unable to open envelope.\n"); + return false; + } + } + else + { + OTLog::Error("Error retrieving message from payload.\n"); + return false; + } + } + + return true; +} + + +// At certain times, when the server has verified that a Nym REALLY is who +// he says he is, he sets the public key onto the connection object for +// that nym. That way, if the connection object ever needs to encrypt something +// being sent to the client, he has access to the public key. +void OTClientConnection::SetPublicKey(const OTString & strPublicKey) +{ + // SetPublicKey takes the ascii-encoded text, including bookends, and processes + // it into the OTAssymeticKey object. If successful, the OTAssymetricKey is now + // fully functional for encrypting and verifying. + m_PublicKey.SetPublicKey(strPublicKey, true/*bEscaped*/); +} + +void OTClientConnection::SetPublicKey(const OTAsymmetricKey & thePublicKey) +{ + OTString strNymsPublicKey; + + thePublicKey.GetPublicKey(strNymsPublicKey, true); + m_PublicKey.SetPublicKey(strNymsPublicKey, true/*bEscaped*/); +} + + +// This function, you pass in a message and it returns true or false to let +// you know whether the message was successfully sealed into theEnvelope. +// (Based on the public key into cached in the OTClientConnection...) +// This is for XmlRpc / HTTP mode. +bool OTClientConnection::SealMessageForRecipient(OTMessage & theMsg, OTEnvelope & theEnvelope) +{ + if (m_PublicKey.GetKey()) + { + // Save the ready-to-go message into a string. + OTString strEnvelopeContents(theMsg); + + // Seal the string up into an encrypted Envelope + if (strEnvelopeContents.Exists()) + return theEnvelope.Seal(m_PublicKey, strEnvelopeContents); + } + + return false; +} + +// Process my reply back out to the client. @something. +// For TCP / SSL mode. +void OTClientConnection::ProcessReply(OTMessage &theReply) +{ + int err = 0; + uint32_t nwritten = 0; + bool bSendCommand = false; + bool bSendPayload = false; + + u_header theCMD; + OTPayload thePayload; + + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + // For now let's send ALL replies in Envelopes (encrypted to public key of client) + // IF we have a public key, that is. Otherwise we send as a normal message. + // + // All messages already require either a public key, or a nymID used to look up a + // public key. So given that I have that information when I reply, I might as well + // ENCRYPT my reply to that same public key. More secure that way. + // + // The wallet (and server) are both ready to open and process these encrypted envelopes. + + + // If GetKey() returns something, that means the key was set in there, it's + // not just a null pointer. This means we can use it! So let's encrypt to it. + if (m_PublicKey.GetKey()) + { + OTString strEnvelopeContents(theReply); + // Save the ready-to-go message into a string. + + OTEnvelope theEnvelope; + // Seal the string up into an encrypted Envelope + theEnvelope.Seal(m_PublicKey, strEnvelopeContents); + + // From here on out, theMessage is disposable. OTPayload takes over. + // OTMessage doesn't care about checksums and headers. + thePayload.SetEnvelope(theEnvelope); + + // Now that the payload is ready, we'll set up the header. + SetupHeader(&theCMD, CMD_TYPE_1, TYPE_1_CMD_2, thePayload); + } + else { + thePayload.SetMessage(theReply); + + // Now that the payload is ready, we'll set up the header. + SetupHeader(&theCMD, CMD_TYPE_1, TYPE_1_CMD_1, thePayload); + } + + bSendCommand = true; + bSendPayload = true; + + + OTLog::vOutput(2, "\n****************************************************************\n" + "===> Finished setting up header for response.\nFirst 9 bytes are: %d %d %d %d %d %d %d %d %d...\n", + theCMD.buf[0], theCMD.buf[1], theCMD.buf[2], theCMD.buf[3], theCMD.buf[4], + theCMD.buf[5], theCMD.buf[6], theCMD.buf[7], theCMD.buf[8]); + + + // ------------------------------------------------------------------------------ + /* + // Write to Client + strcpy(buffer, "Hello Client!"); + SFSocketWrite(clientSocket, buffer, strlen(buffer)); + + */ + + if (bSendCommand) + { + + int nHeaderSize = OT_CMD_HEADER_SIZE; + + for (nwritten = 0; nwritten < nHeaderSize; nwritten += err) + { + err = SFSocketWrite(m_pSocket, theCMD.buf + nwritten, nHeaderSize - nwritten); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 means disconnect. error means error. >0 means bytes read. +#else + if (err <= 0) +#endif + break; + } + } + // At this point, we have sent the header across the pipe. + + if (bSendPayload) + { + + uint32_t nPayloadSize = thePayload.GetSize(); + + for (nwritten = 0; nwritten < nPayloadSize; nwritten += err) + { + err = SFSocketWrite(m_pSocket, (unsigned char *)thePayload.GetPayloadPointer() + nwritten, nPayloadSize - nwritten); + +#ifdef _WIN32 + if (0 == err || SOCKET_ERROR == err) // 0 means disconnect. error means error. >0 means bytes read. +#else + if (err <= 0) +#endif + break; + } + } + // At this point, we have sent the payload across the pipe. + + OTLog::Output(2, "...Done.\n"); +} + + + +void OTClientConnection::AddToInputList(OTMessage & theMessage) +{ + m_listIn.AddToList(theMessage); +} + +OTMessage * OTClientConnection::GetNextInputMessage() +{ + return m_listIn.GetNextMessage(); +} + + +void OTClientConnection::AddToOutputList(OTMessage & theMessage) +{ + m_listOut.AddToList(theMessage); + +} + + +OTMessage * OTClientConnection::GetNextOutputMessage() +{ + return m_listOut.GetNextMessage(); +} + +// For TCP / SSL mode. +OTClientConnection::OTClientConnection(SFSocket & theSocket, OTServer & theServer) +{ + m_pSocket = &theSocket; + m_pServer = &theServer; + + m_bHaveHeader = false; + m_bFocused = false; // tcp over ssl mode +} + +// For XmlRpc / HTTP mode. +OTClientConnection::OTClientConnection(OTServer & theServer) +{ + m_pSocket = NULL; + m_pServer = &theServer; + + m_bHaveHeader = false; + m_bFocused = true; // rpc over http mode +} + +OTClientConnection::~OTClientConnection() +{ + // Disconnect Client + if (NULL != m_pSocket) + { + SFSocketRelease(m_pSocket); + m_pSocket = NULL; + } +} + + + + + + + + + + + + + + + + + + diff --git a/transaction/OTClientConnection.h b/transaction/OTClientConnection.h new file mode 100644 index 000000000..f9c65725c --- /dev/null +++ b/transaction/OTClientConnection.h @@ -0,0 +1,234 @@ +/******************************************************************* + * + * OTCLientConnection.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + + + +#ifndef __OT_CLIENT_CONNECTION_H__ +#define __OT_CLIENT_CONNECTION_H__ + +extern "C" +{ +#include "SSL-Example/SFSocket.h" +} + + +#ifdef __cplusplus +extern "C" { +#endif + +#define TYPE_1_CMD_1 1 +#define TYPE_1_CMD_2 2 +#define TYPE_1_CMD_3 3 +#define TYPE_1_CMD_4 4 + +#define CMD_TYPE_1 1 + +#define OT_CMD_HEADER_SIZE 9 + + typedef unsigned char BYTE; + typedef unsigned short USHORT; + + union u_header + { + BYTE buf[OT_CMD_HEADER_SIZE]; + struct { + BYTE type_id; // 1 byte + BYTE command_id; // 1 byte + BYTE filler[2]; // 2 extra bytes here so the size begins on a 4-byte boundary + uint32_t size; // 4 bytes to describe size of payload + BYTE checksum; // 1 byte + } fields; // total of 9 bytes + }; + +#ifdef __cplusplus +} +#endif + + + + + +class OTMessage; +class OTServer; + + +#include "OTMessageBuffer.h" +#include "OTAsymmetricKey.h" +#include "OTData.h" + +class OTString; +class OTEnvelope; + +class OTClientConnection +{ + u_header m_CMD; // We'll load a header and put it here, then wait until the bytes received matches the count + // before processing. + OTData m_Buffer; // As we read data, we buffer it here and chunk it out into messages. + + bool m_bHaveHeader; // If we've loaded a header already, and we're waiting for the byte count, this is true. + OTMessageBuffer m_listIn; + OTMessageBuffer m_listOut; + OTServer * m_pServer; + + OTAsymmetricKey m_PublicKey; + + bool m_bFocused; // Defaults to false. If true, it means we're in XmlRpc mode, or some such, instead of TCP over SSL streaming. + +public: + SFSocket * m_pSocket; // For TCP / SSL mode. + + void ProcessBuffer(); + void ReadBytesIntoBuffer(); + + void ProcessMessage(u_header & theCMD); + bool ProcessType1Cmd(u_header & theCMD, OTMessage & theMessage); + + void ProcessReply(OTMessage &theReply); + + OTClientConnection(SFSocket & theSocket, OTServer & theServer); // TCP / over SSL mode. + OTClientConnection(OTServer & theServer); // XmlRpc / over HTTP mode. + ~OTClientConnection(); + + void AddToInputList(OTMessage & theMessage); + OTMessage * GetNextInputMessage(); + + void AddToOutputList(OTMessage & theMessage); + OTMessage * GetNextOutputMessage(); + + void SetPublicKey(const OTString & strPublicKey); + void SetPublicKey(const OTAsymmetricKey & thePublicKey); + + // This is for XmlRpc mode (i.e. there is not actually an open connection being maintained.) + bool SealMessageForRecipient(OTMessage & theMsg, OTEnvelope & theEnvelope); +}; + + +#endif // __OT_CLIENT_CONNECTION_H__ diff --git a/transaction/OTServer.cpp b/transaction/OTServer.cpp new file mode 100644 index 000000000..8ae45880e --- /dev/null +++ b/transaction/OTServer.cpp @@ -0,0 +1,9292 @@ +/************************************************************************************ + * + * OTServer.cpp + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + +#include +#include +#include + +#include +#include +#include +#include + + +#include "irrxml/irrXML.h" + +using namespace irr; +using namespace io; +using namespace std; + + + +#include "SimpleIni.h" + + +// ------------------------ + + +#include "OTStorage.h" + +// Had to move these below OTStorage.h since they were conflicting with the stlplus stuff. +#include +#include + + +#include "OTData.h" + +#include "OTString.h" +#include "OTStringXML.h" + +#include "OTDataCheck.h" + + +#include "OTServer.h" + + +#include "OTMint.h" +#include "OTPseudonym.h" +#include "OTCheque.h" + +#include "OTPayload.h" +#include "OTMessage.h" +#include "OTAccount.h" +#include "OTClientConnection.h" +#include "OTAssetContract.h" +#include "OTServerContract.h" + +#include "OTItem.h" +#include "OTTransaction.h" +#include "OTLedger.h" +#include "OTToken.h" +#include "OTPurse.h" +#include "OTBasket.h" +#include "OTMarket.h" +#include "OTTrade.h" +#include "OTOffer.h" +#include "OTPaymentPlan.h" +#include "OTLog.h" + +#include "OTCron.h" + + + + + +// These are default values. There are configurable in the config file. +// +int OTServer::__heartbeat_no_requests = 10; // The number of client requests that will be processed per heartbeat. +int OTServer::__heartbeat_ms_between_beats = 100; // number of ms between each heartbeat. + + + +// DONE: +// Code commands for checking your Cron Items and for canceling them. (Cancelling is done.) +// Code command for looking up specific markets from the server to see if they're supported. (Done) +// NOTE: For now, the server just creates any market you request, if it doesn't already exist. +// +// DONE Code the payment plan command code on client and server side handling. +// DONE OTServer needs to have a map of Markets, indexed by Market ID. The Offer "ID" matches this. (DONE) +// DONE Offer Minimum Increment MUST EXACTLY MATCH MARKET's .. can NOT simply "divide equally", although a second variable can be used for that... +// DONE Code the actual Cron processing for the Trades +// DONE ...and the Payment Plans. +// +// +// Get it all compiled. +// Get it all running again and debugged. + + +// -------------------------------------------------------------------------------------- + +void OTServer::ActivateCron() +{ + m_Cron.ActivateCron(); +} + + +/// Currently the test server calls this 10 times per second. +/// It also processes all the input/output at the same rate. +/// It sleeps in between. (See testserver.cpp for the call +/// and OTLog::Sleep() for the sleep code.) +/// +void OTServer::ProcessCron() +{ + if (!m_Cron.IsActivated()) + return; + + bool bAddedNumbers = false; + + // Cron requires transaction numbers in order to process. + // So every time before I call Cron.Process(), I make sure to replenish first. + while (m_Cron.GetTransactionCount() < 20) + { + long lTransNum = 0; + bool bSuccess = IssueNextTransactionNumber(m_nymServer, lTransNum, false); // bStoreTheNumber = false + + if (bSuccess) + { + m_Cron.AddTransactionNumber(lTransNum); + bAddedNumbers = true; + } + else + break; + } + + if (bAddedNumbers) + { + m_Cron.SaveCron(); + } + + m_Cron.ProcessCronItems(); // This needs to be called regularly for trades, markets, payment plans, etc to process. + + + // NOTE: TODO: OTHER RE-OCCURRING SERVER FUNCTIONS CAN GO HERE AS WELL!! + // + // Such as sweeping server accounts after expiration dates, etc. + +} + + +// -------------------------------------------------------------------------------------- + + +const OTPseudonym & OTServer::GetServerNym() const +{ + return m_nymServer; +} + +// Server stores a map of BASKET_ID to BASKET_ACCOUNT_ID. +bool OTServer::AddBasketAccountID(const OTIdentifier & BASKET_ID, const OTIdentifier & BASKET_ACCOUNT_ID, + const OTIdentifier & BASKET_CONTRACT_ID) +{ + OTIdentifier theBasketAcctID; + + if (LookupBasketAccountID(BASKET_ID, theBasketAcctID)) + { + OTLog::Output(0, "User attempted to add Basket that already exists.\n"); + return false; + } + + OTString strBasketID(BASKET_ID), strBasketAcctID(BASKET_ACCOUNT_ID), strBasketContractID(BASKET_CONTRACT_ID); + + m_mapBaskets[strBasketID.Get()] = strBasketAcctID.Get(); + m_mapBasketContracts[strBasketContractID.Get()] = strBasketAcctID.Get(); + + return true; +} + +/// Looks up a basket account ID and returns true or false. +/// (So you can confirm whether or not it's on the list.) +bool OTServer::VerifyBasketAccountID(const OTIdentifier & BASKET_ACCOUNT_ID) +{ + // Server stores a map of BASKET_ID to BASKET_ACCOUNT_ID. Let's iterate through that map... + for (mapOfBaskets::iterator ii = m_mapBaskets.begin(); ii != m_mapBaskets.end(); ++ii) + { + OTString strBasketAcctID = (*ii).second.c_str(); + + OTIdentifier id_BASKET_ACCT(strBasketAcctID); + + if (BASKET_ACCOUNT_ID == id_BASKET_ACCT) // if the basket Acct ID passed in matches this one... + { + return true; + } + } + return false; +} + +/// Use this to find the basket account ID for this server (which is unique to this server) +/// using the contract ID to look it up. (The basket contract ID is unique to this server.) +bool OTServer::LookupBasketAccountIDByContractID(const OTIdentifier & BASKET_CONTRACT_ID, OTIdentifier & BASKET_ACCOUNT_ID) +{ + // Server stores a map of BASKET_ID to BASKET_ACCOUNT_ID. Let's iterate through that map... + for (mapOfBaskets::iterator ii = m_mapBasketContracts.begin(); ii != m_mapBasketContracts.end(); ++ii) + { + OTString strBasketContractID = (*ii).first.c_str(); + OTString strBasketAcctID = (*ii).second.c_str(); + + OTIdentifier id_BASKET_CONTRACT(strBasketContractID), id_BASKET_ACCT(strBasketAcctID); + + if (BASKET_CONTRACT_ID == id_BASKET_CONTRACT) // if the basket contract ID passed in matches this one... + { + BASKET_ACCOUNT_ID = id_BASKET_ACCT; + return true; + } + } + return false; +} + + +/// Use this to find the basket account ID for this server (which is unique to this server) +/// using the contract ID to look it up. (The basket contract ID is unique to this server.) +bool OTServer::LookupBasketContractIDByAccountID(const OTIdentifier & BASKET_ACCOUNT_ID, OTIdentifier & BASKET_CONTRACT_ID) +{ + // Server stores a map of BASKET_ID to BASKET_ACCOUNT_ID. Let's iterate through that map... + for (mapOfBaskets::iterator ii = m_mapBasketContracts.begin(); ii != m_mapBasketContracts.end(); ++ii) + { + OTString strBasketContractID = (*ii).first.c_str(); + OTString strBasketAcctID = (*ii).second.c_str(); + + OTIdentifier id_BASKET_CONTRACT(strBasketContractID), id_BASKET_ACCT(strBasketAcctID); + + if (BASKET_ACCOUNT_ID == id_BASKET_ACCT) // if the basket contract ID passed in matches this one... + { + BASKET_CONTRACT_ID = id_BASKET_CONTRACT; + return true; + } + } + return false; +} + + +/// Use this to find the basket account for this server (which is unique to this server) +/// using the basket ID to look it up (the Basket ID is the same for all servers) +bool OTServer::LookupBasketAccountID(const OTIdentifier & BASKET_ID, OTIdentifier & BASKET_ACCOUNT_ID) +{ + // Server stores a map of BASKET_ID to BASKET_ACCOUNT_ID. Let's iterate through that map... + for (mapOfBaskets::iterator ii = m_mapBaskets.begin(); ii != m_mapBaskets.end(); ++ii) + { + OTString strBasketID = (*ii).first.c_str(); + OTString strBasketAcctID = (*ii).second.c_str(); + + OTIdentifier id_BASKET(strBasketID), id_BASKET_ACCT(strBasketAcctID); + + if (BASKET_ID == id_BASKET) // if the basket ID passed in matches this one... + { + BASKET_ACCOUNT_ID = id_BASKET_ACCT; + return true; + } + } + return false; +} + + +/// Looked up the voucher account (where cashier's cheques are issued for any given asset type) +/// return a pointer to the account. Since it's SUPPOSED to exist, and since it's being requested, +/// also will GENERATE it if it cannot be found, add it to the list, and return the pointer. Should +/// always succeed. +OTAccount * OTServer::GetVoucherAccount(const OTIdentifier & ASSET_TYPE_ID) +{ + OTAccount * pAccount = NULL; + + for (mapOfAccounts::iterator ii = m_mapVoucherAccounts.begin(); ii != m_mapVoucherAccounts.end(); ++ii) + { + pAccount = (*ii).second; + + OT_ASSERT_MSG(NULL != pAccount, "NULL account pointer in OTServer::GetVoucherAccount"); + + if (ASSET_TYPE_ID == pAccount->GetAssetTypeID()) + return pAccount; + } + + + // If we made it down here, that means the voucher account wasn't on the list, + // so we need to create it. + + const OTIdentifier SERVER_USER_ID(m_nymServer), SERVER_ID(m_strServerID); + + OTMessage theMessage; + SERVER_USER_ID.GetString(theMessage.m_strNymID); + ASSET_TYPE_ID.GetString(theMessage.m_strAssetID); + SERVER_ID.GetString(theMessage.m_strServerID); + + pAccount = OTAccount::GenerateNewAccount(SERVER_USER_ID, SERVER_ID, m_nymServer, theMessage); + + if (NULL != pAccount) + { + OTString strAcctID; + pAccount->GetIdentifier(strAcctID); + + OTLog::vOutput(0, "Successfully created voucher account ID:\n%s\nAsset Type ID:\n%s\n", + strAcctID.Get(), theMessage.m_strAssetID.Get()); + + + if (false == SaveMainFile()) + { + OTLog::Error("Error saving main server file containing new account ID!!\n"); + delete pAccount; + pAccount = NULL; + } + else + { + // Add it to the server's list. + m_mapVoucherAccounts[theMessage.m_strAssetID.Get()] = pAccount; + } + + return pAccount; + } + else + { + OTLog::vError("Failed trying to generate voucher account in OTServer::GetVoucherAccount with asset type ID: %s\n", + theMessage.m_strAssetID.Get()); + } + + return NULL; +} + + +/// Lookup the current mint for any given asset type ID and series. +OTMint * OTServer::GetMint(const OTIdentifier & ASSET_TYPE_ID, int nSeries) // Each asset contract has its own Mint. +{ + OTMint * pMint = NULL; + + for (mapOfMints::iterator ii = m_mapMints.begin(); ii != m_mapMints.end(); ++ii) + { + pMint = (*ii).second; + + OT_ASSERT_MSG(NULL != pMint, "NULL mint pointer in OTServer::GetMint\n"); + + OTIdentifier theID; + pMint->GetIdentifier(theID); + + if (ASSET_TYPE_ID == theID && // if the ID on the Mint matches the ID passed in + nSeries == pMint->GetSeries()) // and the series also matches... + return pMint; // return the pointer right here, we're done. + } + + // -------------------------------------------------------------------- + + // The mint isn't in memory for the series requested. + const OTString ASSET_ID_STR(ASSET_TYPE_ID); + + OTString strMintFilename; + strMintFilename.Format("%s%s%s%s%d", + m_strServerID.Get(), OTLog::PathSeparator(), + ASSET_ID_STR.Get(), ".", nSeries); + + const char * szFoldername = OTLog::MintFolder(); + const char * szFilename = strMintFilename.Get(); + + // -------------------------------------------------------------------- + + pMint = new OTMint(m_strServerID, m_strServerUserID, ASSET_ID_STR); + + // You cannot hash the Mint to get its ID. (The ID is a hash of the asset contract.) + // Instead, you must READ the ID from the Mint file, and then compare it to the one expected + // to see if they match (similar to how Account IDs are verified.) + + OT_ASSERT_MSG(NULL != pMint, "Error allocating memory for Mint in OTServer::GetMint"); + + OTString strSeries; strSeries.Format("%s%d", ".", nSeries); + // + if (pMint->LoadMint(strSeries.Get())) + { + if (pMint->VerifyMint(m_nymServer)) // I don't verify the Mint's expiration date here, just its signature, ID, etc. + { // (Expiry dates are enforced on tokens during deposit--and checked against mint-- + // but expiry dates are only enforced on the Mint itself during a withdrawal.) + // It's a multimap now... + //m_mapMints[ASSET_ID_STR.Get()] = pMint; + + m_mapMints.insert ( pair(ASSET_ID_STR.Get(), pMint) ); + + return pMint; + } + else + { + OTLog::vError("Error verifying Mint in OTServer::GetMint:\n%s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + delete pMint; + pMint = NULL; + } + } + else + { + OTLog::vError("Error loading Mint in OTServer::GetMint:\n%s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + delete pMint; + pMint = NULL; + } + + return NULL; +} + + +/// Just as every request must be accompanied by a request number, so +/// every transaction request must be accompanied by a transaction number. +/// The request numbers can simply be incremented on both sides (per user.) +/// But the transaction numbers must be issued by the server and they do +/// not repeat from user to user. They are unique to transaction. +/// +/// Users must ask the server to send them transaction numbers so that they +/// can be used in transaction requests. The server keeps an internal counter +/// and maintains a data file to store the latest one. +/// +/// More specifically, the server file itself stores the latest transaction number +/// (So it knows what number to issue and increment when the next request comes in.) +/// +/// But once it issues the next number, that number needs to be recorded in the nym file +/// for the user it was issued to, so that it can be verified later when he submits it +/// for a transaction--and so it can be removed once the transaction is complete (so it +/// won't work twice.) +/// +/// The option to bSaveTheNumber defaults to true for this reason. But sometimes it +/// will be sent to false, in cases where the number doesn't need to be saved because +/// it's never going to be verified. For example, if the server creates a transaction +/// number so it can put a transaction into your inbox, it's never going to have to verify +/// that it actually put it into the inbox by checking it's own nymfile for that transaction +/// number. Instead it would just check its own server signature on the inbox. But I digress... +/// +bool OTServer::IssueNextTransactionNumber(OTPseudonym & theNym, long &lTransactionNumber, + bool bStoreTheNumber/*=true*/) +{ + OTIdentifier NYM_ID(theNym), SERVER_NYM_ID(m_nymServer); + + // If theNym has the same ID as m_nymServer, then we'll use m_nymServer + // instead of theNym. (Since it's the same nym anyway, we'll stick to the + // one we already loaded so any changes don't get overwritten later.) + OTPseudonym * pNym = NULL; + + if (NYM_ID == SERVER_NYM_ID) + pNym = &m_nymServer; + else + pNym = &theNym; + + // ---------------------------------------------------------------------------- + + // m_lTransactionNumber stores the last VALID AND ISSUED transaction number. + // So first, we increment that, since we don't want to issue the same number twice. + m_lTransactionNumber++; + + // Next, we save it to file. + if (false == SaveMainFile()) + { + OTLog::Error("Error saving main server file.\n"); + m_lTransactionNumber--; + return false; + } + + // Each Nym stores the transaction numbers that have been issued to it. + // (On client AND server side.) + // + // So whenever the server issues a new number, it's to a specific Nym, then + // it is recorded in his Nym file before being sent to the client (where it + // is also recorded in his Nym file.) That way the server always knows which + // numbers are valid for each Nym. + + else if ( bStoreTheNumber && + (false == pNym->AddTransactionNum(m_nymServer, m_strServerID, m_lTransactionNumber, true))) // bSave = true + { + OTLog::Error("Error adding transaction number to Nym file.\n"); + m_lTransactionNumber--; + SaveMainFile(); // Save it back how it was, since we're not issuing this number after all. + return false; + } + + // SUCCESS? + // Now the server main file has saved the latest transaction number, + // and the number has been stored on the relevant nym file. + // NOW we set it onto the parameter and return true. + else + { + lTransactionNumber = m_lTransactionNumber; + return true; + } +} + + + +/// Transaction numbers are now stored in the nym file (on client and server side) for whichever nym +/// they were issued to. This function verifies whether or not the transaction number is present and valid +/// for any specific nym (i.e. for the nym passed in.) +bool OTServer::VerifyTransactionNumber(OTPseudonym & theNym, const long &lTransactionNumber) // passed by reference for speed, but not a return value. +{ + OTIdentifier NYM_ID(theNym), SERVER_NYM_ID(m_nymServer); + + // If theNym has the same ID as m_nymServer, then we'll use m_nymServer + // instead of theNym. (Since it's the same nym anyway, we'll stick to the + // one we already loaded so any changes don't get overwritten later.) + OTPseudonym * pNym = NULL; + + if (NYM_ID == SERVER_NYM_ID) + pNym = &m_nymServer; + else + pNym = &theNym; + + + if (pNym->VerifyTransactionNum(m_strServerID, lTransactionNumber)) + return true; + else + OTLog::vError("Invalid transaction number: %ld. (Current Trns# counter: %ld)\n", + lTransactionNumber, m_lTransactionNumber); + + return false; +} + + +/// Remove a transaction number from the Nym record once it's officially used/spent. +bool OTServer::RemoveTransactionNumber(OTPseudonym & theNym, const long &lTransactionNumber, bool bSave/*=false*/) +{ + OTIdentifier NYM_ID(theNym), SERVER_NYM_ID(m_nymServer); + + // If theNym has the same ID as m_nymServer, then we'll use m_nymServer + // instead of theNym. (Since it's the same nym anyway, we'll stick to the + // one we already loaded so any changes don't get overwritten later.) + OTPseudonym * pNym = NULL; + + if (NYM_ID == SERVER_NYM_ID) + pNym = &m_nymServer; + else + pNym = &theNym; + + bool bRemoved = false; + + if (bSave) + bRemoved = pNym->RemoveTransactionNum(m_nymServer, m_strServerID, lTransactionNumber); // the version that passes in a signer nym -- saves to local storage. + else + bRemoved = pNym->RemoveTransactionNum(m_strServerID, lTransactionNumber); // the version that doesn't save. + + return bRemoved; +} + + +/// Remove an issued number from the Nym record once that nym accepts the receipt from his inbox. +bool OTServer::RemoveIssuedNumber(OTPseudonym & theNym, const long &lTransactionNumber, bool bSave/*=false*/) +{ + OTIdentifier NYM_ID(theNym), SERVER_NYM_ID(m_nymServer); + + // If theNym has the same ID as m_nymServer, then we'll use m_nymServer + // instead of theNym. (Since it's the same nym anyway, we'll stick to the + // one we already loaded so any changes don't get overwritten later.) + OTPseudonym * pNym = NULL; + + if (NYM_ID == SERVER_NYM_ID) + pNym = &m_nymServer; + else + pNym = &theNym; + + bool bRemoved = pNym->RemoveIssuedNum(m_nymServer, m_strServerID, lTransactionNumber, bSave); + + return bRemoved; +} + + + +/// The server supports various different asset types. +/// Any user may create a new asset type by uploading the asset contract to the server. +/// The server stores the contract in a directory and in its in-memory list of asset types. +/// You can call this function to look up any asset contract by ID. If it returns NULL, +/// you can add it yourself by uploading the contract. But be sure that the public key +/// in the contract, used to sign the contract, is also the public key of the Nym of the +/// issuer. They must match. In the future I may create a special key category just for +/// this purpose. Right now I'm using the "contract" key which is already used to verify +/// any asset or server contract. +OTAssetContract * OTServer::GetAssetContract(const OTIdentifier & ASSET_TYPE_ID) +{ + OTAssetContract * pContract = NULL; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + if (pContract = (*ii).second) // if not null + { + OTIdentifier theContractID; + pContract->GetIdentifier(theContractID); + + if (theContractID == ASSET_TYPE_ID) + return pContract; + } + else + { + OTLog::Error("NULL contract pointer in OTServer::GetAssetContract.\n"); + } + } + + return NULL; +} + + + +/// OTServer will take ownership of theContract from this point on, +/// and will be responsible for deleting it. MUST be allocated on the heap. +bool OTServer::AddAssetContract(OTAssetContract & theContract) +{ + OTAssetContract * pContract = NULL; + + OTString STR_CONTRACT_ID; OTIdentifier CONTRACT_ID; + theContract.GetIdentifier(STR_CONTRACT_ID); + theContract.GetIdentifier(CONTRACT_ID); + + // already exists + if (pContract = GetAssetContract(CONTRACT_ID)) // if not null + return false; + + m_mapContracts[STR_CONTRACT_ID.Get()] = &theContract; + + return true; +} + + +bool OTServer::SaveMainFileToString(OTString & strMainFile) +{ + // --------------------------------------------------------------- + + strMainFile.Format("\n" + "\n\n", m_strVersion.Get(), m_strServerID.Get(), + m_strServerUserID.Get(), m_lTransactionNumber); + + //mapOfContracts m_mapContracts; // If the server needs to store copies of the asset contracts, then here they are. + //mapOfMints m_mapMints; // Mints for each of those. + + // --------------------------------------------------------------- + + OTContract * pContract = NULL; + + for (mapOfContracts::iterator ii = m_mapContracts.begin(); ii != m_mapContracts.end(); ++ii) + { + pContract = (*ii).second; + + OT_ASSERT_MSG(NULL != pContract, "NULL contract pointer in OTServer::SaveMainFile.\n"); + + // This is like the Server's wallet. + pContract->SaveContractWallet(strMainFile); + + // ---------------------------------------- + } + + // Save the basket account information + + for (mapOfBaskets::iterator ii = m_mapBaskets.begin(); ii != m_mapBaskets.end(); ++ii) + { + OTString strBasketID = (*ii).first.c_str(); + OTString strBasketAcctID = (*ii).second.c_str(); + + const OTIdentifier BASKET_ACCOUNT_ID(strBasketAcctID); + OTIdentifier BASKET_CONTRACT_ID; + + bool bContractID = LookupBasketContractIDByAccountID(BASKET_ACCOUNT_ID, BASKET_CONTRACT_ID); + + if (!bContractID) + { + OTLog::vError("Error in OTServer::SaveMainFile: Missing Contract ID for basket ID %s\n", + strBasketID.Get()); + break; + } + + OTString strBasketContractID(BASKET_CONTRACT_ID); + + strMainFile.Concatenate("\n\n", + strBasketID.Get(), strBasketAcctID.Get(), strBasketContractID.Get()); + } + + /* + OTPseudonym * pNym = NULL; + + for (mapOfNyms::iterator ii = m_mapNyms.begin(); ii != m_mapNyms.end(); ++ii) + { + pNym = (*ii).second; + + OT_ASSERT_MSG(NULL != pNym, "NULL pseudonym pointer in OTWallet::m_mapNyms, OTWallet::SaveWallet"); + + pNym->SavePseudonymWallet(fl); + } + + + // --------------------------------------------------------------- + + OTContract * pServer = NULL; + + for (mapOfServers::iterator ii = m_mapServers.begin(); ii != m_mapServers.end(); ++ii) + { + pServer = (*ii).second; + + OT_ASSERT_MSG(NULL != pServer, "NULL server pointer in OTWallet::m_mapServers, OTWallet::SaveWallet"); + + pServer->SaveContractWallet(fl); + } + + // --------------------------------------------------------------- + */ + + strMainFile.Concatenate("\n"); + + return true; +} + +bool OTServer::SaveMainFile() +{ + static OTString strMainFilePath; + + if (!strMainFilePath.Exists()) + { + strMainFilePath = "notaryServer.xml"; // todo fix hardcoding + } + + // --------------------------------------------------------------- + + OTString strMainFile; + + if (false == SaveMainFileToString(strMainFile)) + { + OTLog::Error("Error saving to string in OTServer::SaveMainFile.\n"); + return false; + } + + // --------------------------------------------------------------- + + bool bSaved = OTDB::StorePlainString(strMainFile.Get(), ".", strMainFilePath.Get()); + + if (!bSaved) + OTLog::vError("Error saving main file: %s\n", strMainFilePath.Get()); + + return bSaved; +} + + + +bool OTServer::LoadConfigFile() +{ + OTString strFilepath; + strFilepath.Format("%s%s%s%s%s", OTLog::Path(), OTLog::PathSeparator(), "..", OTLog::PathSeparator(), "server.cfg"); // todo: stop hardcoding. + + { + CSimpleIniA ini; // We're assuming this file is on the path. + SI_Error rc = ini.LoadFile(strFilepath.Get()); + + if (rc >=0) + { + // --------------------------------------------- + // LOG FILE + { + // Read a value from file: (category, key ) + const char * pVal1 = ini.GetValue("logging", "logfile_path"); // todo stop hardcoding. + + if (NULL != pVal1) + { + OTString strOutput; + + OTLog::TransformFilePath(pVal1, strOutput); + + if (strOutput.Exists()) + { + OTLog::vOutput(0, "Setting logfile to: %s\n", strOutput.Get()); + OTLog::SetLogfile(strOutput.Get()); + } + } + else + OTLog::vOutput(0, "Current Logfile: %s\n", OTLog::Logfile()); + + // --------------------------------------------- + // LOG LEVEL + const char * pVal2 = ini.GetValue("logging", "log_level"); // todo stop hardcoding. + + if (NULL != pVal2) + { + OTLog::vOutput(0, "Setting log level to: %d\n", atoi(pVal2)); + OTLog::SetLogLevel(atoi(pVal2)); + } + else + OTLog::vOutput(0, "Current log level: %d\n", OTLog::GetLogLevel()); + } + // --------------------------------------------- + // HEARTBEAT + { + const char * pVal = ini.GetValue("heartbeat", "no_requests"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting heartbeat_no_requests to: %d\n", atoi(pVal)); + OTServer::SetHeartbeatNoRequests(atoi(pVal)); + } + } + { + const char * pVal = ini.GetValue("heartbeat", "ms_between_beats"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting heartbeat ms_between_beats to: %d\n", atoi(pVal)); + OTServer::SetHeartbeatMsBetweenBeats(atoi(pVal)); + } + } + // ----------------------------------- + // LATENCY + { + const char * pVal = ini.GetValue("latency", "send_no_tries"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency send_no_tries to: %d\n", atoi(pVal)); + OTLog::SetLatencySendNoTries(atoi(pVal)); + } + } + { + const char * pVal = ini.GetValue("latency", "send_ms"); + + if ((NULL != pVal) && (atoi(pVal))) + { + OTLog::vOutput(0, "Setting latency send_ms to: %d\n", atoi(pVal)); + OTLog::SetLatencySendMs(atoi(pVal)); + } + } + // --------------------------------------------- + + // So far I don't read the receive_no_tries and receive_ms here, though I could... + + // --------------------------------------------- + } + else + OTLog::vError("OTServer::LoadConfigFile: Failed loading file: %s\n", strFilepath.Get()); + } + + return true; +} + + + +void OTServer::Init() +{ + LoadConfigFile(); // assumes main path is set. + + // ---------------------- + + bool bSuccessInitDefault = + OTDB::InitDefaultStorage(OTDB_DEFAULT_STORAGE, + OTDB_DEFAULT_PACKER, OTLog::Path(), + "notaryServer.xml"); // todo stop hardcoding + + OTLog::ConfirmOrCreateFolder(OTLog::MarketFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::CronFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::NymFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::AccountFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::UserAcctFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::ReceiptFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::NymboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::InboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::OutboxFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::CertFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::PubkeyFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::ContractFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::MintFolder()); + OTLog::ConfirmOrCreateFolder(OTLog::SpentFolder()); + + // Load up the transaction number. + LoadMainFile(); + + // We just want to call this function once in order to make sure that the + // Nym is loaded up and ready for use decrypting messages that are sent to it. + // If you comment this out, the server will be unable to decrypt and open envelopes. + ValidateServerIDfromUser(m_strServerID); + + // With the Server's private key loaded, and the latest transaction number loaded, + // the server is now ready for operation! +} + + + +bool OTServer::LoadMainFile() +{ + const char * szFoldername = "."; // todo stop hardcoding. + const char * szFilename = "notaryServer.xml"; // todo stop hardcoding. + + if (false == OTDB::Exists(szFoldername, szFilename)) + { + OTLog::vError("OTServer::LoadMainFile: %s%s%s does not exist.\n", szFoldername, + OTLog::PathSeparator(), szFilename); + return false; + } + + // -------------------------------------------------------------------- + // + std::string strFileContents(OTDB::QueryPlainString(szFoldername, szFilename)); // <=== LOADING FROM DATA STORE. + + if (strFileContents.length() < 2) + { + OTLog::vError("OTServer::LoadMainFile: Error reading file: %s%s%s\n", + szFoldername, OTLog::PathSeparator(), szFilename); + return false; + } + // -------------------------------------------------------------------- + + OTStringXML xmlFileContents(strFileContents.c_str()); + + IrrXMLReader* xml = createIrrXMLReader(&xmlFileContents); + + OTCleanup theXMLGuardian(xml); // So I don't have to clean it up later. + + + // parse the file until end reached + while(xml && xml->read()) + { + // strings for storing the data that we want to read out of the file + + OTString AssetName; + OTString AssetContract; + OTString AssetID; + /* + OTString NymName; + OTString NymFile; + OTString NymID; + */ + +// OTString ServerName; +// OTString ServerID; + + + switch(xml->getNodeType()) + { + case EXN_TEXT: + // in this xml file, the only text which occurs is the messageText + //messageText = xml->getNodeData(); + break; + case EXN_ELEMENT: + { + if (!strcmp("notaryServer", xml->getNodeName())) + { + m_strVersion = xml->getAttributeValue("version"); + m_strServerID = xml->getAttributeValue("serverID"); + m_strServerUserID = xml->getAttributeValue("serverUserID"); + + m_nymServer.SetIdentifier(m_strServerUserID); + + OTString strTransactionNumber; // The server issues transaction numbers and stores the counter here for the latest one. + strTransactionNumber = xml->getAttributeValue("transactionNum"); + m_lTransactionNumber = atol(strTransactionNumber.Get()); + + OTLog::vOutput(0, "\nLoading Open Transactions server. File version: %s\nLast Issued Transaction Number: %ld\nServerID:\n%s\n", + m_strVersion.Get(), m_lTransactionNumber, m_strServerID.Get()); + + + if (!m_nymServer.Loadx509CertAndPrivateKey()) + { + OTLog::Output(0, "Error loading server certificate and keys.\n"); + } + else if (!m_nymServer.VerifyPseudonym()) + { + OTLog::Output(0, "Error verifying server nym.\n"); + } + else + { + // This file will be saved during the course of operation + // Just making sure it is loaded up first. + OT_ASSERT(m_nymServer.LoadSignedNymfile(m_nymServer)); + + +// m_nymServer.SaveSignedNymfile(m_nymServer); // Uncomment this if you want to create the file. NORMALLY LEAVE IT OUT!!!! DANGEROUS!!! + + OTLog::Output(0, "Loaded server certificate and keys. Next loading Cron...\n"); + + // ---------------------------------------------------------------- + // Load Cron (now that we have the server Nym. + // (I WAS loading this erroneously in Server.Init(), before + // the Nym had actually been loaded from disk. That didn't work.) + const OTIdentifier SERVER_ID(m_strServerID); + + // Make sure the Cron object has a pointer to the server's Nym. + // (For signing stuff...) + m_Cron.SetServerID(SERVER_ID); + m_Cron.SetServerNym(&m_nymServer); + + if (!m_Cron.LoadCron()) + OTLog::Error("Failed loading Cron file in OTServer::Init.\n"); + + // ---------------------------------------------------------------- + + OTLog::Output(0, "Loading the server contract...\n"); + + // We have the serverID, so let's load up the server Contract! + OTString strContractPath(OTLog::ContractFolder()); + + OTServerContract * pContract = new OTServerContract(m_strServerID, strContractPath, m_strServerID, m_strServerID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for main Server Contract in OTServer::LoadMainFile\n"); + + if (pContract->LoadContract()) + { + if (pContract->VerifyContract()) + { + OTLog::Output(0, "** Main Server Contract Verified **\n"); + + m_pServerContract = pContract; + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Main Server Contract FAILED to verify.\n"); + } + } + else + { + delete pContract; pContract = NULL; + OTLog::vOutput(0, "Failed reading Main Server Contract in OTServer::LoadMainFile:\n%s\n", + strContractPath.Get()); + } + } + } + else if (!strcmp("basketInfo", xml->getNodeName())) + { + OTString strBasketID = xml->getAttributeValue("basketID"); + OTString strBasketAcctID = xml->getAttributeValue("basketAcctID"); + OTString strBasketContractID = xml->getAttributeValue("basketContractID"); + + const OTIdentifier BASKET_ID(strBasketID), BASKET_ACCT_ID(strBasketAcctID), BASKET_CONTRACT_ID(strBasketContractID); + + if (AddBasketAccountID(BASKET_ID, BASKET_ACCT_ID, BASKET_CONTRACT_ID)) + OTLog::vOutput(0, "Loading basket currency info...\n Basket ID:\n%s\n Basket Acct ID:\n%s\n Basket Contract ID:\n%s\n", + strBasketID.Get(), strBasketAcctID.Get(), strBasketContractID.Get()); + else + OTLog::vError("Error adding basket currency info...\n Basket ID:\n%s\n Basket Acct ID:\n%s\n", + strBasketID.Get(), strBasketAcctID.Get()); + } + + // Create an OTAssetContract and load them from file, (for each asset type), + // and add them to the internal map. + else if (!strcmp("assetType", xml->getNodeName())) + { + OTASCIIArmor ascAssetName = xml->getAttributeValue("name"); + + if (ascAssetName.Exists()) + ascAssetName.GetString(AssetName, false); // linebreaks == false + + AssetID = xml->getAttributeValue("assetTypeID"); // hash of contract itself + + OTLog::vOutput(0, "\n\n****Asset Contract**** (server listing) Name: %s\nContract ID:\n%s\n", + AssetName.Get(), AssetID.Get()); + + OTString strContractPath; + strContractPath = OTLog::ContractFolder(); + + OTAssetContract * pContract = new OTAssetContract(AssetName, strContractPath, AssetID, AssetID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Asset Contract in OTServer::LoadMainFile\n"); + + if (pContract->LoadContract()) + { + if (pContract->VerifyContract()) + { + OTLog::Output(0, "** Asset Contract Verified **\n"); + + pContract->SetName(AssetName); + + m_mapContracts[AssetID.Get()] = pContract; + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Asset Contract FAILED to verify.\n"); + } + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Failed reading file for Asset Contract in OTServer::LoadMainFile\n"); + } + } + + // This is where the server finds out his own contract, which he hashes in order to verify his + // serverID (which is either hardcoded or stored in the server xml file.) + // + // There should be only one of these per transaction server. + // + // Commented out because I don't need it right now. TODO. COMING SOON! So the server can load his + // port information out of the contract BEFORE it starts listening on the port (right now port is + // still hardcoded.) + // Todo: Server should also then immediately connect to itself BASED ON THE INFO IN THE CONTRACT + // in order to verify that whatever is running at that port IS, IN FACT, ITSELF! + /* + else if (!strcmp("notaryProvider", xml->getNodeName())) + { + ServerName = xml->getAttributeValue("name"); + ServerID = xml->getAttributeValue("serverID"); // hash of contract itself + + OTLog::vOutput(0, "\n\n****Notary Server (contract)**** (server listing) Name: %s\nContract ID:\n%s\n", + ServerName.Get(), ServerID.Get()); + + OTString strContractPath; + strContractPath.Format("%s%s%s%s%s", OTLog::Path(), OTLog::PathSeparator(), + OTLog::ContractFolder(), + OTLog::PathSeparator(), ServerID.Get()); + OTServerContract * pContract = new OTServerContract(ServerName, strContractPath, ServerID); + + OT_ASSERT_MSG(NULL != pContract, "Error allocating memory for Server Contract in OTServer::LoadMainFile\n"); + + if (pContract->LoadContract()) + { + if (pContract->VerifyContract()) + { + OTLog::Output(0, "** Server Contract Verified **\n"); + + m_mapContracts[ServerID.Get()] = pContract; + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Server Contract FAILED to verify.\n"); + } + } + else + { + delete pContract; pContract = NULL; + OTLog::Output(0, "Failed reading file for Server Contract in OTServer::LoadMainFile\n"); + } + } + */ + + + + /* + // commented out because, since I already have the serverID, then the server + // already knows which certfile to open in order to get at its private key. + // So I already have the private key loaded, so I don't need pseudonyms in + // the config file right now. + // + // In the future, I will load the server XML file (here) FIRST, and get the serverID and + // contract file from that. THEN I will hash the contract file and verify that it matches + // the serverID. THEN I will use that serverID to open the Certfile and get my private key. + // + // In the meantime I don't need this yet, serverID is setup in the config file (that I'm reading now.) + else if (!strcmp("pseudonym", xml->getNodeName())) // The server has to sign things, too. + { + NymName = xml->getAttributeValue("name");// user-assigned name for GUI usage + NymID = xml->getAttributeValue("nymID"); // message digest from hash of x.509 cert, used to look up certfile. + + OTLog::vOutput(0, "\n\n** Pseudonym ** (server): %s\nID: %s\nfile: %s\n", + NymName.Get(), NymID.Get(), NymFile.Get()); + + OTPseudonym * pNym = new OTPseudonym(NymName, NymFile, NymID); + + if (pNym && pNym->LoadNymfile((char*)(NymFile.Get()))) + { + if (pNym->Loadx509CertAndPrivateKey()) + { + if (pNym->VerifyPseudonym()) + { + m_mapNyms[NymID.Get()] = pNym; + g_pTemporaryNym = pNym; // TODO remove this temporary line used for testing only. + } + else { + OTLog::Error("Error verifying public key from x509 against Nym ID in OTWallet::LoadWallet\n"); + } + } + else { + OTLog::Error("Error loading x509 file for Pseudonym in OTWallet::LoadWallet\n"); + } + } + else { + OTLog::Error("Error creating or loading Nym in OTWallet::LoadWallet\n"); + } + } + + + */ + + + else + { + // unknown element type + OTLog::vError("unknown element type: %s\n", xml->getNodeName()); + } + } + break; + } + } + + return true; +} + + + +// ------------------------------------------------------------------------ + + + +// Get the list of markets on this server. +void OTServer::UserCmdGetMarketList(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getMarketList"; // reply to getMarketList + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + OTASCIIArmor ascOutput; + int nMarketCount = 0; + + msgOut.m_bSuccess = m_Cron.GetMarketList(ascOutput, nMarketCount); + + // If success, + if ((true == msgOut.m_bSuccess) && (nMarketCount > 0)) + { + msgOut.m_ascPayload.Set(ascOutput); + msgOut.m_lDepth = nMarketCount; + } + // if Failed, we send the user's message back to him, ascii-armored as part of response. + else if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + +// Get the publicly-available list of offers on a specific market. +void OTServer::UserCmdGetMarketOffers(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getMarketOffers"; // reply to getMarketOffers + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strNymID2 = MsgIn.m_strNymID2;// Market ID. + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + long lDepth = MsgIn.m_lDepth; + if (lDepth < 0) + lDepth = 0; + + const OTIdentifier MARKET_ID(MsgIn.m_strNymID2); + + // ------------------------------------------ + + OTMarket * pMarket = m_Cron.GetMarket(MARKET_ID); + + // If success, + if (msgOut.m_bSuccess = ((pMarket != NULL) ? true:false) ) // if assigned true + { + OTASCIIArmor ascOutput; + int nOfferCount = 0; + + msgOut.m_bSuccess = pMarket->GetOfferList(ascOutput, lDepth, nOfferCount); + + if ((true == msgOut.m_bSuccess) && (nOfferCount > 0)) + { + msgOut.m_ascPayload = ascOutput; + msgOut.m_lDepth = nOfferCount; + } + } + + // if Failed, we send the user's message back to him, ascii-armored as part of response. + if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + +// Get a report of recent trades that have occurred on a specific market. +void OTServer::UserCmdGetMarketRecentTrades(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getMarketRecentTrades"; // reply to getMarketRecentTrades + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strNymID2 = MsgIn.m_strNymID2;// Market ID. + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier MARKET_ID(MsgIn.m_strNymID2); + + // ------------------------------------------ + + OTMarket * pMarket = m_Cron.GetMarket(MARKET_ID); + + // If success, + if (msgOut.m_bSuccess = ((pMarket != NULL) ? true:false) ) // if assigned true + { + OTASCIIArmor ascOutput; + int nTradeCount = 0; + + msgOut.m_bSuccess = pMarket->GetRecentTradeList(ascOutput, nTradeCount); + + if (true == msgOut.m_bSuccess) + { + msgOut.m_lDepth = nTradeCount; + + if (nTradeCount > 0) + msgOut.m_ascPayload = ascOutput; + } + } + + // if Failed, we send the user's message back to him, ascii-armored as part of response. + if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + +// ---------------------------------------------------------------------- + + + + +// Get the offers that a specific Nym has placed on a specific market. +// +void OTServer::UserCmdGetNym_MarketOffers(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getNym_MarketOffers"; // reply to getMarketOffers + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + OTIdentifier NYM_ID; theNym.GetIdentifier(NYM_ID); + + // ------------------------------------------ + + OTASCIIArmor ascOutput; + int nOfferCount = 0; + + msgOut.m_bSuccess = m_Cron.GetNym_OfferList(ascOutput, NYM_ID, nOfferCount); + + if ((true == msgOut.m_bSuccess) && (nOfferCount > 0)) + { + msgOut.m_ascPayload = ascOutput; + msgOut.m_lDepth = nOfferCount; + } + // if Failed, we send the user's message back to him, ascii-armored as part of response. + if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + +// ------------------------------------------------------------ + + + + + +void OTServer::UserCmdCheckServerID(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@checkServerID"; // reply to checkServerID + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + if (MsgIn.m_strServerID == m_strServerID) // ServerID, a hash of the server contract. + msgOut.m_bSuccess = true; + else + msgOut.m_bSuccess = false; + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetTransactionNum(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + long lTransNum = 0; + + // (1) set up member variables + msgOut.m_strCommand = "@getTransactionNum"; // reply to getTransactionNum + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + // This call will save the new transaction number to the nym's file. + // ??? Why did I say that, when clearly the last parameter is false? + // AHHHH Because I drop it into the Nymbox instead, and make him sign for it! + // + bool bGotNextTransNum = IssueNextTransactionNumber(theNym, lTransNum, false); // bool bStoreTheNumber = false + + OTIdentifier USER_ID; + const OTIdentifier SERVER_ID(m_strServerID); + theNym.GetIdentifier(USER_ID); + + OTLedger theLedger(USER_ID, USER_ID, SERVER_ID); + + if (!bGotNextTransNum) + { + lTransNum = 0; + OTLog::Error("Error getting next transaction number in OTServer::UserCmdGetTransactionNum\n"); + } + // Drop in the Nymbox + else if (msgOut.m_bSuccess = (theLedger.LoadNymbox() && theLedger.VerifyAccount(m_nymServer)) ) + { + OTTransaction * pTransaction = OTTransaction::GenerateTransaction(theLedger, OTTransaction::blank, lTransNum); + + if (NULL != pTransaction) // The above has an OT_ASSERT within, but I just like to check my pointers. + { + pTransaction-> SignContract(m_nymServer); + pTransaction-> SaveContract(); + + theLedger.AddTransaction(*pTransaction); + + theLedger.ReleaseSignatures(); + theLedger.SignContract(m_nymServer); + theLedger.SaveContract(); + theLedger.SaveNymbox(); + } + } + else + { + OTLog::Error("Error loading or verifying Nymbox in OTServer::UserCmdGetTransactionNum\n"); + } + + RemoveTransactionNumber(theNym, lTransNum, false); //bSave=false + RemoveIssuedNumber(theNym, lTransNum, false); // I'll drop it in his Nymbox -- he can SIGN for it. + // Then why was it added in the first place? Because we originally sent it back in the reply directly, + // so IssueNext was designed that way. + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + +void OTServer::UserCmdGetRequest(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + long lReqNum = 0; + + // (1) set up member variables + msgOut.m_strCommand = "@getRequest"; // reply to getRequest + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + msgOut.m_bSuccess = theNym.GetCurrentRequestNum(m_strServerID, lReqNum); + + // Server was unable to load ReqNum, which is unusual because the calling function + // should have already insured its existence. + if (!msgOut.m_bSuccess) + { + lReqNum = 0; + OTLog::Error("Error loading request number in OTServer::UserCmdGetRequest\n"); + } + + msgOut.m_strRequestNum.Format("%ld", lReqNum); + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdSendUserMessage(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + long lTransNum = 0; + + // (1) set up member variables + msgOut.m_strCommand = "@sendUserMessage"; // reply to sendUserMessage + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strNymID2 = MsgIn.m_strNymID2;// UserID of recipient pubkey + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + bool bGotNextTransNum = IssueNextTransactionNumber(m_nymServer, lTransNum, false); // bool bStoreTheNumber = false + + OTPseudonym nym2; + nym2.SetIdentifier(MsgIn.m_strNymID2); + + OTIdentifier RECIPIENT_USER_ID(nym2), SERVER_ID(m_strServerID); + + OTLedger theLedger(RECIPIENT_USER_ID, RECIPIENT_USER_ID, SERVER_ID); + + OTString strInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(strInMessage); + + if (!bGotNextTransNum) + { + lTransNum = 0; + OTLog::Error("Error getting next transaction number in OTServer::UserCmdSendUserMessage\n"); + } + // Drop in the Nymbox + else if (msgOut.m_bSuccess = (theLedger.LoadNymbox() && theLedger.VerifyAccount(m_nymServer)) ) + { + OTTransaction * pTransaction = OTTransaction::GenerateTransaction(theLedger, OTTransaction::message, lTransNum); + + if (NULL != pTransaction) // The above has an OT_ASSERT within, but I just like to check my pointers. + { + pTransaction-> SetReferenceToNum(lTransNum); // <====== Recipient RECEIVES entire incoming message as string here, which includes the sender user ID, + pTransaction-> SetReferenceString(strInMessage); // and has an OTEnvelope in the payload. Message is signed by sender, and envelope is encrypted to recipient. + + pTransaction-> SignContract(m_nymServer); + pTransaction-> SaveContract(); + + theLedger.AddTransaction(*pTransaction); // Add the message transaction to the nymbox. + + theLedger.ReleaseSignatures(); + theLedger.SignContract(m_nymServer); + theLedger.SaveContract(); + theLedger.SaveNymbox(); + + msgOut.m_bSuccess = true; + } + else + { + msgOut.m_bSuccess = false; + } + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + +void OTServer::UserCmdCheckUser(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@checkUser"; // reply to checkUser + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strNymID2 = MsgIn.m_strNymID2;// UserID of public key requested by user. + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + OTPseudonym nym2; + nym2.SetIdentifier(MsgIn.m_strNymID2); + + // If success, we send the Nym2's public key back to the user. + if (msgOut.m_bSuccess = nym2.LoadPublicKey()) + { + nym2.GetPublicKey().GetPublicKey(msgOut.m_strNymPublicKey, true); + } + // if Failed, we send the user's message back to him, ascii-armored as part of response. + else + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + + +/// An existing user is issuing a new currency. +void OTServer::UserCmdIssueAssetType(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@issueAssetType";// reply to issueAssetType + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strAssetID = MsgIn.m_strAssetID; // Asset Type ID, a hash of the asset contract. + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier USER_ID(theNym), SERVER_ID(m_strServerID), ASSET_TYPE_ID(MsgIn.m_strAssetID); + + OTAssetContract * pAssetContract = NULL; + + // Make sure the contract isn't already available on this server. + if (pAssetContract = GetAssetContract(ASSET_TYPE_ID)) + { + OTLog::Error("Error: Attempt to issue asset type that already exists in OTServer::UserCmdIssueAssetType.\n"); + } + else + { + // Pull the contract out of the message and verify it. + OTString strFoldername(OTLog::ContractFolder()), strFilename(MsgIn.m_strAssetID.Get()); + + OTString strContract(MsgIn.m_ascPayload); + pAssetContract = new OTAssetContract(MsgIn.m_strAssetID, strFoldername, strFilename, MsgIn.m_strAssetID); + + OTIdentifier ASSET_USER_ID; + bool bSuccessLoadingContract = false; + bool bSuccessCalculateDigest = false; + OTPseudonym * pNym = NULL; + + if (pAssetContract) + { + bSuccessLoadingContract = pAssetContract->LoadContractFromString(strContract); + + if (pNym = (OTPseudonym*)pAssetContract->GetContractPublicNym()) + { +// pNym->GetIdentifier(ASSET_USER_ID); + OTString strPublicKey; + bool bGotPublicKey = pNym->GetPublicKey().GetPublicKey(strPublicKey); + + if (!bGotPublicKey) + { + OTLog::Error("Error getting public key in OTServer::UserCmdIssueAssetType.\n"); + } + else + { + bSuccessCalculateDigest = ASSET_USER_ID.CalculateDigest(strPublicKey); + + if (!bSuccessCalculateDigest) + { + OTLog::Error("Error calculating digest in OTServer::UserCmdIssueAssetType.\n"); + } + } + } + } + + // Make sure the public key in the contract is the public key of the Nym. + // If we successfully loaded the contract from the string, and the contract + // internally verifies (the ID matches the hash of the contract, and the + // signature verifies with the contract key that's inside the contract), + // AND the Nym making this request has the same ID as the Nym in the + // asset contract. (ONLY the issuer of that contract can connect to this + // server and issue his currency.) + // TODO make sure a receipt is issued that the issuer can post on his + // website, to verify that he has indeed issued the currency at the specified + // transaction processor. That way, users can double-check. + if (bSuccessCalculateDigest) + { + if ((ASSET_USER_ID == USER_ID)) + // The ID of the user who signed the contract must be the ID of the user + // whose public key is associated with this user account. They are one. + { + if (pAssetContract->VerifyContract()) + { + // Create an ISSUER account (like a normal account, except it can go negative) + OTAccount * pNewAccount = NULL; + OTCleanup theAcctGuardian; + + // If we successfully create the account, then bundle it in the message XML payload + if (pNewAccount = OTAccount::GenerateNewAccount(USER_ID, SERVER_ID, m_nymServer, MsgIn, + OTAccount::issuer)) // This last parameter makes it an ISSUER account + { // instead of the default SIMPLE. + theAcctGuardian.SetCleanupTarget(*pNewAccount); // So I don't have to worry about cleaning it up. + + OTString tempPayload(*pNewAccount); + msgOut.m_ascPayload.SetString(tempPayload); + + // Attach the new account number to the outgoing message. + pNewAccount->GetIdentifier(msgOut.m_strAcctID); + + // Now that the account is actually created, let's add the new asset contract + // to the server's list. + AddAssetContract(*pAssetContract); // Do NOT clean this up unless failure! Server will clean it up. + SaveMainFile(); // So the main xml file knows to load this asset type next time we run. + + // Make sure the contracts/%s file is created for next time. + pAssetContract->SaveContract(OTLog::ContractFolder(), strFilename.Get()); + + // --------------------------------------------------- + + OTIdentifier theNewAccountID; + pNewAccount->GetIdentifier(theNewAccountID); + + // OTLog::Error("DEBUG: GenerateNewAccount successfully returned account pointer. Contents:\n%s\n", tempPayload.Get()); + + // ----------------------------------------------- + + OTLog::Output(0, "Generating inbox/outbox for new issuer acct. IGNORE ANY \"FILE OPEN\" ERRORS HERE.\n"); + + OTLedger theOutbox (USER_ID, theNewAccountID, SERVER_ID), + theInbox (USER_ID, theNewAccountID, SERVER_ID); + + bool bSuccessLoadingInbox = theInbox.LoadInbox(); + bool bSuccessLoadingOutbox = theOutbox.LoadOutbox(); + + // -------------------------------------------------------------------- + + // ...or generate them otherwise... + + if (true == bSuccessLoadingInbox) // WEIRD IF THIS HAPPENED... + bSuccessLoadingInbox = theInbox.VerifyAccount(m_nymServer); // todo -- this should NEVER happen, the ID was just RANDOMLY generated, so HOW did the inbox already exist??? + else + { + bSuccessLoadingInbox = theInbox.GenerateLedger(theNewAccountID, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (bSuccessLoadingInbox) + { + bSuccessLoadingInbox = theInbox.SignContract(m_nymServer); + + if (bSuccessLoadingInbox) + { + bSuccessLoadingInbox = theInbox.SaveContract(); + + if (bSuccessLoadingInbox) + bSuccessLoadingInbox = theInbox.SaveInbox(); + } + } + } + + // -------------------------------------------------------------------- + + if (true == bSuccessLoadingOutbox) // WEIRD IF THIS HAPPENED.... + bSuccessLoadingOutbox = theOutbox.VerifyAccount(m_nymServer); // todo -- this should NEVER happen, the ID was just RANDOMLY generated, so HOW did the outbox already exist??? + else + { + bSuccessLoadingOutbox = theOutbox.GenerateLedger(theNewAccountID, SERVER_ID, OTLedger::outbox, true); // bGenerateFile=true + + if (bSuccessLoadingOutbox) + { + bSuccessLoadingOutbox = theOutbox.SignContract(m_nymServer); + + if (bSuccessLoadingOutbox) + { + bSuccessLoadingOutbox = theOutbox.SaveContract(); + + if (bSuccessLoadingOutbox) + bSuccessLoadingOutbox = theOutbox.SaveOutbox(); + } + } + } + + // -------------------------------------------------------------------- + + if (false == bSuccessLoadingInbox) + { + OTString strNewAcctID(theNewAccountID); + + OTLog::vError("ERROR generating inbox ledger in OTServer::UserCmdIssueAssetType:\n%s\n", + strNewAcctID.Get()); + } + else if (false == bSuccessLoadingOutbox) + { + OTString strNewAcctID(theNewAccountID); + + OTLog::vError("ERROR generating outbox ledger in OTServer::UserCmdIssueAssetType:\n%s\n", + strNewAcctID.Get()); + } + else + { + msgOut.m_bSuccess = true; // <==== SUCCESS!! + + // On the server side, each nym stores a list of its asset accounts (IDs). + // + std::set & theAccountSet = theNym.GetSetAssetAccounts(); + theAccountSet.insert(msgOut.m_strAcctID.Get()); + + theNym.SaveSignedNymfile(m_nymServer); + + // TODO fire off a separate process here to create the mint. + // + // THE PROGRAM ALREADY EXISTS (CreateMint) and you can RUN IT BY HAND FOR NOW. + // But in actual production environment, we'll trigger that executable here, + // and within a few minutes, users will be able to getMint successfully (and + // thus withdraw cash.) + } + } + else + { + OTLog::Error("Failure generating new issuer account in OTServer::UserCmdIssueAssetType.\n"); + } + } + else + { + OTLog::Error("Failure verifying asset contract in OTServer::UserCmdIssueAssetType.\n"); + } + } + else + { + OTString strAssetUserID(ASSET_USER_ID), strUserID; + theNym.GetIdentifier(strUserID); + OTLog::vError("User ID on this user account:\n%s\ndoes NOT match public key used in asset contract:\n%s\n", + strUserID.Get(), strAssetUserID.Get()); + } + } + else + { + OTLog::Error("Failure loading asset contract from client in OTServer::UserCmdIssueAssetType\n"); + } + + + if (pAssetContract && !msgOut.m_bSuccess) // We only clean it up here, if the Server didn't take ownership of it. + { + delete pAssetContract; + pAssetContract = NULL; + } + } + + // Either way, we need to send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +/// An existing user is creating an issuer account (that he will not control) based on a basket of currencies. +void OTServer::UserCmdIssueBasket(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@issueBasket"; // reply to issueBasket + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + // Either way, we need to send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + const OTIdentifier USER_ID(theNym), SERVER_ID(m_strServerID), SERVER_USER_ID(m_nymServer); + + OTString strBasket(MsgIn.m_ascPayload); + OTBasket theBasket; + + if (theBasket.LoadContractFromString(strBasket) && theBasket.VerifySignature(theNym)) + { + // The contract ID of the basket is calculated based on the UNSIGNED portion of the contract + // (so it is unique on every server) and for the same reason with the AccountID removed before calculating. + OTIdentifier BASKET_ID, BASKET_ACCOUNT_ID, BASKET_CONTRACT_ID; + theBasket.CalculateContractID(BASKET_ID); + + // Use BASKET_ID to look up the Basket account and see if it already exists (the server keeps a list.) + bool bFoundBasket = LookupBasketAccountID(BASKET_ID, BASKET_ACCOUNT_ID); + + if (!bFoundBasket) + { + // Generate a new OTAssetContract -- the ID will be a hash of THAT contract, which includes theBasket as well as + // the server's public key as part of its contents. Therefore, the actual Asset Type ID of the basket currency + // will be different from server to server. + // + // BUT!! Because we can also generate a hash of theBasket.m_xmlUnsigned (which is what OTBasket::CalculateContractID + // does) then we have a way of obtaining a number that will be the same from server to server, for cross-server + // transfers of basket assets. + // + // The way it will work is, when the cross-server transfer request is generated, the server will check the asset contract + // for the "from" account and see if it is for a basket currency. If it is, there will be a function on the contract + // that returns the Basket ID, which can be included in the message to the target server, which uses the ID to look + // for its own basket issuer account for the same basket asset type. This allows the target server to translate the + // Asset Type ID to its own corresponding ID for the same basket. + + + // GenerateNewAccount also expects the NymID to be stored in m_strNymID. + // Since we want the SERVER to be the user for basket accounts, I'm setting it that + // way in MsgIn so that GenerateNewAccount will create the sub-account with the server + // as the owner, instead of the user. + SERVER_USER_ID.GetString(MsgIn.m_strNymID); + + // We need to actually create all the sub-accounts. + // This loop also sets the Account ID onto the basket items (which formerly was blank, from the client.) + // This loop also adds the BASKET_ID and the NEW ACCOUNT ID to a map on the server for later reference. + for (int i = 0; i < theBasket.Count(); i++) + { + BasketItem * pItem = theBasket.At(i); + + + /* + + // Just make sure theMessage has these members populated: + // + // theMessage.m_strNymID; + // theMessage.m_strAssetID; + // theMessage.m_strServerID; + + // static method (call it without an instance, using notation: OTAccount::GenerateNewAccount) + OTAccount * OTAccount::GenerateNewAccount( const OTIdentifier & theUserID, const OTIdentifier & theServerID, + const OTPseudonym & theServerNym, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType=OTAccount::simple) + + + // The above method uses this one internally... + bool OTAccount::GenerateNewAccount(const OTPseudonym & theServer, const OTMessage & theMessage, + const OTAccount::AccountType eAcctType=OTAccount::simple) + + */ + + OTAccount * pNewAccount = NULL; + + // GenerateNewAccount expects the Asset ID to be in MsgIn. So we'll just put it there to make things easy... + pItem->SUB_CONTRACT_ID.GetString(MsgIn.m_strAssetID); + + // If we successfully create the account, then bundle it in the message XML payload + if (pNewAccount = OTAccount::GenerateNewAccount(SERVER_USER_ID, SERVER_ID, m_nymServer, MsgIn)) + { + msgOut.m_bSuccess = true; + + // Now the item finally has its account ID. Let's grab it. + pNewAccount->GetIdentifier(pItem->SUB_ACCOUNT_ID); + + delete pNewAccount; + pNewAccount = NULL; + } + else { + msgOut.m_bSuccess = false; + break; + } + } // for + + + if (true == msgOut.m_bSuccess) + { + theBasket.ReleaseSignatures(); + theBasket.SignContract(m_nymServer); + theBasket.SaveContract(); + + // The basket does not yet exist on this server. Create a new Asset Contract to support it... + OTAssetContract * pBasketContract = new OTAssetContract; + + // todo check for memory allocation failure here. + + // Put the Server's Public Key into the "contract" key field of the new Asset Contract... + // This adds a "contract" key to the asset contract (the server's public key) + // Asset Contracts are verified by a key found internal to the contract, so it's + // necessary to put the key in there so it will verify later. + // This also updates the m_xmlUnsigned contents, signs the contract, saves it, + // and calculates the new ID. + pBasketContract->CreateBasket(theBasket, m_nymServer); + + // Grab the new asset ID for the new basket currency + pBasketContract->GetIdentifier(BASKET_CONTRACT_ID); + OTString STR_BASKET_CONTRACT_ID(BASKET_CONTRACT_ID); + + // set the new Asset Type ID, aka ContractID, onto the outgoing message. + msgOut.m_strAssetID = STR_BASKET_CONTRACT_ID; + + // Save the new Asset Contract to disk + const OTString strFoldername(OTLog::ContractFolder()), strFilename(STR_BASKET_CONTRACT_ID.Get()); + + // Save the new basket contract to the contracts folder + // (So the users can use it the same as they would use any other contract.) + pBasketContract->SaveContract(strFoldername.Get(), strFilename.Get()); + + AddAssetContract(*pBasketContract); + // I don't save this here. Instead, I wait for AddBasketAccountID and then I call SaveMainFile after that. See below. + // TODO need better code for reverting when something screws up halfway through a change. + // If I add this contract, it's not enough to just "not save" the file. I actually need to re-load the file + // in order to TRULY "make sure" this won't screw something up on down the line. + + // Once the new Asset Type is generated, from which the BasketID can be requested at will, next we need to create + // the issuer account for that new Asset Type. (We have the asset type ID and the contract file. Now let's create + // the issuer account the same as we would for any normal issuer account.) + // + // The issuer account is special compared to a normal issuer account, because within its walls, it must store an + // OTAccount for EACH sub-contract, in order to store the reserves. That's what makes the basket work. + + OTAccount * pBasketAccount = NULL; + + // GenerateNewAccount expects the Asset ID to be in MsgIn. So we'll just put it there to make things easy... + MsgIn.m_strAssetID = STR_BASKET_CONTRACT_ID; + + if (pBasketAccount = OTAccount::GenerateNewAccount(SERVER_USER_ID, SERVER_ID, m_nymServer, MsgIn, OTAccount::basket)) + { + msgOut.m_bSuccess = true; + + pBasketAccount->GetIdentifier(msgOut.m_strAcctID); // string + pBasketAccount->GetAssetTypeID().GetString(msgOut.m_strAssetID); + + pBasketAccount->GetIdentifier(BASKET_ACCOUNT_ID); // id + + // So the server can later use the BASKET_ID (which is universal) + // to lookup the account ID on this server corresponding to that basket. + // (The account ID will be different from server to server, thus the need + // to be able to look it up via the basket ID.) + AddBasketAccountID(BASKET_ID, BASKET_ACCOUNT_ID, BASKET_CONTRACT_ID); + + SaveMainFile(); // So the main xml file loads this basket info next time we run. + + delete pBasketAccount; + pBasketAccount = NULL; + } + else { + msgOut.m_bSuccess = false; + } + + }// if true == msgOut.m_bSuccess + } + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +/// An existing user is creating an asset account. +void OTServer::UserCmdCreateAccount(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@createAccount"; // reply to createAccount + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier USER_ID(theNym), SERVER_ID(m_strServerID); + + // ---------------------------------------------- + + OTAccount * pNewAccount = NULL; + + // If we successfully create the account, then bundle it in the message XML payload + if (pNewAccount = OTAccount::GenerateNewAccount(USER_ID, SERVER_ID, m_nymServer, MsgIn)) + { + OTIdentifier theNewAccountID; + pNewAccount->GetIdentifier(theNewAccountID); + +// OTLog::Error("DEBUG: GenerateNewAccount successfully returned account pointer. Contents:\n%s\n", tempPayload.Get()); + + // ----------------------------------------------- + + OTLedger theOutbox(USER_ID, theNewAccountID, SERVER_ID), + theInbox(USER_ID, theNewAccountID, SERVER_ID); + + bool bSuccessLoadingInbox = theInbox.LoadInbox(); + bool bSuccessLoadingOutbox = theOutbox.LoadOutbox(); + + // -------------------------------------------------------------------- + + // ...or generate them otherwise... + + if (true == bSuccessLoadingInbox) // WEIRD IF THIS HAPPENED... + bSuccessLoadingInbox = theInbox.VerifyAccount(m_nymServer); // todo -- this should NEVER happen, the ID was just RANDOMLY generated, so HOW did the inbox already exist??? + else + { + bSuccessLoadingInbox = theInbox.GenerateLedger(theNewAccountID, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + if (bSuccessLoadingInbox) + { + bSuccessLoadingInbox = theInbox.SignContract(m_nymServer); + + if (bSuccessLoadingInbox) + { + bSuccessLoadingInbox = theInbox.SaveContract(); + + if (bSuccessLoadingInbox) + bSuccessLoadingInbox = theInbox.SaveInbox(); + } + } + } + + // -------------------------------------------------------------------- + + if (true == bSuccessLoadingOutbox) // WEIRD IF THIS HAPPENED.... + bSuccessLoadingOutbox = theOutbox.VerifyAccount(m_nymServer); // todo -- this should NEVER happen, the ID was just RANDOMLY generated, so HOW did the outbox already exist??? + else + { + bSuccessLoadingOutbox = theOutbox.GenerateLedger(theNewAccountID, SERVER_ID, OTLedger::outbox, true); // bGenerateFile=true + + if (bSuccessLoadingOutbox) + { + bSuccessLoadingOutbox = theOutbox.SignContract(m_nymServer); + + if (bSuccessLoadingOutbox) + { + bSuccessLoadingOutbox = theOutbox.SaveContract(); + + if (bSuccessLoadingOutbox) + bSuccessLoadingOutbox = theOutbox.SaveOutbox(); + } + } + } + + // -------------------------------------------------------------------- + + if (false == bSuccessLoadingInbox) + { + const OTString strNewAcctID(theNewAccountID); + + OTLog::vError("ERROR generating inbox ledger in OTServer::UserCmdCreateAccount:\n%s\n", + strNewAcctID.Get()); + } + else if (false == bSuccessLoadingOutbox) + { + const OTString strNewAcctID(theNewAccountID); + + OTLog::vError("ERROR generating outbox ledger in OTServer::UserCmdCreateAccount:\n%s\n", + strNewAcctID.Get()); + } + else + { + msgOut.m_bSuccess = true; // <==== SUCCESS!! + + pNewAccount->GetIdentifier(msgOut.m_strAcctID); + + // On the server side, each nym stores a list of its asset accounts (IDs). + // + std::set & theAccountSet = theNym.GetSetAssetAccounts(); + theAccountSet.insert(msgOut.m_strAcctID.Get()); + + theNym.SaveSignedNymfile(m_nymServer); + + // --------------------------------- + + OTString tempPayload(*pNewAccount); + msgOut.m_ascPayload.SetString(tempPayload); + } + + // -------------------------------------------------------------------- + + delete pNewAccount; + pNewAccount = NULL; + } + + // Either way, we need to send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::NotarizeTransfer(OTPseudonym & theNym, OTAccount & theFromAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atTransfer", that is, "a reply to the transfer request" + tranOut.SetType(OTTransaction::atTransfer); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will probably be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym), ACCOUNT_ID(theFromAccount), + ASSET_TYPE_ID(theFromAccount.GetAssetTypeID()); + + OTString strUserID(USER_ID), strAccountID(ACCOUNT_ID); + + // -------------------- + + pBalanceItem = tranIn.GetItem(OTItem::balanceStatement); + + if (NULL == pBalanceItem) + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeTransfer: Expected OTItem::balanceStatement in trans# %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } + // For now, there should only be one of these transfer items inside the transaction. + // So we treat it that way... I either get it successfully or not. + else if (pItem = tranIn.GetItem(OTItem::transfer)) + { + // The response item, as well as the inbox and outbox items, will contain a copy + // of the request item. So I save it into a string here so they can all grab a copy of it + // into their "in reference to" fields. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // IDFromAccount is the ID on the "from" Account that was passed in. + // IDItemFromAccount is the "from" account ID on the transaction Item we are currently examining. + // IDItemToAccount is the "to" account ID on the transaction item we are currently examining. + OTIdentifier IDFromAccount(theFromAccount); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransfer); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + +// OTString strTestInRefTo2; +// pResponseItem->GetReferenceString(strTestInRefTo2); +// OTLog::Error("DEBUG: Item in reference to: %s\n", strTestInRefTo2.Get()); + + // Set the ID on the To Account based on what the transaction request said. (So we can load it up.) + OTAccount * pDestinationAcct = OTAccount::LoadExistingAccount(pItem->GetDestinationAcctID(), SERVER_ID); + + OTCleanup theDestAcctGuardian(pDestinationAcct); // This is safe in cases where NULL is returned. No more need to cleanup pDestAcct. + + // Only accept transfers with positive amounts. + if (0 > pItem->GetAmount()) + { + OTLog::Output(0, "Attempt to transfer negative balance.\n"); + } + + // I'm using the operator== because it exists. + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + else if (!(IDFromAccount == pItem->GetPurportedAccountID())) + { + OTLog::Output(0, "Error: 'From' account ID on the transaction does not match 'from' account ID on the transaction item.\n"); + } + // ok so the IDs match. Does the destination account exist? + else if (NULL == pDestinationAcct) + { + OTLog::Output(0, "ERROR verifying existence of the 'to' account in OTServer::NotarizeTransfer\n"); + } + // Are both of the accounts of the same Asset Type? + else if (!(theFromAccount.GetAssetTypeID() == pDestinationAcct->GetAssetTypeID())) + { + OTString strFromAssetID(theFromAccount.GetAssetTypeID()), + strDestinationAssetID(pDestinationAcct->GetAssetTypeID()); + OTLog::vOutput(0, "ERROR - user attempted to transfer between accounts of 2 different " + "asset types in OTServer::NotarizeTransfer:\n%s\n%s\n", strFromAssetID.Get(), + strDestinationAssetID.Get()); + } + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pDestinationAcct->VerifySignature(m_nymServer)) + { + OTLog::Output(0, "ERROR verifying signature on, the 'to' account in OTServer::NotarizeTransfer\n"); + } + + // This entire function can be divided into the top and bottom halves. + // The top half is oriented around finding the "transfer" item (in the "transfer" transaction) + // and setting up the response item that will go into the response transaction. + // The bottom half is oriented, in the case of success, around creating the necessary inbox + // and outbox entries, and debiting the account, and basically performing the actual transfer. + else + { + // Okay then, everything checks out. Let's add this to the sender's outbox and the recipient's inbox. + // IF they can be loaded up from file, or generated, that is. + + // Load the inbox/outbox in case they already exist + OTLedger theFromOutbox(USER_ID, IDFromAccount, SERVER_ID), + theToInbox(pItem->GetDestinationAcctID(), SERVER_ID); + + bool bSuccessLoadingInbox = theToInbox.LoadInbox(); + bool bSuccessLoadingOutbox = theFromOutbox.LoadOutbox(); + + // -------------------------------------------------------------------- + + // ...or generate them otherwise... + + if (true == bSuccessLoadingInbox) + bSuccessLoadingInbox = theToInbox.VerifyAccount(m_nymServer); + else + bSuccessLoadingInbox = theToInbox.GenerateLedger(pItem->GetDestinationAcctID(), SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + + // -------------------------------------------------------------------- + + if (true == bSuccessLoadingOutbox) + bSuccessLoadingOutbox = theFromOutbox.VerifyAccount(m_nymServer); + else + bSuccessLoadingOutbox = theFromOutbox.GenerateLedger(IDFromAccount, SERVER_ID, OTLedger::outbox, true); // bGenerateFile=true + + // -------------------------------------------------------------------- + + OTLedger * pInbox = theFromAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theFromAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + + // -------------------------------------------------------------------- + + else if (false == bSuccessLoadingInbox || false == bSuccessLoadingOutbox) + { + OTLog::Error("ERROR generating ledger in OTServer::NotarizeTransfer.\n"); + } + else + { + // Generate new transaction number for these new transactions + // todo check this generation for failure (can it fail?) + long lNewTransactionNumber = 0; + + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + // ------------------------------------------ + // I create TWO Outbox transactions -- one for the real outbox, (theFromOutbox) + // and one for pOutbox (used for verifying the balance statement.) + // pTEMPOutboxTransaction (here below) is that last one, pOutbox. + // + OTTransaction * pTEMPOutboxTransaction = OTTransaction::GenerateTransaction(*pOutbox, OTTransaction::pending, + lNewTransactionNumber); + // ------------------------------------------ + + OTTransaction * pOutboxTransaction = OTTransaction::GenerateTransaction(theFromOutbox, OTTransaction::pending, + lNewTransactionNumber); + +// IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + OTTransaction * pInboxTransaction = OTTransaction::GenerateTransaction(theToInbox, OTTransaction::pending, + lNewTransactionNumber); + // ------------------------------------------ + + // UPDATE: I am now issuing one new transaction number above, instead of two. This is to make it easy + // for the two to cross-reference each other. Later if I want to remove the transaction from the inbox + // and need to know the corresponding transaction # for the outbox, it will be the same number. + + // I have to set this one up just like the one below. + pTEMPOutboxTransaction->SetReferenceString(strInReferenceTo); + pTEMPOutboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + + // ------------------------------------------- + + // the new transactions store a record of the item they're referring to. + pOutboxTransaction->SetReferenceString(strInReferenceTo); + pOutboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + + //todo put these two together in a method. + pInboxTransaction-> SetReferenceString(strInReferenceTo); + pInboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + + // Now we have created 2 new transactions from the server to the users' boxes + // Let's sign them and add to their inbox / outbox. + pOutboxTransaction->SignContract(m_nymServer); + pInboxTransaction-> SignContract(m_nymServer); + + pOutboxTransaction->SaveContract(); + pInboxTransaction-> SaveContract(); + + // ------------------------------------------- + + // Meanwhile a copy of the outbox transaction is also added to + // pOutbox. (It's just another copy of the outbox, but used + // purely for verifying the balance statement, while a different + // copy of the outbox is used for actually adding the receipt + // and saving to the outbox file.) + // + pTEMPOutboxTransaction->SignContract(m_nymServer); + pTEMPOutboxTransaction->SaveContract(); + + pOutbox->AddTransaction(*pTEMPOutboxTransaction); // pOutbox will clean this up + + // The balance item from the user, for the outbox transaction, will not have + // the correct transaction number (because I just generated it above, so the user + // could not possibly have known that when he sent his message.) Currently it is + // set to "1" in the user request, but I just put the actual number in the pOutbox + // above (since I now have the actual number.) + // + // So when the receipt is saved (the output transaction) it will show the user's + // signed request with "1" in the outbox, included in the server's signed reply + // with lNewTransactionNumber in the outbox to correspond to it. The user saves + // a copy of the same receipt, thus he will be unable to produce a receipt signed + // by the server, without producing the exact same thing. + // ("1" in the request and lNewTransactionNumber in the signed response.) + // + // This all means that the below call to VerifyBalanceStatement() needs to verify + // the number "1" on the user request, as lNewTransactionNumber in pOutbox, in order + // to handle this special case, since otherwise the verification would fail. + // + if (!(pBalanceItem->VerifyBalanceStatement(pItem->GetAmount() * (-1), // My acct balance will be smaller as a result of this transfer. + theNym, + *pInbox, + *pOutbox, + theFromAccount, + tranIn, + lNewTransactionNumber))) + { + OTLog::vOutput(0, "ERROR verifying balance statement while performing transfer. Acct ID:\n%s\n", + strAccountID.Get()); + } + + else + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the balance agreement (just above) was successful. + pResponseBalanceItem->SetNewOutboxTransNum(lNewTransactionNumber); // So the receipt will show that the client's "1" in the outbox is now actually "34" or whatever, issued by the server as part of successfully processing the transaction. + + // Deduct the amount from the account... + // TODO an issuer account here, can go negative. + // whereas a regular account should not be allowed to go negative. + if (theFromAccount.Debit(pItem->GetAmount())) + {//todo need to be able to "roll back" if anything inside this block fails. + // Here the transactions we just created are actually added to the ledgers. + theFromOutbox. AddTransaction(*pOutboxTransaction); + theToInbox. AddTransaction(*pInboxTransaction); + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theFromAccount. ReleaseSignatures(); + theFromOutbox. ReleaseSignatures(); + theToInbox. ReleaseSignatures(); + + // Sign all three of them. + theFromAccount. SignContract(m_nymServer); + theFromOutbox. SignContract(m_nymServer); + theToInbox. SignContract(m_nymServer); + + // Save all three of them internally + theFromAccount. SaveContract(); + theFromOutbox. SaveContract(); + theToInbox. SaveContract(); + + // Save all three of their internals (signatures and all) to file. + theFromAccount. SaveAccount(); + theFromOutbox. SaveOutbox(); + theToInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + // otherwise, if we never entered this block, then it would still be set to rejection, and the + // new items would never have been added to the inbox/outboxes, and those files, along with + // the account file, would never have had their signatures released, or been re-signed or + // re-saved back to file. The debit failed, so all of those other actions would fail also. + // BUT... if the message comes back with acknowledgement--then all of these actions must have + // happened, and here is the server's signature to prove it. + // Otherwise you get no items and no signature. Just a rejection item in the response transaction. + pResponseItem->SetStatus(OTItem::acknowledgement); + } + else + { + delete pOutboxTransaction; pOutboxTransaction = NULL; // I can't use OTCleanup here because sometimes we DON'T delete it. (above) + delete pInboxTransaction; pInboxTransaction = NULL; + OTLog::vOutput(0, "Unable to debit account in OTServer::NotarizeTransfer: %ld\n", pItem->GetAmount()); + } + } + } // both boxes were successfully loaded or generated. + } + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + +// OTString strTestInRefTo; +// pResponseItem->GetReferenceString(strTestInRefTo); +// OTLog::vError("DEBUG: Item in reference to: %s\n", strTestInRefTo.Get()); + + } // if pItem = tranIn.GetItem(OTItem::transfer) + else + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeTransfer: Expected OTItem::transfer on trans# %ld:\n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } +} + + + + + + +/// NotarizeWithdrawal supports two withdrawal types: +/// +/// OTItem::withdrawVoucher This is a bank voucher, like a cashier's check. Funds are transferred to +/// the bank, who then issues a cheque drawn on an internal voucher account. +/// +/// OTItem::withdrawal This is a digital cash withdrawal, in the form of untraceable, blinded +/// tokens. Funds are transferred to the bank, who blind-signs the tokens. +/// +void OTServer::NotarizeWithdrawal(OTPseudonym & theNym, OTAccount & theAccount, + OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atWithdrawal", that is, "a reply to the withdrawal request" + tranOut.SetType(OTTransaction::atWithdrawal); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will probably be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym), ACCOUNT_ID(theAccount), + SERVER_USER_ID(m_nymServer), ASSET_TYPE_ID(theAccount.GetAssetTypeID()); + + const OTString strUserID(USER_ID), strAccountID(ACCOUNT_ID), strAssetTypeID(ASSET_TYPE_ID); + + + pBalanceItem = tranIn.GetItem(OTItem::balanceStatement); + + if (NULL == pBalanceItem) + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeWithdrawal: Wxpected OTItem::balanceStatement, but not found in trans # %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } + + // ------------------------------------------------------------------------ + // + // WITHDRAW VOUCHER (like a cashier's cheque) is the top half of this function. + // + // For digital cash (blinded tokens), see the bottom half of this function. + // + else if (pItem = tranIn.GetItem(OTItem::withdrawVoucher)) + { + // The response item will contain a copy of the request item. So I save it into a string + // here so they can all grab a copy of it into their "in reference to" fields. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // Server response item being added to server response transaction (tranOut) + // (They're getting SOME sort of response item.) + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atWithdrawVoucher); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + OTAccount * pVoucherReserveAcct = NULL; // contains the server's funds to back vouchers of a specific asset type. + + // ---------------------------------------------------- + + OTLedger * pInbox = theAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + // ---------------------------------------------------- + + // I'm using the operator== because it exists. + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + if (!(ACCOUNT_ID == pItem->GetPurportedAccountID())) + { // TODO see if this is already verified by the caller function and if so, remove. + OTLog::Output(0, "Error: Account ID does not match account ID on the withdrawal item.\n"); + } + // -------------------------------------------------------------------- + + else if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + + // -------------------------------------------------------------------- + + // The server will already have a special account for issuing vouchers. Actually, a list of them -- + // one for each asset type. Since this is the normal way of doing business, GetVoucherAccount() will + // just create it if it doesn't already exist, and then return the pointer. Therefore, a failure here + // is a catastrophic failure! Should never fail. + else if ((pVoucherReserveAcct = GetVoucherAccount(ASSET_TYPE_ID)) && + pVoucherReserveAcct->VerifyAccount(m_nymServer)) + { + OTString strVoucherRequest, strItemNote; + pItem->GetNote(strItemNote); + pItem->GetAttachment(strVoucherRequest); + + OTIdentifier VOUCHER_ACCOUNT_ID(*pVoucherReserveAcct); + + OTCheque theVoucher(SERVER_ID, ASSET_TYPE_ID), + theVoucherRequest(SERVER_ID, ASSET_TYPE_ID); + + bool bLoadContractFromString = theVoucherRequest.LoadContractFromString(strVoucherRequest); + + if (!bLoadContractFromString) + { + OTLog::vError("ERROR loading voucher request from string in OTServer::NotarizeWithdrawal:\n%s\n", + strVoucherRequest.Get()); + } + else if (!(pBalanceItem->VerifyBalanceStatement(theVoucherRequest.GetAmount() * (-1), // My account's balance will go down by this much. + theNym, + *pInbox, + *pOutbox, + theAccount, + tranIn))) + { + OTLog::vOutput(0, "ERROR verifying balance statement while issuing voucher. Acct ID:\n%s\n", + strAccountID.Get()); + } + else // successfully loaded the voucher request from the string... + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // ------------------------------------------- + + OTString strChequeMemo; + strChequeMemo.Format("%s\n%s", strItemNote.Get(), theVoucherRequest.GetMemo().Get()); + + // 10 minutes == 600 Seconds + // 1 hour == 3600 Seconds + // 1 day == 86400 Seconds + // 30 days == 2592000 Seconds + // 3 months == 7776000 Seconds + // 6 months == 15552000 Seconds + + const time_t VALID_FROM = time(NULL); // This time is set to TODAY NOW + const time_t VALID_TO = VALID_FROM + 15552000;// This time occurs in 180 days (6 months) + + long lNewTransactionNumber = 0; + + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber); // bStoreTheNumber defaults to true. We save the transaction + // number on the server Nym (normally we'd discard it) because + const long lAmount = theVoucherRequest.GetAmount(); // when the cheque is deposited, the server nym, as the owner of + const OTIdentifier & RECIPIENT_ID = theVoucherRequest.GetRecipientUserID(); // the voucher account, needs to verify the transaction # on the + // cheque (to prevent double-spending of cheques.) + bool bIssueVoucher = theVoucher.IssueCheque( + lAmount, // The amount of the cheque. + lNewTransactionNumber, // Requiring a transaction number prevents double-spending of cheques. + VALID_FROM, // The expiration date (valid from/to dates) of the cheque + VALID_TO, // Vouchers are automatically starting today and lasting 6 months. + VOUCHER_ACCOUNT_ID, // The asset account the cheque is drawn on. + SERVER_USER_ID, // User ID of the sender (in this case the server.) + strChequeMemo.Get(), // Optional memo field. Includes item note and request memo. + theVoucherRequest.HasRecipient() ? (&RECIPIENT_ID) : NULL); + + // IF we successfully created the voucher, AND the voucher amount is greater than 0, + // AND debited the user's account, + // AND credited the server's voucher account, + // + // THEN save the accounts and return the voucher to the user. + // + if (bIssueVoucher && (lAmount > 0) && + theAccount.Debit(theVoucherRequest.GetAmount()) + ) + { + if (false == pVoucherReserveAcct->Credit(theVoucherRequest.GetAmount())) + { + OTLog::Error("OTServer::NotarizeWithdrawal: Failed Crediting voucher reserve account.\n"); + + if (false == theAccount.Credit(theVoucherRequest.GetAmount())) + OTLog::Error("OTServer::NotarizeWithdrawal (voucher): Failed Crediting user account.\n"); + } + else + { + OTString strVoucher; + theVoucher.SetAsVoucher(); // All this does is set the voucher's internal contract + // string to "VOUCHER" instead of "CHEQUE". + theVoucher.SignContract(m_nymServer); + theVoucher.SaveContract(); + theVoucher.SaveContract(strVoucher); + + pResponseItem->SetAttachment(strVoucher); + pResponseItem->SetStatus(OTItem::acknowledgement); + + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theAccount. ReleaseSignatures(); + theAccount. SignContract(m_nymServer); // Sign + theAccount. SaveContract(); // Save + theAccount. SaveAccount(); // Save to file + + // We also need to save the Voucher cash reserve account. + // (Any issued voucher cheque is automatically backed by this reserve account. + // If a cheque is deposited, the funds come back out of this account. If the + // cheque expires, then after the expiry period, if it remains in the account, + // it is now the property of the transaction server.) + pVoucherReserveAcct->ReleaseSignatures(); + pVoucherReserveAcct->SignContract(m_nymServer); + pVoucherReserveAcct->SaveContract(); + pVoucherReserveAcct->SaveAccount(); + } + } + //else{} // TODO log that there was a problem with the amount + + } // voucher request loaded successfully from string + } // GetVoucherAccount() + else + { + OTLog::vError("GetVoucherAccount() failed in NotarizeWithdrawal. Asset Type:\n%s\n", + strAssetTypeID.Get()); + } + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + } + + // -------------------------------------------------------------------------------------- + + // WITHDRAW DIGITAL CASH (BLINDED TOKENS) + // + // For now, there should only be one of these withdrawal items inside the transaction. + // So we treat it that way... I either get it successfully or not. + else if (pItem = tranIn.GetItem(OTItem::withdrawal)) + { + // The response item will contain a copy of the request item. So I save it into a string + // here so they can all grab a copy of it into their "in reference to" fields. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atWithdrawal); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // -------------------------------------------------------------------- + + OTLedger * pInbox = theAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + // -------------------------------------------------------------------- + + OTMint * pMint = NULL; + OTAccount * pMintCashReserveAcct = NULL; + + if (0 > pItem->GetAmount()) + { + OTLog::Output(0, "Attempt to withdraw a negative amount.\n"); + } + + // I'm using the operator== because it exists. + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + else if (!(ACCOUNT_ID == pItem->GetPurportedAccountID())) + { + OTLog::Output(0, "Error: 'From' account ID on the transaction does not match 'from' account ID on the withdrawal item.\n"); + } + + else if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + + else + { + + // -------------------------------------------------------------------- + // The COIN REQUEST (including the prototokens) comes from the client side. + // so we assume the OTToken is in the payload. Now we need to randomly choose one for + // signing, and reply to the client with that number so that the client can reply back + // to us with the unblinding factors for all the other prototokens (but that one.) + // + // In the meantime, I have to store this request somewhere -- presumably in the outbox or purse. + // + // UPDATE!!! Looks like Lucre protocol is simpler than that. The request only needs to contain a + // single blinded token, which the server signs and sends back. Done. + // + // The amount is known to be safe (by the mint) because the User asks the Mint to create + // a denomination (say, 10) token. The Mint therefore uses the "Denomination 10" key to sign + // the token, and will later use the "Denomination 10" key to verify the token. So the mint + // obviously trusts its own keys... There is nothing else to "open and verify", since only the ID + // itself is what gets blinded and verified. The amount on the token (as well as the asset type) + // is only there to help the bank to look up the right key, without which the token will DEFINITELY + // NOT verify. So it is in the user's interest to supply the correct amount, because otherwise he'll + // just get the wrong key and then get rejected by the bank. + + OTString strPurse; + pItem->GetAttachment(strPurse); + + // Todo do more security checking in here, like making sure the withdrawal amount matches the + // total of the proto-tokens. Update: I think this is done, since the Debits are done one-at-a-time + // for each token and it's amount/denomination + + OTPurse thePurse(SERVER_ID, ASSET_TYPE_ID); + OTPurse theOutputPurse(SERVER_ID, ASSET_TYPE_ID); + OTToken * pToken = NULL; + dequeOfTokenPtrs theDeque; + + bool bSuccess = false; + bool bLoadContractFromString = thePurse.LoadContractFromString(strPurse); + + if (!bLoadContractFromString) + { + OTLog::vError("ERROR loading purse from string in OTServer::NotarizeWithdrawal:\n%s\n", + strPurse.Get()); + } + else if (!(pBalanceItem->VerifyBalanceStatement(thePurse.GetTotalValue() * (-1), // This amount will be subtracted from my acct. + theNym, + *pInbox, + *pOutbox, + theAccount, + tranIn))) + { + OTLog::vOutput(0, "ERROR verifying balance statement while withdrawing cash. Acct ID:\n%s\n", + strAccountID.Get()); + } + else // successfully loaded the purse from the string... + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // Pull the token(s) out of the purse that was received from the client. + while (pToken = thePurse.Pop(m_nymServer)) + { + // We are responsible to cleanup pToken + // So I grab a copy here for later... + theDeque.push_front(pToken); + + pMint = GetMint(ASSET_TYPE_ID, pToken->GetSeries()); + + if (NULL == pMint) + { + OTLog::vError("OTServer::NotarizeWithdrawal: Unable to find Mint (series %d):\n%s\n", + pToken->GetSeries(), strAssetTypeID.Get()); + bSuccess = false; + break; // Once there's a failure, we ditch the loop. + } + else if (NULL == (pMintCashReserveAcct = pMint->GetCashReserveAccount())) + { + OTLog::vError("OTServer::NotarizeWithdrawal: Unable to find cash reserve account for Mint (series %d):\n%s\n", + pToken->GetSeries(), strAssetTypeID.Get()); + bSuccess = false; + break; // Once there's a failure, we ditch the loop. + } + // Mints expire halfway into their token expiration period. So if a mint creates + // tokens valid from Jan 1 through Jun 1, then the Mint itself expires Mar 1. + // That's when the next series Mint is phased in to start issuing tokens, even + // though the server continues redeeming the first series tokens until June. + // + else if (pMint->Expired()) + { + OTLog::vError("OTServer::NotarizeWithdrawal: User attempting withdrawal with an expired mint (series %d):\n%s\n", + pToken->GetSeries(), strAssetTypeID.Get()); + bSuccess = false; + break; // Once there's a failure, we ditch the loop. + } + else + { + OTString theStringReturnVal; + + // TokenIndex is for cash systems that send multiple proto-tokens, so the Mint + // knows which proto-token has been chosen for signing. + // But Lucre only uses a single proto-token, so the token index is always 0. + if (!(pToken->GetAssetID() == ASSET_TYPE_ID) || + !(pMint->SignToken(m_nymServer, *pToken, theStringReturnVal, 0))) // nTokenIndex = 0 // ****************************************** + { + bSuccess = false; + OTLog::Error("ERROR signing token in OTServer::NotarizeWithdrawal\n"); + break; + } + else + { + OTASCIIArmor theArmorReturnVal(theStringReturnVal); + + pToken->ReleaseSignatures(); // this releases the normal signatures, not the Lucre signed token from the Mint, above. + + pToken->SetSignature(theArmorReturnVal, 0); // nTokenIndex = 0 + + // Sign and Save the token + pToken->SignContract(m_nymServer); + pToken->SaveContract(); + + // Now the token is in signedToken mode, and the other prototokens have been released. + + // Deduct the amount from the account... + if (theAccount.Debit(pToken->GetDenomination())) + {//todo need to be able to "roll back" if anything inside this block fails. + bSuccess = true; + + // Credit the server's cash account for this asset type in the same + // amount that was debited. When the token is deposited again, Debit that same + // server cash account and deposit in the depositor's acct. + // Why, you might ask? Because if the token expires, the money will stay in + // the bank's cash account instead of being lost (and screwing up the overall + // issuer balance, with the issued money disappearing forever.) The bank knows + // that once the series expires, whatever funds are left in that cash account are + // for the bank to keep. They can be transferred to another account and kept, instead + // of being lost. + if (!pMintCashReserveAcct->Credit(pToken->GetDenomination())) + { + OTLog::Error("Error crediting mint cash reserve account...\n"); + + // Reverse the account debit (even though we're not going to save it anyway.) + if (false == theAccount.Credit(pToken->GetDenomination())) + OTLog::Error("OTServer::NotarizeWithdrawal: Failed crediting user account back.\n"); + + bSuccess = false; + break; + } + } + else { + bSuccess = false; + OTLog::Output(0, "Unable to debit account in OTServer::NotarizeWithdrawal.\n"); + break; // Once there's a failure, we ditch the loop. + } + } + } + } // While success popping token out of the purse... + + if (bSuccess) + { + while (!theDeque.empty()) + { + pToken = theDeque.front(); + theDeque.pop_front(); + + theOutputPurse.Push(theNym, *pToken); // these were in reverse order. Fixing with theDeque. + + delete pToken; + pToken = NULL; + } + + strPurse.Release(); // just in case it only concatenates. + + theOutputPurse.SignContract(m_nymServer); + theOutputPurse.SaveContract(); // todo this is probably unnecessary + theOutputPurse.SaveContract(strPurse); + + + // Add the digital cash token to the response message + pResponseItem->SetAttachment(strPurse); + pResponseItem->SetStatus(OTItem::acknowledgement); + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theAccount. ReleaseSignatures(); + + // Sign + theAccount. SignContract(m_nymServer); + + // Save + theAccount. SaveContract(); + + // Save to file + theAccount. SaveAccount(); + + // We also need to save the Mint's cash reserve. + // (Any cash issued by the Mint is automatically backed by this reserve + // account. If cash is deposited, it comes back out of this account. If the + // cash expires, then after the expiry period, if it remains in the account, + // it is now the property of the transaction server.) + pMintCashReserveAcct->ReleaseSignatures(); + pMintCashReserveAcct->SignContract(m_nymServer); + pMintCashReserveAcct->SaveContract(); + pMintCashReserveAcct->SaveAccount(); + + // Notice if there is any failure in the above loop, then we will never enter this block. + // Therefore the account will never be saved with the new debited balance, and the output + // purse will never be added to the response item. No tokens will be returned to the user + // and the account will not be saved, thus retaining the original balance. + // + // Only if everything is successful do we enter this block, save the output purse onto the + // response, and save the newly-debitted account back to disk. + } + // Still need to clean up theDeque + else + { + while (!theDeque.empty()) + { + pToken = theDeque.front(); + theDeque.pop_front(); + + delete pToken; + pToken = NULL; + } + } + + } // purse loaded successfully from string + + } // the Account ID on the item matched properly + + + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + } // if pItem = tranIn.GetItem(OTItem::withdrawal) + else + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeWithdrawal: Expected OTItem::withdrawal or OTItem::withdrawVoucher in trans# %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } +} + + + + + + + + +/// for depositing a cheque or cash. +void OTServer::NotarizeDeposit(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atDeposit", that is, "a reply to the deposit request" + tranOut.SetType(OTTransaction::atDeposit); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will probably be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym), ACCOUNT_ID(theAccount), + SERVER_USER_ID(m_nymServer), ASSET_TYPE_ID(theAccount.GetAssetTypeID()); + + const OTString strUserID(USER_ID), strAccountID(ACCOUNT_ID); + + OTMint * pMint = NULL; // the Mint itself. + OTAccount * pMintCashReserveAcct = NULL; // the Mint's funds for cash withdrawals. + + + // must have included a balance statement for any deposit. + // + pBalanceItem = tranIn.GetItem(OTItem::balanceStatement); + + if (NULL == pBalanceItem) + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeDeposit: No balance agreement was found with this deposit, trans# %ld : \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR GETTING TRANSACTION AS STRING) "); + } + + // ------------------------------------------------------------------------------------------- + // DEPOSIT CHEQUE (Deposit Cash is the bottom half of the function, deposit cheque is the top half.) + + // Deposit (the transaction) now supports deposit (the item) and depositCheque (the item) + else if (pItem = tranIn.GetItem(OTItem::depositCheque)) + { + // The response item, as well as the sender's inbox, will soon contain a copy + // of the request item. So I save it into a string here so they can grab a copy of it + // into their "in reference to" fields. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atDepositCheque); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + if (ACCOUNT_ID != pItem->GetPurportedAccountID()) + { + // TODO: Verify that this if block is unnecessary, and if so, remove it. + // (The item should already have been verified when the transaction itself was + // verified, before this function was even called. I think this is just an oversight.) + OTLog::Output(0, "Error: account ID does not match account ID on the deposit item.\n"); + } + else + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pItem->GetAttachment(strCheque); + OTCheque theCheque(SERVER_ID, ASSET_TYPE_ID); // allocated on the stack :-) + bool bLoadContractFromString = theCheque.LoadContractFromString(strCheque); + + if (!bLoadContractFromString) + { + OTLog::vError("ERROR loading cheque from string in OTServer::NotarizeDeposit:\n%s\n", + strCheque.Get()); + } + // You can't deposit a cheque into the same account that it's drawn on. (Otherwise, in loading + // both accounts, I would cause one of them to be overwritten. I'm not willing to do the same + // pointer magic that I'm doing with Nyms... instead I just disallow this entirely.) + else if (ACCOUNT_ID == theCheque.GetSenderAcctID()) // Depositor ACCOUNT_ID is recipient's acct. (theNym.) But pSenderNym is someone else (the sender). + { + OTLog::vError("ERROR in OTServer::NotarizeDeposit: Unable to deposit into the same account cheque was drawn on:\n%s\n", + strCheque.Get()); + } + else + { + const OTIdentifier & SOURCE_ACCT_ID(theCheque.GetSenderAcctID()); + const OTIdentifier & SENDER_USER_ID(theCheque.GetSenderUserID()); + const OTIdentifier & RECIPIENT_USER_ID(theCheque.GetRecipientUserID()); + + const OTString strSenderUserID(SENDER_USER_ID), strRecipientUserID(RECIPIENT_USER_ID), + strSourceAcctID(SOURCE_ACCT_ID); + + OTAccount * pSourceAcct = NULL; // We'll load this up and change its balance, save it then delete the instance. + // (I'll use OTCleanup to take care of deleting the instance, so it's automatic.) + OTCleanup theSourceAcctGuardian; // This is set below, right after OTAccount::LoadExistingAccount(). + + OTPseudonym theSenderNym(SENDER_USER_ID); + OTPseudonym * pSenderNym = &theSenderNym; + + // Don't want to overwrite files or db records in cases where the sender is also the depositor. + // (Similar concern if the server is also the depositor, but that's already partly handled + // before we get to this point... theNym is already substituted for m_nymServer, + // if the IDs match, before any of the commands are processed.) + // + // The conundrum is in the multiplicity of combinations. The server COULD be the sender + // OR the depositor, or he could be BOTH, or the server might NOT be the sender OR depositor, + // yet they could still be the same person. Normally all 3 are separate entities. That's a + // lot of combinations. I want to make sure that I don't overwrite ANY files while juggling the + // respective nymfiles, transaction numbers, request numbers, etc. + // + // Solution: When commands are first processed, and the Request Number is processed, theNym + // is ALREADY replaced with m_nymServer IF the IDs match and the signature verifies. It is then + // passed that way to all of the commands (including the one we are in now.) + // + // I THEN do the logic BELOW as additional to that. Make sure if you change anything that you + // think long and hard about what you are doing!! + // + // Here's the logic: + // -- theNym is the depositor (for sure.) + // -- m_nymServer is the server nym (for sure.) + // -- By the time we get here, IF the ServerUserID and UserID match, + // then theNym IS ALREADY m_nymServer, literally a reference to it. + // (This is performed before we even get to this point, so that the + // same problem doesn't occur with request numbers.) + // -- In cases where the "server is also the depositor", it's therefore + // ALREADY handled, since theNym already points to m_nymServer. + // -- theSenderNym is used to load the sender nym in cases where we have + // to load it from file or db ourselves. (Most normal cases.) + // -- In those normal cases, pSenderNym will point to theSenderNym and + // we load it up from file or database. + // -- In cases where the sender is also the user (the depositor), then + // pSenderNym will point to theNym instead of to theSenderNym, and we + // no longer bother loading it, since the user is already loaded. + // -- In cases where the sender is also the server, then pSenderNym will + // point to m_nymServer instead of to theSenderNym, and we no longer + // bother loading it, since the server's nym is already loaded. + + bool bDepositorIsServer = ((USER_ID == SERVER_USER_ID) ? true : false); + bool bSenderIsServer = ((SENDER_USER_ID == SERVER_USER_ID) ? true : false); + bool bDepositorIsSender = ((SENDER_USER_ID == USER_ID) ? true : false); + + bool bSenderAlreadyLoaded = false; + + // The depositor is already loaded, (for sure.) + + // The server is already loaded, (for sure.) + + // If the depositor IS the server, then it already points there (for sure.) + if (bDepositorIsServer) + { + //OTPseudonym & theNym = m_nymServer; // Already handled in the code that calls IncrementRequestNum(). + //bSenderAlreadyLoaded = false; // Sender is either determined to be already loaded (directly below) or + // it is loaded as part of the cheque verification process below that. + // At this point I can't set it because I just don't know yet. + } + + // If the depositor IS the sender, pSenderNym points to depositor, and we're already loaded. + if (bDepositorIsSender) + { + pSenderNym = &theNym; + bSenderAlreadyLoaded = true; + } + + // If the server IS the sender, pSenderNym points to the server, and we're already loaded. + if (bSenderIsServer) + { + pSenderNym = &m_nymServer; + bSenderAlreadyLoaded = true; + } + + OTLedger theSenderInbox(SENDER_USER_ID, SOURCE_ACCT_ID, SERVER_ID); + + // To deposit a cheque, need to verify: (in no special order) + // + // -- DONE Load the source account and verify it exists. + // -- DONE Make sure the source acct is verified for the server signature. + // -- DONE Make sure the Asset Type of the cheque matches the Asset Type of BOTH source and recipient accts. + // -- DONE See if there is a Recipient User ID. If so, MAKE SURE it matches the user depositing the cheque! + // -- DONE See if the Sender User even exists. + // -- DONE See if the Sender User ID matches the hash of the actual public key in the sender's pubkey file. + // -- DONE Make sure the cheque has the right server ID. + // -- DONE Make sure the cheque has not yet EXPIRED. + // -- DONE Make sure the cheque signature is verified with the sender's pubkey. + // -- DONE Make sure the account ID on the transaction item matches the depositor account ID. + // -- DONE Verify the funds are in the source acct. + // + // -- DONE Plus deal with sender's inbox. + + // Load source account's inbox + bool bSuccessLoadingInbox = theSenderInbox.LoadInbox(); + + // ...If it loads, verify it. Otherwise, generate it... + if (true == bSuccessLoadingInbox) + bSuccessLoadingInbox = theSenderInbox.VerifyAccount(m_nymServer); + else + bSuccessLoadingInbox = theSenderInbox.GenerateLedger(SOURCE_ACCT_ID, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + // -------------------------------------------------------------------- + + OTLedger * pInbox = theAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + + // -------------------------------------------------------------------- + + else if (false == bSuccessLoadingInbox) + { + OTLog::vError("ERROR verifying or generating inbox ledger in OTServer::NotarizeDeposit for source acct ID:\n%s\n", + strSourceAcctID.Get()); + } + + // See if the cheque is drawn on the same server as the deposit account (the server running this code right now.) + else if (SERVER_ID != theCheque.GetServerID()) + { + OTLog::vOutput(0, "Cheque rejected: Incorrect Server ID. Recipient User ID is:\n%s\n", + strRecipientUserID.Get()); + } + + // See if the cheque is already expired or otherwise not within it's valid date range. + else if (false == theCheque.VerifyCurrentDate()) + { + OTLog::vOutput(0, "Cheque rejected: Not within valid date range. Sender User ID:\n%s\nRecipient User ID:\n%s\n", + strSenderUserID.Get(), strRecipientUserID.Get()); + } + + // See if we can load the sender's public key (to verify cheque signature) + // if !bSenderAlreadyLoaded since the server already had its public key loaded at boot-time. + // (also since the depositor and sender might be the same person.) + else if (!bSenderAlreadyLoaded && (false == theSenderNym.LoadPublicKey())) + { + OTLog::vOutput(0, "Error loading public key for cheque signer during deposit:\n%s\nRecipient User ID:\n%s\n", + strSenderUserID.Get(), strRecipientUserID.Get()); + } + + // See if the Nym ID (User ID) that we have matches the message digest of the public key. + else if (false == pSenderNym->VerifyPseudonym()) + { + OTLog::vOutput(0, "Failure verifying cheque: Bad Sender User ID (fails hash check of pubkey)" + ":\n%s\nRecipient User ID:\n%s\n", + strSenderUserID.Get(), strRecipientUserID.Get()); + } + + // See if we can load the sender's nym file (to verify the transaction # on the cheque) + // if !bSenderAlreadyLoaded since the server already had its nym file loaded at boot-time. + // (also since the depositor and sender might be the same person.) + else if (!bSenderAlreadyLoaded && (false == theSenderNym.LoadSignedNymfile(m_nymServer))) + { + OTLog::vOutput(0, "Error loading nymfile for cheque signer during deposit:\n%s\nRecipient User ID:\n%s\n", + strSenderUserID.Get(), strRecipientUserID.Get()); + } + + // Make sure they're not double-spending this cheque. + else if (false == VerifyTransactionNumber(*pSenderNym, theCheque.GetTransactionNum())) + { + OTLog::vOutput(0, "Failure verifying cheque: Bad transaction number.\nRecipient User ID:\n%s\n", + strRecipientUserID.Get()); + } + + // Let's see if the sender's signature matches the one on the cheque... + else if (false == theCheque.VerifySignature(*pSenderNym)) + { + OTLog::vOutput(0, "Failure verifying cheque signature for sender ID:\n%s\nRecipient User ID:\n%s\n", + strSenderUserID.Get(), strRecipientUserID.Get()); + } + + // If there is a recipient user ID on the check, it must match the user depositing the cheque. + // (But if there is NO recipient user ID, then it's a blank cheque and ANYONE can deposit it.) + else if (theCheque.HasRecipient() && !(USER_ID == RECIPIENT_USER_ID)) + { + OTLog::vOutput(0, "Failure matching cheque recipient to depositor. Depositor User ID:\n%s\n" + "Cheque Recipient User ID:\n%s\n", + strUserID.Get(), strRecipientUserID.Get()); + } + + // Try to load the source account (that cheque is drawn on) up into memory. + // We'll need to debit funds from it... Also, set the cleanup object onto this pointer. + else if ( + ( + NULL == (pSourceAcct = OTAccount::LoadExistingAccount(SOURCE_ACCT_ID, SERVER_ID)) + ) + || + ( + theSourceAcctGuardian.SetCleanupTargetPointer(pSourceAcct), false // I want this to eval to false, but I want SetCleanup to call. + ) // Also, SetCleanup() is safe even if pointer is NULL. + ) + // ---------------------------------------------------------------------------------- + { + OTLog::vOutput(0, "Cheque deposit failure, trying to load source acct, ID:\n%s\nRecipient User ID:\n%s\n", + strSourceAcctID.Get(), strRecipientUserID.Get()); + } + + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + // (Otherwise I might normally call VerifyAccount(), which does both...) + // + // Someone can't just alter an account file, because then the server's signature + // won't verify anymore on that file and transactions will fail such as right here: + else if (!pSourceAcct->VerifySignature(m_nymServer)) + { + OTLog::vOutput(0, "ERROR verifying signature on source account while depositing cheque. Acct ID:\n%s\n", + strAccountID.Get()); + +// delete pSourceAcct; // NO NEED TO DO THIS ANYMORE -- OTCleanup HANDLES THIS NOW! (The pointer +// pSourceAcct = NULL; // will be cleaned up automatically when its guardian goes out of scope.) + } + + // Need to make sure the signer is the owner of the account... + else if (!pSourceAcct->VerifyOwner(*pSenderNym)) + { + OTLog::vOutput(0, "ERROR verifying signer's ownership of source account while depositing cheque. Source Acct ID:\n%s\n", + strAccountID.Get()); + } + + // Are both of the accounts, AND the cheque, all of the same Asset Type? + else if (!(theCheque.GetAssetID() == pSourceAcct->GetAssetTypeID()) || + !(theCheque.GetAssetID() == theAccount.GetAssetTypeID())) + { + OTString strSourceAssetID(pSourceAcct->GetAssetTypeID()), + strRecipientAssetID(theAccount.GetAssetTypeID()); + + OTLog::vOutput(0, "ERROR - user attempted to deposit cheque between accounts of 2 different " + "asset types. Source Acct:\n%s\nType:\n%s\nRecipient Acct:\n%s\nType:\n%s\n", + strSourceAcctID.Get(), strSourceAssetID.Get(), + strAccountID.Get(), strRecipientAssetID.Get()); + } + + + // The BALANCE AGREEMENT includes a signed and dated: + /* + user ID, server ID, account ID, transaction ID. + + BY THE TIME you are ever inside the procesing for ANY transaction. we know for + a fact that NotarizeTransaction has ALREADY checked all the items on the transaction + (the ones in its list) to make sure they ALL have the same owner, and signature, + and transaction number, and account ID, and server ID. This happens when the items + first load via VerifyContractID(), and then in NotarizeTransaction() with a call to + VerifyItems(). Therefore I can consider the above variables COVERED for pItem as + well as pBalanceItem. + + Balance Agreement also includes: + -- A copy of all the transaction numbers that should still be issued to the Nym, + AFTER one is removed from depositing this cheque. (The same number on tranIn and pItem.) + NEED TO VERIFY BOTH LISTS ARE THE SAME AFTER REMOVING ONE ON MY SIDE. + -- Account balance. + (NEED TO VERIFY BALANCE WOULD BE THE SAME AFTER PROCESSING TRANSACTION. + -- Inbox and Outbox reports on a single list of sub-items. + (NEED TO VERIFY INBOX AND OUTBOX ITEMS MATCH BY RE-CREATING AND THEN COMPARING.) + + All these are now done in VerifyBalanceStatement(). + + */ + + else if (!(pBalanceItem->VerifyBalanceStatement(theCheque.GetAmount(), + theNym, + *pInbox, + *pOutbox, + theAccount, + tranIn))) + { + OTLog::vOutput(0, "ERROR verifying balance statement while depositing cheque. Acct ID:\n%s\n", + strAccountID.Get()); + } + + // Debit Source account, Credit Recipient Account, add to Sender's inbox. + // + // Also clear the transaction number so this cheque can't be deposited again. + // + else + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // Deduct the amount from the source account, and add it to the recipient account... + if (false == pSourceAcct->Debit(theCheque.GetAmount())) + { + OTLog::Error("OTServer::NotarizeDeposit: Failed debiting source account.\n"); + } + else if (false == theAccount.Credit(theCheque.GetAmount())) + { + OTLog::Error("OTServer::NotarizeDeposit: Failed crediting destination account.\n"); + + if (false == pSourceAcct->Credit(theCheque.GetAmount())) + OTLog::Error("OTServer::NotarizeDeposit: Failed crediting back source account.\n"); + } + else if (// Clear the transaction number. Sender Nym was responsible for it (and still is, until + // he signs to accept the cheque reecipt). Still, however, he HAS used the cheque, so + // I'm removing his ability to use that number twice. It will remain on his issued list + // until he signs for the receipt. + // + false == RemoveTransactionNumber(*pSenderNym, theCheque.GetTransactionNum(), true) //bSave=true + )// ----------------------------------------------------------------------- + { + OTLog::vOutput(0, "OTServer::NotarizeDeposit cheque: Presumably unable to debit %ld from source account ID:\n%s\n", + theCheque.GetAmount(), strSourceAcctID.Get()); + + if (false == pSourceAcct->Credit(theCheque.GetAmount())) + OTLog::Error("OTServer::NotarizeDeposit: Failed crediting-back source account.\n"); + + if (false == theAccount.Debit(theCheque.GetAmount())) + OTLog::Error("OTServer::NotarizeDeposit: Failed debiting-back destination account.\n"); + } + else + { // need to be able to "roll back" if anything inside this block fails. + // update: actually does pretty good roll-back as it is. The debits and credits + // don't save unless everything is a success. + + // Generate new transaction number (for putting the check receipt in the sender's inbox.) + // todo check this generation for failure (can it fail?) + long lNewTransactionNumber = 0; + + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + OTTransaction * pInboxTransaction = OTTransaction::GenerateTransaction(theSenderInbox, OTTransaction::chequeReceipt, + lNewTransactionNumber); + + // The depositCheque request OTItem is saved as a "in reference to" field, + // on the inbox chequeReceipt transaction. + //todo put these two together in a method. + pInboxTransaction->SetReferenceString(strInReferenceTo); + pInboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + + // Now we have created a new transaction from the server to the sender's inbox + // Let's sign and save it... + pInboxTransaction->SignContract(m_nymServer); + pInboxTransaction->SaveContract(); + + // Here the transaction we just created is actually added to the source acct's inbox. + theSenderInbox.AddTransaction(*pInboxTransaction); + + // --------------------------------------------------------------------------------- + // AT THIS POINT, the source account is debited, the recipient account is credited, + // and the sender's inbox has had the cheque transaction added to it as his receipt. + // (He must perform a balance agreement in order to get it out of his inbox.) + // + // THERE IS NOTHING LEFT TO DO BUT SAVE THE FILES!! + + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + pSourceAcct-> ReleaseSignatures(); + theAccount. ReleaseSignatures(); + theSenderInbox. ReleaseSignatures(); + + // Sign all three of them. + pSourceAcct-> SignContract(m_nymServer); + theAccount. SignContract(m_nymServer); + theSenderInbox. SignContract(m_nymServer); + + // Save all three of them internally + pSourceAcct-> SaveContract(); + theAccount. SaveContract(); + theSenderInbox. SaveContract(); + + // Save all three of their internals (signatures and all) to file. + pSourceAcct-> SaveAccount(); + theAccount. SaveAccount(); + theSenderInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + // otherwise, if we never entered this block, then it would still be set to rejection, and the + // new item would never have been added to the inbox, and the inbox file, along with the + // account files, would never have had their signatures released, or been re-signed or + // re-saved back to file. The debit failed, so all of those other actions would fail also. + // BUT... if the message comes back with acknowledgement--then all of these actions must have + // happened, and here is the server's signature to prove it. + // Otherwise you get no items and no signature. Just a rejection item in the response transaction. + pResponseItem->SetStatus(OTItem::acknowledgement); + + OTLog::Output(1, "SUCCESS crediting account from cheque deposit.\n"); + + // TODO: Our code that actually saves the new balance statement receipt should go here + // (that is, only after ultimate success.) Otherwise we still want to store the old receipt. + // For now I'm verifying it, but not storing it. This means the security for it works, but + // in a dispute, I can't prove it / cover my ass. So very soon a receipt WILL be saved here + // that is, a copy of the user's signed BalanceAgreement.) + + } + + // Make sure we clean this up. +// delete pSourceAcct; // No longer necessary -- handled by OTCleanup in this case. +// pSourceAcct = NULL; // OTCleanup handles this now. + } + } // successfully loaded cheque from string + } // account ID DOES match item's account ID + + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + // OTString strTestInRefTo; + // pResponseItem->GetReferenceString(strTestInRefTo); + // OTLog::vOutput(0, "DEBUG: Item in reference to: %s\n", strTestInRefTo.Get()); + + } // deposit cheque + + // --------------------------------------------------------------------------------- + + // BELOW -- DEPOSIT CASH + + // For now, there should only be one of these deposit items inside the transaction. + // So we treat it that way... I either get it successfully or not. + // + else if (pItem = tranIn.GetItem(OTItem::deposit)) + { + // The response item, as well as the inbox and outbox items, will contain a copy + // of the request item. So I save it into a string here so they can all grab a copy of it + // into their "in reference to" fields. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atDeposit); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + if (ACCOUNT_ID != pItem->GetPurportedAccountID()) + { + OTLog::vOutput(0, "Error: 'From' account ID on the transaction does not match 'from' account ID on the deposit item.\n"); + } + else + { + // -------------------------------------------------------------------- + + OTLedger * pInbox = theAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + + // -------------------------------------------------------------------- + + OTString strPurse; + pItem->GetAttachment(strPurse); + + OTPurse thePurse(SERVER_ID, ASSET_TYPE_ID); + OTToken * pToken = NULL; + + bool bLoadContractFromString = thePurse.LoadContractFromString(strPurse); + + if (!bLoadContractFromString) + { + OTLog::vError("ERROR loading purse from string in OTServer::NotarizeDeposit:\n%s\n", + strPurse.Get()); + } + + else if (!(pBalanceItem->VerifyBalanceStatement(thePurse.GetTotalValue(), + theNym, + *pInbox, + *pOutbox, + theAccount, + tranIn))) + { + OTLog::vOutput(0, "ERROR verifying balance statement while depositing cheque. Acct ID:\n%s\n", + strAccountID.Get()); + } + + // TODO: double-check all verification stuff all around on the purse and token, transaction, mint, etc. + + else // the purse loaded successfully from the string + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + bool bSuccess = false; + + // Pull the token(s) out of the purse that was received from the client. + while(pToken = thePurse.Pop(m_nymServer)) + { + // This way I don't have to worry about cleaning up pToken or leaking memory. + OTCleanup theTokenGuardian(*pToken); + + pMint = GetMint(ASSET_TYPE_ID, pToken->GetSeries()); + + if (NULL == pMint) + { + OTLog::Error("Unable to get or load Mint in OTServer::NotarizeDeposit.\n"); + break; + } + else if (pMintCashReserveAcct = pMint->GetCashReserveAccount()) + { +// OTString DEBUG_STR(*pToken); +// OTLog::vError("\n**************\nEXTRACTED TOKEN FROM PURSE:\n%s\n", DEBUG_STR.Get()); + + OTString strSpendableToken; + bool bToken = pToken->GetSpendableString(m_nymServer, strSpendableToken); +// OTLog::vError("\n**************\nSPENDABLE STRING:\n%s\n", strSpendableToken.Get()); + + if (!bToken) // if failure getting the spendable token data from the token object + { + bSuccess = false; + OTLog::vOutput(0, "ERROR verifying token in OTServer::NotarizeDeposit: Failure retrieving token data. \n"); + break; + } + else if (!(pToken->GetAssetID() == ASSET_TYPE_ID)) // or if failure verifying asset type + { + bSuccess = false; + OTLog::vOutput(0, "ERROR verifying token in OTServer::NotarizeDeposit: Wrong asset type. \n"); + break; + } + else if (!(pToken->GetServerID() == SERVER_ID)) // or if failure verifying server ID + { + bSuccess = false; + OTLog::vOutput(0, "ERROR verifying token in OTServer::NotarizeDeposit: Wrong server ID. \n"); + break; + } + // This call to VerifyToken verifies the token's Series and From/To dates against the + // mint's, and also verifies that the CURRENT date is inside that valid date range. + // + // It also verifies the Lucre coin data itself against the key for that series and + // denomination. (The signed and unblinded Lucre coin is finally verified in Lucre + // using the appropriate Mint private key.) + // + else if (!(pMint->VerifyToken(m_nymServer, strSpendableToken, pToken->GetDenomination()))) + { + bSuccess = false; + OTLog::vOutput(0, "ERROR verifying token in OTServer::NotarizeDeposit: Token verification failed. \n"); + break; + } + // Lookup the token in the SPENT TOKEN DATABASE, and make sure + // that it hasn't already been spent... + else if (pToken->IsTokenAlreadySpent(strSpendableToken)) + { + // TODO!!!! Need to store the spent token database in multiple places, on multiple media! + // Furthermore need to CHECK those multiple places inside IsTokenAlreadySpent. + // In fact, that should all be configurable in the server config file! + // Related: make sure IsTokenAlreadySpent differentiates between ACTUALLY not finding + // a token as spent (successfully), versus some error state with the storage. + bSuccess = false; + OTLog::vOutput(0, "ERROR verifying token in OTServer::NotarizeDeposit: Token was already spent. \n"); + break; + } + else + { + OTLog::Output(3, "SUCCESS verifying token... \n"); + + // need to be able to "roll back" if anything inside this block fails. + // so unless bSuccess is true, I don't save the account below. + // + + // two defense mechanisms here: mint cash reserve acct, and spent token database + // + if (false == pMintCashReserveAcct->Debit(pToken->GetDenomination())) + { + OTLog::Error("OTServer::NotarizeDeposit: Error debiting the mint cash reserve account. " + "SHOULD NEVER HAPPEN...\n"); + bSuccess = false; + break; + } + // CREDIT the amount to the account... + else if (false == theAccount.Credit(pToken->GetDenomination())) + { + OTLog::Error("OTServer::NotarizeDeposit: Error crediting the user's asset account...\n"); + + if (false == pMintCashReserveAcct->Credit(pToken->GetDenomination())) + OTLog::Error("OTServer::NotarizeDeposit: Failure crediting-back mint's cash reserve account " + "while depositing cash.\n"); + bSuccess = false; + break; + } + // Spent token database. This is where the call is made to add + // the token to the spent token database. + else if (false == pToken->RecordTokenAsSpent(strSpendableToken)) + { + OTLog::Error("OTServer::NotarizeDeposit: Failed recording token as spent...\n"); + + if (false == pMintCashReserveAcct->Credit(pToken->GetDenomination())) + OTLog::Error("Failure crediting-back mint's cash reserve account while depositing cash.\n"); + + if (false == theAccount.Debit(pToken->GetDenomination())) + OTLog::Error("Failure debiting-back user's asset account while depositing cash.\n"); + + bSuccess = false; + break; + } + else // SUCCESS!!! (this iteration) + { + OTLog::vOutput(2, "SUCCESS crediting account with cash token...\n"); + bSuccess = true; + + // No break here -- we allow the loop to carry on through. + } + } + } + else + { + OTLog::Error("Unable to get cash reserve account for Mint in OTServer::NotarizeDeposit.\n"); + bSuccess = false; + break; + } + +// delete pToken; // Unnecessary now, handled by OTCleanup. +// pToken = NULL; + + } // while success popping token from purse ------------------------------------ + + if (bSuccess) + { + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + theAccount. ReleaseSignatures(); + + // Sign + theAccount. SignContract(m_nymServer); + + // Save + theAccount. SaveContract(); + + // Save to file + theAccount. SaveAccount(); + + // We also need to save the Mint's cash reserve. + // (Any cash issued by the Mint is automatically backed by this reserve + // account. If cash is deposited, it comes back out of this account. If the + // cash expires, then after the expiry period, if it remains in the account, + // it is now the property of the transaction server.) + pMintCashReserveAcct->ReleaseSignatures(); + pMintCashReserveAcct->SignContract(m_nymServer); + pMintCashReserveAcct->SaveContract(); + pMintCashReserveAcct->SaveAccount(); + + pResponseItem->SetStatus(OTItem::acknowledgement); + + OTLog::Output(1, ".....SUCCESS -- crediting account from cash deposit.\n"); + + // TODO: Right here, again, I need to save the receipt from the new balance agreement, since we have + // "ultimate success". Also need to save the Nym, since he had a transaction number removed in + // the above call to VerifyBalanceAgreement. If we failed here, then we wouldn't WANT to save, since + // that number should stay on him! Same reason we don't save the accounts if anything goes wrong. + } + } // the purse loaded successfully from the string + } // the account ID matches correctly to the acct ID on the item. + + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + +// OTString strTestInRefTo; +// pResponseItem->GetReferenceString(strTestInRefTo); +// OTLog::vError("DEBUG: Item in reference to: %s\n", strTestInRefTo.Get()); + + } // if pItem = tranIn.GetItem(OTItem::deposit) + else + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeDeposit: Expected OTItem::deposit or OTItem::depositCheque on trans# %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR CREATING STRING FROM TRANSACTION.) "); + } +} + + + + +// DONE: Need to make sure both parties have included TWO!!! transaction numbers, so both +// have the option to cancel later! (And so the server can expire it later, and cover its own ass.) +// +// Note: still need to do something with those numbers upon closing. (cron expiration, and cancelCronItem.) +// + +// DONE: The current version verifies that it's signed by both parties. +// Fix it so that it loads the merchant's copy to verify recipient signature. + + +/// 1) The Merchant generates the payment plan, adds transaction numbers, and signs. (All done via ProposePaymentPlan) +/// 2) Then the Customer uses ConfirmPaymentPlan to add his own numbers and sign. +/// 3) Then the Customer must activate the payment plan. (Using a transaction with the same number as the plan.) +/// +/// +void OTServer::NotarizePaymentPlan(OTPseudonym & theNym, OTAccount & theSourceAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atPaymentPlan", that is, "a reply to the paymentPlan request" + tranOut.SetType(OTTransaction::atPaymentPlan); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will definitely be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), SENDER_USER_ID(theNym), + SERVER_USER_ID(m_nymServer), SOURCE_ACCT_ID(theSourceAccount); + + + pItem = tranIn.GetItem(OTItem::paymentPlan); + pBalanceItem = tranIn.GetItem(OTItem::transactionStatement); + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atPaymentPlan); + pResponseItem->SetStatus(OTItem::rejection); // the default. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransactionStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // -------------------------------------------------------------------- + + // For now, there should only be one of these paymentPlan items inside the transaction. + // So we treat it that way... I either get it successfully or not. + if (NULL == pItem || NULL == pBalanceItem) + { + OTLog::Error("Error, expected OTItem::paymentPlan and OTItem::transactionStatement in OTServer::NotarizePaymentPlan\n"); + } + else if (SOURCE_ACCT_ID != pItem->GetPurportedAccountID()) + { + OTLog::Output(0, "Error: Source account ID on the transaction does not match sender's account ID on the transaction item.\n"); + } + else if (false == pBalanceItem->VerifyTransactionStatement(theNym, tranIn)) // bIsRealTransaction=true + { + OTLog::Output(0, "Failed verifying transaction statement in OTServer::NotarizePaymentPlan.\n"); + } + else + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // The response item will contain a copy of the request item. So I save it into a string + // here so it can be saved into the "in reference to" field. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + + // Also load up the Payment Plan from inside the transaction item. + OTString strPaymentPlan; + pItem->GetAttachment(strPaymentPlan); + OTPaymentPlan * pPlan = new OTPaymentPlan(); + OT_ASSERT(NULL != pPlan); + + // If we failed to load the plan... + if ((false == pPlan->LoadContractFromString(strPaymentPlan))) + { + OTLog::vError("ERROR loading payment plan from string in OTServer::NotarizePaymentPlan:\n%s\n", + strPaymentPlan.Get()); + } + else if (pPlan->GetTransactionNum() != pItem->GetTransactionNum()) + { + OTLog::Output(0, "ERROR bad transaction number on payment plan in OTServer::NotarizePaymentPlan\n"); + } +// else if (!pPlan->VerifySignature(theNym)) // This is now done below, in VerifyAgreement()! +// { +// OTLog::Output(0, "ERROR verifying sender signature on Payment Plan in OTServer::NotarizePaymentPlan\n"); +// } + else if (pPlan->GetServerID() != SERVER_ID) + { + OTLog::Output(0, "ERROR bad server ID on payment plan in OTServer::NotarizePaymentPlan\n"); + } + else if (pPlan->GetSenderUserID() != SENDER_USER_ID) + { + OTLog::Output(0, "ERROR wrong user ID on payment plan in OTServer::NotarizePaymentPlan\n"); + } + else if (pPlan->GetAssetID() != theSourceAccount.GetAssetTypeID()) + { + OTLog::Output(0, "ERROR wrong Asset Type ID on payment plan in OTServer::NotarizePaymentPlan\n"); + } + else if (pPlan->GetSenderAcctID() != SOURCE_ACCT_ID) + { + OTLog::Output(0, "ERROR wrong Asset Acct ID on payment plan in OTServer::NotarizePaymentPlan\n"); + } + // The transaction number opens the payment plan, but there must also be a closing number for closing it. + else if ((pPlan->GetCountClosingNumbers() < 1) || + !VerifyTransactionNumber(theNym, pPlan->GetClosingNum())) // Verify that it can still be USED (not closed... that's VerifyIssuedNum()) + { + OTLog::Output(0, "ERROR: the Closing number wasn't available for use on a payment plan in OTServer::NotarizePaymentPlan\n"); + } + else // The plan is good (so far.) + { + // The RECIPIENT_ACCT_ID is the ID on the "To" Account. (When doing a transfer, normally 2nd acct is the Payee.) + const OTIdentifier RECIPIENT_ACCT_ID(pPlan->GetRecipientAcctID()), + RECIPIENT_USER_ID(pPlan->GetRecipientUserID()); + + bool bRecipientNymIsServerNym = ((RECIPIENT_USER_ID == SERVER_USER_ID) ? true : false); + bool bUsersAreSameNym = ((SENDER_USER_ID == RECIPIENT_USER_ID) ? true : false); + + OTPseudonym theRecipientNym; // We'll probably use this, but maybe not. So I use a pointer that will maybe point here. + OTPseudonym * pRecipientNym = NULL; // Here's the pointer. (Logic explained directly below.) + + // ------------------------------------------------------------------------ + + // Set pRecipientNym to point to the right one so we can use it below. (Do NOT use theRecipientNym, + // since it won't always point to that one.) + + bool bFoundRecipientNym = false; + + // Find out if Recipient Nym is also the Server Nym... + if (bRecipientNymIsServerNym) + { + // If the Recipient Nym is the server, then just point to that. + pRecipientNym = &m_nymServer; + bFoundRecipientNym = true; + + // (No need to verify Nym here since already done in this case.) + } + else if (bUsersAreSameNym) // Else if the participants are the same Nym, point to the one we already loaded. + { + pRecipientNym = &theNym; + bFoundRecipientNym = true; + + // (No need to verify Nym here since already done in this case, before we even got here.) + } + else // Otherwise load the Recipient Nym from Disk and point to that. + { + theRecipientNym.SetIdentifier(RECIPIENT_USER_ID); + + if (false == theRecipientNym.LoadPublicKey()) + { + OTString strNymID(RECIPIENT_USER_ID); + OTLog::vError("Failure loading Recipient Nym public key in OTServer::NotarizePaymentPlan: %s\n", + strNymID.Get()); + bFoundRecipientNym = false; + } + else if (!theRecipientNym.VerifyPseudonym() || !theRecipientNym.LoadSignedNymfile(m_nymServer)) + { + OTString strNymID(RECIPIENT_USER_ID); + OTLog::vError("Failure loading or verifying Recipient Nym public key in OTServer::NotarizePaymentPlan: %s\n", + strNymID.Get()); + bFoundRecipientNym = false; + } + else + { + pRecipientNym = &theRecipientNym; // <===== + bFoundRecipientNym = true; + } + } + + // Below this point, ALWAYS use pRecipientNym, NOT theRecipientNym. + // pRecipientNym is always guaranteed below here to point to the right one. + + // ------------------------------------------------------------------------ + + if (!bFoundRecipientNym || (NULL == pRecipientNym)) + { + // (No need to log here; already logged right above.) + // OTLog::Output("Unable to load or verify Recipient Nym in OTServer::NotarizePaymentPlan()"); + } + + // Below this point, we know for sure that the Recipient Nym is loaded and verified, and we know + // that if the Server or Sender is actually the Recipient, that the pRecipientNym pointer will + // always point to the right one, and no files can be overwritten. *phew* + + + // You CAN have both accounts owned by the same Nym, but you CANNOT have them both actually be the SAME ACCT. + else if (SOURCE_ACCT_ID == RECIPIENT_ACCT_ID) + { + OTLog::Output(0, "Error: Source account ID matches Recipient account ID on attempted Payment Plan notarization.\n"); + } + else if (!pPlan->VerifyAgreement(*pRecipientNym, theNym)) + { + OTLog::Output(0, "ERROR verifying Sender and Recipient on Payment Plan (against merchant and customer copies.)\n"); + } + // This is now done above, in VerifyAgreement(). +// else if (!pPlan->VerifySignature(*pRecipientNym)) // BOTH parties must be signers to a payment plan. +// { +// OTLog::Output(0, "ERROR verifying Recipient's signature on Payment Plan.\n"); +// } + else // ----------------------------------------------------------------- + { + // Verify that BOTH of the Recipient's transaction numbers + // (opening and closing) are available for use. + // + if (pPlan->GetRecipientCountClosingNumbers() < 2) + { + OTLog::Output(0, "ERROR verifying Recipient's Closing numbers on a Payment Plan (he should have 2 and he doesn't.)\n"); + } + else if (!VerifyTransactionNumber(*pRecipientNym, pPlan->GetRecipientOpeningNum())) + { + OTLog::Output(0, "ERROR verifying Recipient's opening transaction number on a payment plan.\n"); + } + else if (!VerifyTransactionNumber(*pRecipientNym, pPlan->GetRecipientClosingNum())) + { + OTLog::Output(0, "ERROR verifying Recipient's Closing transaction number on a Payment Plan.\n"); + } + else // ----------------------------------------------------------------- + { + // Load up the recipient ACCOUNT and validate it. + OTAccount * pRecipientAcct = OTAccount::LoadExistingAccount(RECIPIENT_ACCT_ID, SERVER_ID); + OTCleanup theRecipientAcctGuardian(pRecipientAcct); // This will cleanup pRecipAcct, or do nothing if it's NULL. + + if (NULL == pRecipientAcct) + { + OTLog::Output(0, "ERROR loading Recipient account in OTServer::NotarizePaymentPlan\n"); + } + else if (!pRecipientAcct->VerifyOwner(*pRecipientNym)) + { + OTLog::Output(0, "ERROR verifying ownership of the recipient account in OTServer::NotarizePaymentPlan\n"); + } + // ---------------------------------------------------------------------------- + // Are both of the accounts of the same Asset Type? VERY IMPORTANT!! + else if (pRecipientAcct->GetAssetTypeID() != theSourceAccount.GetAssetTypeID()) + { + OTString strSourceAssetID(theSourceAccount.GetAssetTypeID()), + strRecipAssetID(pRecipientAcct->GetAssetTypeID()); + OTLog::vOutput(0, "ERROR - user attempted to make a payment plan between dissimilar " + "asset types in OTServer::NotarizePaymentPlan:\n%s\n%s\n", + strSourceAssetID.Get(), + strRecipAssetID.Get()); + } + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pRecipientAcct->VerifySignature(m_nymServer)) + { + OTLog::Output(0, "ERROR verifying signature on the Recipient account in OTServer::NotarizePaymentPlan\n"); + } + // This one is superfluous, but I'm leaving it. (pPlan and pRecip are both already + // matches to a 3rd value: source acct asset type ID.) + else if (pRecipientAcct->GetAssetTypeID() != pPlan->GetAssetID()) + { + OTLog::Output(0, "ERROR wrong Asset Type ID on Recipient Acct in OTServer::NotarizePaymentPlan\n"); + } + + // At this point I feel pretty confident that the Payment Plan is a valid request from both parties. + // I have both users AND both accounts and validated against the Payment Plan, signatures and all. + + else + { + // We add the payment plan to the server's Cron object, which does regular processing. + // That object will take care of processing the payment plan according to its terms. + // + // NOTE: FYI, inside AddCronItem, since this is a new CronItem, a Cron Receipt will + // be saved with the User's signature on it, containing the Cron Item from the user's + // original request. After that, the item is stored internally to Cron itself, and + // signed by the server--and changes over time as cron processes. (The original receipt + // can always be loaded when necessary.) + if (m_Cron.AddCronItem(*pPlan, true)) // bSaveReceipt=true + {//todo need to be able to "roll back" if anything inside this block fails. + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + OTLog::Output(2, "Successfully added payment plan to Cron object.\n"); + + + // *************************************************************** + + // Server side, the Nym stores a list of all open cron item numbers. + // (So we know if there is still stuff open on Cron for that Nym, and we know what it is.) + // + std::set & theIDSet = theNym.GetSetOpenCronItems(); + theIDSet.insert(pPlan->GetTransactionNum()); + theIDSet.insert(pPlan->GetClosingNum()); +// theNym.SaveSignedNymfile(m_nymServer); // saved below + + // This just removes the Closing number so I can't USE it again. (Since I'm using it as the closing + // number for this cron item now.) I'm still RESPONSIBLE for the number until RemoveIssuedNumber() + // is called. If we didn't call this here, then I could come back later and USE THE NUMBER AGAIN! + // (Bad!) + // ------------------------------------- + // RemoveTransactionNumber was already called for pPlan->GetTransactionNum() (or will be soon, by the framework.) + // That's the opening number. Here's the closing number: + RemoveTransactionNumber(theNym, pPlan->GetClosingNum(), true); // bSave=true + // ------------------------------------- + // RemoveIssuedNum will be called for that original transaction number when the finalReceipt is created. + // RemoveIssuedNum will be called for the Closing number when the finalReceipt is accepted. + + // *************************************************************** + + std::set & theIDSet2 = pRecipientNym->GetSetOpenCronItems(); + theIDSet2.insert(pPlan->GetRecipientOpeningNum()); + theIDSet2.insert(pPlan->GetRecipientClosingNum()); +// pRecipientNym->SaveSignedNymfile(m_nymServer); // saved below + + // For recipient, I also remove the opening and closing numbers as AVAILABLE FOR USE. + // But they aren't removed as ISSUED until later... + // RemoveIssuedNum is called for the Recipient's opening number onFinalReceipt, + // and it's called for the Recipient's closing number when that final receipt is closed out. + RemoveTransactionNumber(*pRecipientNym, pPlan->GetRecipientOpeningNum(), false); // bSave=true + RemoveTransactionNumber(*pRecipientNym, pPlan->GetRecipientClosingNum(), true); // bSave=true + + // *************************************************************** + + // TODO: Put a receipt in the RECIPIENT's inbox (the Merchant) to notify them that the + // payment plan has been activated. This is no different than giving them a chequeReceipt + // to notice them that their invoice has been "cashed". + + OTLedger * pInbox = pRecipientAcct->LoadInbox(m_nymServer); + OTCleanup theInboxAngel; + // -------------------------------------------------------------- + // + if ((NULL == pInbox) || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("NotarizePaymentPlan: Error loading or verifying recipient's inbox.\n"); + } + else + { + theInboxAngel.SetCleanupTarget(*pInbox); + // -------------------------------------------------------------- + // + // Generate a new transaction number for the recipient's inbox (to notice him of activation of the plan.) + long lNewTransactionNumber = 0; + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + OTTransaction * pTransRecip = OTTransaction::GenerateTransaction(*pInbox, + OTTransaction::paymentReceipt, lNewTransactionNumber); + // (No need to OT_ASSERT on the above transaction since it occurs in GenerateTransaction() already.) + + // set up the transaction item + OTItem * pItemRecip = OTItem::CreateItemFromTransaction(*pTransRecip, OTItem::paymentReceipt); + // these may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave em. + OT_ASSERT(NULL != pItemRecip); + + pItemRecip->SetStatus(OTItem::acknowledgement); // the default. + pItemRecip->SetAmount(0); // This is just a notice that the plan is activated. (Not an actual payment -- that happens in cron.) + + // Here I make sure that each receipt (each inbox notice) references the original + // transaction number that was used to set the payment plan into place... + // This number is used to track all cron items. (All Cron items require a transaction + // number from the user in order to add them to Cron in the first place.) + // + // The number is also used to uniquely identify all other transactions, as you + // might guess from its name. + pTransRecip->SetReferenceToNum(pPlan->GetOpeningNum()); + + + // The TRANSACTION (a receipt in my inbox) will be sent with "In Reference To" information + // containing the ORIGINAL SIGNED PLAN. (With both parties' original signatures on it.) + // + // Whereas the TRANSACTION ITEM will include an "attachment" containing the UPDATED + // PLAN (this time with the SERVER's signature on it.) In the case of THIS receipt, however, + // there will be no updated version on the item (just the original on the transaction.) + // Why not? Because the plan hasn't actually been updated yet, none of the payments have + // actually occured yet. Having an EMPTY SPOT in the place where the updated plan would + // NORMALLY go is just another way of making it clear that this is an activation receipt. + // (Which is also why the amount is 0.) + // + // Here's the original one going onto the transaction: + // + pTransRecip->SetReferenceString(strPaymentPlan); + + // sign the item + pItemRecip->SignContract(m_nymServer); + pItemRecip->SaveContract(); + + // the Transaction "owns" the item now and will handle cleaning it up. + pTransRecip->AddItem(*pItemRecip); + + pTransRecip->SignContract(m_nymServer); + pTransRecip->SaveContract(); + + // ------------------------------------------- + // Here, the transaction we just created is actually added to the ledger. + // This happens either way, success or fail. + + pInbox->AddTransaction(*pTransRecip); + + // ------------------------------------------- + // Release any signatures that were there before (They won't + // verify anymore anyway, since the content has changed.) + pInbox->ReleaseSignatures(); + pInbox->SignContract(m_nymServer); + pInbox->SaveContract(); + + // Save inbox to storage. (File, DB, wherever it goes.) + pInbox->SaveInbox(); + } + } + else + { + OTLog::Output(0, "Unable to add payment plan to Cron object OTServer::NotarizePaymentPlan\n"); + } + } + } + } // If recipient Nym successfully loaded from storage. + } // If Payment Plan successfully loaded from Transaction Item. + + // If the payment plan WAS successfully added to Cron, then we don't need to + // delete it here, since Cron owns it now, and will deal with cleaning + // it up at the right time. (So I can't use OTCleanup on pPlan.) + if ((NULL != pPlan) && (pResponseItem->GetStatus() != OTItem::acknowledgement)) + { + delete pPlan; + pPlan = NULL; + } + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + } // if pItem = tranIn.GetItem(OTItem::paymentPlan) +} + + + +// DONE: The code inside here is just a copy of payment plan. +// Make it into a REAL notarizeCancelCronItem so it actually works. +// +// Cancel a market offer. +// (DONE: NEED TO CHANGE THIS INTO A TRANSACTION, INSTEAD OF A MESSAGE...) +// Will become "Cancel Cron Item" +// +// DONE: This needs to be "CANCEL CRON ITEM" and it should make use of CLOSING NUMBERS that should +// SHOULD ALREADY be available in the CRON ITEMS! +// +// Basically it allows you to cancel payment plans OR market offers, and places the appropriate +// cancellation receipts (preferably through polymorphism, versus some huge 'if' block here... +// +// When cancelling it uses the closing numbers provided in the cron items. +// Then code the expiration part in OTCron Item or wherever, which should use the SAME closing numbers. +// +void OTServer::NotarizeCancelCronItem(OTPseudonym & theNym, OTAccount & theAssetAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atCancelCronItem", that is, "a reply to the cancelCronItem request" + tranOut.SetType(OTTransaction::atCancelCronItem); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will definitely be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym); + + pBalanceItem = tranIn.GetItem(OTItem::transactionStatement); + + if (NULL == pBalanceItem) + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeCancelCronItem: Expected transaction statement in trans# %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } + // For now, there should only be one of these cancelCronItem items inside the transaction. + // So we treat it that way... I either get it successfully or not. + else if (pItem = tranIn.GetItem(OTItem::cancelCronItem)) + { + // The response item will contain a copy of the request item. So I save it into a string + // here so it can be saved into the "in reference to" field. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // ASSET_ACCT_ID is the ID on the "from" Account that was passed in. + // + const OTIdentifier ASSET_ACCT_ID(theAssetAccount); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atCancelCronItem); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransactionStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // ********************************************************************** + if (false == (pBalanceItem->VerifyTransactionStatement(theNym, tranIn))) // isRealTransaction=true + { + OTLog::vOutput(0, "ERROR verifying transaction statement in NotarizeCancelCronItem.\n"); + } + // ********************************************************************** + else + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + const long lReferenceToNum = pItem->GetReferenceToNum(); + + // I'm using the operator== because it exists. (Although now I believe != exists also) + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + if (!(ASSET_ACCT_ID == pItem->GetPurportedAccountID())) + { + OTLog::Output(0, "Error: Asset account ID on the transaction does not match asset account " + "ID on the transaction item.\n"); + } + else // LET'S SEE IF WE CAN REMOVE IT THEN... + { + OTCronItem * pCronItem = m_Cron.GetCronItem(lReferenceToNum); + + // Check for the closing number here (that happens in OTCronItem, since it's polymorphic.) + + bool bSuccess = false; + + if ((NULL != pCronItem) && (pCronItem->CanRemoveItemFromCron(theNym))) // see if theNym has right to remove the cronItem from processing. + bSuccess = m_Cron.RemoveCronItem(lReferenceToNum, theNym); // <===== + + // If we were just successful in removing the offer from the market, that means a finalReceipt was + // just dropped into the inboxes for the relevant asset accounts. Once I process that receipt out of my + // inbox, (which will require my processing out all related marketReceipts) then the closing number + // will be removed from my list of responsibility. + + if (bSuccess) + { + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + OTLog::Output(2, "Successfully removed Cron Item from Cron object.\n"); + + // Any transaction numbers that need to be cleared, happens inside RemoveCronItem(). + } + else + { + OTLog::Output(0, "Unable to remove Cron Item from Cron object OTServer::NotarizeCancelCronItem\n"); + } + } + } // transaction statement verified. + + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + } // if pItem = tranIn.GetItem(OTItem::cancelCronItem) + else { + OTString strTemp(tranIn); + OTLog::vOutput(0, "Error, expected OTItem::cancelCronItem " + "in OTServer::NotarizeCancelCronItem for trans# %ld:\n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION FROM STRING) "); + } +} + + + + + + +/// void OTServer::NotarizeExchangeBasket(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut) +/// +/// a user is exchanging in or out of a basket. (Ex. He's trading 2 gold and 3 silver for 10 baskets, or vice-versa.) +/// +void OTServer::NotarizeExchangeBasket(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atExchangeBasket", that is, "a reply to the exchange basket request" + tranOut.SetType(OTTransaction::atExchangeBasket); + + OTItem * pItem = tranIn.GetItem(OTItem::exchangeBasket); + OTItem * pBalanceItem = tranIn.GetItem(OTItem::balanceStatement); + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will probably be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + const OTIdentifier USER_ID(theNym), + SERVER_ID(m_strServerID), + BASKET_CONTRACT_ID(theAccount.GetAssetTypeID()), + ACCOUNT_ID(theAccount); + + // ------------------------------------------------------------- + + OTLedger * pInbox = NULL; + OTLedger * pOutbox = NULL; + + OTCleanup theInboxAngel; + OTCleanup theOutboxAngel; + + // -------------------------------------------------------------- + bool bSuccess = false; + + if (NULL == pItem) + { + OTLog::Output(0, "OTServer::NotarizeExchangeBasket: No exchangeBasket item found on this transaction.\n"); + } + else if (NULL == pBalanceItem) + { + OTLog::Output(0, "OTServer::NotarizeExchangeBasket: No Balance Agreement item found on this transaction.\n"); + } + else if (NULL == (pInbox = theAccount.LoadInbox(m_nymServer)) || + !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + else if (NULL == (pOutbox = theAccount.LoadOutbox(m_nymServer)) || + !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + else + { + theInboxAngel.SetCleanupTarget(*pInbox); + theOutboxAngel.SetCleanupTarget(*pOutbox); + // ------------------------------------------ + + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // ---------------------------------------------- + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atExchangeBasket); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pBalanceItem->GetTransactionNum()); // This response item is IN RESPONSE to tranIn's balance agreement + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // *************************************************************************** +// OTLog::Error("BELOW THE LOOP===> ABout to call VERIFY BALANCE STATEMENT \n"); + + // Now after all that setup, we do the balance agreement! + if (false == pBalanceItem->VerifyBalanceStatement(0,// the one balance agreement that doesn't change any balances. + theNym, // Could have been a transaction agreement. + *pInbox, // Still could be, in fact.... + *pOutbox, + theAccount, + tranIn)) + { + OTLog::vOutput(0, "OTServer::NotarizeExchangeBasket: ERROR verifying balance statement.\n"); + + } + // ********************************************************************** + + else // BALANCE AGREEMENT WAS SUCCESSFUL....... + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the balance agreement was successful. + + // -------------------------------------------------------------------- + + // Set up some account pointer lists for later... + listOfAccounts listUserAccounts, listServerAccounts; + std::list listInboxes; + + // Here's the request from the user. + OTString strBasket; + OTBasket theBasket, theRequestBasket; + + pItem->GetAttachment(strBasket); + // ------------------------------------- + + long lTransferAmount = 0; + + // Now we have the Contract ID from the basket account, + // we can get a pointer to its asset contract... + + OTIdentifier BASKET_ACCOUNT_ID; + + OTAccount * pBasketAcct = NULL; + OTCleanup theBasketAcctGuardian; + + bool bLookup = LookupBasketAccountIDByContractID(BASKET_CONTRACT_ID, BASKET_ACCOUNT_ID); + if (!bLookup) + { + OTLog::Error("OTServer::NotarizeExchangeBasket: Asset type is not a basket currency.\n"); + } + else if (!strBasket.Exists() || + !theRequestBasket.LoadContractFromString(strBasket) || + !theRequestBasket.VerifySignature(theNym)) + { + OTLog::Error("OTServer::NotarizeExchangeBasket: Expected verifiable basket object to be attached to exchangeBasket item.\n"); + } + else if (theRequestBasket.GetRequestAccountID() != theAccount.GetPurportedAccountID()) + { + OTLog::Error("OTServer::NotarizeExchangeBasket: User's main account ID according to request basket doesn't match theAccount.\n"); + } + else if (false == VerifyTransactionNumber(theNym, theRequestBasket.GetClosingNum())) + { + OTLog::Error("OTServer::NotarizeExchangeBasket: Closing number used for User's main account receipt was not available for use...\n"); + } + else + { // Load the basket account and make sure it exists. + pBasketAcct = OTAccount::LoadExistingAccount(BASKET_ACCOUNT_ID, SERVER_ID); + + // If the pointer is NULL, that works too. Otherwise it cleans up the object at the end of this function. + theBasketAcctGuardian.SetCleanupTargetPointer(pBasketAcct); + + if (NULL == pBasketAcct) + { + OTLog::Error("ERROR loading the basket account in OTServer::NotarizeExchangeBasket\n"); + } + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pBasketAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on the basket account in OTServer::NotarizeExchangeBasket\n"); + } + else + { + // Now we get a pointer to its asset contract... + OTAssetContract * pContract = GetAssetContract(BASKET_CONTRACT_ID); + + // Now let's load up the actual basket, from the actual asset contract. + if (pContract && + theBasket.LoadContractFromString(pContract->GetBasketInfo()) && + theBasket.VerifySignature(m_nymServer) && + theBasket.Count() == theRequestBasket.Count() && + theBasket.GetMinimumTransfer() == theRequestBasket.GetMinimumTransfer()) + { + // Loop through the request AND the actual basket TOGETHER... + for (int i = 0; i < theBasket.Count(); i++) + { + BasketItem * pBasketItem = theBasket.At(i); + BasketItem * pRequestItem = theRequestBasket.At(i); // we already know these are the same length + + // if not equal + if (!(pBasketItem->SUB_CONTRACT_ID == pRequestItem->SUB_CONTRACT_ID)) + { + OTLog::Error("Error: expected asset type IDs to match in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + // if accounts are equal (should never happen -- why would the user be trying to use the server's account as his own?) + // Furthermore, loading both at the same time, with same ID, then saving again, can screw up the balance. + // + else if (pBasketItem->SUB_ACCOUNT_ID == pRequestItem->SUB_ACCOUNT_ID) + { + OTLog::Error("Error: VERY strange to have these account ID's match. OTServer::NotarizeExchangeBasket.\n"); + bSuccess = false; + break; + } + + else if (false == VerifyTransactionNumber(theNym, pRequestItem->lClosingTransactionNo)) + { + OTLog::Error("Error: Basket sub-currency closing number didn't verify . OTServer::NotarizeExchangeBasket.\n"); + bSuccess = false; + break; + } + else // if equal + { + bSuccess = true; + + // -------------------------------------------------------- + // Load up the two accounts and perform the exchange... + OTAccount * pUserAcct = OTAccount::LoadExistingAccount(pRequestItem->SUB_ACCOUNT_ID, SERVER_ID); + + if (NULL == pUserAcct) + { + OTLog::Error("ERROR loading a user's asset account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + // -------------------------------------------------------- + OTAccount * pServerAcct = OTAccount::LoadExistingAccount(pBasketItem->SUB_ACCOUNT_ID, SERVER_ID); + + if (NULL == pServerAcct) + { + OTLog::Error("ERROR loading a basket sub-account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + // -------------------------------------------------------- + // Load up the inbox for the user's sub account, so we can drop the receipt. + // + OTLedger * pSubInbox = pUserAcct->LoadInbox(m_nymServer); + + if (NULL == pSubInbox || !pSubInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying sub-inbox in OTServer::NotarizeExchangeBasket.\n"); + bSuccess = false; + break; + } + + // I'm preserving these points, to be deleted at the end. + // They won't be saved until after ALL debits/credits were successful. + // Once ALL exchanges are done, THEN it loops through and saves / deletes + // all the accounts. + listUserAccounts.push_back(pUserAcct); + listServerAccounts.push_back(pServerAcct); + listInboxes.push_back(pSubInbox); + + // Do they verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + if (pUserAcct->GetAssetTypeID() != pBasketItem->SUB_CONTRACT_ID) + { + OTLog::Error("ERROR verifying asset type on a user's account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + else if (!pUserAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on a user's asset account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + else if (!pServerAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on a basket sub-account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + break; + } + else // ------------------------------------------------------------------------------- + { + // the amount being transferred between these two accounts is the minimum transfer amount + // for the sub-account on the basket, multiplied by + lTransferAmount = (pBasketItem->lMinimumTransferAmount * theRequestBasket.GetTransferMultiple()); + +// bSuccess = false; // probably superfluous. + + // user is performing exchange IN + if (theRequestBasket.GetExchangingIn()) + { + if (pUserAcct->Debit(lTransferAmount)) + { + if (pServerAcct->Credit(lTransferAmount)) + bSuccess = true; + else + { // the server credit failed. + OTLog::Error(" OTServer::NotarizeExchangeBasket: Failure crediting server acct.\n"); + + // Since we debited the user's acct already, let's put that back. + if (false == pUserAcct->Credit(lTransferAmount)) + OTLog::Error(" OTServer::NotarizeExchangeBasket: Failure crediting back user " + "account.\n"); + bSuccess = false; + break; + } + } + else + { + OTLog::Output(0, "OTServer::NotarizeExchangeBasket: Unable to Debit user account.\n"); + bSuccess = false; + break; + } + } + else // user is peforming exchange OUT + { + if (pServerAcct->Debit(lTransferAmount)) + { + if (pUserAcct->Credit(lTransferAmount)) + bSuccess = true; + else + { // the user credit failed. + OTLog::Error(" OTServer::NotarizeExchangeBasket: Failure crediting user acct.\n"); + + // Since we debited the server's acct already, let's put that back. + if (false == pServerAcct->Credit(lTransferAmount)) + OTLog::Error(" OTServer::NotarizeExchangeBasket: Failure crediting back server " + "account.\n"); + bSuccess = false; + break; + } + } + else + { + OTLog::Output(0, " OTServer::NotarizeExchangeBasket: Unable to Debit server account.\n"); + bSuccess = false; + break; + } + } + // ----------------------------------------------------------------------------- + // Drop the receipt -- accounts were debited and credited properly. + // + if (bSuccess) + { // need to be able to "roll back" if anything inside this block fails. + // update: actually does pretty good roll-back as it is. The debits and credits + // don't save unless everything is a success. + + // Generate new transaction number (for putting the basketReceipt in the exchanger's inbox.) + // todo check this generation for failure (can it fail?) + long lNewTransactionNumber = 0; + + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + OTTransaction * pInboxTransaction = OTTransaction::GenerateTransaction(*pSubInbox, OTTransaction::basketReceipt, lNewTransactionNumber); + + OTItem * pItemInbox = OTItem::CreateItemFromTransaction(*pInboxTransaction, OTItem::basketReceipt); + + // these may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave em. + OT_ASSERT(NULL != pItemInbox); + + pItemInbox->SetStatus(OTItem::acknowledgement); // the default. + pItemInbox->SetAmount(theRequestBasket.GetExchangingIn() ? lTransferAmount*(-1) : lTransferAmount); + + pItemInbox->SignContract(m_nymServer); + pItemInbox->SaveContract(); + + pInboxTransaction->AddItem(*pItemInbox); // Add the inbox item to the inbox transaction, so we can add to the inbox ledger. + + // The "exchangeBasket request" OTItem is saved as the "In Reference To" field + // on the inbox basketReceipt transaction. + //todo put these two together in a method. + pInboxTransaction->SetReferenceString(strInReferenceTo); + pInboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + pInboxTransaction->SetClosingNum(pRequestItem->lClosingTransactionNo); // Here is the number the user wishes to sign-off by accepting this receipt. + + // Now we have created a new transaction from the server to the sender's inbox (for a receipt). + // Let's sign and save it... + pInboxTransaction->SignContract(m_nymServer); + pInboxTransaction->SaveContract(); + + // Here the transaction we just created is actually added to the exchanger's inbox. + pSubInbox->AddTransaction(*pInboxTransaction); + } + } // User and Server sub-accounts are good. --------------------------------------- + } // pBasketItem and pRequestItem are good. + } // for (loop through basketitems) + // ***************************************************************************** + // Load up the two main accounts and perform the exchange... + // (Above we did the sub-accounts for server and user. Now we do the main accounts for server and user.) + // + + // At this point, if we have successfully debited / credited the sub-accounts. + // then we need to debit and credit the user's main basket account and the server's basket issuer account. + if ((true == bSuccess) && (NULL != pBasketAcct)) + { + lTransferAmount = (theRequestBasket.GetMinimumTransfer() * theRequestBasket.GetTransferMultiple()); + + // Load up the two accounts and perform the exchange... + // user is performing exchange IN + if (theRequestBasket.GetExchangingIn()) + { + if (pBasketAcct->Debit(lTransferAmount)) + { + if (theAccount.Credit(lTransferAmount)) + bSuccess = true; + else + { + OTLog::Error("OTServer::NotarizeExchangeBasket: Failed crediting user basket account.\n"); + + if (false == pBasketAcct->Credit(lTransferAmount)) + OTLog::Error("OTServer::NotarizeExchangeBasket: Failed crediting back basket issuer account.\n"); + + bSuccess = false; + } + } + else + { + bSuccess = false; + OTLog::Output(0, "Unable to Debit basket issuer account, in OTServer::NotarizeExchangeBasket\n"); + } + } + else // user is peforming exchange OUT + { + if (theAccount.Debit(lTransferAmount)) + { + if (pBasketAcct->Credit(lTransferAmount)) + bSuccess = true; + else + { + OTLog::Error("OTServer::NotarizeExchangeBasket: Failed crediting basket issuer account.\n"); + + if (false == theAccount.Credit(lTransferAmount)) + OTLog::Error("OTServer::NotarizeExchangeBasket: Failed crediting back user basket account.\n"); + + bSuccess = false; + } + } + else + { + bSuccess = false; + OTLog::Output(0, "Unable to Debit user basket account in OTServer::NotarizeExchangeBasket\n"); + } + } + + + // ----------------------------------------------------------------------------- + // Drop the receipt -- accounts were debited and credited properly. + // + if (bSuccess) + { // need to be able to "roll back" if anything inside this block fails. + // update: actually does pretty good roll-back as it is. The debits and credits + // don't save unless everything is a success. + + // Generate new transaction number (for putting the basketReceipt in the exchanger's inbox.) + // todo check this generation for failure (can it fail?) + long lNewTransactionNumber = 0; + + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + OTTransaction * pInboxTransaction = OTTransaction::GenerateTransaction(*pInbox, OTTransaction::basketReceipt, + lNewTransactionNumber); + + OTItem * pItemInbox = OTItem::CreateItemFromTransaction(*pInboxTransaction, OTItem::basketReceipt); + + // these may be unnecessary, I'll have to check CreateItemFromTransaction. I'll leave em. + OT_ASSERT(NULL != pItemInbox); + + pItemInbox->SetStatus(OTItem::acknowledgement); // the default. + pItemInbox->SetAmount(theRequestBasket.GetExchangingIn() ? lTransferAmount : lTransferAmount*(-1)); + + pItemInbox->SignContract(m_nymServer); + pItemInbox->SaveContract(); + + pInboxTransaction->AddItem(*pItemInbox); // Add the inbox item to the inbox transaction, so we can add to the inbox ledger. + + // The depositCheque request OTItem is saved as a "in reference to" field, + // on the inbox chequeReceipt transaction. + //todo put these two together in a method. + pInboxTransaction->SetReferenceString(strInReferenceTo); + pInboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); + pInboxTransaction->SetClosingNum(theRequestBasket.GetClosingNum()); // So the exchanger can sign-off on this closing num by accepting the basket receipt on his main basket account. + + // Now we have created a new transaction from the server to the sender's inbox + // Let's sign and save it... + pInboxTransaction->SignContract(m_nymServer); + pInboxTransaction->SaveContract(); + + // Here the transaction we just created is actually added to the source acct's inbox. + pInbox->AddTransaction(*pInboxTransaction); + } + } + else + { + OTLog::Error("Error loading or verifying user's main basket account in OTServer::NotarizeExchangeBasket\n"); + bSuccess = false; + } + // --------------------------------------------------------------------------------------- + + + // At this point, we have hopefully credited/debited ALL the relevant accounts. + // So now, let's Save them ALL to disk.. (and clean them up.) + OTAccount * pAccount = NULL; + + // empty the list of USER accounts (and save to disk, if everything was successful.) + while (!listUserAccounts.empty()) + { + pAccount = listUserAccounts.front(); + listUserAccounts.pop_front(); + + if (true == bSuccess) + { + pAccount->ReleaseSignatures(); + pAccount->SignContract(m_nymServer); + pAccount->SaveContract(); + pAccount->SaveAccount(); + } + + delete pAccount; pAccount=NULL; + } + // --------------------------------------------- + // empty the list of SERVER accounts (and save to disk, if everything was successful.) + while (!listServerAccounts.empty()) + { + pAccount = listServerAccounts.front(); + listServerAccounts.pop_front(); + + if (true == bSuccess) + { + pAccount->ReleaseSignatures(); + pAccount->SignContract(m_nymServer); + pAccount->SaveContract(); + pAccount->SaveAccount(); + } + + delete pAccount; pAccount=NULL; + } + // --------------------------------------------- + // empty the list of SERVER accounts (and save to disk, if everything was successful.) + while (!listInboxes.empty()) + { + OTLedger * pTempInbox = listInboxes.front(); + listInboxes.pop_front(); + + if (true == bSuccess) + { + pTempInbox->ReleaseSignatures(); + pTempInbox->SignContract(m_nymServer); + pTempInbox->SaveContract(); + pTempInbox->SaveInbox(); + } + + delete pTempInbox; pTempInbox=NULL; + } + // --------------------------------------------- + if (true == bSuccess) + { + pBasketAcct->ReleaseSignatures(); + pBasketAcct->SignContract(m_nymServer); + pBasketAcct->SaveContract(); + pBasketAcct->SaveAccount(); + + theAccount.ReleaseSignatures(); + theAccount.SignContract(m_nymServer); + theAccount.SaveContract(); + theAccount.SaveAccount(); + + pInbox->ReleaseSignatures(); + pInbox->SignContract(m_nymServer); + pInbox->SaveContract(); + pInbox->SaveInbox(); + + // ---------------------------------------------------- + // Remove my ability to use the "closing" numbers in the future. + // (Since I'm using them to do this exchange...) + // + for (int i = 0; i < theRequestBasket.Count(); i++) + { + BasketItem * pRequestItem = theRequestBasket.At(i); + + OT_ASSERT(NULL != pRequestItem); + + // This just removes the number so I can't USE it. + // I'm still RESPONSIBLE for the number until RemoveIssuedNumber() is called. + // + RemoveTransactionNumber(theNym, pRequestItem->lClosingTransactionNo, false); // bSave=false + + } + RemoveTransactionNumber(theNym, theRequestBasket.GetClosingNum(), true); // bSave=true + + // ---------------------------------------------------- + + pResponseItem->SetStatus(OTItem::acknowledgement); // the exchangeBasket was successful. + } + } + else + { + OTLog::Error("Error finding asset contract for basket, or loading the basket from it, or verifying\n" + "the signature on that basket, or the request basket didn't match actual basket.\n"); + } + } // pBasket exists and signature verifies + // NO need to cleanup pBasketAcct here, since OTCleanup handles it now. + } // theRequestBasket loaded properly. + } // else (balance agreement verified.) + + // I put this here so it's signed/saved whether the balance agreement itself was successful OR NOT. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + } // Balance Agreement item found. +} + + + +// DONE: CHANGE THIS INTO A TRANSACTION (see above) +// Use the CLOSING NUMBERS for each member, and for the basket, to put RECEIPTS in their INBOXES! +// +/// a user is exchanging in or out of a basket. (Ex. He's trading 2 gold and 3 silver for 10 baskets, or vice-versa.) +/* +void OTServer::UserCmdExchangeBasket(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@exchangeBasket";// reply to exchangeBasket + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAssetID = MsgIn.m_strAssetID;// basket asset type ID + msgOut.m_bBool = MsgIn.m_bBool; // exchange in or out? + + const OTIdentifier USER_ID(theNym), SERVER_ID(m_strServerID), + SERVER_USER_ID(m_nymServer), + BASKET_CONTRACT_ID(msgOut.m_strAssetID); + + OTIdentifier BASKET_ACCOUNT_ID; + + // Either way, we need to send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + + + + // Set up some account pointer lists for later... + listOfAccounts listUserAccounts, listServerAccounts; + + // Here's the request from the user. + OTString strBasket(MsgIn.m_ascPayload); + OTBasket theBasket, theRequestBasket; + + long lTransferAmount = 0; + + // Now we have the Contract ID from the basket account, + // we can get a pointer to its asset contract... + + OTIdentifier BASKET_ACCOUNT_ID; + bool bLookup = LookupBasketAccountIDByContractID(BASKET_CONTRACT_ID, BASKET_ACCOUNT_ID); + + OTAccount * pBasketAcct = NULL; + OTCleanup theBasketAcctGuardian; + + // if the account we received IS INDEED a basket account, AND + // we can load the request basket from a string, AND verify its signature... + if (bLookup && theRequestBasket.LoadContractFromString(strBasket) && theRequestBasket.VerifySignature(theNym)) + { + // Load the basket account and make sure it exists. + pBasketAcct = OTAccount::LoadExistingAccount(BASKET_ACCOUNT_ID, SERVER_ID); + + // If the pointer is NULL, that works too. Otherwise it cleans up the object at the end of this function. + theBasketAcctGuardian.SetCleanupTargetPointer(pBasketAcct); + + if (NULL == pBasketAcct) + { + OTLog::Error("ERROR loading the basket account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + } + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pBasketAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on the basket account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + } + else + { + // Now we get a pointer to its asset contract... + OTAssetContract * pContract = GetAssetContract(BASKET_CONTRACT_ID); + + // Now let's load up the actual basket, from the actual asset contract. + if (pContract && + theBasket.LoadContractFromString(pContract->GetBasketInfo()) && + theBasket.VerifySignature(m_nymServer) && + theBasket.Count() == theRequestBasket.Count() && + theBasket.GetMinimumTransfer() == theRequestBasket.GetMinimumTransfer()) + { + // Loop through the request AND the actual basket TOGETHER... + for (int i = 0; i < theBasket.Count(); i++) + { + BasketItem * pBasketItem = theBasket.At(i); + BasketItem * pRequestItem = theRequestBasket.At(i); // we already know these are the same length + + // if not equal + if (!(pBasketItem->SUB_CONTRACT_ID == pRequestItem->SUB_CONTRACT_ID)) + { + OTLog::Error("Error: expected asset type IDs to match in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + else // if equal + { + msgOut.m_bSuccess = true; + + // Load up the two accounts and perform the exchange... + OTAccount * pUserAcct = OTAccount::LoadExistingAccount(pRequestItem->SUB_ACCOUNT_ID, SERVER_ID); + + if (NULL == pUserAcct) + { + OTLog::Error("ERROR loading a user's asset account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + + OTAccount * pServerAcct = OTAccount::LoadExistingAccount(pBasketItem->SUB_ACCOUNT_ID, SERVER_ID); + + if (NULL == pServerAcct) + { + OTLog::Error("ERROR loading a basket sub-account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + + // I'm preserving these points, to be deleted at the end. + // They won't be saved until after ALL debits/credits were successful. + // Once ALL exchanges are done, THEN it loops through and saves / deletes + // all the accounts. + listUserAccounts.push_back(pUserAcct); + listServerAccounts.push_back(pServerAcct); + + + // Do they verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + if (!(pUserAcct->GetAssetTypeID() == pBasketItem->SUB_CONTRACT_ID)) + { + OTLog::Error("ERROR verifying asset type on a user's account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + else if (!pUserAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on a user's asset account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + else if (!pServerAcct->VerifySignature(m_nymServer)) + { + OTLog::Error("ERROR verifying signature on a basket sub-account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + break; + } + else + { + // the amount being transferred between these two accounts is the minimum transfer amount + // for the sub-account on the basket, multiplied by + lTransferAmount = (pBasketItem->lMinimumTransferAmount * theRequestBasket.GetTransferMultiple()); + + // user is performing exchange IN + if (msgOut.m_bBool) + { + if (pUserAcct->Debit(lTransferAmount) && pServerAcct->Credit(lTransferAmount)) + { + msgOut.m_bSuccess = true; + } + else + { + msgOut.m_bSuccess = false; + OTLog::Output(0, "Unable to Debit user account, or Credit server account, in OTServer::UserCmdExchangeBasket\n"); + break; + } + } + else // user is peforming exchange OUT + { + if (pUserAcct->Credit(lTransferAmount) && pServerAcct->Debit(lTransferAmount)) + { + msgOut.m_bSuccess = true; + } + else + { + msgOut.m_bSuccess = false; + OTLog::Output(0, "Unable to Credit user account, or Debit server account, in OTServer::UserCmdExchangeBasket\n"); + break; + } + } + } + } + } // for + } + else + { + OTLog::Error("Error finding asset contract for basket, or loading the basket from it, or verifying\n" + "the signature on that basket, or the request basket didn't match actual basket.\n"); + } + } // pBasket exists and signature verifies + + // ***************************************************************************** + + // Load up the two accounts and perform the exchange... + // (Above we did the sub-accounts for server and user. Now we do the main accounts for server and user.) + // + OTAccount * pUserMainAcct = NULL; + OTCleanup theUserAcctGuardian; + + // At this point, if we have successfully debited / credited the sub-accounts. + // then we need to debit and credit the user's main basket account and the server's basket issuer account. + if ((true == msgOut.m_bSuccess) && pBasketAcct && + (pUserMainAcct = OTAccount::LoadExistingAccount(theRequestBasket.GetRequestAccountID(), SERVER_ID)) && + theUserAcctGuardian.SetCleanupTargetPointer(pUserMainAcct) && // Make sure pUserMainAcct gets cleaned up + pUserMainAcct->VerifySignature(m_nymServer) && + (pUserMainAcct->GetAssetTypeID() == BASKET_CONTRACT_ID)) // Just make sure the two main basket accts have same currency type + { + lTransferAmount = (theRequestBasket.GetMinimumTransfer() * theRequestBasket.GetTransferMultiple()); + + // Load up the two accounts and perform the exchange... + // user is performing exchange IN + if (msgOut.m_bBool) + { + if (pUserMainAcct->Credit(lTransferAmount) && pBasketAcct->Debit(lTransferAmount)) + { + msgOut.m_bSuccess = true; + } + else + { + msgOut.m_bSuccess = false; + OTLog::Output(0, "Unable to Credit user basket account, or Debit basket issuer account, " + "in OTServer::UserCmdExchangeBasket\n"); + } + } + else // user is peforming exchange OUT + { + if (pUserMainAcct->Debit(lTransferAmount) && pBasketAcct->Credit(lTransferAmount)) + { + msgOut.m_bSuccess = true; + } + else + { + msgOut.m_bSuccess = false; + OTLog::Output(0, "Unable to Debit user basket account, or Credit basket issuer account, " + "in OTServer::UserCmdExchangeBasket\n"); + } + } + } + else { + OTLog::Error("Error loading or verifying user's main basket account in OTServer::UserCmdExchangeBasket\n"); + msgOut.m_bSuccess = false; + } + + // At this point, we have hopefully credited/debited ALL the relevant accounts. + // So now, let's Save them ALL to disk.. (and clean them up.) + OTAccount * pAccount = NULL; + + // empty the list of USER accounts (and save to disk, if everything was successful.) + while (!listUserAccounts.empty()) + { + pAccount = listUserAccounts.front(); + listUserAccounts.pop_front(); + + if (true == msgOut.m_bSuccess) + { + pAccount->ReleaseSignatures(); + pAccount->SignContract(m_nymServer); + pAccount->SaveContract(); + pAccount->SaveAccount(); + } + + delete pAccount; pAccount=NULL; + } + + // empty the list of SERVER accounts (and save to disk, if everything was successful.) + while (!listServerAccounts.empty()) + { + pAccount = listServerAccounts.front(); + listServerAccounts.pop_front(); + + if (true == msgOut.m_bSuccess) + { + pAccount->ReleaseSignatures(); + pAccount->SignContract(m_nymServer); + pAccount->SaveContract(); + pAccount->SaveAccount(); + } + + delete pAccount; pAccount=NULL; + } + + + if (true == msgOut.m_bSuccess) + { + pBasketAcct->ReleaseSignatures(); + pBasketAcct->SignContract(m_nymServer); + pBasketAcct->SaveContract(); + pBasketAcct->SaveAccount(); + + pUserMainAcct->ReleaseSignatures(); + pUserMainAcct->SignContract(m_nymServer); + pUserMainAcct->SaveContract(); + pUserMainAcct->SaveAccount(); + } + + + // NO need to cleanup pBasketAcct or pUserMainAcct here, since OTCleanup handles it now. + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} +*/ + + +// ------------------------------------------------------------ + + +// DONE: Make sure a CLOSING TRANSACTION number is provided, and recorded for use later in cron! + +void OTServer::NotarizeMarketOffer(OTPseudonym & theNym, OTAccount & theAssetAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atMarketOffer", that is, "a reply to the marketOffer request" + tranOut.SetType(OTTransaction::atMarketOffer); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = NULL; + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will definitely be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym); + + pBalanceItem = tranIn.GetItem(OTItem::transactionStatement); + + + if (NULL == pBalanceItem) + { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeMarketOffer: Expected transaction statement in trans # %ld: \n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } + // For now, there should only be one of these marketOffer items inside the transaction. + // So we treat it that way... I either get it successfully or not. + else if (pItem = tranIn.GetItem(OTItem::marketOffer)) + { + // The response item will contain a copy of the request item. So I save it into a string + // here so it can be saved into the "in reference to" field. + pItem->SaveContract(strInReferenceTo); + pBalanceItem->SaveContract(strBalanceItem); + + // ASSET_ACCT_ID is the ID on the "from" Account that was passed in. + // The CURRENCY_ACCT_ID is the ID on the "To" Account. (When doing a transfer, normally 2nd acct is the Payee.) + const OTIdentifier ASSET_ACCT_ID(theAssetAccount), CURRENCY_ACCT_ID(pItem->GetDestinationAcctID()); + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atMarketOffer); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransactionStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pItem->GetTransactionNum()); // This response item is IN RESPONSE to pItem and its Owner Transaction. + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // ******************************************************************************************* + + if (false == (pBalanceItem->VerifyTransactionStatement(theNym, tranIn))) // bIsRealTransaction = true; + { + OTLog::vOutput(0, "ERROR verifying transaction statement in NotarizeMarketOffer.\n"); + } + // ******************************************************************************************* + else + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // Load up the currency account and validate it. + OTAccount * pCurrencyAcct = OTAccount::LoadExistingAccount(CURRENCY_ACCT_ID, SERVER_ID); + OTCleanup theCurrencyAcctGuardian(pCurrencyAcct); // Now I don't have to worry about deleting pCurrencyAcct. + + // Also load up the Trade from inside the transaction item. + OTString strOffer; + OTOffer theOffer; + + OTString strTrade; + pItem->GetAttachment(strTrade); + + OTTrade * pTrade = new OTTrade(); + + OT_ASSERT(NULL != pTrade); + + // First load the Trade up (from the string that was passed in on the transaction item.) + bool bLoadContractFromString = pTrade->LoadContractFromString(strTrade); + + // If failed to load the trade... + if (!bLoadContractFromString) + { + OTLog::vError("ERROR loading trade from string in OTServer::NotarizeMarketOffer:\n%s\n", + strTrade.Get()); + } + // I'm using the operator== because it exists. (Although now I believe != exists also) + // If the ID on the "from" account that was passed in, + // does not match the "Acct From" ID on this transaction item + else if (!(ASSET_ACCT_ID == pItem->GetPurportedAccountID())) + { + OTLog::Output(0, "Error: Asset account ID on the transaction does not match asset account ID on the transaction item.\n"); + } + // ok so the IDs match. Does the currency account exist? + else if (NULL == pCurrencyAcct) + { + OTLog::Output(0, "ERROR verifying existence of the currency account in OTServer::NotarizeMarketOffer\n"); + } + else if (!pCurrencyAcct->VerifyContractID()) + { + OTLog::Output(0, "ERROR verifying Contract ID on the currency account in OTServer::NotarizeMarketOffer\n"); + } + else if (!pCurrencyAcct->VerifyOwner(theNym)) + { + OTLog::Output(0, "ERROR verifying ownership of the currency account in OTServer::NotarizeMarketOffer\n"); + } + // Are both of the accounts of the same Asset Type? + else if (theAssetAccount.GetAssetTypeID() == pCurrencyAcct->GetAssetTypeID()) + { + OTString strAssetTypeID(theAssetAccount.GetAssetTypeID()), + strCurrencyTypeID(pCurrencyAcct->GetAssetTypeID()); + OTLog::vOutput(0, "ERROR - user attempted to trade between identical " + "asset types in OTServer::NotarizeMarketOffer:\n%s\n%s\n", + strAssetTypeID.Get(), + strCurrencyTypeID.Get()); + } + // Does it verify? + // I call VerifySignature here since VerifyContractID was already called in LoadExistingAccount(). + else if (!pCurrencyAcct->VerifySignature(m_nymServer)) + { + OTLog::Output(0, "ERROR verifying signature on the Currency account in OTServer::NotarizeMarketOffer\n"); + } + else if (!pTrade->VerifySignature(theNym)) + { + OTLog::Output(0, "ERROR verifying signature on the Trade in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetTransactionNum() != pItem->GetTransactionNum()) + { + OTLog::Output(0, "ERROR bad transaction number on trade in OTServer::NotarizeMarketOffer\n"); + } + // The transaction number opens the market offer, but there must also be a closing number for closing it. + else if ((pTrade->GetCountClosingNumbers() < 2) || + !VerifyTransactionNumber(theNym, pTrade->GetAssetAcctClosingNum()) || // Verify that it can still be USED + !VerifyTransactionNumber(theNym, pTrade->GetCurrencyAcctClosingNum()) + ) + { + OTLog::Output(0, "ERROR needed 2 valid closing transaction numbers in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetServerID() != SERVER_ID) + { + OTLog::Output(0, "ERROR bad server ID on Trade in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetSenderUserID() != USER_ID) + { + OTLog::Output(0, "ERROR wrong user ID on Trade in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetAssetID() != theAssetAccount.GetAssetTypeID()) + { + OTLog::Output(0, "ERROR wrong Asset Type ID on Trade in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetSenderAcctID() != ASSET_ACCT_ID) + { + OTLog::Output(0, "ERROR wrong Asset Acct ID on Trade in OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetCurrencyID() != pCurrencyAcct->GetAssetTypeID()) + { + OTLog::Output(0, "ERROR wrong Currency Type ID OTServer::NotarizeMarketOffer\n"); + } + else if (pTrade->GetCurrencyAcctID() != CURRENCY_ACCT_ID) + { + OTLog::Output(0, "ERROR wrong Currency Acct ID on Trade in OTServer::NotarizeMarketOffer\n"); + } + // If the Trade successfully verified, but I couldn't get the offer out of it, then it + // actually DIDN'T successfully load still. :-( + else if (!pTrade->GetOfferString(strOffer)) + { + OTLog::vError("ERROR getting offer string in OTServer::NotarizeMarketOffer:\n%s\n", + strTrade.Get()); + } + else if (!theOffer.LoadContractFromString(strOffer)) + { + OTLog::vError("ERROR loading offer from string in OTServer::NotarizeMarketOffer:\n%s\n", + strTrade.Get()); + } + // ...And then we use that same Nym to verify the signature on the offer. + else if (!theOffer.VerifySignature(theNym)) + { + OTLog::Error("ERROR verifying Offer signature in OTServer::NotarizeMarketOffer.\n"); + } + else if (!pTrade->VerifyOffer(theOffer)) + { + OTLog::Output(0, "ERROR verifying Offer for Trade in OTServer::NotarizeMarketOffer\n"); + } + + // At this point I feel pretty confident that the Trade is a valid request from the user. + + + + // The top half of this function is oriented around finding the "marketOffer" item (in the "marketOffer" + // transaction) and setting up the response item that will go into the response transaction. It also + // retrieves the Trade object and fully validates it. + // + // Next all we need to do is add it to the market... + + + else + { + // We don't actually add the trade to a market here. Instead, we add it to the server's Cron object. + // That object will take care of processing the offer on and off of any market. + // + // NOTE: FYI, inside AddCronItem, since this is a new CronItem, a Cron Receipt will + // be saved with the User's signature on it, containing the Cron Item from the user's + // original request. After that, the item is stored internally to Cron itself, and + // signed by the server--and changes over time as cron processes. (The original receipt + // can always be loaded when necessary.) + if (m_Cron.AddCronItem(*pTrade, true)) // bSaveReceipt=true + {//todo need to be able to "roll back" if anything inside this block fails. + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + OTLog::Output(2, "Successfully added Trade to Cron object.\n"); + + // This just removes the Closing number so he can't USE it again. (Since he's using it as the closing + // number for this cron item now.) He's still RESPONSIBLE for the number until RemoveIssuedNumber() + // is called. If we didn't call this here, then he could come back later and USE THE NUMBER AGAIN! + // (Bad!) + RemoveTransactionNumber(theNym, pTrade->GetAssetAcctClosingNum(), false); // bSave=true + RemoveTransactionNumber(theNym, pTrade->GetCurrencyAcctClosingNum(), true); // (No sense saving twice in a row.) + // RemoveIssuedNum will be called for the original transaction number when the finalReceipt is created. + // RemoveIssuedNum will be called for the Closing number when the finalReceipt is accepted. + + // Server side, the Nym stores a list of all open cron item numbers. + // (So we know if there is still stuff open on Cron for that Nym, and we know what it is.) + // + std::set & theIDSet = theNym.GetSetOpenCronItems(); + theIDSet.insert(pTrade->GetTransactionNum()); + theIDSet.insert(pTrade->GetAssetAcctClosingNum()); + theIDSet.insert(pTrade->GetCurrencyAcctClosingNum()); + theNym.SaveSignedNymfile(m_nymServer); + } + else + { + OTLog::Output(0, "Unable to add trade to Cron object OTServer::NotarizeMarketOffer\n"); + } + } + + // If the trade WAS successfully added to Cron, then we don't need to + // delete it here, since Cron owns it now, and will deal with cleaning + // it up at the right time. + if ((NULL != pTrade) && pResponseItem->GetStatus() != OTItem::acknowledgement) + { + delete pTrade; + pTrade = NULL; + } + } // transaction statement verified. + + // -------------------------------------------------------------------- + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); // the signing was of no effect because I forgot to save. + + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + } // if pItem = tranIn.GetItem(OTItem::marketOffer) + else { + OTString strTemp(tranIn); + OTLog::vOutput(0, "OTServer::NotarizeMarketOffer: Expected OTItem::marketOffer in trans# %ld:\n\n%s\n\n", + tranIn.GetTransactionNum(), strTemp.Exists() ? strTemp.Get() : " (ERROR LOADING TRANSACTION INTO STRING) "); + } +} + + + + + +/// If the server receives a notarizeTransactions command, it will be accompanied by a payload +/// containing a ledger to be notarized. UserCmdNotarizeTransactions will loop through that ledger, +/// and for each transaction within, it calls THIS method. +/// TODO think about error reporting here and sending a message back to user. +void OTServer::NotarizeTransaction(OTPseudonym & theNym, OTTransaction & tranIn, OTTransaction & tranOut) +{ + bool bSuccess = false; + + const long lTransactionNumber = tranIn.GetTransactionNum(); + const OTIdentifier SERVER_ID(m_strServerID); + OTIdentifier USER_ID; + theNym.GetIdentifier( USER_ID); + + OTAccount theFromAccount(USER_ID, tranIn.GetPurportedAccountID(), SERVER_ID); + + // Make sure the "from" account even exists... + if (!theFromAccount.LoadContract()) + { + OTLog::vOutput(0, "Error loading 'from' account in OTServer::NotarizeTransaction\n"); + } + // Make sure the "from" account isn't marked for deletion. + else if (theFromAccount.IsMarkedForDeletion()) + { + OTLog::vOutput(0, "OTServer::NotarizeTransaction: Failed attempt to use an Asset account that was marked for deletion.\n"); + } + // Make sure the Account ID loaded from the file matches the one we just set and used as the filename. + else if (!theFromAccount.VerifyContractID()) + { + // this should never happen. How did the wrong ID get into the account file, if the right + // ID is on the filename itself? and vice versa. + OTLog::Error("Error verifying account ID in OTServer::NotarizeTransaction\n"); + } + // Make sure the nymID loaded up in the account as its actual owner matches the nym who was + // passed in to this function requesting a transaction on this account... otherwise any asshole + // could do transactions on your account, no? + else if (!theFromAccount.VerifyOwner(theNym)) + { + OTLog::vOutput(0, "Error verifying account ownership in OTServer::NotarizeTransaction\n"); + } + // Make sure I, the server, have signed this file. + else if (!theFromAccount.VerifySignature(m_nymServer)) + { + OTLog::Error("Error verifying server signature on account in OTServer::NotarizeTransaction\n"); + } + // No need to call VerifyAccount() here since the above calls go above and beyond that method. + + else if (!VerifyTransactionNumber(theNym, lTransactionNumber)) + { + // The user may not submit a transaction using a number he's already used before. + OTLog::Output(0, "Error verifying transaction number on user nym in OTServer::NotarizeTransaction\n"); + } + + // The items' acct and server ID were already checked in VerifyContractID() when they were loaded. + // Now this checks a little deeper, to verify ownership, signatures, and transaction number + // on each item. That way those things don't have to be checked for security over and over + // again in the subsequent calls. + // + else if (!tranIn.VerifyItems(theNym)) + { + OTLog::Output(0, "Error verifying transaction items OTServer::NotarizeTransaction\n"); + } + + // any other security stuff? + // Todo do I need to verify the server ID here as well? + else + { + // We don't want any transaction number being used twice. + // (The number, at this point, is STILL issued to the user, who is still responsible + // for that number and must continue signing for it. All this means here is that the + // user no longer has the number on his AVAILABLE list. Removal from issued list happens separately.) + // + if (false == RemoveTransactionNumber(theNym, lTransactionNumber, true)) //bSave=true + { + OTLog::Error("Error removing transaction number (as available) from user nym in OTServer::NotarizeTransaction\n"); + } + + // ------------------------------------------------------------------- + + else + { + OTItem::itemType theReplyItemType = OTItem::error_state; + + switch (tranIn.GetType()) + { + // TRANSFER (account to account) + // Alice sends a signed request to the server asking it to + // transfer from her account ABC to the inbox of account DEF. + // A copy will also remain in her outbox until canceled or accepted. + case OTTransaction::transfer: + OTLog::Output(0, "NotarizeTransaction type: Transfer\n"); + NotarizeTransfer(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atTransfer; + break; + + // PROCESS INBOX (currently, all incoming transfers must be accepted.) + // Bob sends a signed request to the server asking it to reject + // some of his inbox items and/or accept some into his account DEF. + case OTTransaction::processInbox: + OTLog::Output(0, "NotarizeTransaction type: Process Inbox\n"); + NotarizeProcessInbox(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; +// theReplyItemType = OTItem::atProcessInbox; // Nonexistent, and here, unused. + // (There is a processInbox message that carries that transaction...) + break; + + // WITHDRAWAL (cash or voucher) + // Alice sends a signed request to the server asking it to debit her + // account ABC and then issue her a purse full of blinded cash tokens + // --OR-- a voucher (a cashier's cheque, made out to any recipient's + // User ID, or made out to a blank recipient, just like a blank cheque.) + case OTTransaction::withdrawal: + OTLog::Output(0, "NotarizeTransaction type: Withdrawal\n"); + NotarizeWithdrawal(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atWithdrawal; + break; + + // DEPOSIT (cash or cheque) + // Bob sends a signed request to the server asking it to deposit into his + // account ABC. He includes with his request a signed cheque made out to + // Bob's user ID (or blank), --OR-- a purse full of tokens. + case OTTransaction::deposit: + OTLog::Output(0, "NotarizeTransaction type: Deposit\n"); + NotarizeDeposit(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atDeposit; + break; + + // MARKET OFFER + // Bob sends a signed request to the server asking it to put an offer + // on the market. He includes with his request a signed trade listing + // the relevant information, asset types and account IDs. + case OTTransaction::marketOffer: + OTLog::Output(0, "NotarizeTransaction type: Market Offer\n"); + NotarizeMarketOffer(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atMarketOffer; + break; + + // PAYMENT PLAN + // Bob sends a signed request to the server asking it to make regular + // payments to Alice. (BOTH Alice AND Bob must have signed the same contract.) + case OTTransaction::paymentPlan: + OTLog::Output(0, "NotarizeTransaction type: Payment Plan\n"); + NotarizePaymentPlan(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atPaymentPlan; + break; + + // CANCEL CRON ITEM + // (Cron items: market offers, payment plans...) + // Bob sends a signed request to the server asking it to cancel a + // REGULARLY PROCESSING CONTRACT that he had previously created. + case OTTransaction::cancelCronItem: + OTLog::Output(0, "NotarizeTransaction type: cancelCronItem\n"); + NotarizeCancelCronItem(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atCancelCronItem; + break; + + // EXCHANGE BASKET + // Bob sends a signed request to the server asking it to exchange funds + // in or out of a basket currency. (From-or-to his main basket account and his + // various sub-accounts for each member currency in the basket.) + case OTTransaction::exchangeBasket: + OTLog::Output(0, "NotarizeTransaction type: Exchange Basket\n"); + NotarizeExchangeBasket(theNym, theFromAccount, tranIn, tranOut); + bSuccess = true; + theReplyItemType = OTItem::atExchangeBasket; + break; + + default: + OTLog::vError("OTServer::NotarizeTransaction: Error, unexpected type: %s\n", tranIn.GetTypeString()); + break; + } + + // ------------------------------------------ + + // Where appropriate, remove a transaction number from my issued list + // (the list of numbers I must sign for in every balance agreement.) + + switch (tranIn.GetType()) + { + case OTTransaction::transfer: + case OTTransaction::marketOffer: + case OTTransaction::paymentPlan: + // If success, then Issued number stays on Nym's issued list until the transfer, paymentPlan or marketOffer + // is entirely closed and removed. In the case of transfer, that's when the transfer receipt is accepted. + // In the case of markets and paymentplans, that's when they've been entirely removed from Cron (many + // intermediary receipts might occur before that happens.) At that time, a final receipt is issued with + // a closing transaction number (to make sure the user closes all of the related market receipts.) + // + // But if failure, then Issued number is immediately removed. + // (It already can't be used again, and there's no receipt to clear later, thus no reason to save it...) + { + OTItem * pItem = tranOut.GetItem(theReplyItemType); + + if ((NULL != pItem)) + { + if (OTItem::rejection == pItem->GetStatus()) + { + if (false == RemoveIssuedNumber(theNym, lTransactionNumber, true)) //bSave=true + { + OTLog::Error("Error removing issued number from user nym in OTServer::NotarizeTransaction\n"); + } + } + } + } + break; + + // In the case of the below transaction types, the transaction number is removed from the Nym's + // issued list SUCCESS OR FAIL. (It's closed either way.) + // + case OTTransaction::processInbox: + case OTTransaction::withdrawal: + case OTTransaction::deposit: + case OTTransaction::cancelCronItem: + case OTTransaction::exchangeBasket: + if (false == RemoveIssuedNumber(theNym, lTransactionNumber, true)) //bSave=true + { + OTLog::Error("Error removing issued number from user nym in OTServer::NotarizeTransaction\n"); + } + break; + + default: + OTLog::vError("OTServer::NotarizeTransaction: Error, unexpected type: %s\n", tranIn.GetTypeString()); + break; + } + } + + // Add a new transaction number item to each outgoing transaction. + // So that the client can use it with his next request. Might as well + // send it now, otherwise the client will have to request one later + // before his next request. + // + // UPDATE: We NO LONGER send a transaction number here. Instead, the + // user MUST request it, and we MUST drop it into his Nymbox, and he + // MUST retrieve it from there by processing his nymbox (and therefore + // SIGNING for it, via a transactionStatement.) + // + // This is what makes it possible for both sides to prove balances + // without having to store a transaction history (as long as they do + // save the last receipt.) + // +// long lTransactionNum = 0; +// +// // This call to IssueNextTransactionNumber will save the new transaction +// // number to the nym's file on the server side. +// if (bSuccess +// && IssueNextTransactionNumber(theNym, lTransactionNum) +// ) +// { +// // But we still have to bundle it into the message and send it, so +// // it can also be saved into the same nym's file on the client side. +// OTPseudonym theMessageNym; +// theMessageNym.AddTransactionNum(m_strServerID, lTransactionNum); // This version of AddTransactionNum doesn't bother saving to file. No need here... +// +// OTString strMessageNym(theMessageNym); +// +// OTItem * pItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransaction); +// +// if (pItem) +// { +// pItem->SetStatus(OTItem::acknowledgement); +// pItem->SetAttachment(strMessageNym); +// pItem->SignContract(m_nymServer); +// pItem->SaveContract(); // the signing was of no effect because I forgot to save. +// tranOut.AddItem(*pItem); // the Transaction's destructor will cleanup the item. It "owns" it now. +// } +// } + } + + // sign the outoing transaction + tranOut.SignContract(m_nymServer); + tranOut.SaveContract(); // don't forget to save (to internal raw file member) + + // Contracts store an internal member that contains the "Raw File" contents + // That is, the unsigned XML portion, plus the signatures, attached in a standard + // PGP-compatible format. It's not enough to sign it, you must also save it into + // that Raw file member variable (using SaveContract) and then you must sometimes + // THEN save it into a file (or a string or wherever you want to put it.) +} + + + + + +/// There will be more code here to handle all that. In the meantime, I just send +/// a test response back to make sure the communication works. +/// +/// An existing user is sending a list of transactions to be notarized. +void OTServer::UserCmdNotarizeTransactions(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@notarizeTransactions"; // reply to notarizeTransactions + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // The Account ID in question + + const OTIdentifier USER_ID(MsgIn.m_strNymID), + ACCOUNT_ID(MsgIn.m_strAcctID), + SERVER_ID(m_strServerID), + SERVER_USER_ID(m_nymServer); + + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); // These are ledgers used as messages. The one we received and the one + // that we're sending back in response. + OTLedger * pResponseLedger = OTLedger::GenerateLedger(SERVER_USER_ID, ACCOUNT_ID, SERVER_ID, OTLedger::message, false); + OTCleanup theRespLedgerGuardian(pResponseLedger); // So I don't have to worry about cleaning it up. + + // Since the one going back (above) is a new ledger, we have to call GenerateLedger. + // Whereas the ledger we received from the server was generated there, so we don't + // have to generate it again. We just load it. + + OTString strLedger(MsgIn.m_ascPayload); + + // as long as the request ledger loads from the message into memory, success is true + // from there, the success or failure of the transactions within will be carried in + // their own status variables and those of the items inside those transactions. + if (msgOut.m_bSuccess = theLedger.LoadContractFromString(strLedger)) + { + // In this case we need to process the ledger items + // and create a corresponding ledger where each of the new items + // contains the answer to the ledger item sent. + // Then we send that new "response ledger" back to the user in MsgOut.Payload. + // That is all done here. Until I write that, in the meantime, + // let's just fprintf it out and see what it looks like. + // OTLog::Error("Loaded ledger out of message payload:\n%s\n", strLedger.Get()); +// OTLog::Error("Loaded ledger out of message payload.\n"); + + // Loop through ledger transactions, and do a "NotarizeTransaction" call for each one. + // Inside that function it will do the various necessary authentication and processing, not this one. + + OTTransaction * pTransaction = NULL; + OTTransaction * pTranResponse = NULL; + + for (mapOfTransactions::iterator ii = theLedger.GetTransactionMap().begin(); + ii != theLedger.GetTransactionMap().end(); ++ii) + { + // for each transaction in the ledger, we create a transaction response and add + // that to the response ledger. + if (pTransaction = (*ii).second) + { + + // I don't call IssueNextTransactionNumber here because I'm not creating a new transaction + // in someone's inbox or outbox. Instead, I'm making a transaction response to a transaction + // request, with a MATCHING transaction number (so don't need to issue a new one) to be sent + // back to the client in a message. + // + // On this new "response transaction", I set the ACCT ID, the serverID, and Transaction Number. + pTranResponse = OTTransaction::GenerateTransaction(*pResponseLedger, OTTransaction::error_state, pTransaction->GetTransactionNum()); + // Add the response transaction to the response ledger. + // That will go into the response message and be sent back to the client. + pResponseLedger->AddTransaction(*pTranResponse); + + // Now let's make sure the response transaction has a copy of the transaction + // it is responding to. + // OTString strResponseTo; + // pTransaction->SaveContract(strResponseTo); + // pTranResponse->m_ascInReferenceTo.SetString(strResponseTo); + // I commented out the above because we are keeping too many copies. + // Message contains a copy of the message it's responding to. + // Then each transaction contains a copy of the transaction responding to... + // Then each ITEM in each transaction contains a copy of each item it's responding to. + // + // Therefore, for the "notarizeTransactions" message, I have decided (for now) to have + // the extra copy in the items themselves, and in the overall message, but not in the + // transactions. Thus, the above is commented out. + + + // It should always return something. Success, or failure, that goes into pTranResponse. + // I don't think there's need for more return value than that. The user has gotten deep + // enough that they deserve SOME sort of response. + // + // This function also SIGNS the transaction, so there is no need to sign it after this. + // There's also no point to change it after this, unless you plan to sign it twice. + // + NotarizeTransaction(theNym, *pTransaction, *pTranResponse); + + pTranResponse = NULL; // at this point, the ledger now "owns" the response, and will handle deleting it. + } + else + { + OTLog::Error("NULL transaction pointer in OTServer::UserCmdNotarizeTransactions\n"); + } + } + + // TODO: should consider saving a copy of the response ledger here on the server. + // Until the user signs off of the responses, maybe the user didn't receive them. + // The server should be able to re-send them until confirmation, then delete them. + // So might want to consider a SAVE TO FILE here of that ledger we're sending out... + + // sign the ledger + pResponseLedger->SignContract(m_nymServer); + pResponseLedger->SaveContract(); + + // extract the ledger in ascii-armored form + OTString strPayload(*pResponseLedger); + + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the response ledger in its payload. + } + else + { + OTLog::Error("ERROR loading ledger from message in OTServer::UserCmdNotarizeTransactions\n"); + } + + + // todo: consider commenting this out since the transaction reply items already include a copy + // of the original client communication that the server is responding to. No point beating a + // dead horse. + // + // Send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetAccount(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getAccount"; // reply to getAccount + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // The Account ID in question + + const OTIdentifier USER_ID(MsgIn.m_strNymID), ACCOUNT_ID(MsgIn.m_strAcctID), SERVER_ID(MsgIn.m_strServerID); + + OTAccount * pAccount = OTAccount::LoadExistingAccount(ACCOUNT_ID, SERVER_ID); + bool bSuccessLoadingAccount = ((pAccount != NULL) ? true:false ); + + // Yup the account exists. Yup it has the same user ID. + if (bSuccessLoadingAccount && (pAccount->GetUserID() == USER_ID)) + { + msgOut.m_bSuccess = true; + // extract the account in ascii-armored form on the outgoing message + OTString strPayload(*pAccount); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the inbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + else + { + msgOut.m_bSuccess = false; + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetContract(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getContract"; // reply to getContract + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAssetID = MsgIn.m_strAssetID; // The Asset Type ID in question + + const OTIdentifier ASSET_TYPE_ID(MsgIn.m_strAssetID); + + OTAssetContract * pContract = GetAssetContract(ASSET_TYPE_ID); + + bool bSuccessLoadingContract = ((pContract != NULL) ? true:false ); + + // Yup the asset contract exists. + if (bSuccessLoadingContract) + { + msgOut.m_bSuccess = true; + // extract the account in ascii-armored form on the outgoing message + OTString strPayload(*pContract); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the inbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + else + { + msgOut.m_bSuccess = false; + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetMint(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getMint"; // reply to getMint + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAssetID = MsgIn.m_strAssetID; // The Asset Type ID in question + + const OTIdentifier ASSET_TYPE_ID(MsgIn.m_strAssetID); + const OTString ASSET_ID_STR(ASSET_TYPE_ID); + + // -------------------------------------------------------------------- + + bool bSuccessLoadingMint = false; + + OTMint theMint(m_strServerID, ASSET_ID_STR); + + if (true == (bSuccessLoadingMint = theMint.LoadMint(".PUBLIC"))) + { + // You cannot hash the Mint to get its ID. + // (The ID is a hash of the asset contract, not the mint contract.) + // Instead, you must READ the ID from the Mint file, and then compare it to the one expected + // to see if they match (similar to how Account IDs are verified.) + + bSuccessLoadingMint = theMint.VerifyMint(m_nymServer); + + // Yup the asset contract exists. + if (bSuccessLoadingMint) + { + msgOut.m_bSuccess = true; + + // extract the account in ascii-armored form on the outgoing message + OTString strPayload(theMint); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the inbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + } + + if (!bSuccessLoadingMint) + { + msgOut.m_bSuccess = false; + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +// If a user requests to delete his own Nym, the server will allow it. +// IF: If the transaction numbers are all closable (available on both lists). +// AND if the Nymbox is empty. AND if there are no cron items open, AND if +// there are no asset accounts! (Delete them / Close them all FIRST! Or this fails.) +// +void OTServer::UserCmdDeleteUser(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@deleteUserAccount"; // reply to deleteUserAccount + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier USER_ID(MsgIn.m_strNymID), SERVER_ID(MsgIn.m_strServerID); + + OTLedger theLedger(USER_ID, USER_ID, SERVER_ID); + + std::set & theSetofCronItemIDs = theNym.GetSetOpenCronItems(); + + // If success loading Nymbox, and there are transactions still inside, THEN FAIL!!! + // (Can't delete a Nym with open receipts...) + // + const bool bSuccessLoadNymbox = theLedger.LoadNymbox(); + if (false == bSuccessLoadNymbox) + { + OTLog::Output(3, "Tried to delete Nym, but failed loading the Nymbox.\n"); + msgOut.m_bSuccess = false; + } + else if (theLedger.GetTransactionCount() > 0) + { + OTLog::Output(3, "Tried to delete Nym, but there are still receipts in the Nymbox. (Process them first.)\n"); + msgOut.m_bSuccess = false; + } + // This Nym still has items open on Cron! + // + else if (theSetofCronItemIDs.size() > 0) + { + OTLog::Output(3, "Tried to delete Nym, but there are still open Cron Items. (Close them first.)\n"); + msgOut.m_bSuccess = false; + } + else if (theNym.GetSetAssetAccounts().size() > 0) + { + OTLog::Output(3, "Tried to delete Nym, but there are still Asset Accounts open for that Nym. (Close them first.)\n"); + msgOut.m_bSuccess = false; + } + // The Nym has used some of his transaction numbers, but hasn't closed them out yet. + // Close those transactions first. + else if (theNym.GetTransactionNumCount(SERVER_ID) != theNym.GetIssuedNumCount(SERVER_ID)) + { + OTLog::Output(3, "Tried to delete Nym, but there are still transactions open for that Nym. (Close them first.)\n"); + msgOut.m_bSuccess = false; + } + else // SUCCESS! + { + msgOut.m_bSuccess = true; + + // The Nym may have some numbers signed out, but none of them have come through + // and been "used but not closed" yet. (That is, removed from transaction num list but still + // on issued num list.) If they had (i.e. if the previous elseif just above had discovered + // mismatched counts) then we wouldn't be able to delete the Nym until those transactions were + // closed. + // Since we know the counts match perfectly, here we remove all the numbers. + // The client side must know to remove all the numbers as well, when it receives a successful + // reply that the nym was "deleted." + // + while (theNym.GetTransactionNumCount(SERVER_ID) > 0) + { + long lTemp = theNym.GetTransactionNum(SERVER_ID, 0); // index 0 + RemoveTransactionNumber(theNym, lTemp, false); // bSave = false + } + + while (theNym.GetIssuedNumCount(SERVER_ID) > 0) + { + long lTemp = theNym.GetIssuedNum(SERVER_ID, 0); // index 0 + RemoveIssuedNumber(theNym, lTemp, false); // bSave = false + } + // -------------------------------- + // + theNym.MarkForDeletion(); // The nym isn't actually deleted yet, just marked for deletion. + // It will get cleaned up later, during server maintenance. + + // SAVE the Nym... (now marked for deletion and with all of its transaction numbers removed.) + // + theNym.SaveSignedNymfile(m_nymServer); + } + + // Send the user's command back to him (success or failure.) + // if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + +// If the client wants to delete an asset account, the server will allow it... +// ...IF: the Inbox and Outbox are both EMPTY. AND the Balance must be empty as well! +// +void OTServer::UserCmdDeleteAssetAcct(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@deleteAssetAccount"; // reply to deleteAssetAccount + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // the asset account being deleted. + + const OTIdentifier USER_ID(MsgIn.m_strNymID), + SERVER_ID(MsgIn.m_strServerID), + ACCOUNT_ID(MsgIn.m_strAcctID); + + OTAccount * pAccount = OTAccount::LoadExistingAccount(ACCOUNT_ID, SERVER_ID); + OTCleanup theAcctGuardian(pAccount); // This is safe in cases where NULL is returned. No more need to cleanup pAccount. + + if (NULL == pAccount || !pAccount->VerifyAccount(m_nymServer)) + { + OTLog::vError("OTServer::UserCmdDeleteAssetAcct: Error loading or verifying account: %s\n", MsgIn.m_strAcctID.Get()); + } + else if (pAccount->GetBalance() != 0) + { + OTLog::vOutput(1, "OTServer::UserCmdDeleteAssetAcct: Failed while trying to delete asset account %s: Balance must be zero to do this!\n", + MsgIn.m_strAcctID.Get()); + } + else + { + OTLedger * pInbox = pAccount->LoadInbox(m_nymServer); + OTLedger * pOutbox = pAccount->LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::vError("OTServer::UserCmdDeleteAssetAcct: Error loading or verifying inbox.\n", MsgIn.m_strAcctID.Get()); + } + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::vError("OTServer::UserCmdDeleteAssetAcct: Error loading or verifying outbox.\n", MsgIn.m_strAcctID.Get()); + } + else if (pInbox->GetTransactionCount() > 0) + { + OTLog::Output(3, "Tried to delete asset account, but there are still receipts in the Inbox. (Process them first.)\n"); + msgOut.m_bSuccess = false; + } + else if (pOutbox->GetTransactionCount() > 0) + { + OTLog::Output(3, "Tried to delete asset account, but there are still receipts in the Outbox. (Process them first.)\n"); + msgOut.m_bSuccess = false; + } + else // SUCCESS! + { + msgOut.m_bSuccess = true; + + std::set & theAccountSet = theNym.GetSetAssetAccounts(); + theAccountSet.erase(MsgIn.m_strAcctID.Get()); + + theNym.SaveSignedNymfile(m_nymServer); + + // -------------------------------- + // + pAccount->MarkForDeletion(); // The account isn't actually deleted yet, just marked for deletion. + // It will get cleaned up later, during server maintenance. + + // SAVE the Account... (NOW THAT IT IS MARKED FOR DELETION.) + // + pAccount->ReleaseSignatures(); + pAccount->SignContract(m_nymServer); + pAccount->SaveContract(); + pAccount->SaveAccount(); + } + } // pAccount verifies. + // ---------------------------------------------------- + + // Send the user's command back to him (success or failure.) + // if (false == msgOut.m_bSuccess) + { + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + + + +void OTServer::UserCmdGetNymbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getNymbox"; // reply to getNymbox + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier USER_ID(MsgIn.m_strNymID), SERVER_ID(MsgIn.m_strServerID); + + OTLedger theLedger(USER_ID, USER_ID, SERVER_ID); + + if (msgOut.m_bSuccess = theLedger.LoadNymbox()) + { + // extract the ledger in ascii-armored form on the outgoing message + OTString strPayload(theLedger); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the nymbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + else + { + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetInbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getInbox"; // reply to getInbox + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // The Account ID in question + + const OTIdentifier USER_ID(MsgIn.m_strNymID), ACCOUNT_ID(MsgIn.m_strAcctID), SERVER_ID(MsgIn.m_strServerID); + + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + + if (msgOut.m_bSuccess = theLedger.LoadInbox()) + { + // extract the ledger in ascii-armored form on the outgoing message + OTString strPayload(theLedger); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the inbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + else + { + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + +void OTServer::UserCmdGetOutbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@getOutbox"; // reply to getOutbox + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // The Account ID in question + + const OTIdentifier USER_ID(MsgIn.m_strNymID), ACCOUNT_ID(MsgIn.m_strAcctID), SERVER_ID(MsgIn.m_strServerID); + + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); + + if (msgOut.m_bSuccess = theLedger.LoadOutbox()) + { + // extract the ledger in ascii-armored form on the outgoing message + OTString strPayload(theLedger); // first grab it in plaintext string form + msgOut.m_ascPayload.SetString(strPayload); // now the outgoing message has the outbox ledger in its payload in base64 form. + } + // Send the user's command back to him if failure. + else + { + OTString tempInMessage(MsgIn); // Grab the incoming message in plaintext form + msgOut.m_ascInReferenceTo.SetString(tempInMessage); // Set it into the base64-encoded object on the outgoing message + } + + // (2) Sign the Message + msgOut.SignContract((const OTPseudonym &)m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + + + + +void OTServer::UserCmdProcessNymbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@processNymbox"; // reply to processNymbox + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + + const OTIdentifier USER_ID(msgOut.m_strNymID), + SERVER_ID(m_strServerID), + SERVER_USER_ID(m_nymServer); + + OTLedger theLedger(USER_ID, USER_ID, SERVER_ID); // These are ledgers used as messages. The one we received + // and the one we're sending back. + OTLedger * pResponseLedger = OTLedger::GenerateLedger(SERVER_USER_ID, USER_ID, SERVER_ID, OTLedger::message, false); // bCreateFile=false + OTCleanup theRespLedgerGuardian(pResponseLedger); + + // Grab the string (containing the request ledger) out of ascii-armored form. + OTString strLedger(MsgIn.m_ascPayload); + + // theLedger contains a single transaction from the client, with an item inside + // for each inbox transaction the client wants to accept or reject. + // Let's see if we can load it from the string that came in the message... + if (msgOut.m_bSuccess = theLedger.LoadContractFromString(strLedger)) + { + // In this case we need to process the transaction items from the ledger + // and create a corresponding transaction where each of the new items + // contains the answer to the transaction item sent. + // Then we send that new "response ledger" back to the user in MsgOut.Payload + // as an @processNymbox message. + + OTTransaction * pTransaction = NULL; + OTTransaction * pTranResponse = NULL; + + for (mapOfTransactions::iterator ii = theLedger.GetTransactionMap().begin(); + ii != theLedger.GetTransactionMap().end(); ++ii) + { + pTransaction = (*ii).second; + + OT_ASSERT_MSG(NULL != pTransaction, "NULL transaction pointer in OTServer::UserCmdProcessNymbox\n"); + + // for each transaction in the ledger, we create a transaction response and add + // that to the response ledger. + pTranResponse = OTTransaction::GenerateTransaction(*pResponseLedger, OTTransaction::error_state, pTransaction->GetTransactionNum()); + + // Add the response transaction to the response ledger. + // That will go into the response message and be sent back to the client. + pResponseLedger->AddTransaction(*pTranResponse); + + // Now let's make sure the response transaction has a copy of the transaction + // it is responding to. + // OTString strResponseTo; + // pTransaction->SaveContract(strResponseTo); + // pTranResponse->m_ascInReferenceTo.SetString(strResponseTo); + // I commented out the above because we are keeping too many copies. + // Message contains a copy of the message it's responding to. + // Then each transaction contains a copy of the transaction responding to... + // Then each ITEM in each transaction contains a copy of each item it's responding to. + // + // Therefore, for the "processNymbox" message, I have decided (for now) to have + // the extra copy in the items themselves, and in the overall message, but not in the + // transactions. Thus, the above is commented out. + + + // It should always return something. Success, or failure, that goes into pTranResponse. + // I don't think there's need for more return value than that. The user has gotten deep + // enough that they deserve SOME sort of response. + // + // This function also SIGNS the transaction, so there is no need to sign it after this. + // There's also no point to change it after this, unless you plan to sign it twice. + NotarizeProcessNymbox(theNym, *pTransaction, *pTranResponse); + + pTranResponse = NULL; // at this point, the ledger now "owns" the response, and will handle deleting it. + } + + // TODO: should consider saving a copy of the response ledger here on the server. + // Until the user signs off of the responses, maybe the user didn't receive them. + // The server should be able to re-send them until confirmation, then delete them. + // So might want to consider a SAVE TO FILE here of that ledger we're sending out... + + // sign the ledger + pResponseLedger->SignContract(m_nymServer); + pResponseLedger->SaveContract(); + // extract the ledger in ascii-armored form + OTString strPayload(*pResponseLedger); + // now the outgoing message has the response ledger in its payload. + msgOut.m_ascPayload.SetString(strPayload); + + } + else { + OTLog::Error("ERROR loading ledger from message in OTServer::UserCmdProcessNymbox\n"); + } + + + // todo: consider commenting this out since the transaction reply items already include a copy + // of the original client communication that the server is responding to. No point beating a + // dead horse. + // + // Send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + + + +/// The client may send multiple transactions in the ledger when he calls processNymbox. +/// This function will be called for each of those. Each may contain multiple items accepting +/// or rejecting certain transactions. The server acknowledges and notarizes those transactions +/// accordingly. +/// (And each of those transactions must be accepted or rejected in whole.) +void OTServer::NotarizeProcessNymbox(OTPseudonym & theNym, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atProcessNymbox", that is, "a reply to the process nymbox request" + tranOut.SetType(OTTransaction::atProcessNymbox); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = tranIn.GetItem(OTItem::transactionStatement); + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), USER_ID(theNym); + + // -------------------------------------------------------------------- + + OTPseudonym theTempNym; + + OTLedger theNymbox(USER_ID, USER_ID, SERVER_ID); + OTString strNymID(USER_ID); + + bool bSuccessLoadingNymbox = theNymbox.LoadNymbox(); + + if (true == bSuccessLoadingNymbox) + bSuccessLoadingNymbox = theNymbox.VerifyAccount(m_nymServer); // make sure it's all good. + + // -------------------------------------------------------------------- + + if (false == bSuccessLoadingNymbox) + { + OTLog::vOutput(0, "OTServer::NotarizeProcessNymbox: Failed loading or verifying Nymbox for user:\n%s\n", + strNymID.Get()); + } + else if (NULL == pBalanceItem) + { + OTLog::Output(0, "OTServer::NotarizeProcessNymbox: No Transaction Agreement item found on this transaction (required).\n"); + } + else + { + OTString strBalanceItem; + + pBalanceItem->SaveContract(strBalanceItem); + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atTransactionStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pBalanceItem->GetTransactionNum()); // This response item is IN RESPONSE to tranIn's balance agreement + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + + // The incoming transaction accepts various messages and transaction numbers. + // So when it's all finished, my list of transaction numbers will be higher. + // + // I would like to not even process the whole giant loop below, + // if I can verify here now that the transaction agreement is wrong. + // + // Thus I will actually loop through the acceptTransaction items in tranIn, and then for each one, I'll + // lookup the ACTUAL transaction in the nymbox, and get its ACTUAL value. (And store them all up on a temp nym.) + // + // The ones being accepted will therefore be added to my Nym, so the Transaction Statement will be signed + // as if that is already the case. (So they'll match.) + // + // I need to add them all to the Nym, verify the transaction statement, and then remove them again. + // (which is why I stored them on a temp Nym :-) Then if it succeeds for real, at the bottom of this function, + // I'll go ahead and add them properly (so it adds them to both lists.) + // + + bool bSuccessFindingAllTransactions = true; + long lTotalBeingAccepted = 0; + + for (listOfItems::iterator ii = tranIn.GetItemList().begin(); ii != tranIn.GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + if (pItem->GetType() == OTItem::acceptTransaction) + { + OTTransaction * pTransaction = theNymbox.GetTransaction(pItem->GetReferenceToNum()); + + if ((NULL != pTransaction) && (pTransaction->GetType() == OTTransaction::blank)) + { + bSuccessFindingAllTransactions = true; + + if (false == theNym.VerifyIssuedNum(m_strServerID, pItem->GetReferenceToNum())) + { + theNym.AddIssuedNum(m_strServerID, pItem->GetReferenceToNum()); + theTempNym.AddIssuedNum(m_strServerID, pItem->GetReferenceToNum()); // so I can remove from theNym after VerifyTransactionStatement call + } + else + OTLog::Error("NotarizeProcessNymbox: tried to add an issued trans# to a nym who ALREADY had that number...\n"); + } + else + { + bSuccessFindingAllTransactions = false; + break; + } + } + } + + // NOTICE: We're adding up all the new transaction numbers being added. (OTItem::acceptTransaction)... + // but we're NOT bothering with the ones being REMOVED (OTItem::acceptFinalReceipt) here in NotarizeProecessNymbox. + // Why not? BECAUSE THEY WERE ALREADY REMOVED. They were removed when the Cron Item expired, or was canceled. + // The finalReceipt notice that went into the Nymbox was ONLY A COURTESY -- the NUMBER was ALREADY REMOVED. + // Thus, we don't need to remove it now, although we DO need to add the new transaction numbers (acceptTransaction). + // + // (Of course, I will still remove the finalReceipt from the Nymbox. I just don't have to juggle any + // transaction numbers on the NYM as a result of this.) + // + // ------------------------------------------ + + if (false == bSuccessFindingAllTransactions) + { + OTLog::Output(0, "OTServer::NotarizeProcessNymbox: transactions in processNymbox message do not match actual nymbox.\n"); + + // Remove all issued nums from theNym that are stored on theTempNym HERE. + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + theNym.RemoveIssuedNum(m_strServerID, lTemp); + } + } + + // ********************************************************************************** + // VERIFY TRANSACTION STATEMENT! + // + else if (false == pBalanceItem->VerifyTransactionStatement(theNym, tranIn, false)) // bIsRealTransaction=false (since we're doing Nymbox) // <======== + { + OTLog::vOutput(0, "OTServer::NotarizeProcessNymbox: ERROR verifying transaction statement.\n"); + + // Remove all issued nums from theNym that are stored on theTempNym HERE. + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + theNym.RemoveIssuedNum(m_strServerID, lTemp); + } + } + // ********************************************************************************** + + else // TRANSACTION AGREEMENT WAS SUCCESSFUL....... + { + // Remove all issued nums from theNym that are stored on theTempNym HERE. + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + theNym.RemoveIssuedNum(m_strServerID, lTemp); + } + + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // -------------------------------------------------------------------- + + // THE ABOVE LOOP WAS JUST A TEST RUN + // + // (TO **VERIFY TRANSACTION AGREEMENT** BEFORE WE BOTHERED TO RUN THIS LOOP BELOW...) + // (AND TO GET THE LIST OF NUMBERS FOR THE STATEMENT ONTO TEMP NYM.) + + + // loop through the items that make up the incoming transaction, and add them + // to the Nym, and remove them from the Nymbox, as appropriate. + // + for (listOfItems::iterator ii = tranIn.GetItemList().begin(); ii != tranIn.GetItemList().end(); ++ii) + { + pItem = *ii; + + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + // We already handled this one (if we're even in this block in the first place.) + // + if (OTItem::transactionStatement == pItem->GetType()) + { + continue; + } + + // If the client sent an accept item then let's process it. + if ( + (OTItem::request == pItem->GetStatus()) + && + ( + (OTItem::acceptFinalReceipt== pItem->GetType()) || // Clearing out a finalReceipt notice. + (OTItem::acceptTransaction == pItem->GetType()) || // Accepting new transaction number. + (OTItem::acceptMessage == pItem->GetType()) // Accepted message. + ) + ) + { + OTString strInReferenceTo; + + // The response item will contain a copy of the "accept" request. + // So I'm just setting aside a copy now for those purposes later. + pItem->SaveContract(strInReferenceTo); + + OTItem::itemType theReplyItemType; + switch (pItem->GetType()) + { + case OTItem::acceptFinalReceipt: + theReplyItemType = OTItem::atAcceptFinalReceipt; + break; + case OTItem::acceptTransaction: + theReplyItemType = OTItem::atAcceptTransaction; + break; + case OTItem::acceptMessage: + theReplyItemType = OTItem::atAcceptMessage; + break; + default: + OTLog::Error("Should never happen.\n"); + theReplyItemType = OTItem::error_state; // should never happen based on above 'if' statement. + continue; // saving this anyway just cause it's cleaner. + } + + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, theReplyItemType); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. +// pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); // This was just 0 every time, since Nymbox needs no transaction numbers. + pResponseItem->SetReferenceToNum(pItem->GetReferenceToNum()); // So the reference was useless. I'm hoping to change it to this and make sure nothing breaks. + // ReferenceNum actually means you can match it up against the request items, and also, that is where THEY store it. + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + // --------------------------------------------- + + OTTransaction * pServerTransaction = NULL; + + if ( + (NULL != (pServerTransaction = theNymbox.GetTransaction(pItem->GetReferenceToNum()))) + && + ( + (OTTransaction::finalReceipt == pServerTransaction->GetType()) || // finalReceipt (notice that an opening num was closed.) + (OTTransaction::blank == pServerTransaction->GetType()) || // new transaction number waiting to be picked up. + (OTTransaction::message == pServerTransaction->GetType()) // message in the nymbox + ) + ) + { + // the accept item will come with the transaction number that + // it's referring to. So we'll just look up that transaction + // in the nymbox, and now that it's been accepted, we'll process it. + + // At this point, pItem points to the client's attempt to accept pServerTransaction + // and pServerTransaction is the server's created transaction in my nymbox that might + // have a message or transaction number on it I might find useful. + + + // What are we doing in this code? + // + // I need to accept various items that are sitting in my nymbox, such as: + // + // -- transaction numbers waiting to be accepted (they cannot be rejected.) + // + // -- messages waiting to be accepted (they cannot be rejected.) + // + + // ---------------------------------------------------------------------------------------------- + + // The below block only executes for ACCEPTING a MESSAGE + if ( + (OTItem::acceptMessage == pItem->GetType()) + && + (OTTransaction::message == pServerTransaction->GetType()) + ) + + { + // pItem contains the current user's attempt to accept the + // ['message'] located in pServerTransaction. + // Now we have the user's item and the item he is trying to accept. + + theNymbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theNymbox. ReleaseSignatures(); + theNymbox. SignContract(m_nymServer); + theNymbox. SaveContract(); + theNymbox. SaveNymbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + }// its type is OTItem::aacceptMessage + + + // The below block only executes for ACCEPTING a TRANSACTION NUMBER + else if ( + (OTItem::acceptTransaction == pItem->GetType()) + && + (OTTransaction::blank == pServerTransaction->GetType()) + ) + { + // pItem contains the current user's attempt to accept the + // transaction number located in pServerTransaction. + // Now we have the user's item and the item he is trying to accept. + + theNymbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theNymbox. ReleaseSignatures(); + theNymbox. SignContract(m_nymServer); + theNymbox. SaveContract(); + theNymbox. SaveNymbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + } + + // The below block only executes for CLEARING a finalReceipt + // (an OPENING TRANSACTION NUMBER was already removed), and this was + // a notice that that had occurred. The client has seen the notice and is + // now clearing it from the box. + else if ( + (OTItem::acceptFinalReceipt == pItem->GetType()) + && + (OTTransaction::finalReceipt == pServerTransaction->GetType()) + ) + { + // pItem contains the current user's attempt to clear the + // finalReceipt located in pServerTransaction. + // Now we have the user's item and the item he is trying to accept. + + theNymbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theNymbox. ReleaseSignatures(); + theNymbox. SignContract(m_nymServer); + theNymbox. SaveContract(); + theNymbox. SaveNymbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + } + } + else + { + OTLog::vError("Error finding original Nymbox transaction that client is trying to accept: %ld\n", + pItem->GetReferenceToNum()); + } + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->ReleaseSignatures(); + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); + } + else + { + const int nStatus = pItem->GetStatus(); + OTString strItemType; + pItem->GetTypeString(strItemType); + + OTLog::vError("Error, unexpected item type (%s) and/or status (%d) in OTServer::NotarizeProcessNymbox\n", + strItemType.Get(), nStatus); + } // if type == ACCEPT (only) + } // for each item + } // else (balance agreement verified.) + + pResponseBalanceItem->ReleaseSignatures(); + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + } // Balance Agreement item found. + + // ---------------------------------------- + + tranOut.ReleaseSignatures(); + tranOut.SignContract(m_nymServer); + tranOut.SaveContract(); + + // ---------------------------------------- + + OTString strPath; + + // On the server side, response will only have chance to succeed if balance agreement succeeds first. + // Therefore, you will never see successful response but failed balance, since it would stop at the + // balance and response itself would remain failed with no chance of changing. + // + // Thus, "success" must be when balance succeeded and transaction succeeded, + // and "failure" must be when balance succeeded but transaction failed. + // + // If NEITHER succeeded, then there is no point recording it to a file, now is there? + + if ((NULL != pResponseBalanceItem) && (OTItem::acknowledgement == pResponseBalanceItem->GetStatus())) + { + if (tranOut.GetSuccess()) + { + // Transaction agreement was a success, AND process nymbox was a success. + // Therefore, add any new issued numbers to theNym, and save. + + theNym.HarvestIssuedNumbers(SERVER_ID, m_nymServer, theTempNym, true); // bSave=true + + strPath.Format((char*)"%s.success", strNymID.Get()); + } + else + strPath.Format((char*)"%s.fail", strNymID.Get()); + + const char * szFoldername = OTLog::ReceiptFolder(); + + tranOut.SaveContract(szFoldername, strPath.Get()); + } +} + + + + + + +void OTServer::UserCmdProcessInbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut) +{ + // (1) set up member variables + msgOut.m_strCommand = "@processInbox"; // reply to processInbox + msgOut.m_strNymID = MsgIn.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_strAcctID = MsgIn.m_strAcctID; // The Account ID in question + + const OTIdentifier USER_ID(msgOut.m_strNymID), + ACCOUNT_ID(MsgIn.m_strAcctID), + SERVER_ID(m_strServerID), + SERVER_USER_ID(m_nymServer); + + OTLedger theLedger(USER_ID, ACCOUNT_ID, SERVER_ID); // These are ledgers used as messages. The one we received, + // and the one we're sending back. + OTLedger * pResponseLedger = OTLedger::GenerateLedger(SERVER_USER_ID, ACCOUNT_ID, SERVER_ID, OTLedger::message, false); // bCreateFile=false + OTCleanup theRespLedgerGuardian(pResponseLedger); + + // Grab the string (containing the request ledger) out of ascii-armored form. + OTString strLedger(MsgIn.m_ascPayload); + + // theLedger contains a single transaction from the client, with an item inside + // for each inbox transaction the client wants to accept or reject. + // Let's see if we can load it from the string that came in the message... + if (msgOut.m_bSuccess = theLedger.LoadContractFromString(strLedger)) + { + OTAccount theAccount(USER_ID, ACCOUNT_ID, SERVER_ID); + + // Make sure the "from" account even exists... + if (!theAccount.LoadContract()) + { + OTLog::vOutput(0, "Failed loading account in OTServer::UserCmdProcessInbox\n"); + } + // Make sure the account isn't marked for deletion. + else if (theAccount.IsMarkedForDeletion()) + { + OTLog::vOutput(0, "OTServer::UserCmdProcessInbox: Failed attempt to use an Asset account that was marked for deletion.\n"); + } + // Make sure the Account ID loaded from the file matches the one we just set and used as the filename. + else if (!theAccount.VerifyContractID()) + { + // this should never happen. How did the wrong ID get into the account file, if the right + // ID is on the filename itself? and vice versa. + OTLog::Error("Error verifying account ID in OTServer::UserCmdProcessInbox\n"); + } + // Make sure the nymID loaded up in the account as its actual owner matches the nym who was + // passed in to this function requesting a transaction on this account... otherwise any asshole + // could do transactions on your account, no? + else if (!theAccount.VerifyOwner(theNym)) + { + OTLog::vOutput(0, "Failed verifying account ownership in OTServer::UserCmdProcessInbox\n"); + } + // Make sure I, the server, have signed this file. + else if (!theAccount.VerifySignature(m_nymServer)) + { + OTLog::Error("Error verifying server signature on account in OTServer::UserCmdProcessInbox\n"); + } + // No need to call VerifyAccount() here since the above calls go above and beyond that method. + + else + { + // In this case we need to process the transaction items from the ledger + // and create a corresponding transaction where each of the new items + // contains the answer to the transaction item sent. + // Then we send that new "response ledger" back to the user in MsgOut.Payload + // as an @processInbox message. + + OTTransaction * pTransaction = theLedger.GetTransaction(OTTransaction::processInbox); + OTTransaction * pTranResponse = NULL; + + if (NULL == pTransaction) // I'm assuming there's only one in the ledger (for now anyways..) + { + OTLog::Error("Expected processInbox transaction in OTServer::UserCmdProcessInbox\n"); + } + else + { + // We create a transaction response and add that to the response ledger... + // + pTranResponse = OTTransaction::GenerateTransaction(*pResponseLedger, OTTransaction::error_state, pTransaction->GetTransactionNum()); + + // Add the response transaction to the response ledger. + // That will go into the response message and be sent back to the client. + pResponseLedger->AddTransaction(*pTranResponse); + + //--------------------------------------------------- + + const long lTransactionNumber = pTransaction->GetTransactionNum(); + + //--------------------------------------------------- + + if (!VerifyTransactionNumber(theNym, lTransactionNumber)) + { + // The user may not submit a transaction using a number he's already used before. + OTLog::Output(0, "Error verifying transaction number in OTServer::UserCmdProcessInbox\n"); + } + + // The items' acct and server ID were already checked in VerifyContractID() when they were loaded. + // Now this checks a little deeper, to verify ownership, signatures, and transaction number + // on each item. That way those things don't have to be checked for security over and over + // again in the subsequent calls. + // + else if (!pTransaction->VerifyItems(theNym)) + { + OTLog::Output(0, "Error verifying transaction items OTServer::UserCmdProcessInbox\n"); + } + + // any other security stuff? + // Todo do I need to verify the server ID here as well? + else + { + // We don't want any transaction number being used twice. + // (The number, at this point, is STILL issued to the user, who is still responsible + // for that number and must continue signing for it. All this means here is that the + // user no longer has the number on his AVAILABLE list. Removal from issued list happens separately.) + // + if (false == RemoveTransactionNumber(theNym, lTransactionNumber, true)) //bSave=true + { + OTLog::Error("Error removing transaction number (as available) from user nym in OTServer::UserCmdProcessInbox\n"); + } + + // ------------------------------------------------------------------- + + else + { + OTLog::Output(2, "UserCmdProcessInbox type: Process Inbox\n"); + + NotarizeProcessInbox(theNym, theAccount, *pTransaction, *pTranResponse); + + // ------------------------------------------ + + // Where appropriate, remove a transaction number from my issued list + // (the list of numbers I must sign for in every balance agreement.) + + if (false == RemoveIssuedNumber(theNym, lTransactionNumber, true)) //bSave=true + { + OTLog::Error("Error removing issued number from user nym in OTServer::UserCmdProcessInbox\n"); + } + } + } + + // sign the outoing transaction + pTranResponse->ReleaseSignatures(); + pTranResponse->SignContract(m_nymServer); + pTranResponse->SaveContract(); // don't forget to save (to internal raw file member) + + pTranResponse = NULL; // at this point, the ledger now "owns" the response, and will handle deleting it. + } // for loop + + // TODO: should consider saving a copy of the response ledger here on the server. + // Until the user signs off of the responses, maybe the user didn't receive them. + // The server should be able to re-send them until confirmation, then delete them. + // So might want to consider a SAVE TO FILE here of that ledger we're sending out... + + // sign the ledger + pResponseLedger->SignContract(m_nymServer); + pResponseLedger->SaveContract(); + // extract the ledger in ascii-armored form + OTString strPayload(*pResponseLedger); + // now the outgoing message has the response ledger in its payload. + msgOut.m_ascPayload.SetString(strPayload); + } + } + else + { + OTLog::Error("ERROR loading ledger from message in OTServer::UserCmdProcessInbox\n"); + } + + + // todo: consider commenting this out since the transaction reply items already include a copy + // of the original client communication that the server is responding to. No point beating a + // dead horse. + // + // Send the user's command back to him as well. + { + OTString tempInMessage(MsgIn); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + } + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); +} + + + + +/// The client may send multiple transactions in the ledger when he calls processInbox. +/// This function will be called for each of those. Each may contain multiple items accepting +/// or rejecting certain transactions. The server acknowledges and notarizes those transactions +/// accordingly. +/// (And each of those transactions must be accepted or rejected in whole.) +void OTServer::NotarizeProcessInbox(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut) +{ + // The outgoing transaction is an "atProcessInbox", that is, "a reply to the process inbox request" + tranOut.SetType(OTTransaction::atProcessInbox); + + OTItem * pItem = NULL; + OTItem * pBalanceItem = tranIn.GetItem(OTItem::balanceStatement); + OTItem * pResponseItem = NULL; + OTItem * pResponseBalanceItem = NULL; + + // The incoming transaction may be sent to inboxes and outboxes, and it + // will probably be bundled in our reply to the user as well. Therefore, + // let's grab it as a string. + OTString strInReferenceTo; + OTString strBalanceItem; + + // Grab the actual server ID from this object, and use it as the server ID here. + const OTIdentifier SERVER_ID(m_strServerID), ACCOUNT_ID(theAccount), + USER_ID(theNym); + + OTPseudonym theTempNym, theTempClosingNumNym; + + // -------------------------------------------------------------- + + OTLedger * pInbox = theAccount.LoadInbox(m_nymServer); + OTLedger * pOutbox = theAccount.LoadOutbox(m_nymServer); + + OTCleanup theInboxAngel(pInbox); + OTCleanup theOutboxAngel(pOutbox); + + // -------------------------------------------------------------- + + if (NULL == pBalanceItem) + { + OTLog::Output(0, "OTServer::NotarizeProcessInbox: No Balance Agreement item found on this transaction.\n"); + } + else if (NULL == pInbox || !pInbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying inbox.\n"); + } + else if (NULL == pOutbox || !pOutbox->VerifyAccount(m_nymServer)) + { + OTLog::Error("Error loading or verifying outbox.\n"); + } + else + { + pBalanceItem->SaveContract(strBalanceItem); + + pResponseBalanceItem = OTItem::CreateItemFromTransaction(tranOut, OTItem::atBalanceStatement); + pResponseBalanceItem->SetStatus(OTItem::rejection); // the default. + pResponseBalanceItem->SetReferenceString(strBalanceItem); // the response item carries a copy of what it's responding to. + pResponseBalanceItem->SetReferenceToNum(pBalanceItem->GetTransactionNum()); // This response item is IN RESPONSE to tranIn's balance agreement + tranOut.AddItem(*pResponseBalanceItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + +// OTString strAccountIDBLAH(ACCOUNT_ID); +// OTLog::vError("OTServer::NotarizeProcessInbox ==========> ENTERING LOOP ------ (Loaded " +// "Inbox for ACCOUNT ID): %s.\n ==========> Inbox Receipt Count: %d \n", +// strAccountIDBLAH.Get(), pInbox->GetTransactionCount()); + + // ----------------------------------------------------------- + // This transaction accepts various incoming pending transfers. + // So when it's all done, my balance will be higher. + // AND pending inbox items will be removed from my inbox. + // + // I would like to not even process the whole giant loop below, + // if I can verify here now that the balance agreement is wrong. + // + // Thus I will actually loop through the acceptPending items in tranIn, and then for each one, I'll + // lookup the ACTUAL transaction in the inbox, and get its ACTUAL value. (And total them all up.) + // + // The total of those, (WITHOUT the user having to tell me what it will be, since I'm looking them all up), + // should equal the difference in the account balance! Meaning the current balance plus that total will be + // the expected NEW balance, according to this balance agreement -- if it wants to be approved, that is. + // + // + + std::list theListOfInboxReceiptsBeingRemoved; + + bool bSuccessFindingAllTransactions = true; + long lTotalBeingAccepted = 0; + + for (listOfItems::iterator ii = tranIn.GetItemList().begin(); ii != tranIn.GetItemList().end(); ++ii) + { +// OTLog::Error("OTServer::NotarizeProcessInbox: TOP OF LOOP (of the item list on the incoming transaction) \n"); +// +// OTLog::vError("OTServer::NotarizeProcessInbox ==========> =======> Inbox Receipt Count: %d \n", +// pInbox->GetTransactionCount()); + + pItem = *ii; + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + // ----------------------------------------------------- + + OTTransaction * pServerTransaction = NULL; + + switch (pItem->GetType()) + { + case OTItem::balanceStatement: +// OTLog::Output(1, "OTServer::NotarizeProcessInbox: (This item is a balance statement... SKIPPING IT.)\n\n"); // temp remove + pServerTransaction = NULL; + continue; + + case OTItem::acceptCronReceipt: + case OTItem::acceptFinalReceipt: + case OTItem::acceptBasketReceipt: + //--------- + case OTItem::disputeCronReceipt: + case OTItem::disputeFinalReceipt: + case OTItem::disputeBasketReceipt: +// +// OTLog::vOutput(1, "OTServer::NotarizeProcessInbox: Checking server-side inbox for expected CRON receipt: %ld... \n", +// pItem->GetReferenceToNum()); // temp remove + + pServerTransaction = pInbox->GetTransaction(pItem->GetReferenceToNum()); + break; + + case OTItem::acceptPending: + case OTItem::acceptItemReceipt: + //--------- + case OTItem::rejectPending: + case OTItem::disputeItemReceipt: + +// OTLog::vOutput(1, "OTServer::NotarizeProcessInbox: Checking server-side inbox for receipt pending (IN REF TO): %ld... \n", +// pItem->GetReferenceToNum()); // temp remove + + pServerTransaction = pInbox->GetPendingTransaction(pItem->GetReferenceToNum()); + break; + + default: + { + OTString strItemType; + pItem->GetTypeString(strItemType); + int nItemType = pItem->GetType(); + + pServerTransaction = NULL; + bSuccessFindingAllTransactions = false; + + OTLog::vError("Wrong item type in OTServer::NotarizeProcessInbox: %s (%d).\n", + strItemType.Exists() ? strItemType.Get() : "", nItemType); + break; + } + } + // ------------------------------------------------------- + if (NULL == pServerTransaction) + { + OTLog::Error("OTServer::NotarizeProcessInbox: Unable to find inbox transaction being accepted by user. \n"); + bSuccessFindingAllTransactions = false; + break; // for + } + else if (pServerTransaction->GetReceiptAmount() != pItem->GetAmount()) + { + OTLog::vError("OTServer::NotarizeProcessInbox: Receipt amounts don't match: %ld and %ld\n", + pServerTransaction->GetReceiptAmount(), pItem->GetAmount()); + bSuccessFindingAllTransactions = false; + break; // for + } + + // BELOW THIS POINT, WE KNOW THAT pServerTransaction was FOUND (and validated.) + // ***************************************************************************** + + switch (pItem->GetType()) + { + case OTItem::acceptCronReceipt: + bSuccessFindingAllTransactions = true; + break; + // --------------------------------------------------------------------------- + case OTItem::acceptFinalReceipt: + bSuccessFindingAllTransactions = true; + + // Need to ERROR OUT here, if the number of cron receipts (related to + // this finalReceipt) in the inbox isn't equal to the number being accepted + // in this processInbox transaction. (You can't close the final receipt unless + // you close all the others as well.) + // + + + // IN THIS CASE: If user is accepting a finalReceipt, that means all the OTHER receipts related to it + // (sharing the same "in reference to") must ALSO be cleared from the inbox along with it! That's the + // whole point of the finalReceipt -- to make sure all related receipts are cleared, when IT is. + // + // So let's see if the number of related receipts on this process inbox (tranIn) matches + // the number of related receipts in the actual inbox (pInbox), as found by the finalReceipt's + // (pServerTransaction) "in reference to" value, which should be the same as on the related receipts. + + // (Below) tranIn is the processInbox transaction. Each item on it is "in ref to" a DIFFERENT receipt, + // even though, if they are marketReceipts, all of THOSE receipts are "in ref to" the original transaction#. + // I need to loop through all items on tranIn (processInbox request) + // For each, look it up on the inbox. (Each item will be "in reference to" the original transaction.) + // ONCE THE INBOX RECEIPT IS FOUND, if *IT* is "in reference to" pServerTransaction->GetReferenceToNum(), + // Then increment the count for the transaction. COMPARE *THAT* to theInbox.GetCount and we're golden!! + { +// int nRefCount = 0; // Using std::set here instead of a simple int. (To prevent duplicates.) + std::set setOfRefNumbers; // we'll store them here, and disallow duplicates, to make sure they are all unique IDs (no repeats.) + + for (listOfItems::iterator iiii = tranIn.GetItemList().begin(); + iiii != tranIn.GetItemList().end(); ++iiii) + { + OTItem * pItemPointer = *iiii; + OT_ASSERT_MSG(NULL != pItemPointer, "Pointer should not have been NULL."); + + OTTransaction * pTransPointer = pInbox->GetTransaction(pItemPointer->GetReferenceToNum()); + + if ((NULL != pTransPointer) && + (pTransPointer->GetReferenceToNum() == pServerTransaction->GetReferenceToNum())) + { +// nRefCount++; + // std::set doesn't allow duplicates. + setOfRefNumbers.insert(pItemPointer->GetReferenceToNum()); + } + } // for + // ------------------- + + if (pInbox->GetTransactionCountInRefTo(pServerTransaction->GetReferenceToNum()) != + setOfRefNumbers.size()) + { + OTLog::Output(0, "OTServer::NotarizeProcessInbox: User tried to close a finalReceipt, " + "without also closing all related receipts. (Those that share the IN REF TO number.)\n"); + bSuccessFindingAllTransactions = false; + break; + } + // Upon success, these numbers will be removed from the Nym's additional record of "cron item IDs". + // + // ------------------------------------------------------------------- + + // Server side stores a list of open cron items on each Nym. + // The closing transaction number on the final receipt SHOULD be on that list. + // + std::set & theIDSet = theNym.GetSetOpenCronItems(); + + std::set::iterator theSetIT = theIDSet.find(pServerTransaction->GetClosingNum()); + + // If we FOUND it on the Nym, then we add it to the list to be removed from Nym's open cron items. + // (If it wasn't there before, then we wouldn't want to "re-add" it, now would we?) + // + if (theIDSet.end() != theSetIT) // FOUND IT! + theTempClosingNumNym.AddIssuedNum(m_strServerID, pServerTransaction->GetClosingNum()); // Schedule to remove GetClosingNum() from server-side list of Nym's open cron items. (By adding it to theTempClosingNumNym.) + else + OTLog::Error("OTServer::NotarizeProcessInbox: expected to find pServerTransaction->GetClosingNum() on Nym's list of open cron items...\n"); + // else error log. + } + + // ---- COUNT is correct and closing num is on list of open cron items. (FINAL RECEIPT FALLS THROUGH HERE!!! no break) ------------------------ + + case OTItem::acceptBasketReceipt: + // IF it's actually there on theNym, then schedule it for removal. + // (Otherwise we'd end up improperly re-adding it.) + // + if (theNym.VerifyIssuedNum(m_strServerID, pServerTransaction->GetClosingNum())) + theTempNym.AddIssuedNum(m_strServerID, pServerTransaction->GetClosingNum()); + else + { + bSuccessFindingAllTransactions = false; + + OTLog::vError("OTServer::NotarizeProcessInbox: basket or final receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on Nym's issued list. (So what is this in the inbox, " + "then?)\n", pServerTransaction->GetClosingNum()); + } + + break; + // ---------------------------------------------------------------------------- + case OTItem::acceptPending: + // IF I'm accepting a pending transfer, then add the amount to my counter of total amount being accepted. + // + lTotalBeingAccepted += pServerTransaction->GetReceiptAmount(); + bSuccessFindingAllTransactions = true; + break; + // ---------------------------------------------------------------------------- + case OTItem::acceptItemReceipt: + bSuccessFindingAllTransactions = true; + { + //if I'm accepting an item receipt (which will remove my responsibility for that item) then add it + // to the temp Nym (which is a list of transaction numbers that will be removed from my responsibility if + // all is successful.) Also remove all the Temp Nym numbers from theNym, so we can verify the Balance + // Statement AS IF they were already removed. + // + // What number do I remove here? the user is accepting a transfer receipt, which + // is in reference to the recipient's acceptPending. THAT item is in reference to + // my original transfer (or contains a cheque with my original number.) (THAT's the # I need.) + // + OTString strOriginalItem; + pServerTransaction->GetReferenceString(strOriginalItem); + + OTItem * pOriginalItem = OTItem::CreateItemFromString(strOriginalItem, SERVER_ID, pServerTransaction->GetReferenceToNum()); + OTCleanup theOrigItemGuardian(pOriginalItem); // So I don't have to clean it up later. No memory leaks. + + if (NULL != pOriginalItem) + { + // If pOriginalItem is acceptPending, that means the client is accepting the transfer receipt from the server, (from his inbox), + // which has the recipient's acceptance inside of the client's transfer as the original item. This means the transfer that + // the client originally sent is now finally closed! + // + // If it's a depositCheque, that means the client is accepting the cheque receipt from the server, (from his inbox) + // which has the recipient's deposit inside of it as the original item. This means that the cheque that + // the client originally wrote is now finally closed! + // + // In both cases, the "original item" itself is not from the client, but from the recipient! Therefore, + // the number on that item is useless for removing numbers from the client's list of issued numbers. + // Rather, I need to load that original cheque, or pending transfer, from WITHIN the original item, + // in order to get THAT number, to remove it from the client's issued list. (Whether for real, or for + // setting up dummy data in order to verify the balance agreement.) *sigh* + // + if (OTItem::depositCheque == pOriginalItem->GetType()) // client is accepting a cheque receipt, which has a depositCheque (from the recipient) as the original item within. + { + // Get the cheque from the Item and load it up into a Cheque object. + OTString strCheque; + pOriginalItem->GetAttachment(strCheque); + + OTCheque theCheque; // allocated on the stack :-) + + if (false == ((strCheque.GetLength() > 2) && + theCheque.LoadContractFromString(strCheque))) + { + OTLog::vError("OTServer::NotarizeProcessInbox: ERROR loading cheque from string:\n%s\n", + strCheque.Get()); + bSuccessFindingAllTransactions = false; + } + else // Since the client wrote the cheque, and he is now accepting the cheque receipt, he can be cleared for that transaction number... + { + // IF it's actually there on theNym, then schedule it for removal. + // (Otherwise we'd end up improperly re-adding it.) + // + if (theNym.VerifyIssuedNum(m_strServerID, theCheque.GetTransactionNum())) + theTempNym.AddIssuedNum(m_strServerID, theCheque.GetTransactionNum()); + else + { + bSuccessFindingAllTransactions = false; + + OTLog::vError("OTServer::NotarizeProcessInbox: cheque receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on Nym's issued list. (So what is this in the inbox, " + "then?)\n", theCheque.GetTransactionNum()); + } + } + } + // client is accepting a transfer receipt, which has an acceptPending from the recipient as the original item within, + else if (OTItem::acceptPending == pOriginalItem->GetType()) // (which is in reference to the client's outoing original transfer.) + { + // IF it's actually there on theNym, then schedule it for removal. + // (Otherwise we'd end up improperly re-adding it.) + // + if (theNym.VerifyIssuedNum(m_strServerID, pOriginalItem->GetReferenceToNum())) + theTempNym.AddIssuedNum(m_strServerID, pOriginalItem->GetReferenceToNum()); + else + { + bSuccessFindingAllTransactions = false; + + OTLog::vError("OTServer::NotarizeProcessInbox: transfer receipt, trying to 'remove' an issued " + "number (%ld) that already wasn't on Nym's issued list. (So what is this in the inbox, " + "then?)\n", pOriginalItem->GetReferenceToNum()); + } + } + else + { + OTString strOriginalItemType; + pOriginalItem->GetTypeString(strOriginalItemType); + OTLog::vError("OTServer::NotarizeProcessInbox: Original item has wrong type, while accepting item receipt:\n%s\n", + strOriginalItemType.Get()); + bSuccessFindingAllTransactions = false; + } + } + else + { + OTLog::vError("OTServer::NotarizeProcessInbox: Unable to load original item from string while accepting item receipt:\n%s\n", + strOriginalItem.Get()); + bSuccessFindingAllTransactions = false; + } + } // pItem is acceptItemReceipt -------------------- + + break; + // ------------------------------------------------------------------------------- + default: + OTLog::Error("Wrong item type in OTServer::NotarizeProcessInbox. (2nd notice.)\n"); + bSuccessFindingAllTransactions = false; + break; + } // switch -------------------------------------------- + + + // I'll also go ahead and remove each transaction from pInbox, and pass said inbox into the VerifyBalanceAgreement call... + // (So it can simulate as if the inbox was already processed, and the total is already calculated, and if it succeeds, + // then we can allow the giant loop below to do it all for real.) + // (I'm not saving this copy of the inbox anyway--there's another one below.) + // + if (bSuccessFindingAllTransactions) + { + // WE'RE REMOVING THE TRANSACTIONS FROM AN INBOX COPY, IN ORDER TO VERIFY THE + // BALANCE AGREEMENT (WITH THAT INBOX COPY SET UP AS THOUGH THE TRANSACTION HAD + // ALREADY BEEN A SUCCESS.) + // I'm not ACTUALLY removing though, until AFTER the loop (in case the rest of the + // loop needs the data still, in that inbox.) So we save in a list, and remove AFTER the loop. + // + theListOfInboxReceiptsBeingRemoved.push_back(pServerTransaction->GetTransactionNum()); + } + else // If there was an error above, then we don't want to keep looping. We want the below error block. + break; + // --------------------------------------------------------------------------- + } // for loop (list of "process inbox" items) + + // *************************************************************************** + +// OTLog::Error("OTServer::NotarizeProcessInbox BELOW THE LOOP===> ABout to call VERIFY BALANCE STATEMENT \n"); + + if (false == bSuccessFindingAllTransactions) + { + OTLog::Output(0, "OTServer::NotarizeProcessInbox: transactions in processInbox message do not match actual inbox.\n"); + } + else + { // Remove certain receipts (determined in the big loop above) from the inbox copy, + // to see if it will verify in the balance agreement. + // + while (!theListOfInboxReceiptsBeingRemoved.empty()) + { + long lTemp = theListOfInboxReceiptsBeingRemoved.front(); + theListOfInboxReceiptsBeingRemoved.pop_front(); + + if (false == pInbox->RemoveTransaction(lTemp)) // <================ + OTLog::vError("OTServer::NotarizeProcessInbox: Failed removing receipt from Inbox copy: %ld \n", lTemp); + } + + // ----------------------------------------------------------------------------- + // Remove certain issued numbers (determined in the big loop above) from the Nym, + // to see if it will verify in the balance agreement (we'll re-add them after.) + // Also, we're ONLY removing these because we verified above that they were really there. + // Otherwise it'd be pretty stupid to "re-add" them, eh? + // + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + theNym.RemoveIssuedNum(m_strServerID, lTemp); + } + + // ********************************************************************** + // FINALLY after all that setup, we can do the balance agreement!! + // + const bool bVerifiedBalanceStatement = pBalanceItem->VerifyBalanceStatement(lTotalBeingAccepted, // <======================== + theNym, + *pInbox, + *pOutbox, + theAccount, + tranIn); + // ********************************************************************** + + // Here, add all the issued nums back (that had been temporarily removed from theNym) that were stored on theTempNym for safe-keeping. + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + theNym.AddIssuedNum(m_strServerID, lTemp); + } + // (They are removed for real at the bottom of this function, IF everything is successful between now and then.) + + // ----------------------------------------------------------------------------- + + if (false == bVerifiedBalanceStatement) + { + OTLog::vOutput(0, "OTServer::NotarizeProcessInbox: ERROR verifying balance statement.\n"); + } + + else // BALANCE AGREEMENT WAS SUCCESSFUL....... + { + pResponseBalanceItem->SetStatus(OTItem::acknowledgement); // the transaction agreement was successful. + + // -------------------------------------------------------------------- + + // THE ABOVE LOOP WAS JUST A TEST RUN + // + // (TO VERIFY BALANCE AGREEMENT BEFORE WE BOTHERED TO RUN THIS LOOP BELOW...) + + // loop through the items that make up the incoming transaction + for (listOfItems::iterator ii = tranIn.GetItemList().begin(); ii != tranIn.GetItemList().end(); ++ii) + { + pItem = *ii; + OT_ASSERT_MSG(NULL != pItem, "Pointer should not have been NULL."); + + // We already handled this one (if we're even in this block in the first place.) + // + if (OTItem::balanceStatement == pItem->GetType()) + { + continue; + } + + // If the client sent an accept item, (or reject/dispute) then let's process it. + if ( + (OTItem::request == pItem->GetStatus()) + && + ( + (OTItem::acceptCronReceipt == pItem->GetType()) || // Accepting notice of market trade or payment processing. (Original in Cron Receipt.) +// (OTItem::disputeCronReceipt == pItem->GetType()) || // Disputing said notice. With Cron receipts, original is stored as an OTCronItem... + (OTItem::acceptItemReceipt == pItem->GetType()) || // Accepted item receipt (cheque, transfer) +// (OTItem::disputeItemReceipt == pItem->GetType()) || // Disputing said notice. + (OTItem::acceptPending == pItem->GetType()) || // Accepting notice of pending transfer +// (OTItem::rejectPending == pItem->GetType()) || // With pending, the Original is stored in OTItem pOriginalItem... + (OTItem::acceptFinalReceipt == pItem->GetType()) || // Accepting finalReceipt +// (OTItem::disputeFinalReceipt == pItem->GetType()) || // Disputing finalReceipt. + (OTItem::acceptBasketReceipt == pItem->GetType()) // Accepting basketReceipt +// (OTItem::disputeBasketReceipt == pItem->GetType()) // Disputing basketReceipt. + ) + ) + { + // The response item will contain a copy of the "accept" request. + // So I'm just setting aside a copy now for those purposes later. + strInReferenceTo.Release(); + pItem->SaveContract(strInReferenceTo); + + OTItem::itemType theReplyItemType; + switch (pItem->GetType()) + { + case OTItem::acceptPending: + theReplyItemType = OTItem::atAcceptPending; + break; + case OTItem::rejectPending: + theReplyItemType = OTItem::atRejectPending; + break; + case OTItem::acceptCronReceipt: + theReplyItemType = OTItem::atAcceptCronReceipt; + break; + case OTItem::disputeCronReceipt: + theReplyItemType = OTItem::atDisputeCronReceipt; + break; + case OTItem::acceptItemReceipt: + theReplyItemType = OTItem::atAcceptItemReceipt; + break; + case OTItem::disputeItemReceipt: + theReplyItemType = OTItem::atDisputeItemReceipt; + break; + case OTItem::acceptFinalReceipt: + theReplyItemType = OTItem::atAcceptFinalReceipt; + break; + case OTItem::disputeFinalReceipt: + theReplyItemType = OTItem::atDisputeFinalReceipt; + break; + case OTItem::acceptBasketReceipt: + theReplyItemType = OTItem::atAcceptBasketReceipt; + break; + case OTItem::disputeBasketReceipt: + theReplyItemType = OTItem::atDisputeBasketReceipt; + break; + default: + OTLog::Error("Should never happen.\n"); + theReplyItemType = OTItem::error_state; // should never happen based on above 'if' statement. + break; // saving this anyway just cause it's cleaner. + } + + + // Server response item being added to server response transaction (tranOut) + // They're getting SOME sort of response item. + + pResponseItem = OTItem::CreateItemFromTransaction(tranOut, theReplyItemType); + pResponseItem->SetStatus(OTItem::rejection); // the default. + pResponseItem->SetReferenceString(strInReferenceTo); // the response item carries a copy of what it's responding to. + pResponseItem->SetReferenceToNum(pItem->GetTransactionNum()); + + tranOut.AddItem(*pResponseItem); // the Transaction's destructor will cleanup the item. It "owns" it now. + + + // Need to load the Inbox first, in order to look up the transaction that + // the client is accepting. This is possible because the client has included + // the transaction number. I'll just look it up in his inbox and then + // process it. + // theAcctID is the ID on the client Account that was passed in. + OTLedger theInbox(USER_ID, ACCOUNT_ID, SERVER_ID); + + OTTransaction * pServerTransaction = NULL; + + if (false == theInbox.LoadInbox()) + { + OTLog::Error("Error loading inbox during processInbox\n"); + } + else if (false == theInbox.VerifyAccount(m_nymServer)) + { + OTLog::Error("Error verifying inbox during processInbox\n"); + } + // -------------------------------------------------------------- + // + // Warning! In the case of a OTTransaction::paymentReceipt or OTTransaction::marketReceipt, + // the "in reference to" string will NOT contain an OTItem at all, but an OTPaymentPlan or + // an OTTrade!! I handle those two cases first, here: + // + // + else if ( // MARKET RECEIPT, or PAYMENT RECEIPT..... + ( + (OTItem::acceptCronReceipt == pItem->GetType())// This is checked above, but just keeping this safe. + ) // especially in case this block moves or is used elsewhere. + && + (NULL != (pServerTransaction = theInbox.GetTransaction(pItem->GetReferenceToNum()))) + && // Notice here I use theInbox.GetTransaction, whereas in the acceptItemReceipt + ( // section, I use theInbox.GetPendingTransaction instead. That's the + (OTTransaction::paymentReceipt== pServerTransaction->GetType()) || // big difference between cron + (OTTransaction::marketReceipt == pServerTransaction->GetType()) // receipts and other inbox items. + ) + ) + { + // pItem contains the current user's attempt to accept the Receipt + // represented by pServerTransaction. Therefore we have the user's + // item AND the receipt he is trying to accept. + + theInbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theInbox. ReleaseSignatures(); + theInbox. SignContract(m_nymServer); + theInbox. SaveContract(); + theInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + } + // ----------------------------------------------------------------- + + else if ( // FINAL RECEIPT + ( + (OTItem::acceptFinalReceipt == pItem->GetType())// This is checked above, but just keeping this safe. + ) // especially in case this block moves or is used elsewhere. + && + (NULL != (pServerTransaction = theInbox.GetTransaction(pItem->GetReferenceToNum()))) + && // Notice here I use theInbox.GetTransaction, whereas in the acceptItemReceipt + ( // section, I use theInbox.GetPendingTransaction instead. That's the + (OTTransaction::finalReceipt == pServerTransaction->GetType()) // receipts and other inbox items. + ) + ) + { + // pItem contains the current user's attempt to accept the Receipt + // represented by pServerTransaction. Therefore we have the user's + // item AND the receipt he is trying to accept. + + theInbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theInbox. ReleaseSignatures(); + theInbox. SignContract(m_nymServer); + theInbox. SaveContract(); + theInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + } + + // ----------------------------------------------------------------- + + else if ( // BASKET RECEIPT + ( + (OTItem::acceptBasketReceipt == pItem->GetType())// This is checked above, but just keeping this safe. + ) // especially in case this block moves or is used elsewhere. + && + (NULL != (pServerTransaction = theInbox.GetTransaction(pItem->GetReferenceToNum()))) + && // Notice here I use theInbox.GetTransaction, whereas in the acceptItemReceipt + ( // section, I use theInbox.GetPendingTransaction instead. That's the + (OTTransaction::basketReceipt == pServerTransaction->GetType()) // receipts and other inbox items. + ) + ) + { + // pItem contains the current user's attempt to accept the Receipt + // represented by pServerTransaction. Therefore we have the user's + // item AND the receipt he is trying to accept. + + theInbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theInbox. ReleaseSignatures(); + theInbox. SignContract(m_nymServer); + theInbox. SaveContract(); + theInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + } + + // ----------------------------------------------------------------- + // Careful here. I'm looking up the original transaction number (1, say) which is stored + // in my inbox as a "in reference to" on transaction number 41. (Which is a pending transaction + // or receipt + // that the server created in my inbox, and only REFERS to the original transaction, but is not + // the original transaction in and of itself.) + // + // In other words, in this case below, I am looking for the transaction in the Inbox + // that REFERS to the same transaction that the accept item REFERS to. That process, necessary + // for pending transactions and cheque receipts, is NOT the case above, with receipts from cron. + else if ( ( + (OTItem::acceptItemReceipt == pItem->GetType()) // acceptItemReceipt includes checkReceipt and transferReceipts. +// (OTItem::rejectItemReceipt == pItem->GetType()) + || (OTItem::acceptPending == pItem->GetType()) // acceptPending includes checkReceipts. Because they are +// (OTItem::rejectPending == pItem->GetType()) // stored/loaded similarly, not like the above Cron Receipts. + ) + && + (NULL != (pServerTransaction = theInbox.GetPendingTransaction(pItem->GetReferenceToNum()))) + && + ( + (OTTransaction::pending == pServerTransaction->GetType()) || // pending transfer. + (OTTransaction::transferReceipt == pServerTransaction->GetType()) || // transfer receipt. + (OTTransaction::chequeReceipt == pServerTransaction->GetType()) // cheque receipt is down here in the pending section, + ) // because this is where an OTItem is loaded up (since it + ) // originated with a deposit transaction, not a cron receipt.) + { + // the accept item will come with the transaction number that + // it's referring to. So we'll just look up that transaction + // in the inbox, and now that it's been accepted, we'll process it. + + // At this point, pItem points to the client's attempt to accept pServerTransaction + // and pServerTransaction is the server's created transaction in my inbox that contains + // the original item (from the sender) as the "referenced to" object. So let's extract + // it. + OTString strOriginalItem; + pServerTransaction->GetReferenceString(strOriginalItem); + + OTItem * pOriginalItem = OTItem::CreateItemFromString(strOriginalItem, SERVER_ID, pServerTransaction->GetReferenceToNum()); + OTCleanup theOrigItemGuardian(pOriginalItem); // So I don't have to clean it up later. No memory leaks. + + if (NULL != pOriginalItem) + { + + // What are we doing in this code? + // + // I need to accept various items that are sitting in my inbox, such as: + // + // -- transfers waiting to be accepted (or rejected.) + // + // -- cheque deposit receipts waiting to be accepted (they cannot be rejected.) + // + // -- transfer receipts waiting to be accepted (they cannot be rejected.) + + // + // ONLY in the case of pending transfers also do I need to mess around with my account, + // and the sender's inbox and outbox. In the other cases, I merely need to remove + // the item from my inbox. + // Although when 'accepting the reject', I do need to take the money back into + // my inbox... + + + + // ---------------------------------------------------------------------------------------------- + + + // The depositCheque request OTItem is saved as a "in reference to" field + // on the inbox chequeReceipt transaction. + + // Therefore, if I am processing an acceptPending item from the client, + // for accepting a chequeReceipt Transaction that's in his inbox, and + // the original item (that the receipt is for) is a depositCheque, + // then I can go ahead and clear it from his inbox. + + + // The below block only executes for ACCEPTING a CHEQUE deposit receipt, or + // for 'Accepting an ACCEPT.' + // + // I can't 'Accept a REJECT' without also transferring the rejected money back into + // my own account. And that means fiddling with my account, and that means it will + // be in a different block of code than this one. + // + // Whereas with accepting a cheque deposit receipt, or accepting an accepted transfer notice, + // in both of those cases, my account balance doesn't change at all. I just need to accept + // those notices in order to get them out of my inbox. So that's the simplest case, and it's + // handled by THIS block of code: + // + if ( + (OTItem::acceptItemReceipt == pItem->GetType()) + && + ( + ( + (OTTransaction::transferReceipt == pServerTransaction->GetType()) && + (OTItem::acceptPending == pOriginalItem->GetType()) + ) + || + ( + (OTTransaction::chequeReceipt == pServerTransaction->GetType()) && + (OTItem::depositCheque == pOriginalItem->GetType()) + ) + ) + + ) + { // (The funds are already paid out...) + // pItem contains the current user's attempt to accept the + // ['depositCheque' OR 'acceptPending'] located in theOriginalItem. + // Now we have the user's item and the item he is trying to accept. + + theInbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + theInbox. ReleaseSignatures(); + theInbox. SignContract(m_nymServer); + theInbox. SaveContract(); + theInbox. SaveInbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + pResponseItem->SetStatus(OTItem::acknowledgement); + + // Don't I need to remove from responsibility list? + // No, because that is done at the bottom of the function. + // + }// its type is OTItem::acceptPending or OTItem::depositCheque + + + + // ---------------------------------------------------------------------------------------------- + + // TODO: 'Accept a REJECT' -- NEED TO PERFORM THE TRANSFER OF FUNDS BACK TO THE SENDER'S ACCOUNT WHEN TRANSFER IS REJECTED. + + // ---------------------------------------------------------------------------------------------- + + // The below block only executes for ACCEPTING a TRANSFER + + else if ( + (OTTransaction::pending == pServerTransaction->GetType()) + && + (OTItem::transfer == pOriginalItem->GetType()) + ) + { + // pItem contains the current user's attempt to accept the transfer located in theOriginalItem. + // Now we have both items. + OTIdentifier IDFromAccount(pOriginalItem->GetPurportedAccountID()); + OTIdentifier IDToAccount(pOriginalItem->GetDestinationAcctID()); + + // I'm using the operator== because it exists. + // If the ID on the "To" account from the original transaction does not + // match the Acct ID of the client trying to accept the transaction... + if (!(ACCOUNT_ID == IDToAccount)) + { + OTLog::Error("Error: Destination account ID on the transaction does not match account ID of client transaction item.\n"); + } + + // ------------------------------------------------------------------- + + // The 'from' outbox is loaded to remove the outgoing transfer, since it has been accepted. + // The 'from' inbox is loaded in order to put a notice of this acceptance for the sender's records. + OTLedger theFromOutbox(IDFromAccount, SERVER_ID), // Sender's *OUTBOX* + theFromInbox(IDFromAccount, SERVER_ID); // Sender's *INBOX* + + bool bSuccessLoadingInbox = theFromInbox.LoadInbox(); + bool bSuccessLoadingOutbox = theFromOutbox.LoadOutbox(); + + // -------------------------------------------------------------------- + + // THE FROM INBOX -- We are adding an item here (acceptance of transfer), + // so we will create this inbox if we have to, so we can add that record to it. + + if (true == bSuccessLoadingInbox) + bSuccessLoadingInbox = theFromInbox.VerifyAccount(m_nymServer); + else + bSuccessLoadingInbox = theFromInbox.GenerateLedger(IDFromAccount, SERVER_ID, OTLedger::inbox, true); // bGenerateFile=true + + + // -------------------------------------------------------------------- + + // THE FROM OUTBOX -- We are removing an item, so this outbox SHOULD already exist. + + if (true == bSuccessLoadingOutbox) + bSuccessLoadingOutbox = theFromOutbox.VerifyAccount(m_nymServer); + else // If it does not already exist, that is an error condition. For now, log and fail. + OTLog::Error("ERROR missing 'from' outbox in OTServer::NotarizeProcessInbox.\n"); + + + // --------------------------------------------------------------------- + + if (false == bSuccessLoadingInbox || false == bSuccessLoadingOutbox) + { + OTLog::Error("ERROR loading 'from' inbox or outbox in OTServer::NotarizeProcessInbox.\n"); + } + else + { + // Generate a new transaction number for the sender's inbox (to notice him of acceptance.) + long lNewTransactionNumber = 0; + IssueNextTransactionNumber(m_nymServer, lNewTransactionNumber, false); // bStoreTheNumber = false + + // Generate a new transaction... (to notice the sender of acceptance.) + OTTransaction * pInboxTransaction = OTTransaction::GenerateTransaction(theFromInbox, + OTTransaction::transferReceipt, + lNewTransactionNumber); + + // Here we give the sender (by dropping into his inbox) a copy of my acceptItem (for + // his transfer), including the transaction number of my acceptance of his transfer. + // + pInboxTransaction->SetReferenceString(strInReferenceTo); + pInboxTransaction->SetReferenceToNum(pItem->GetTransactionNum()); // Right now this has the 'accept the transfer' transaction number. + // It could be changed to the original transaction number, as a better + // receipt for the original sender. TODO? Decisions.... + + // Now we have created a new transaction from the server to the sender's inbox + // Let's sign it and add to his inbox. + pInboxTransaction->ReleaseSignatures(); + pInboxTransaction->SignContract(m_nymServer); + pInboxTransaction->SaveContract(); + + // At this point I have theInbox ledger, theFromOutbox ledger, theFromINBOX ledger, + // and theAccount. So I should remove the appropriate item from each ledger, and + // add the acceptance to the sender's inbox, and credit the account.... + + // First try to credit the amount to the account... + if (theAccount.Credit(pOriginalItem->GetAmount())) + { + // Add a transfer receipt to the sender's inbox, containing the "accept" transaction as the ref string. + // (to notify him that his transfer was accepted; once he accepts it, the trans# can be removed from his issued list.) + // + theFromInbox. AddTransaction(*pInboxTransaction); + + // The original item carries the transaction number that the original + // sender used to generate the transfer in the first place. This is the number + // by which that transaction is available in the sender's outbox. + // + // Then ANOTHER transaction was created, by the server, in order to put + // a pending transfer into the recipient's inbox. This has its own transaction + // number, generated by the server at that time. + // + // So we remove the original transfer from the sender's outbox using the + // transaction number on the original item, and we remove the pending transfer + // from the recipient's inbox using the transaction number from the pending + // transaction. + + // UPDATE: These two transactions correspond to each other, so I am now creating + // them with the same transaction number. As you can see, this makes them easy + // to remove as well. + theFromOutbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + theInbox. RemoveTransaction(pServerTransaction->GetTransactionNum()); + + // Release any signatures that were there before (Old ones won't + // verify anymore anyway, since the content has changed.) + theInbox. ReleaseSignatures(); + theAccount. ReleaseSignatures(); + theFromInbox. ReleaseSignatures(); + theFromOutbox. ReleaseSignatures(); + + // Sign all of them. + theInbox. SignContract(m_nymServer); + theAccount. SignContract(m_nymServer); + theFromInbox. SignContract(m_nymServer); + theFromOutbox. SignContract(m_nymServer); + + theInbox. SaveContract(); + theAccount. SaveContract(); + theFromInbox. SaveContract(); + theFromOutbox. SaveContract(); + + // Save all of them. + theInbox. SaveInbox(); + theAccount. SaveAccount(); + theFromInbox. SaveInbox(); + theFromOutbox. SaveOutbox(); + + // Now we can set the response item as an acknowledgement instead of the default (rejection) + // otherwise, if we never entered this block, then it would still be set to rejection, and the + // new items would never have been added to the inbox/outboxes, and those files, along with + // the account file, would never have had their signatures released, or been re-signed or + // re-saved back to file. The debit failed, so all of those other actions would fail also. + // BUT... if the message comes back with acknowledgement--then all of these actions must have + // happened, and here is the server's signature to prove it. + // Otherwise you get no items and no signature. Just a rejection item in the response transaction. + pResponseItem->SetStatus(OTItem::acknowledgement); + } + else + { + delete pInboxTransaction; pInboxTransaction = NULL; + OTLog::Error("Unable to credit account in OTServer::NotarizeProcessInbox.\n"); + } + } // outbox was successfully loaded + }// its type is OTItem::transfer + }// loaded original item from string + else + { + OTLog::Error("Error loading original item from inbox transaction.\n"); + } + } + else + { + OTLog::vError("Error finding original transaction that client is trying to accept: %ld\n", + pItem->GetReferenceToNum()); + } + + // sign the response item before sending it back (it's already been added to the transaction above) + // Now, whether it was rejection or acknowledgement, it is set properly and it is signed, and it + // is owned by the transaction, who will take it from here. + pResponseItem->SignContract(m_nymServer); + pResponseItem->SaveContract(); + } + else + { + OTString strItemType; + pItem->GetTypeString(strItemType); + + OTLog::vError("Error, unexpected OTItem::itemType in OTServer::NotarizeProcessInbox: %s\n", + strItemType.Get()); + } // if type == ACCEPT, REJECT, DISPUTE + } // for LOOP (each item) + } // else (balance agreement verified.) + } // else bSuccessFindingAllTransactions = true + + // I put this here so it's signed/saved whether the balance agreement itself was successful OR NOT. + pResponseBalanceItem->ReleaseSignatures(); + pResponseBalanceItem->SignContract(m_nymServer); + pResponseBalanceItem->SaveContract(); + + } // Balance Agreement item found. + + // ------------------------------------------------- + + tranOut.ReleaseSignatures(); + tranOut.SignContract(m_nymServer); + tranOut.SaveContract(); + + // ------------------------------------------------- + + OTString strPath; // SAVE THE RECEIPT TO LOCAL STORAGE (for dispute resolution.) + + // On the server side, response will only have chance to succeed if balance agreement succeeds first. + // Therefore, you will never see successful response but failed balance, since it would stop at the + // balance and response itself would remain failed with no chance of changing. + // + // Thus, "success" must be when balance succeeded and transaction succeeded, + // and "failure" must be when balance succeeded but transaction failed. + // + // If NEITHER succeeded, then there is no point recording it to a file, now is there? + + const OTString strAcctID(ACCOUNT_ID); + + if (tranOut.GetSuccess()) + { + // Balance agreement was a success, AND process inbox was a success. + // Therefore, remove any relevant issued numbers from theNym (those he's + // now officially no longer responsible for), and save. + // + for (int i = 0; i < theTempNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempNym.GetIssuedNum(SERVER_ID, i); + + theNym.RemoveIssuedNum(m_nymServer, m_strServerID, lTemp, false); // bSave = false (saved below) + } + //------------------------------------------- + // The Nym (server side) stores a list of all opening and closing cron #s. + // So when the number is released from the Nym, we also take it off that list. + // + std::set & theIDSet = theNym.GetSetOpenCronItems(); + for (int i = 0; i < theTempClosingNumNym.GetIssuedNumCount(SERVER_ID); i++) + { + long lTemp = theTempClosingNumNym.GetIssuedNum(SERVER_ID, i); + + theIDSet.erase(lTemp); // now it's erased from within the Nym. + } + + theNym.SaveSignedNymfile(m_nymServer); + + //------------------------------------------- + + strPath.Format((char*)"%s.success", strAcctID.Get()); + } + else + strPath.Format((char*)"%s.fail", strAcctID.Get()); + + const char * szFoldername = OTLog::ReceiptFolder(); + + // Save the receipt. (My outgoing transaction including the client's signed request that triggered it.) + tranOut.SaveContract(szFoldername, strPath.Get()); +} + + + + + +bool OTServer::ValidateServerIDfromUser(OTString & strServerID) +{ + static bool bFirstTime = true; + + if (bFirstTime) + { + bFirstTime=false; + + // This part is now done when the server XML file is first loaded +// if (!m_nymServer.Loadx509CertAndPrivateKey()) +// { +// OTLog::Error("Error loading server certificate and keys.\n"); +// } +// else { +// OTLog::Error("Success loading server certificate and keys.\n"); +// } + + //TODO.. Notice after calling Loadx509CertAndPrivateKey, I do not call + // VerifyPseudonym immediately after, like the client does. That's because + // the client's ID is a hash of his public key, so that function compares + // the two. + // + // But the server ID is a hash of the SERVER CONTRACT. Which will NOT match + // the hash of the server public key. + // + // Ideally the server will load the contract, and then EXTRACT the public key + // from the contract, and then use it to verify the signature on the contract, + // and THEN hash the contract, to get the ServerID, + + // Here's basically what I need to add: m_ServerContract + // + // ServerContract.SetFilename("server contract file") + // ServerContract.LoadContract() + // ServerContract.VerifyContractID() + // if (success) + // ServerContract.VerifySignature(m_nymServer); + // if (success) + // SUCCESS LOADING SERVER CERTIFICATES AND KEYS. + } + + + if (m_strServerID == strServerID) + { + return true; + } + + return false; +} + + + + + + +OTServer::OTServer() +{ + // This will be set when the server main xml file is loaded. For now, initialize to 0. + m_lTransactionNumber = 0; + + m_pServerContract = NULL; + + m_bShutdownFlag = false; // If I ever set this to true, then the caller will shutdown gracefully. + // (Caller must regularly check the flag and shutdown when it sees the change.) +} + + +OTServer::~OTServer() +{ + if (m_pServerContract) + delete m_pServerContract; + + m_pServerContract = NULL; +} + + + + +bool OTServer::ProcessUserCommand(OTMessage & theMessage, OTMessage & msgOut, OTClientConnection * pConnection/*=NULL*/) +{ + // Validate the server ID, to keep users from intercepting a valid requst + // and sending it to the wrong server. + if (false == ValidateServerIDfromUser(theMessage.m_strServerID)) + { + OTLog::Error("Invalid server ID sent in command request.\n"); + return false; + } + else { + OTLog::Output(4, "Received valid Server ID with command request.\n"); + } + + OTPseudonym theNym(theMessage.m_strNymID); + + //********************************************************************************************** + + // This command is special because the User sent his public key, not just his ID. + // We have to verify the two together. + // + // At this point the user doesn't even have an account, so there is no public key + // to look up from the database. + // + // If the ServerID in the reply matches the ID calculated from the Server Contract, + // that means the user, without asking for the server's public key, can just extract + // the public key from the contract from which the serverID was first calculated. (The + // ID is a hash of the contract.) + // + // In other words, the user reads a contract. It's signed. The signature is verified + // by a public key that is embedded in the contract. If the server, a URL also embedded in + // the contract, acknowledges the ServerID, then the user can encrypt everything to the + // public key in the contract, without asking the server for a copy of that key. + // + // Only the private key who signed that contract will be able to read the communications from + // the user. + // + // I definitely have to build in an option for x509 certs to be used in lieu of public keys. + // Otherwise the key is not ever revokable -- yet it's in a contract! What is the issuer supposed + // to do if that key is stolen? Make a public announcement? + // + // In such a case, the issuer would have to put a "check this URL to make sure contract still good" + // variable into the contract so that the users have the chance to make sure the contract is still + // good and the contract's private key hasn't been stolen. Well guess what? That's what x509 does. + // Therefore the appropriate solution is for the server to support x509s, and to look up the authority + // and verify certs, so that users have recourse in the event their private key is stolen. (They can + // just use their Cert to issue a new public key, which the transaction server would be smart enough + // to use, once the certificate authority signs off on it. (Since the user uses an x509 from a + // specific authority, then I can trust that whatever that authority says, that user wanted it to say.) + // Without knowing the authority itself, I can now trust it because the user has asked me to trust it. + // Fair enough! + // + // Similarly a user should be able to use his x509 Cert instead of his public key, and the server + // should verify that cert whenever it's used to make sure it's up to date. This takes the + // problem off of the user's hands by way of a trusted authority. + // + // In fact this transaction server is really just a transaction VERIFIER. It's just another form + // of trusted 3rd party. Just like Verisign is an authority who ceritifies an identity, so this + // server is an authority who certifies a transaction. It's like a timestamping server. In fact + // it should have timestamping built in as one of the functions. + // + // Transactions do not actually occur on the server, per se. They occur between the USERS. + // All the server does it certify that the numbers are correct. It's like accounting software. + // Ultimately the users are the ones making a transaction, and they are the ones who are + // responsible to back up their promises in real life and potentially in court. All the software + // does is CERTIFY that the users DID make certain agreements at certain times, and digitally sign + // those certifications. + // + // Thus, this server is very similar to Verisign. It is a trusted 3rd party who users can trust + // to authenticate their transactions. Instead of authenticating certifications like Verisign does, + // it authenticates transactions. + // + // UPDATE: May not want x509's after all, since it provides an opening for governments to + // serve warrants on the authority site and switch certs whenever they want to (BAD THING!) + // + if (theMessage.m_strCommand.Compare("checkServerID")) + { + OTLog::vOutput(0, "\n==> Received a checkServerID message. Processing...\n"); + + OTAsymmetricKey & nymPublicKey = (OTAsymmetricKey &)theNym.GetPublicKey(); + + bool bIfNymPublicKey = + nymPublicKey.SetPublicKey(theMessage.m_strNymPublicKey, true/*bEscaped*/); + + if (bIfNymPublicKey) + { + // Now the Nym has his public key set. Let's compare it to a hash of his ID (should match) + if (theNym.VerifyPseudonym()) + { + OTLog::vOutput(3, "Pseudonym verified! The Nym ID is a perfect hash of the public key.\n"); + + if (theMessage.VerifySignature(theNym)) + { + OTLog::vOutput(3, "Signature verified! The message WAS signed by " + "the Nym\'s Private Key.\n"); + + + // This is only for verified Nyms, (and we're verified in here!) We do this so that + // we have the option later to encrypt the replies back to the client...(using the + // client's public key that we set here.) + if (NULL != pConnection) + pConnection->SetPublicKey(theMessage.m_strNymPublicKey); + + + UserCmdCheckServerID(theNym, theMessage, msgOut); + + return true; + } + else + { + OTLog::vOutput(0, "Signature failed!\nThe message was NOT signed by the Nym, OR the " + "message was changed after signing.\n"); + return false; + } + + } + else + { + OTLog::vOutput(0, "Pseudonym failed to verify. Hash of public key doesn't match " + "Nym ID that was sent.\n"); + return false; + } + } + else { + OTLog::Error("Failure reading Nym's public key from message.\n"); + return false; + } + } + + // This command is also special because again, the User sent his public key, not just his ID. + // We have to verify the two together. + else if (theMessage.m_strCommand.Compare("createUserAccount")) + { + OTLog::Output(0, "\n==> Received a createUserAccount message. Processing...\n"); + + OTAsymmetricKey & nymPublicKey = (OTAsymmetricKey &)theNym.GetPublicKey(); + bool bIfNymPublicKey = + nymPublicKey.SetPublicKey(theMessage.m_strNymPublicKey, true/*bEscaped*/); + + if (bIfNymPublicKey) + { + // Now the Nym has his public key set. Let's compare it to a hash of his ID (should match) + if (theNym.VerifyPseudonym()) + { + OTLog::Output(3, "Pseudonym verified! The Nym ID is a perfect hash of the public key.\n"); + + if (theMessage.VerifySignature(theNym)) + { + OTLog::Output(3, "Signature verified! The message WAS signed by " + "the Nym\'s Private Key.\n"); + // + // Look up the NymID and see if it's already a valid user account. + // + // If it is, then we can't very well create it twice, can we? + theNym.SetIdentifier(theMessage.m_strNymID); + + OTLog::Output(0, "Verifying account doesn't already exist... (IGNORE ERRORS HERE ABOUT FAILURE OPENING FILES)\n"); + + // Prepare to send success or failure back to user. + // (1) set up member variables + msgOut.m_strCommand = "@createUserAccount"; // reply to createUserAccount + msgOut.m_strNymID = theMessage.m_strNymID; // UserID + msgOut.m_strServerID = m_strServerID; // ServerID, a hash of the server contract. + msgOut.m_bSuccess = false; + + // We send the user's message back to him, ascii-armored, + // as part of our response. + OTString tempInMessage; + theMessage.SaveContract(tempInMessage); + msgOut.m_ascInReferenceTo.SetString(tempInMessage); + + bool bLoadSignedNymfile = theNym.LoadSignedNymfile(m_nymServer); + bool bLoadedPublicKey = theNym.LoadPublicKey(); + + if ( + (theNym.IsMarkedForDeletion() && (true == bLoadedPublicKey)) || // We allow people to resurrect deleted Nyms. + ((false == bLoadSignedNymfile) && (false == bLoadedPublicKey)) + ) + { + if (theNym.IsMarkedForDeletion()) + theNym.MarkAsUndeleted(); + + // Good -- this means the account doesn't already exist. + // Let's create it. + + // First we save the createUserAccount message in the accounts folder... + if (msgOut.m_bSuccess = theMessage.SaveContract(OTLog::UserAcctFolder(), theMessage.m_strNymID.Get())) + { + OTLog::Output(0, "Success saving new user account verification file.\n"); + + OTString strPath(theMessage.m_strNymID.Get()); + + // Next we save the public key in the pubkeys folder... + if (msgOut.m_bSuccess = theNym.SavePublicKey(strPath)) + { + // This is only for verified Nyms, (and we're verified in here!) We do this so that + // we have the option later to encrypt the replies back to the client...(using the + // client's public key that we set here.) + if (NULL != pConnection) + pConnection->SetPublicKey(theMessage.m_strNymPublicKey); + + OTLog::vOutput(0, "Success saving new nym\'s public key file.\n"); + + OTIdentifier theNewNymID, SERVER_ID(m_strServerID); + theNym.GetIdentifier(theNewNymID); + + OTLedger theNymbox(theNewNymID, theNewNymID, SERVER_ID); + + bool bSuccessLoadingNymbox = theNymbox.LoadNymbox(); + + if (true == bSuccessLoadingNymbox) // that's strange, this user didn't exist... but maybe I allow people to drop notes anyway, so then the nymbox might already exist, with usage tokens and messages inside.... + bSuccessLoadingNymbox = theNymbox.VerifyAccount(m_nymServer); // make sure it's all good. + else + { + bSuccessLoadingNymbox = theNymbox.GenerateLedger(theNewNymID, SERVER_ID, OTLedger::nymbox, true); // bGenerateFile=true + + if (bSuccessLoadingNymbox) + { + bSuccessLoadingNymbox = theNymbox.SignContract(m_nymServer); + + if (bSuccessLoadingNymbox) + { + bSuccessLoadingNymbox = theNymbox.SaveContract(); + + if (bSuccessLoadingNymbox) + bSuccessLoadingNymbox = theNymbox.SaveNymbox(); + } + } + } + + // by this point, the nymbox DEFINITELY exists -- or not. (generation might have failed, or verification.) + + if (false == bSuccessLoadingNymbox) + { + OTLog::vError("Error during user account registration. Failed verifying or generating nymbox for user:\n%s\n", + theMessage.m_strNymID.Get()); + } + else if (msgOut.m_bSuccess = theNym.SaveSignedNymfile(m_nymServer)) + { + OTLog::vOutput(0, "Success saving new Nymfile. (User account fully created.)\n"); + + + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message (with signatures and all, back to its internal member m_strRawFile.) + // + // FYI, SaveContract takes m_xmlUnsigned and wraps it with the signatures and ------- BEGIN bookends + // If you don't pass a string in, then SaveContract saves the new version to its member, m_strRawFile + msgOut.SaveContract(); + + return true; + } + else + { + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message + msgOut.SaveContract(); + + return true; + } + } + else + { + OTLog::Error("Error saving new user account verification file.\n"); + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message + msgOut.SaveContract(); + + return true; + } + } + else { + OTLog::Error("Error creating Account in OTServer::ProcessUserCommand.\n"); + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message + msgOut.SaveContract(); + + return true; + } + } + else + { + OTLog::vOutput(0, "Error: User attempted to create account that already exists: %s\n", + theMessage.m_strNymID.Get()); + // (2) Sign the Message + msgOut.SignContract(m_nymServer); + + // (3) Save the Message + msgOut.SaveContract(); + + return true; + } + + return true; + } + else + { + OTLog::Output(0, "Signature failed!\nThe message was NOT signed by the Nym, OR the " + "message was changed after signing.\n"); + return false; + } + + } + else + { + OTLog::Output(0, "Pseudonym failed to verify. Hash of public key doesn't match " + "Nym ID that was sent.\n"); + return false; + } + } + else { + OTLog::Error("Failure reading Nym's public key from message.\n"); + return false; + } + } + + + // ------------------------------------------------------------------------------------------ + + + // Look up the NymID and see if it's a valid user account. + // + // If we didn't receive a public key (above) + // Or read one from our files (below) + // ... then we'd have no way of validating the requests. + // + // If it is, then we read the public key from that Pseudonym and use it to verify any + // requests bearing that NymID. + + // I appear to already be setting this variable near the top of the function. + // No idea why I'm setting it twice, probably an oversight. TODO: remove. + theNym.SetIdentifier(theMessage.m_strNymID); + + // For special cases where the Nym sending the transaction has the same public key as + // the server itself. (IE it IS the server Nym, then we'd want to use the already-loaded + // server nym object instead of loading a fresh one, so the two don't overwrite each other.) + // + bool bNymIsServerNym = (m_strServerUserID.Compare(theMessage.m_strNymID) ? true : false); + OTPseudonym * pNym = &theNym; + + if (bNymIsServerNym) + pNym = &m_nymServer; + + if (!bNymIsServerNym && (false == theNym.LoadPublicKey())) + { + OTLog::vError("Failure loading Nym public key: %s\n", theMessage.m_strNymID.Get()); + return false; + } + + if (theNym.IsMarkedForDeletion()) + { + OTLog::vOutput(0, "(Failed) attempt by client to use a deleted Nym: %s\n", theMessage.m_strNymID.Get()); + return false; + } + + + // Okay, the file was read into memory and Public Key was successfully extracted! + // Next, let's use that public key to verify (1) the NymID and (2) the signature + // on the message that we're processing. + + if (pNym->VerifyPseudonym()) + { + OTLog::Output(3, "Pseudonym verified! The Nym ID is a perfect hash of the public key.\n"); + + // So far so good. Now let's see if the signature matches... + if (theMessage.VerifySignature(*pNym)) + { + OTLog::Output(3, "Signature verified! The message WAS signed by " + "the Nym\'s Private Key.\n"); + + // Now we might as well load up the rest of the Nym. + // Notice I use the || to only load the nymfile if it's NOT the server Nym. + if (bNymIsServerNym || theNym.LoadSignedNymfile(m_nymServer)) + { + OTLog::Output(2, "Successfully loaded Nymfile into memory.\n"); + + // ***************************************************************************** + // ENTERING THE INNER SANCTUM OF SECURITY. If the user got all the way to here, + // Then he has passed multiple levels of security, and all commands below will + // assume the Nym is secure, validated, and loaded into memory for use. + // + // But still need to verify the Request Number for all other commands except + // Get Request Number itself... + // ***************************************************************************** + + // Request numbers start at 1 (currently). + long lRequestNumber = 0; + + if (false == pNym->GetCurrentRequestNum(m_strServerID, lRequestNumber)) + { + OTLog::Output(0, "Nym file request number doesn't exist. Apparently first-ever request to server--but everything checks out. " + "(Shouldn't this request number have been created already when the NymFile was first created???????\n"); + // FIRST TIME! This account has never before made a single request to this server. + // The above call always succeeds unless the number just isn't there for that server. + // Therefore, since it's the first time, we'll create it now: + pNym->IncrementRequestNum(m_nymServer, m_strServerID); + + // Call it again so that lRequestNumber is set to 1 also + if (pNym->GetCurrentRequestNum(m_strServerID, lRequestNumber)) + { + OTLog::Output(0, "Created first request number in Nym file, apparently first-ever request. " + "(Shouldn't this have been created already when the NymFile was first created???????\n"); + } + else { + OTLog::Error("ERROR creating first request number in Nym file.\n"); + return false; + } + } + + // At this point, I now have the current request number for this nym in lRequestNumber + // Let's compare it to the one that was sent in the message... (This prevents attackers + // from repeat-sending intercepted messages to the server.) + if (false == theMessage.m_strCommand.Compare("getRequest")) // IF it's NOT a getRequest CMD, (therefore requires a request number) + { + if (lRequestNumber != atol(theMessage.m_strRequestNum.Get())) // AND the request number attached does not match what we just read out of the file... + { + OTLog::vOutput(3, "Request number sent in this message %ld does not match the one in the file! (%ld)\n", + atol(theMessage.m_strRequestNum.Get()), lRequestNumber); + return false; + } + else // it's not a getRequest CMD, and the request number sent DOES match what we read out of the file!! + { + OTLog::vOutput(3, "Request number sent in this message %ld DOES match the one in the file!\n", lRequestNumber); + + // At this point, it is some OTHER command (besides getRequest) + // AND the request number verifies, so we're going to increment + // the number, and let the command process. + pNym->IncrementRequestNum(m_nymServer, m_strServerID); + + // ***************************************************************************** + // **INSIDE** THE INNER SANCTUM OF SECURITY. If the user got all the way to here, + // Then he has passed multiple levels of security, and all commands below will + // assume the Nym is secure, validated, and loaded into memory for use. They can + // also assume that the request number has been verified on this message. + // EVERYTHING checks out. + // ***************************************************************************** + + // NO RETURN HERE!!!! ON PURPOSE!!!! + } + + } + else // If you entered this else, that means it IS a getRequest command + // So we allow it to go through without verifying this step, and without incrementing the counter. + { + //pNym->IncrementRequestNum(m_strServerID); // commented out cause this is the one case where we DON'T increment this number. + // We allow the user to get the number, we DON'T increment it, and now the user + // can send it on his next request for some other command, and it will verify + // properly. This prevents repeat messages. + + // NO RETURN HERE!!!! ON PURPOSE!!!! + } + + + // At this point, we KNOW that it is EITHER a GetRequest command, which doesn't require a request number, + // OR it was some other command, but the request number they sent in the command MATCHES the one that we + // just read out of the file. + + // Therefore, we can process ALL messages below this + // point KNOWING that the Nym is properly verified in all ways. + // No messages need to worry about verifying the Nym, or about + // dealing with the Request Number. It's all handled in here. + + + + // Get the public key from theNym, and set it into the connection. + // This is only for verified Nyms, (and we're verified in here!) We do this so that + // we have the option later to encrypt the replies back to the client...(using the + // client's public key that we set here.) + if (NULL != pConnection) + pConnection->SetPublicKey(pNym->GetPublicKey()); + } + else { + OTLog::vError("Error loading Nymfile: %s\n", theMessage.m_strNymID.Get()); + return false; + } + + } + else + { + OTLog::Output(0, "Signature failed!\nThe message was NOT signed by the Nym, OR the " + "message was changed after signing.\n"); + return false; + } + + } + else + { + OTLog::Output(0, "Pseudonym failed to verify. Hash of public key doesn't match " + "Nym ID that was sent.\n"); + return false; + } + + + // ---------------------------------------------------------------------------------------- + + + // If you made it down this far, that means the Pseudonym verifies! The message is legit. + // + // (Server ID was good, NymID is a valid hash of User's public key, and the Signature on + // the message was signed by the user's private key.) + // + // Now we can process the message. + // + // All the commands below here, it is assumed that the user account exists and is + // referenceable via theNym. (An OTPseudonym object.) + // + // ALL commands below can assume the Nym is real, and that the NymID and Public Key are + // available for use -- and that they verify -- without having to check again and again. + + + if (theMessage.m_strCommand.Compare("getRequest")) // This command is special because it's the only one that doesn't require a request number. + // All of the other commands, below, will fail above if the proper request number isn't included + // in the message. They will already have failed by this point if they didn't verify. + { + OTLog::Output(0, "\n==> Received a getRequest message. Processing...\n"); + + UserCmdGetRequest(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getTransactionNum")) + { + OTLog::Output(0, "\n==> Received a getTransactionNum message. Processing...\n"); + + UserCmdGetTransactionNum(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("checkUser")) + { + OTLog::Output(0, "\n==> Received a checkUser message. Processing...\n"); + + UserCmdCheckUser(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("sendUserMessage")) + { + OTLog::Output(0, "\n==> Received a sendUserMessage message. Processing...\n"); + + UserCmdSendUserMessage(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("deleteUserAccount")) + { + OTLog::Output(0, "\n==> Received a deleteUserAccount message. Processing...\n"); + + UserCmdDeleteUser(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("deleteAssetAccount")) + { + OTLog::Output(0, "\n==> Received a deleteAssetAccount message. Processing...\n"); + + UserCmdDeleteAssetAcct(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("createAccount")) + { + OTLog::Output(0, "\n==> Received a createAccount message. Processing...\n"); + + UserCmdCreateAccount(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("issueAssetType")) + { + OTLog::Output(0, "\n==> Received an issueAssetType message. Processing...\n"); + + UserCmdIssueAssetType(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("issueBasket")) + { + OTLog::Output(0, "\n==> Received an issueBasket message. Processing...\n"); + + UserCmdIssueBasket(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("notarizeTransactions")) + { + OTLog::Output(0, "\n==> Received a notarizeTransactions message. Processing...\n"); + + UserCmdNotarizeTransactions(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getNymbox")) + { + OTLog::Output(0, "\n==> Received a getNymbox message. Processing...\n"); + + UserCmdGetNymbox(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getInbox")) + { + OTLog::Output(0, "\n==> Received a getInbox message. Processing...\n"); + + UserCmdGetInbox(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getOutbox")) + { + OTLog::Output(0, "\n==> Received a getOutbox message. Processing...\n"); + + UserCmdGetOutbox(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("processNymbox")) + { + OTLog::Output(0, "\n==> Received a processNymbox message. Processing...\n"); + + UserCmdProcessNymbox(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("processInbox")) + { + OTLog::Output(0, "\n==> Received a processInbox message. Processing...\n"); + + UserCmdProcessInbox(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getAccount")) + { + OTLog::Output(0, "\n==> Received a getAccount message. Processing...\n"); + + UserCmdGetAccount(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getContract")) + { + OTLog::Output(0, "\n==> Received a getContract message. Processing...\n"); + + UserCmdGetContract(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getMint")) + { + OTLog::Output(0, "\n==> Received a getMint message. Processing...\n"); + + UserCmdGetMint(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getMarketList")) + { + OTLog::Output(0, "\n==> Received a getMarketList message. Processing...\n"); + + UserCmdGetMarketList(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getMarketOffers")) + { + OTLog::Output(0, "\n==> Received a getMarketOffers message. Processing...\n"); + + UserCmdGetMarketOffers(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getMarketRecentTrades")) + { + OTLog::Output(0, "\n==> Received a getMarketRecentTrades message. Processing...\n"); + + UserCmdGetMarketRecentTrades(*pNym, theMessage, msgOut); + + return true; + } + else if (theMessage.m_strCommand.Compare("getNym_MarketOffers")) + { + OTLog::Output(0, "\n==> Received a getNym_MarketOffers message. Processing...\n"); + + UserCmdGetNym_MarketOffers(*pNym, theMessage, msgOut); + + return true; + } + else + { + OTLog::vError("Unknown command type in the XML, or missing payload, in ProcessMessage.\n"); + return false; + } +} + + + + + +bool OTServer::GetConnectInfo(OTString & strHostname, int & nPort) +{ + if (NULL == m_pServerContract) + return false; + + return m_pServerContract->GetConnectInfo(strHostname, nPort); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/transaction/OTServer.h b/transaction/OTServer.h new file mode 100644 index 000000000..dfcdb55fa --- /dev/null +++ b/transaction/OTServer.h @@ -0,0 +1,354 @@ +/************************************************************************************ + * + * OTServer.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + + +#ifndef __OTSERVER_H__ +#define __OTSERVER_H__ + +#include + +#include "OTString.h" +#include "OTPseudonym.h" +//#include "OTMint.h" +#include "OTAssetContract.h" + +#include "OTCron.h" + +class OTMessage; +class OTClientConnection; +class OTAccount; +class OTTransaction; +class OTMint; +class OTTrade; +class OTServerContract; + +// these correspond--same IDs. +typedef std::multimap mapOfMints; +typedef std::map mapOfBaskets; +typedef std::map mapOfAccounts; // server side these are keyed by asset type ID + +// Why does the map of mints use multimap instead of map? +// Because there might be multiple valid mints for the same asset type. +// Perhaps I am redeeming tokens from the previous series, which have not yet expired. +// Only tokens from the new series are being issued today, but tokens from the previous +// series are still good until their own expiration date, which is coming up soon. +// Therefore the server manages different mints for the same asset type, and since the asset +// type is the key in the multimap, we don't want to accidentally remove one from the list +// every time another is added. Thus multimap is employed. + +class OTServer +{ + bool m_bShutdownFlag; // If the server wants to be shut down, it can set this flag so the caller knows to do so. + + OTString m_strVersion; // Unused currently. + + OTString m_strServerID; // A hash of the server contract + OTString m_strServerUserID; // A hash of the public key that signed the server contract. + + OTServerContract * m_pServerContract; // This is the server's own contract, containing its public key and connect info. + + long m_lTransactionNumber; // This stores the last VALID AND ISSUED transaction number. + + + OTPseudonym m_nymServer; // the Nym for the server, so he can decrypt messages sent to him + // by paranoid users :-P UPDATE: By ALL users. Everything encrypted now by default. + + mapOfContracts m_mapContracts; // The asset types supported by this server. + mapOfMints m_mapMints; // The mints for each asset type. + + mapOfAccounts m_mapVoucherAccounts; // the voucher accounts (see GetVoucherAccount below for details) + + mapOfBaskets m_mapBaskets; // this map connects BASKET_ID with BASKET_ACCOUNT_ID (so you can look up the server's + // basket issuer account ID, which is *different* on each server, using the Basket Currency's + // ID, which is the *same* on every server.) + mapOfBaskets m_mapBasketContracts; // Need a way to look up a Basket Account ID using its Contract ID + + // ------------------------------------------------------------------------------------------------------------- + + OTCron m_Cron; // This is where re-occurring and expiring tasks go. + + // ------------------------------------------------------------------------------------------------------------- + + static int __heartbeat_no_requests; // The number of client requests that will be processed per heartbeat. + static int __heartbeat_ms_between_beats; // number of ms between each heartbeat. + +public: + static int GetHeartbeatNoRequests() { return __heartbeat_no_requests; } + static void SetHeartbeatNoRequests(int nVal) { __heartbeat_no_requests = nVal; } + + static int GetHeartbeatMsBetweenBeats() { return __heartbeat_ms_between_beats; } + static void SetHeartbeatMsBetweenBeats(int nVal) { __heartbeat_ms_between_beats = nVal; } + + // ----------------------- + + OTServer(); + ~OTServer(); + + void ActivateCron(); + + inline bool IsFlaggedForShutdown() const { return m_bShutdownFlag; } + + // --------------------------------------------------------------------------------- + + // Obviously this will only work once the server contract has been loaded from storage. + bool GetConnectInfo(OTString & strHostname, int & nPort); + + // Trade is passed in as reference to make sure it exists. + // But the trade MUST be heap-allocated, as the market and cron + // objects will own it and handle cleaning it up. + // not needed -- erase this function. +// bool AddTradeToMarket(OTTrade & theTrade); + + // --------------------------------------------------------------------------------- + + OTMint * GetMint(const OTIdentifier & ASSET_TYPE_ID, int nSeries); // Each asset contract has its own series of Mints + + // Whenever the server issues a voucher (like a cashier's cheque), it puts the funds in one + // of these voucher accounts (one for each asset type ID). Then it issues the cheque from the + // same account. + // TODO: also should save the cheque itself to a folder, where the folder is named based on the date + // that the cheque will expire. This way, the server operator can go back later, or have a script, + // to retrieve the cheques from the expired folders, and total them. The server operator is free to + // remove that total from the Voucher Account once the cheque has expired: it is his money now. + OTAccount * GetVoucherAccount(const OTIdentifier & ASSET_TYPE_ID); + + // When a user uploads an asset contract, the server adds it to the list (and verifies the user's key against the + // contract.) This way the server has a directory with all the asset contracts that it supports, saved by their ID. + // As long as the IDs are in the server file, it can look them up. + // When a new asset type is added, a new Mint is added as well. It goes into the mints folder. + bool AddAssetContract(OTAssetContract & theContract); + OTAssetContract * GetAssetContract(const OTIdentifier & ASSET_TYPE_ID); + + bool AddBasketAccountID(const OTIdentifier & BASKET_ID, const OTIdentifier & BASKET_ACCOUNT_ID, + const OTIdentifier & BASKET_CONTRACT_ID); + bool LookupBasketAccountID(const OTIdentifier & BASKET_ID, OTIdentifier & BASKET_ACCOUNT_ID); + bool VerifyBasketAccountID(const OTIdentifier & BASKET_ACCOUNT_ID); + + bool LookupBasketAccountIDByContractID(const OTIdentifier & BASKET_CONTRACT_ID, OTIdentifier & BASKET_ACCOUNT_ID); + bool LookupBasketContractIDByAccountID(const OTIdentifier & BASKET_ACCOUNT_ID, OTIdentifier & BASKET_CONTRACT_ID); + + const OTPseudonym & GetServerNym() const; + + void Init(); // Loads the main file... + + bool LoadConfigFile(); // loads the config file. + + // ------------------------------- + + void ProcessCron(); // Call this periodically so Cron has a chance to process Trades, Payment Plans, etc. + + bool LoadMainFile(); // Called in Init. Loads transaction number. + bool SaveMainFile(); // Called in IssueNextTransactionNumber. + bool SaveMainFileToString(OTString & strMainFile); + + bool ProcessUserCommand(OTMessage & theMessage, OTMessage & msgOut, OTClientConnection * pConnection=NULL); + bool ValidateServerIDfromUser(OTString & strServerID); + + void UserCmdCheckServerID(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdCheckUser(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdSendUserMessage(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetRequest(OTPseudonym & theNym, OTMessage & msgIn, OTMessage & msgOut); + void UserCmdGetTransactionNum(OTPseudonym & theNym, OTMessage & msgIn, OTMessage & msgOut); + void UserCmdIssueAssetType(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdIssueBasket(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdDeleteUser(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdDeleteAssetAcct(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdCreateAccount(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdNotarizeTransactions(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetNymbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetInbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetOutbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetAccount(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetContract(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdGetMint(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdProcessInbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + void UserCmdProcessNymbox(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + // Get the list of markets on this server. + void UserCmdGetMarketList(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + // Get the publicly-available list of offers on a specific market. + void UserCmdGetMarketOffers(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + // Get a report of recent trades that have occurred on a specific market. + void UserCmdGetMarketRecentTrades(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + // Get the offers that a specific Nym has placed on a specific market. + void UserCmdGetNym_MarketOffers(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + // Cancel a market offer. (CHANGING THIS INTO A TRANSACTION, INSTEAD OF A MESSAGE...) +// void UserCmdCancelNymMarketOffer(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + // Exchange in/out of a basket currency. (CHANGING THIS INTO A TRANSACTION, INSTEAD OF A MESSAGE...) +// void UserCmdExchangeBasket(OTPseudonym & theNym, OTMessage & MsgIn, OTMessage & msgOut); + + bool IssueNextTransactionNumber(OTPseudonym & theNym, long &lTransactionNumber, bool bStoreTheNumber=true); + bool VerifyTransactionNumber(OTPseudonym & theNym, const long &lTransactionNumber); // Verify a transaction number. passed by reference for speed :P + bool RemoveTransactionNumber(OTPseudonym & theNym, const long &lTransactionNumber, bool bSave=false); // A nym has just used a transaction number. Remove it from his file. + bool RemoveIssuedNumber(OTPseudonym & theNym, const long &lTransactionNumber, bool bSave=false); // a nym has just accepted a receipt. remove his responsibility for that number. + + // If the server receives a notarizeTransactions command, it will be accompanied by a payload + // containing a ledger to be notarized. UserCmdNotarizeTransactions will loop through that ledger, + // and for each transaction within, it calls THIS method. + void NotarizeTransaction(OTPseudonym & theNym, OTTransaction & tranIn, OTTransaction & tranOut); + // --------------------------------------------------------------------------------- + void NotarizeTransfer(OTPseudonym & theNym, OTAccount & theFromAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizeDeposit(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizeWithdrawal(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizeProcessInbox(OTPseudonym & theNym, OTAccount & theAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizeProcessNymbox(OTPseudonym & theNym, OTTransaction & tranIn, OTTransaction & tranOut); + // --------------------------------------------------------------------------------- + void NotarizeMarketOffer(OTPseudonym & theNym, OTAccount & theAssetAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizePaymentPlan(OTPseudonym & theNym, OTAccount & theSourceAccount, OTTransaction & tranIn, OTTransaction & tranOut); + // --------------------------------------------------------------------------------- + void NotarizeCancelCronItem(OTPseudonym & theNym, OTAccount & theAssetAccount, OTTransaction & tranIn, OTTransaction & tranOut); + void NotarizeExchangeBasket(OTPseudonym & theNym, OTAccount & theSourceAccount, OTTransaction & tranIn, OTTransaction & tranOut); + // --------------------------------------------------------------------------------- +}; + + +#endif // __OTSERVER_H__ + + + + + + + + + + + + + + + + + diff --git a/transaction/SSL-Example/SFSocket.c b/transaction/SSL-Example/SFSocket.c new file mode 100755 index 000000000..059f0e2fe --- /dev/null +++ b/transaction/SSL-Example/SFSocket.c @@ -0,0 +1,560 @@ + + +/* (SSL Sockets) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission in OpenTransactions + * http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +#ifdef _WIN32 +#include +#include +#include +#include +#include + +typedef int socklen_t; + +#define strcasecmp _stricmp + +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#include + +#include "SFSocket.h" + +#define SFSocketSSL(socket) ((socket)->sslSock) +#define SFSocketSetSSL(socket, ssl) (socket)->sslSock = (ssl) + +#define SFSocketBIO(socket) ((socket)->bio) +#define SFSocketSetBIO(socket, sslBio) (socket)->bio = (sslBio); + +#define SFSocketContext(socket) ((socket)->ctx) +#define SFSocketSetContext(socket, context) (socket)->ctx = (context) + +#define SFSocketDescriptor(socket) ((socket)->sock) +#define SFSocketSetDescriptor(socket, fd) (socket)->sock = (fd) +#define SFSocketClearDescriptor(socket) (socket)->sock = (-1) + +#define SFSocketAddress(socket) (&(socket)->address) + +struct _SFSocket { + struct sockaddr_in address; + SSL_CTX *ctx; + SSL *sslSock; + BIO *bio; + int sock; +}; + +static int __SFSocketSetPasswordCallback (char *buf, int size, + int rwflag, void *password) +{ +#ifdef _WIN32 + strncpy_s(buf, size, (char *)password, size); +#else + strncpy(buf, (char *)password, size); +#endif + + buf[size - 1] = '\0'; + return(strlen(buf)); +} + +static int __SFSocketLoadDHParams (SFSocket *socket, const char *dhFile) { + BIO *bio = NULL; + DH *dh = NULL; + +#ifdef _WIN32 +// if ((bio = BIO_new_file(dhFile, "r")) == NULL) // Maybe I can keep it after all.. + if (NULL == (bio = BIO_new_file(dhFile, "rb"))) // _WIN32 +#else + if (NULL == (bio = BIO_new_file(dhFile, "r"))) +#endif + return(-1); + + if (NULL == (dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL))) { + BIO_free(bio); bio = NULL; + return(-2); + } + + BIO_free(bio); bio = NULL; + if (SSL_CTX_set_tmp_dh(SFSocketContext(socket), dh) < 0) + return(-3); + + DH_free(dh); dh = NULL; + + return(0); +} + +static int __SFSocketCheckCert (SFSocket *socket, const char *host) { + char peerCN[256] = ""; + X509 *peer = NULL; + + if (SSL_get_verify_result(SFSocketSSL(socket)) != X509_V_OK) + return(-1); + + if ((peer = SSL_get_peer_certificate(SFSocketSSL(socket))) == NULL) + return(-2); + + X509_NAME_get_text_by_NID(X509_get_subject_name(peer), + NID_commonName, peerCN, 256); + X509_free(peer); peer = NULL; + + return(strcasecmp(peerCN, host) ? - 3 : 0); +} + +static char __globalInit = 0; + +void SFSocketGlobalInit (void) { + if (!__globalInit) { + __globalInit = 1; + + SSL_library_init(); + SSL_load_error_strings(); + } +} + +SFSocket *SFSocketAlloc (void) { + SFSocket *socket = NULL; + + if (NULL == (socket = (SFSocket *) malloc (sizeof(SFSocket)))) + return(NULL); + + socket->ctx = NULL; + socket->sslSock = NULL; + socket->sock = -1; + memset(&(socket->address), 0, sizeof(struct sockaddr_in)); + + return(socket); +} + +void SFSocketRelease (SFSocket *socket) { + if (socket->ctx != NULL) { + SSL_CTX_free(socket->ctx); + socket->ctx = NULL; + } + + if (socket->sslSock != NULL) { + SSL_shutdown(socket->sslSock); + SSL_free(socket->sslSock); + socket->sslSock = NULL; + } + + if (socket->sock != -1) { + close(socket->sock); + socket->sock = -1; + } + + free(socket); socket = NULL; +} + +int SFSocketInit (SFSocket *socket, + const char *caFile, + const char *dhFile, + const char *keyFile, + const char *password, + const char *chipers) +{ + SSL_CTX *ctx = NULL; + + /* Create Context */ + if ((ctx = SSL_CTX_new(SSLv3_method())) == NULL) { + ERR_print_errors_fp(stderr); + return(-1); + } + + /* Load Key and Certificate */ + if (!SSL_CTX_use_certificate_chain_file(ctx, keyFile)) { + ERR_print_errors_fp(stderr); + return(-2); + } + + SSL_CTX_set_default_passwd_cb(ctx, __SFSocketSetPasswordCallback); + SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *)password); + if (!SSL_CTX_use_PrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM)) { + ERR_print_errors_fp(stderr); + SSL_CTX_free(ctx); ctx = NULL; + return(-3); + } + + /* Load the CAs we Trust */ + if (!SSL_CTX_load_verify_locations(ctx, caFile, NULL)) { + SSL_CTX_free(ctx); ctx = NULL; + return(-4); + } + +#if (OPENSSL_VERSION_NUMBER < 0x00905100L) + SSL_CTX_set_verify_depth(ctx, 1); +#endif + + /* Set Context on Socket */ + SFSocketSetContext(socket, ctx); + + /* Load DH Params */ + if (dhFile != NULL) + __SFSocketLoadDHParams(socket, dhFile); + + /* Set Chipers */ + if (chipers != NULL) + SSL_CTX_set_cipher_list(ctx, chipers); + + return(0); +} + + +int SFSocketRead (SFSocket *socket, void *buf, int len) +{ + SSL *ssl = NULL; + + fd_set read_flags, write_flags; // the flag sets to be used + struct timeval waitd; // the max wait time for an event + int stat = 0; // holds return value for select(); + + waitd.tv_sec = 0; // Make select wait up to 1 second for data + waitd.tv_usec = 100; // and 0 milliseconds. + + // (FellowTraveler) trying to make this work asynchronously. + + + FD_ZERO(&read_flags); // Zero the flags ready for using + FD_ZERO(&write_flags); // Zero the flags ready for using + + // Set the sockets read flag, so when select is called it examines + // the read status of available data. + FD_SET(SFSocketDescriptor(socket), &read_flags); + + // Now call select + stat = select(SFSocketDescriptor(socket)+1, &read_flags,&write_flags,(fd_set*)0,&waitd); + + +#ifdef _WIN32 + if (SOCKET_ERROR == stat) + { + fprintf(stderr, "Error during select()\n"); + } + else if (0 == stat) + { + // This means the timeout occurred and there were no new connections + // (Which is normal, don't want to log every single time that happens.) + } + else +#endif + if (FD_ISSET(SFSocketDescriptor(socket), &read_flags)) + { + FD_CLR(SFSocketDescriptor(socket), &read_flags); + + // here is where you use the read(). + // If read returns an error then the socket + // must be dead so you must close it. + + // (FellowTraveler) trying to make asynchronous sockets work... + if (NULL != (ssl = SFSocketSSL(socket))) + { + // if (SSL_pending(ssl)) + return(SSL_read(ssl, buf, len)); + // else { + // return 0; + // } + + } + +#ifdef _WIN32 + return(recv(SFSocketDescriptor(socket), buf, len, 0)); +#else + return(read(SFSocketDescriptor(socket), buf, len)); +#endif + } + + return 0; +} + + + +int SFSocketListen (SFSocket *serverSocket, unsigned int address, int port) { + struct sockaddr_in *saddr = NULL; + SSL_CTX *ctx = NULL; + int sock = 0; + + /* Require Authentication */ + if ((ctx = SFSocketContext(serverSocket)) != NULL) { + SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); + +// SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); + } + +#ifdef _WIN32 + if (INVALID_SOCKET == (sock = socket(AF_INET, SOCK_STREAM, 0)) ) +#else + if (0 > (sock = socket(AF_INET, SOCK_STREAM, 0))) +#endif + return(-1); + + /* Setup Socket Address */ + saddr = SFSocketAddress(serverSocket); + memset(saddr, 0, sizeof(struct sockaddr_in)); + saddr->sin_addr.s_addr = address; + saddr->sin_family = AF_INET; + saddr->sin_port = htons(port); + + /* Bind */ +#ifdef _WIN32 + if ( SOCKET_ERROR == bind(sock, (struct sockaddr *)saddr, sizeof(struct sockaddr_in)) ) +#else + if (0 > bind(sock, (struct sockaddr *)saddr, sizeof(struct sockaddr_in))) +#endif + { +#ifdef _WIN32 + closesocket(sock); +#else + close(sock); +#endif + fprintf(stderr, "Error binding to port.\n"); + return(-2); + } + + /* Listen */ +#ifdef _WIN32 + if (SOCKET_ERROR != listen(sock, 15)) + { + /* Set Socket Descriptor */ + SFSocketSetDescriptor(serverSocket, sock); + + return(0); + } + else + { + fprintf(stderr, "Error listening to socket.\n"); + return (-3); + } +#else + listen(sock, 15); + + /* Set Socket Descriptor */ + SFSocketSetDescriptor(serverSocket, sock); + + return(0); +#endif +} + + + + + +SFSocket *SFSocketAccept (SFSocket *socket) { + struct sockaddr_in *addr = NULL; + SFSocket *clientSocket = NULL; + socklen_t addrlen = sizeof(struct sockaddr); // _WIN32 + SSL_CTX *ctx = NULL; + int sock = 0; + + fd_set read_flags, write_flags; // the flag sets to be used + struct timeval waitd; // the max wait time for an event + int stat = 0; // holds return value for select(); + + waitd.tv_sec = 0; // Make select wait up to 1 second for data + waitd.tv_usec = 100; // and 0 milliseconds. + + + + /* Alloc new Client Socket */ + if (NULL == (clientSocket = SFSocketAlloc())) + return(clientSocket); + + + /* Accept Connection */ + addr = SFSocketAddress(clientSocket); + + + //(FellowTraveler) just trying to get asynchronous sockets working... + + + + + FD_ZERO(&read_flags); // Zero the flags ready for using + FD_ZERO(&write_flags); // Zero the flags ready for using + + // Set the sockets read flag, so when select is called it examines + // the read status of available data. + FD_SET(SFSocketDescriptor(socket), &read_flags); + + // Now call select + stat = select(SFSocketDescriptor(socket)+1, &read_flags,&write_flags,(fd_set*)0,&waitd); + +#ifdef _WIN32 + if (SOCKET_ERROR == stat) + { + fprintf(stderr, "Error during select()\n"); + } + else if (0 == stat) + { + // This means the timeout occurred and there were no new connections + // (Which is normal, don't want to log every single time that happens.) + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + else +#endif + if (FD_ISSET(SFSocketDescriptor(socket), &read_flags)) + { + FD_CLR(SFSocketDescriptor(socket), &read_flags); + + // here is where you use the read(). + // If read returns an error then the socket + // must be dead so you must close it. + + + sock = accept(SFSocketDescriptor(socket), (struct sockaddr *)addr, &addrlen); + +#ifdef _WIN32 + if (INVALID_SOCKET == sock) +#else + if (sock <= 0) +#endif + { +// fprintf(stderr, "Error accepting new connection.\n"); + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + } + else { + SFSocketRelease(clientSocket); clientSocket = NULL; + return NULL; + } + + + + + /* Set Client Socket Descriptor */ + SFSocketSetDescriptor(clientSocket, sock); + + /* Setup Client SSL */ + if (NULL != (ctx = SFSocketContext(socket))) { + BIO *bio = NULL; + SSL *ssl = NULL; + + if (NULL == (bio = BIO_new_socket(sock, BIO_NOCLOSE))) { + ERR_print_errors_fp(stderr); + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + + if (NULL == (ssl = SSL_new(ctx))) { + ERR_print_errors_fp(stderr); + BIO_free(bio); bio = NULL; + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + + /* SSL Accept */ + SSL_set_bio(ssl, bio, bio); + if (0 >= SSL_accept(ssl)) { + ERR_print_errors_fp(stderr); + SSL_free(ssl); ssl = NULL; + SFSocketRelease(clientSocket); clientSocket = NULL; + return(NULL); + } + + /* Set SSL Socket */ + SFSocketSetSSL(clientSocket, ssl); + SFSocketSetBIO(clientSocket, bio); + } + + return(clientSocket); +} + +int SFSocketConnectToHost (SFSocket *clientSocket, const char *host, int port) { + struct sockaddr_in *addr = NULL; + struct hostent *hp = NULL; + SSL_CTX *ctx = NULL; + int sock = 0; + + if (NULL == (hp = gethostbyname(host)) ) + return(-1); + + /* Setup Address */ + addr = SFSocketAddress(clientSocket); + memset(addr, 0, sizeof(struct sockaddr_in)); + addr->sin_addr = *((struct in_addr *)hp->h_addr_list[0]); + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + + if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + return(-2); + + /* Connect to Host */ + if (connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0) + { + close(sock); sock = 0; + return(-3); + } + + /* Set Socket Descriptor */ + SFSocketSetDescriptor(clientSocket, sock); + + if ((ctx = SFSocketContext(clientSocket)) != NULL) { + BIO *bio = NULL; + SSL *ssl = NULL; + + /* Setup SSL */ + if (NULL == (ssl = SSL_new(ctx))) { + ERR_print_errors_fp(stderr); + SFSocketClearDescriptor(clientSocket); clientSocket = NULL; + close(sock); sock = 0; + return(-4); + } + + /* Setup BIO */ + if (NULL == (bio = BIO_new_socket(sock, BIO_NOCLOSE))) { + SFSocketClearDescriptor(clientSocket); + SSL_free(ssl); ssl = NULL; + close(sock); sock = 0; + return(-5); + } + + /* SSL Connect */ + SSL_set_bio(ssl, bio, bio); + if (SSL_connect(ssl) <= 0) { + ERR_print_errors_fp(stderr); + return(-6); + } + + /* Setup SSL/BIO on Socket */ + SFSocketSetSSL(clientSocket, ssl); + SFSocketSetBIO(clientSocket, bio); + + /* Check Certificate */ + if (__SFSocketCheckCert(clientSocket, host) < 0) + return(-7); + } + + return(0); +} + + +int SFSocketWrite (SFSocket *socket, const void *buf, int len) { + SSL *ssl = NULL; + if (NULL != (ssl = SFSocketSSL(socket))) + return(SSL_write(ssl, buf, len)); + +#ifdef _WIN32 + return(send(SFSocketDescriptor(socket), buf, len, 0)); +#else + return(write(SFSocketDescriptor(socket), buf, len)); +#endif +} + diff --git a/transaction/SSL-Example/SFSocket.h b/transaction/SSL-Example/SFSocket.h new file mode 100755 index 000000000..1e2a81c14 --- /dev/null +++ b/transaction/SSL-Example/SFSocket.h @@ -0,0 +1,45 @@ + + +/* (SSL Sockets) + * + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission in OpenTransactions + * http://th30z.netsons.org/ + * + * Useful as a tool for learning SSL sockets. Good work. + * + * (Also new software, but fine for this test release.) + */ + + +#ifndef _SFSOCKET_H_ +#define _SFSOCKET_H_ + +typedef struct _SFSocket SFSocket; + +void SFSocketGlobalInit (void); + +SFSocket * SFSocketAlloc (void); +void SFSocketRelease (SFSocket *socket); + +int SFSocketInit (SFSocket *socket, + const char *caFile, + const char *dhFile, + const char *keyFile, + const char *password, + const char *chipers); + +int SFSocketListen (SFSocket *serverSocket, + unsigned int address, + int port); +SFSocket * SFSocketAccept (SFSocket *socket); + +int SFSocketConnectToHost (SFSocket *socket, + const char *host, + int port); + +int SFSocketRead (SFSocket *socket, void *buf, int len); +int SFSocketWrite (SFSocket *socket, const void *buf, int len); + +#endif /* !_SFSOCKET_H_ */ + diff --git a/transaction/SSL-Example/client.c b/transaction/SSL-Example/client.c new file mode 100755 index 000000000..848bcd29a --- /dev/null +++ b/transaction/SSL-Example/client.c @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "SFSocket.h" + +#define CA_FILE "SSL-Example/ca.crt" +#define KEY_FILE "SSL-Example/client.crt" +#define KEY_PASSWORD "test" + +#define HOSTNAME "localhost" +#define PORT 7085 + +int main (int argc, char **argv) { + char buffer[1024]; + SFSocket *socket; + int rdSize; + + /* Initialize SSL */ + SFSocketGlobalInit(); + + /* Alloc Socket */ + if ((socket = SFSocketAlloc()) == NULL) { + printf("Alloc Failed\n"); + return(1); + } + + /* Initialize SSL Socket */ + if (SFSocketInit(socket, CA_FILE, NULL, KEY_FILE, KEY_PASSWORD, NULL) < 0) { + printf("Init Failed\n"); + return(2); + } + + /* Connect to Host */ + if (SFSocketConnectToHost(socket, HOSTNAME, PORT) < 0) { + printf("Connect to Host Failed\n"); + return(3); + } + + /* Send Message to Server */ + strcpy(buffer, "Hello from Client!"); + SFSocketWrite(socket, buffer, strlen(buffer)); + + /* Read Message from Server */ + if ((rdSize = SFSocketRead(socket, buffer, 1024 - 1)) > 0) { + buffer[rdSize] = '\0'; + printf("Server: %s\n", buffer); + } + + /* Close and Release Socket Resources */ + SFSocketRelease(socket); + + return(0); +} + diff --git a/transaction/SSL-Example/server.c b/transaction/SSL-Example/server.c new file mode 100755 index 000000000..24db3c39d --- /dev/null +++ b/transaction/SSL-Example/server.c @@ -0,0 +1,67 @@ +#include +#include +#include + +#include "SFSocket.h" + +#define CA_FILE "SSL-Example/ca.crt" +#define DH_FILE "SSL-Example/dh_param_1024.pem" +#define KEY_FILE "SSL-Example/server.crt" +#define KEY_PASSWORD "test" + +#define PORT 7085 + +int main (int argc, char **argv) { + SFSocket *socket; + + /* Initialize SSL */ + SFSocketGlobalInit(); + + /* Alloc Socket */ + if ((socket = SFSocketAlloc()) == NULL) { + printf("Alloc Failed\n"); + return(1); + } + + /* Initialize SSL Socket */ + if (SFSocketInit(socket, CA_FILE, DH_FILE, KEY_FILE, KEY_PASSWORD, NULL) < 0) + { + printf("Init Context Failed\n"); + return(2); + } + + /* Listen on Address/Port */ + if (SFSocketListen(socket, INADDR_ANY, PORT) < 0) { + printf("Listen Failed\n"); + return(3); + } + + do { + SFSocket *clientSocket; + char buffer[1024]; + int rdSize; + + /* Accept Client Connection */ + if ((clientSocket = SFSocketAccept(socket)) == NULL) + break; + + /* Read Data from Client */ + if ((rdSize = SFSocketRead(clientSocket, buffer, 1024 - 1)) > 0) { + buffer[rdSize] = '\0'; + printf("Client: %s\n", buffer); + } + + /* Write to Client */ + strcpy(buffer, "Hello Client!"); + SFSocketWrite(clientSocket, buffer, strlen(buffer)); + + /* Disconnect Client */ + SFSocketRelease(clientSocket); + } while (1); + + /* Close and Release Socket Resources */ + SFSocketRelease(socket); + + return(0); +} + diff --git a/transaction/main.h b/transaction/main.h new file mode 100644 index 000000000..fc6189554 --- /dev/null +++ b/transaction/main.h @@ -0,0 +1,153 @@ +/************************************************************************************ + * + * Main.h + * + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#include "OTMessage.h" +#include "OTClientConnection.h" + +/* +#define TYPE_1_CMD_1 1 +#define TYPE_1_CMD_2 2 +#define TYPE_1_CMD_3 3 +#define TYPE_1_CMD_4 4 + +#define CMD_TYPE_1 1 + +#define OT_CMD_HEADER_SIZE 7 +*/ + + +typedef std::list listOfConnections; + + +#endif // __MAIN_H__ diff --git a/transaction/ot_server.cfg b/transaction/ot_server.cfg new file mode 100644 index 000000000..62f053e2a --- /dev/null +++ b/transaction/ot_server.cfg @@ -0,0 +1,5 @@ + +[logging] +logfile_path=/Users/au/Projects/Open-Transactions/transaction/ot.log +log_level=0 + diff --git a/transaction/testserver.cpp b/transaction/testserver.cpp new file mode 100644 index 000000000..2a6f4c27a --- /dev/null +++ b/transaction/testserver.cpp @@ -0,0 +1,589 @@ +/************************************************************************************ + * + * server.cpp (as opposed to OTServer, this is the project's encapsulation.) + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + +#ifdef _WIN32 +#include "OTLib/stdafx.h" +#endif + +#include +#include + +extern "C" +{ +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +#include "SSL-Example/SFSocket.h" +} + + + +#include "SimpleIni.h" + + + +#include "OTLog.h" +#include "OTStorage.h" + + +// NOTE: The PATH and the PASSWORD are configurable on the command line!!! +// +// They are only here for convenience, so I don't have to type them +// over and over again. You can blank them out if you want, or set +// them to whatever is convenient for you on your system. +// + +#define KEY_PASSWORD "test" + +#ifdef _WIN32 +#define SERVER_PATH_DEFAULT "C:\\~\\Open-Transactions\\transaction\\data_folder" +#define CA_FILE "certs\\special\\ca.crt" +#define DH_FILE "certs\\special\\dh_param_1024.pem" +#define KEY_FILE "certs\\special\\server.pem" + +#else + +#define SERVER_PATH_DEFAULT "./data_folder" +#define CA_FILE "certs/special/ca.crt" +#define DH_FILE "certs/special/dh_param_1024.pem" +#define KEY_FILE "certs/special/server.pem" + +#endif + +// NOTE: this SSL connection is entirely different from the user's cert/pubkey that he uses for his UserID while +// talking to the server. I may be using the same key for that, but this code here is not about my wallet talking +// to its mint. Rather, it's about an SSL client app talking to an SSL server, at a lower layer, before my app's +// intelligence takes over. Just like when you use SSH to connect somewhere on a terminal. There is some immediate +// key negotiation going on. Once connected, you might run software that asks you for a public key, which could be +// AN ENTIRELY DIFFERENT PUBLIC KEY. THAT is where, metaphorically, your Public Key / User ID comes into play. + + +#include + +#include "main.h" + +#include "OTMessage.h" +#include "OTServer.h" +#include "OTClientConnection.h" + +#include "OTLog.h" + + + + + +/* + if (bSuccess = theServer.ProcessUserCommand(theMessage, theReply)) + { + OTLog::vOutput(1, "Successfully processed user command: %s\n", theMessage.m_strCommand.Get()); + ProcessReply(ssl, theReply); + } + else + { + OTLog::Output(1, "Unable to process user command in XML, or missing payload, in ProcessMessage.\n"); + } + + */ + + + +int main (int argc, char **argv) +{ + OTLog::vOutput(0, "\n\nWelcome to Open Transactions... Test Server -- version %s\n" + "(transport build: OTMessage -> TCP -> SSL)\n" + "IF YOU PREFER TO USE XmlRpc with HTTP, then rebuild from main folder like this:\n\n" + "cd ..; make clean; make rpc\n\n", + OTLog::Version()); + + // ----------------------------------------------------------------------- + + // This object handles all the actual transaction notarization details. + // (This file you are reading is a wrapper for OTServer, which adds the transport layer.) + OTServer theServer; + + // ----------------------------------------------------------------------- + +#ifdef _WIN32 + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD( 2, 2 ); + int nWSA = WSAStartup( wVersionRequested, &wsaData ); + OT_ASSERT_MSG(0 != nWSA, "Error calling WSAStartup.\n"); +#endif + + OTLog::vOutput(0, "\n\nWelcome to Open Transactions, version %s.\n\n", OTLog::Version()); + + // ----------------------------------------------------------------------- + // The beginnings of an INI file!! + +#ifndef _WIN32 // if UNIX (NOT windows) + wordexp_t exp_result; + wordexp(OT_INI_FILE_DEFAULT, &exp_result, 0); + + const OTString strIniFileDefault(exp_result.we_wordv[0]); + + wordfree(&exp_result); +#else + const OTString strIniFileDefault(OT_INI_FILE_DEFAULT); +#endif + + OTString strPath(SERVER_PATH_DEFAULT); + + { + CSimpleIniA ini; + + SI_Error rc = ini.LoadFile(strIniFileDefault.Get()); + + if (rc >=0) + { + const char * pVal = ini.GetValue("paths", "server_path", SERVER_PATH_DEFAULT); // todo stop hardcoding. + + if (NULL != pVal) + { + strPath.Set(pVal); + OTLog::vOutput(0, "Reading ini file (%s). \n Found Server data_folder path: %s \n", + strIniFileDefault.Get(), strPath.Get()); + } + else + { + strPath.Set(SERVER_PATH_DEFAULT); + OTLog::vOutput(0, "Reading ini file (%s): \n Failed reading Server data_folder path. Using: %s \n", + strIniFileDefault.Get(), strPath.Get()); + } + } + else + { + strPath.Set(SERVER_PATH_DEFAULT); + OTLog::vOutput(0, "Unable to load ini file (%s) to find data_folder path\n Will assume that server data_folder is at path: %s \n", + strIniFileDefault.Get(), strPath.Get()); + } + } + // ----------------------------------------------------------------------- + + OTString strCAFile, strDHFile, strKeyFile; + //, strSSLPassword; + + if (argc < 1) + { + OTLog::vOutput(0, "\n==> USAGE: %s [absolute_path_to_data_folder]\n\n" + + // OTLog::vOutput(0, "\n==> USAGE: %s [absolute_path_to_data_folder]\n\n" +#if defined (FELLOW_TRAVELER) + // "(Password defaults to '%s' if left blank.)\n" + "(Folder defaults to '%s' if left blank.)\n" +#else + "The test password is always 'test'.\n" + "OT will try to read the data_folder path from your ini file. If you prefer\n" + "to specify it at the command line, and you want to see the exact path, type:\n" + " cd data_folder && pwd && cd ..\n" +#endif + "\n\n", argv[0] +#if defined (FELLOW_TRAVELER) + // , KEY_PASSWORD, + , strPath.Get() +#endif + ); + +#if defined (FELLOW_TRAVELER) + // strSSLPassword.Set(KEY_PASSWORD); + OTLog::SetMainPath(strPath.Get()); +#else + exit(1); +#endif + } + else if (argc < 2) + { + // strSSLPassword.Set(argv[1]); + OTLog::SetMainPath(strPath.Get()); + } + else + { + // strSSLPassword.Set(argv[1]); + OTLog::SetMainPath(argv[1]); // formerly [2] + } + + OTLog::vOutput(0, "Using as path to data folder: %s\n", OTLog::Path()); + + strCAFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), CA_FILE); + strDHFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), DH_FILE); + strKeyFile.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), KEY_FILE); + + + // ----------------------------------------------------------------------- + + // Init loads up server's nym so it can decrypt messages sent in envelopes. + // It also does various other initialization work. + // + // (Envelopes prove that ONLY someone who actually had the server contract, + // and had loaded it into his wallet, could ever connect to the server or + // communicate with it. And if that person is following the contract, there + // is only one server he can connect to, and one key he can use to talk to it.) + + OTLog::Output(0, + "\n\nNow loading the server nym, which will also ask you for a password, to unlock\n" + "its private key. (Default password is \"test\".)\n"); + + // Initialize SSL -- This MUST occur before any Private Keys are loaded! + SFSocketGlobalInit(); // Any app that uses OT has to initialize SSL first. + + theServer.Init(); // Keys, etc are loaded here. + + // ----------------------------------------------------------------------- + + // We're going to listen on the same port that is listed in our server contract. + // + // + OTString strHostname; // The hostname of this server, according to its own contract. + int nPort=0; // The port of this server, according to its own contract. + + OT_ASSERT_MSG(theServer.GetConnectInfo(strHostname, nPort), + "Unable to find my own connect info (which is in my server contract BTW.)\n"); + + const int nServerPort = nPort; + + // ----------------------------------------------------------------------- + + + SFSocket *socket = NULL; + listOfConnections theConnections; + + // Alloc Socket + socket = SFSocketAlloc(); + OT_ASSERT_MSG(NULL != socket, "SFSocketAlloc Failed\n"); + + // Initialize SSL Socket + int nSFSocketInit = SFSocketInit(socket, + strCAFile.Get(), + strDHFile.Get(), + strKeyFile.Get(), + strSSLPassword.Get(), + NULL); + + OT_ASSERT_MSG(nSFSocketInit >= 0, "SFSocketInit Context Failed\n"); + + // Listen on Address/Port + int nSFSocketListen = SFSocketListen(socket, INADDR_ANY, nServerPort); + + OT_ASSERT_MSG(nSFSocketListen >= 0, "nSFSocketListen Failed\n"); + + + theServer.ActivateCron(); + + do + { + SFSocket * clientSocket = NULL; + + // Accept Client Connection + if (NULL != (clientSocket = SFSocketAccept(socket))) + { + OTClientConnection * pClient = new OTClientConnection(*clientSocket, theServer); + theConnections.push_back(pClient); + OTLog::Output(0, "Accepting new connection.\n"); + } + + // READ THROUGH ALL CLIENTS HERE, LOOP A LIST + // AND process in-buffer onto our list of messages. + + OTClientConnection * pConnection = NULL; + + for (listOfConnections::iterator ii = theConnections.begin(); + ii != theConnections.end(); ++ii) + { + if (pConnection = *ii) + { + // Here we read the bytes from the pipe into the client's buffer + // As necessary this function also processes those bytes into OTMessages + // and adds them to the Input List for that client. + pConnection->ProcessBuffer(); + } + } + + + + // Now loop through them all again, and process their messages onto the reply list. + + pConnection = NULL; + + for (listOfConnections::iterator ii = theConnections.begin(); + ii != theConnections.end(); ++ii) + { + if (pConnection = *ii) + { + OTMessage * pMsg = NULL; + + while (pMsg = pConnection->GetNextInputMessage()) + { + OTMessage * pReply = new OTMessage; + + OT_ASSERT(NULL != pReply); + + if (theServer.ProcessUserCommand(*pMsg, *pReply, pConnection)) + { + OTLog::vOutput(0, "Successfully processed user command: %s.\n", + pMsg->m_strCommand.Get()); + + pConnection->AddToOutputList(*pReply); + } + else + { + OTLog::Output(0, "Unable to process user command in XML, or missing payload, in main.\n"); + delete pReply; + pReply = NULL; + } + + // I am responsible to delete this here. + delete pMsg; + pMsg = NULL; + } + } + } + + + // Now loop through them all again, and process their replies down the pipe + + pConnection = NULL; + + for (listOfConnections::iterator ii = theConnections.begin(); + ii != theConnections.end(); ++ii) + { + if (pConnection = *ii) + { + OTMessage * pMsg = NULL; + + while (pMsg = pConnection->GetNextOutputMessage()) + { + pConnection->ProcessReply(*pMsg); + + // I am responsible to delete this here. + delete pMsg; + pMsg = NULL; + } + } + } + + + + + + // The Server now processes certain things on a regular basis. + // This method call is what gives it the opportunity to do that. + + theServer.ProcessCron(); + + + + + // Now go to sleep for a tenth of a second. + // (Main loop processes ten times per second, currently.) + + OTLog::SleepMilliseconds(100); // 100 ms == (1 second / 10) + + + + + } while (1); + + // Close and Release Socket Resources + SFSocketRelease(socket); + +#ifdef _WIN32 + WSACleanup(); +#endif + + return(0); +} + +/* + int do_server_loop(SSL *ssl) + { + int err, nread; + union u_header theCMD; + int retVal = 0; + int bClosed = 0; + + do + { + // clear the buffer. + memset((void *)theCMD.buf, 0, OT_CMD_HEADER_SIZE); + + for (nread = 0; nread < OT_CMD_HEADER_SIZE; nread += err) + { + err = SSL_read(ssl, theCMD.buf + nread, OT_CMD_HEADER_SIZE - nread); + if (err <= 0) + { + bClosed = 1; + break; + } + } + + if (bClosed) + break; + + OTLog::vOutput(0, "\n===> Processing header from client message. First 5 bytes are: %d %d %d %d %d...\n", + theCMD.buf[0],theCMD.buf[1],theCMD.buf[2],theCMD.buf[3],theCMD.buf[4]); + + ProcessMessage(ssl, &theCMD); + } + while (!(retVal = ((SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN) ? 1 : 0))); + return retVal; + } + + + +*/ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/transaction/transaction.xcodeproj/project.pbxproj b/transaction/transaction.xcodeproj/project.pbxproj new file mode 100644 index 000000000..bdf2dee57 --- /dev/null +++ b/transaction/transaction.xcodeproj/project.pbxproj @@ -0,0 +1,263 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 830EC91611F8CA6200198F04 /* testserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 830EC91511F8CA6200198F04 /* testserver.cpp */; }; + 8392266811B341F800AF54AF /* libOTLib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8392266711B341F800AF54AF /* libOTLib.dylib */; }; + 839237A011BB4ACC00AF54AF /* OTServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8392379F11BB4ACC00AF54AF /* OTServer.cpp */; }; + 83923C1E11BDC57300AF54AF /* SFSocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 83923C1A11BDC57300AF54AF /* SFSocket.c */; }; + 83923CF411BDDAB900AF54AF /* OTClientConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83923CF311BDDAB900AF54AF /* OTClientConnection.cpp */; }; + 83AC1788120BCFCA00C5A816 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 83AC1787120BCFCA00C5A816 /* Makefile */; }; + 8DD76F6A0486A84900D96B5E /* transaction.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* transaction.1 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 8DD76F6A0486A84900D96B5E /* transaction.1 in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 830EC91511F8CA6200198F04 /* testserver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = testserver.cpp; sourceTree = ""; }; + 8392262711B3415D00AF54AF /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = ""; }; + 8392266711B341F800AF54AF /* libOTLib.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libOTLib.dylib; sourceTree = ""; }; + 8392379E11BB4ACC00AF54AF /* OTServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTServer.h; sourceTree = ""; }; + 8392379F11BB4ACC00AF54AF /* OTServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTServer.cpp; sourceTree = ""; }; + 83923C1A11BDC57300AF54AF /* SFSocket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SFSocket.c; sourceTree = ""; }; + 83923C1B11BDC57300AF54AF /* SFSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFSocket.h; sourceTree = ""; }; + 83923CF211BDDAB900AF54AF /* OTClientConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OTClientConnection.h; sourceTree = ""; }; + 83923CF311BDDAB900AF54AF /* OTClientConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OTClientConnection.cpp; sourceTree = ""; }; + 83AC1787120BCFCA00C5A816 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 8DD76F6C0486A84900D96B5E /* transaction */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transaction; sourceTree = BUILT_PRODUCTS_DIR; }; + C6859E8B029090EE04C91782 /* transaction.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = transaction.1; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8392266811B341F800AF54AF /* libOTLib.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* transaction */ = { + isa = PBXGroup; + children = ( + 8392266711B341F800AF54AF /* libOTLib.dylib */, + 83AC1787120BCFCA00C5A816 /* Makefile */, + 08FB7795FE84155DC02AAC07 /* Source */, + C6859E8C029090F304C91782 /* Documentation */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = transaction; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 83923CF211BDDAB900AF54AF /* OTClientConnection.h */, + 83923CF311BDDAB900AF54AF /* OTClientConnection.cpp */, + 8392379E11BB4ACC00AF54AF /* OTServer.h */, + 8392379F11BB4ACC00AF54AF /* OTServer.cpp */, + 83923C0C11BDC57300AF54AF /* SSL-Example */, + 8392262711B3415D00AF54AF /* main.h */, + 830EC91511F8CA6200198F04 /* testserver.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* transaction */, + ); + name = Products; + sourceTree = ""; + }; + 83923C0C11BDC57300AF54AF /* SSL-Example */ = { + isa = PBXGroup; + children = ( + 83923C1A11BDC57300AF54AF /* SFSocket.c */, + 83923C1B11BDC57300AF54AF /* SFSocket.h */, + ); + path = "SSL-Example"; + sourceTree = ""; + }; + C6859E8C029090F304C91782 /* Documentation */ = { + isa = PBXGroup; + children = ( + C6859E8B029090EE04C91782 /* transaction.1 */, + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* transaction */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "transaction" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = transaction; + productInstallPath = "$(HOME)/bin"; + productName = transaction; + productReference = 8DD76F6C0486A84900D96B5E /* transaction */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "transaction" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* transaction */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* transaction */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 839237A011BB4ACC00AF54AF /* OTServer.cpp in Sources */, + 83923C1E11BDC57300AF54AF /* SFSocket.c in Sources */, + 83923CF411BDDAB900AF54AF /* OTClientConnection.cpp in Sources */, + 830EC91611F8CA6200198F04 /* testserver.cpp in Sources */, + 83AC1788120BCFCA00C5A816 /* Makefile in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "_GLIBCXX_DEBUG=1", + "_GLIBCXX_DEBUG_PEDANTIC=1", + ); + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = transaction; + }; + name = Debug; + }; + 1DEB923308733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = transaction; + }; + name = Release; + }; + 1DEB923608733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LIBRARY_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/transaction\""; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/OTLib\""; + }; + name = Debug; + }; + 1DEB923708733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LIBRARY_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/transaction\""; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "\"/Users/REDACTED/Projects/Open-Transactions/OTLib\""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "transaction" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug */, + 1DEB923308733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "transaction" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug */, + 1DEB923708733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/transaction/transaction/applink.c b/transaction/transaction/applink.c new file mode 100755 index 000000000..7789bd930 --- /dev/null +++ b/transaction/transaction/applink.c @@ -0,0 +1,94 @@ +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +#include +#include +#include + +static void *app_stdin(void) { return stdin; } +static void *app_stdout(void) { return stdout; } +static void *app_stderr(void) { return stderr; } +static int app_feof(FILE *fp) { return feof(fp); } +static int app_ferror(FILE *fp) { return ferror(fp); } +static void app_clearerr(FILE *fp) { clearerr(fp); } +static int app_fileno(FILE *fp) { return _fileno(fp); } +static int app_fsetmod(FILE *fp,char mod) +{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +#if defined(__BORLANDC__) +__stdcall /* __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. */ +#else +__cdecl +#endif +OPENSSL_Applink(void) +{ static int once=1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX}; + + if (once) + { OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/transaction/transaction/stdafx.cpp b/transaction/transaction/stdafx.cpp new file mode 100755 index 000000000..945259ad7 --- /dev/null +++ b/transaction/transaction/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// transaction.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/transaction/transaction/stdafx.h b/transaction/transaction/stdafx.h new file mode 100755 index 000000000..47a0d0252 --- /dev/null +++ b/transaction/transaction/stdafx.h @@ -0,0 +1,15 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: reference additional headers your program requires here diff --git a/transaction/transaction/targetver.h b/transaction/transaction/targetver.h new file mode 100755 index 000000000..90e767bfc --- /dev/null +++ b/transaction/transaction/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/transaction/transaction/transaction.cpp b/transaction/transaction/transaction.cpp new file mode 100755 index 000000000..b4dd454d8 --- /dev/null +++ b/transaction/transaction/transaction.cpp @@ -0,0 +1,12 @@ +// transaction.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" + +/* +int _tmain(int argc, _TCHAR* argv[]) +{ + return 0; +} + +*/ diff --git a/transaction/transaction/transaction.vcxproj b/transaction/transaction/transaction.vcxproj new file mode 100644 index 000000000..b96f37f38 --- /dev/null +++ b/transaction/transaction/transaction.vcxproj @@ -0,0 +1,111 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0E0420E9-6349-4A35-9B39-D06C4AF1692D} + Win32Proj + transaction + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + C:\~\OpenSSL-Win32\include;C:\~\Open-Transactions\XmlRpcC4Win;C:\~\Open-Transactions\OTLib;$(IncludePath) + C:\~\OpenSSL-Win32\lib\VC;C:\~\Open-Transactions\OTLib\OTLib\Debug;$(LibraryPath) + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;OT_ZMQ_MODE;%(PreprocessorDefinitions) + + + Console + true + winmm.lib;ws2_32.lib;libeay32MTd.lib;ssleay32MTd.lib;OTLib.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + + + + + + + + + + + + true + + + + + + + + + + true + + + true + + + + + + + + + + \ No newline at end of file diff --git a/transaction/xmlrpcxx_server.cpp b/transaction/xmlrpcxx_server.cpp new file mode 100644 index 000000000..0b6957973 --- /dev/null +++ b/transaction/xmlrpcxx_server.cpp @@ -0,0 +1,755 @@ +/************************************************************************************ + * + * xmlrpcxx_server.cpp (The web-services implementation of the Open Transactions server.) + */ + +/************************************************************ + -----BEGIN PGP SIGNED MESSAGE----- + Hash: SHA1 + + * OPEN TRANSACTIONS + * + * Financial Cryptography and Digital Cash + * Library, Protocol, API, Server, and GUI + * + * -- Anonymous Numbered Accounts. + * -- Untraceable Digital Cash. + * -- Triple-Signed Receipts. + * -- Cheques, Vouchers, Transfers, Inboxes. + * -- Basket Currencies, Markets, Payment Plans. + * -- Signed, XML, Ricardian-style Contracts. + * + * Copyright (C) 2010-2011 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * FellowTraveler@rayservers.net --- SEE PGP KEY BELOW. + * F3llowTraveler@gmail.com --- (not preferred.) + * + * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * OFFICIAL PROJECT WIKI(s): + * https://github.com/FellowTraveler/Moneychanger + * https://github.com/FellowTraveler/Open-Transactions/wiki + * + * WEBSITE: + * http://www.OpenTransactions.org/ + * + * Components and licensing: + * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3 + * -- OTLib.........A class library.......LICENSE:...LAGPLv3 + * -- OT-API........A client API..........LICENSE:...LAGPLv3 + * -- testwallet....Command-line client...LICENSE:...LAGPLv3 + * -- OT-Server.....Server Application....LICENSE:....AGPLv3 + * Github.com/FellowTraveler/Open-Transactions/wiki/Components + * + * All of the above OT components were designed and written by + * Fellow Traveler, with the exception of Moneychanger, which + * was contracted out to Vicky C (livewire_3001@yahoo.com). + * + * ----------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * ADDITIONAL PERMISSION under the GNU Affero GPL version 3 + * section 7: (This paragraph applies only to the LAGPLv3 + * components listed above.) If you modify this Program, or + * any covered work, by linking or combining it with other + * code, such other code is not for that reason alone subject + * to any of the requirements of the GNU Affero GPL version 3. + * (==> This means if you are only using the OT-API, then you + * don't have to open-source your code--only your changes to + * Open Transactions itself must be open source. Similar to + * LGPLv3, except it applies to software-as-a-service, not + * just to distributing binaries.) + * + * Extra WAIVER for OpenSSL, Lucre, and all other libraries + * used by Open Transactions: This program is released under + * the AGPL with the additional exemption that compiling, + * linking, and/or using OpenSSL is allowed. The same is true + * for any other open source libraries included in this + * project: complete waiver from the AGPL is hereby granted to + * compile, link, and/or use them with Open Transactions, + * according to their own terms, as long as the rest of the + * Open Transactions terms remain respected, with regard to + * the Open Transactions code itself. + * + * Lucre License: + * This code is also "dual-license", meaning that Ben Lau- + * rie's license must also be included and respected, since + * the code for Lucre is also included with Open Transactions. + * See Open-Transactions/OTLib/Lucre/LUCRE_LICENSE.txt + * The Laurie requirements are light, but if there is any + * problem with his license, simply remove the Lucre code. + * Although there are no other blind token algorithms in Open + * Transactions (yet. credlib is coming), the other functions + * will continue to operate. + * ----------------------------------------------------- + * You should have received a copy of the GNU Affero General + * Public License along with this program. If not, see: + * http://www.gnu.org/licenses/ + * + * If you would like to use this software outside of the free + * software license, please contact FellowTraveler. + * (Unfortunately many will run anonymously and untraceably, + * so who could really stop them?) + * + * DISCLAIMER: + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Affero General Public License for + * more details. + + -----BEGIN PGP SIGNATURE----- + Version: GnuPG v1.4.11 (Darwin) + + iQIcBAEBAgAGBQJOiDLNAAoJEAMIAO35UbuOHZ8P/2FButaqcu7+z2wYmYKwm2Ki + hECaUkzqOiT/FJZGBmNTiXxsBc8G1c2mPjB+MUT0cuow8+THBwzhifXRP2mmz03K + 7QqPc8I01q2wtG9C/BnfTLJ/rmkWHcrUsSMQe4nLW4F7fVB9A74J0Jivzq3ItC9F + R/dBqj84zRM0jObW04ndXuJsvGtN3Arp8hujanLfuepOj8Bayu04awuGvmVOBW+U + GqAxKnhW984QlEttydwMgmpDdDtNoBNWeGJKlkYV+T7z2M1ajAaLRje5+FyZZ5cU + BCIp+RKUCLx4jUKCTBh2D9gXog/H5fXNGkpA8IrY9zFp0QABvNfNQLmwTeAT8mEp + Dji07lfPqXu4AezHoWv8n56ew8W2gpTypCX9tL1HnPhCYOAzV+/EVLZqzpJliJV3 + 0dwmO3W0aOsmTjXV2w5Ll4sx2UBi+d4eoVUGE1xYEpDpNoD1NLtysTJILRwFsQAX + 5X+LLzyoIRV+Sx/2N1S3l2fTZNK9EGVbjzJruASphiIrjk3NBQaThIIOLHqsPaTH + RhRoCDpmm80uzWZJr0Mi7JAQmgSmralZAT8tCrD2VYq9mL9RHhwQ/fyXttFEEN+s + DN/7M35z/u3wy3GikVknlzPcm+q4NaZMZJiynh5GeU++A0APh15clYqOsB5Zxe8O + qg/U8uXzgLQuLbFxBjyr + =utx2 + -----END PGP SIGNATURE----- + **************************************************************/ + + + +// NOTE: The PATH and the PASSWORD are configurable on the command line!!! +// Path is also now configurable in the ini file. +// They are only here as DEFAULTS for convenience, so I don't have to +// type them over and over again. You can blank them out if you want, +// or set them to whatever is convenient for you on your system. +// + +#define KEY_PASSWORD "test" + +// password is deprecated. + +// ------------------------------------------------ + +// TODO: what about android for all the defaults here? Are there ini files in android? Revisit. +// so far, treating it like unix since it is. + +#ifdef _WIN32 + +#define OT_INI_FILE_DEFAULT "C:\\ot.ini" +#define SERVER_PATH_DEFAULT "C:\\~\\Open-Transactions\\transaction\\server_data" +#define CA_FILE "certs\\special\\ca.crt" +#define DH_FILE "certs\\special\\dh_param_1024.pem" +#define KEY_FILE "certs\\special\\server.pem" + +#else // UNIX + +#define OT_INI_FILE_DEFAULT "~/.ot/ot_init.cfg" +#define SERVER_PATH_DEFAULT "./server_data" +#define CA_FILE "certs/special/ca.crt" +#define DH_FILE "certs/special/dh_param_1024.pem" +#define KEY_FILE "certs/special/server.pem" + +#endif + +// NOTE: the CA file, DH file, and Key file are most likely not necessary in this XML-RPC version. +// I left them here for now but so far I don't see that I need them for anything. + +// ---------------------------------------------------------------- + +#ifdef _WIN32 +#include "OTLib/stdafx.h" +#endif + +#include +#include +#include + +#include +#include +#include +#include + + +#include + +//#include "zhelpers.hpp" + + +extern "C" +{ +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +#include +} + +// ------------------------------------ + + +#include "SimpleIni.h" + + +// ------------------------------------ + +//#include "XmlRpc.h" + +#include "OTStorage.h" + +#include "main.h" + +#include "OTMessage.h" +#include "OTEnvelope.h" + +#include "OTServer.h" + +#include "OTLog.h" + + +void ProcessMessage_ZMQ(const std::string & str_Message, std::string & str_Reply); + +// ------------------------------------------------------------- + +//using namespace XmlRpc; + + +// The HTTP server +//XmlRpcServer theXmlRpcServer; // This object handles the network transport. (Over HHTP, in this case.) + + +// The Open Transactions server +OTServer * g_pServer = NULL; // This object handles all the actual OT notarization processing. + + +// ------------------------------------------------------------- + +// This function is called for every OT Message that is sent for processing. +// One argument is passed, and a result string is passed back. +// +/* +class OT_XML_RPC : public XmlRpcServerMethod +{ +public: + OT_XML_RPC(XmlRpcServer* s) : XmlRpcServerMethod("OT_XML_RPC", s) + { + // Do I need to do anything here? Doubt it. + } + + void execute(XmlRpcValue& params, XmlRpcValue& result) + { + OT_ASSERT(NULL != g_pServer); + + // return value. + std::string resultString = ""; // Whatever we put in this string is what will get returned. + + // First we grab the client's message (it's the first parameter.) + std::string str_Message = std::string(params[0]); // Here I read the string containing the message. + OTASCIIArmor ascMessage = str_Message.c_str(); + + // ---------------------------------------------------------------------- + + OTMessage theMsg, theReply; // we'll need these in a sec... + + OTEnvelope theEnvelope(ascMessage); // Now the base64 is decoded and the envelope is in binary form again. + if (ascMessage.Exists()) + { + OTLog::Output(2, "Successfully retrieved envelope from XmlRpc argument string...\n"); + + OTString strEnvelopeContents; + + // Decrypt the Envelope. + if (theEnvelope.Open(g_pServer->GetServerNym(), strEnvelopeContents)) // now strEnvelopeContents contains the decoded message. + { + // All decrypted--now let's load the results into an OTMessage. + // No need to call theMsg.ParseRawFile() after, since + // LoadContractFromString handles it. + // + if (strEnvelopeContents.Exists() && theMsg.LoadContractFromString(strEnvelopeContents)) + { + + // In case you want to see all the incoming messages... +// OTLog::vOutput(0, "%s\n\n", strEnvelopeContents.Get()); + + // By constructing this without a socket, I put it in XmlRpc/http mode, instead of tcp/ssl. + OTClientConnection theClient(*g_pServer); + + // By optionally passing in &theClient, the client Nym's public key will be + // set on it whenever verification is complete. (So for the reply, I'll + // have the key and thus I'll be able to encrypt reply to the recipient.) + if (g_pServer->ProcessUserCommand(theMsg, theReply, &theClient)) + { + // At this point the reply is ready to go, and theClient has the public key of the recipient... + + OTLog::vOutput(0, "Successfully processed user command: %s.\n", theMsg.m_strCommand.Get()); + + // The transaction is now processed, and the server's reply message is in theReply. + // Let's seal it up to the recipient's nym (in an envelope) and send back to the user... + OTEnvelope theRecipientEnvelope; + + bool bSealed = theClient.SealMessageForRecipient(theReply, theRecipientEnvelope); + + if (bSealed) + { + OTASCIIArmor ascReply(theRecipientEnvelope); + resultString = ascReply.Get(); + } + else + OTLog::Output(0, "Unable to seal envelope in OT_XML_RPC.\n"); + } + else + OTLog::Output(0, "Unable to process user command in OT_XML_RPC.\n"); + } + else + OTLog::Error("Error loading message from envelope contents.\n"); + } + else + OTLog::Error("Unable to open envelope.\n"); + } + else + OTLog::Error("Error retrieving envelope from rpc.\n"); + + + // ---------------------------------------------------------------------- + + result = resultString; + + } +} theOTXmlRpc(&theXmlRpcServer); +*/ + + + +// ---------------------------------------------------------------------- + + +// The MAIN function for the server software, which starts up the XmlRpc (http server), +// as well as Open Transactions. +// +int main(int argc, char* argv[]) +{ + OTLog::vOutput(0, "\n\nWelcome to Open Transactions... Test Server -- version %s\n" + "(transport build: OTMessage -> OTEnvelope -> ZMQ )\n\n", OTLog::Version()); + // ----------------------------------------------------------------------- + +#ifdef _WIN32 + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD( 2, 2 ); + int nWSA = WSAStartup( wVersionRequested, &wsaData ); + OT_ASSERT_MSG(0 != nWSA, "Error calling WSAStartup.\n"); +#endif + + // ----------------------------------------------------------------------- + // I instantiate this here (instead of globally) so that I am assured all the globals + // are ready to go before the server is created. I still have it as a global pointer, though, + // so I can get to it wherever I need to. + g_pServer = new OTServer; + // (This file you are reading is a wrapper for OTServer, which adds the transport layer.) + + OT_ASSERT_MSG(NULL != g_pServer, "Unable to instantiate OT server...\n"); + + // ----------------------------------------------------------------------- + // The beginnings of an INI file!! + + OTString strIniFileDefault; + OTLog::TransformFilePath(OT_INI_FILE_DEFAULT, strIniFileDefault); + + OTString strPath, strRawPath(SERVER_PATH_DEFAULT); + + { + CSimpleIniA ini; + + SI_Error rc = ini.LoadFile(strIniFileDefault.Get()); + + if (rc >=0) + { + { + const char * pVal = ini.GetValue("paths", "server_path", SERVER_PATH_DEFAULT); // todo stop hardcoding. + + if (NULL != pVal) + { + strRawPath.Set(pVal); + OTLog::vOutput(0, "Reading ini file (%s). \n Found Server data_folder path: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + else + { + strRawPath.Set(SERVER_PATH_DEFAULT); + OTLog::vOutput(0, "Reading ini file (%s): \n Failed reading Server data_folder path. Using: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + } + } + else + { + strRawPath.Set(SERVER_PATH_DEFAULT); + OTLog::vOutput(0, "Unable to load ini file (%s) to find data_folder path\n Will assume that server data_folder is at path: %s \n", + strIniFileDefault.Get(), strRawPath.Get()); + } + } + + // ----------------------------------------------------------------------- + + OTString strCAFile, strDHFile, strKeyFile; //, strSSLPassword; + + OTLog::TransformFilePath(strRawPath.Get(), strPath); + + OTLog::SetMainPath(strPath.Get()); + + OTLog::vOutput(0, "Using data_folder path: %s\n", OTLog::Path()); + + strCAFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), CA_FILE); + strDHFile. Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), DH_FILE); + strKeyFile.Format("%s%s%s", OTLog::Path(), OTLog::PathSeparator(), KEY_FILE); + + + + // ----------------------------------------------------------------------- + + // Initialize SSL -- This MUST occur before any Private Keys are loaded! + SSL_library_init(); + SSL_load_error_strings(); + + // Init loads up server's nym so it can decrypt messages sent in envelopes. + // It also does various other initialization work. + // + // (Envelopes prove that ONLY someone who actually had the server contract, + // and had loaded it into his wallet, could ever connect to the server or + // communicate with it. And if that person is following the contract, there + // is only one server he can connect to, and one key he can use to talk to it.) + + OTLog::vOutput(0, + "\nNow loading the server nym, which will also ask you for a password, to unlock\n" + "its private key. (Default password is \"%s\".)\n", KEY_PASSWORD); + + g_pServer->Init(); // Keys, etc are loaded here. + + // ----------------------------------------------------------------------- + + // We're going to listen on the same port that is listed in our server contract. + // + // + OTString strHostname; // The hostname of this server, according to its own contract. + int nPort=0; // The port of this server, according to its own contract. + + OT_ASSERT_MSG(g_pServer->GetConnectInfo(strHostname, nPort), + "Unable to find my own connect info (which is in my server contract BTW.)\n"); + + const int nServerPort = nPort; + + // int nSFSocketInit = SFSocketInit(socket, + // strCAFile.Get(), + // strDHFile.Get(), + // strKeyFile.Get(), + // strSSLPassword.Get(), + // NULL); + + // ----------------------------------------------------------------------- + + // For re-occuring actions (like markets and payment plans.) + // + g_pServer->ActivateCron(); + + // ----------------------------------- + + //  Prepare our context and socket + zmq::context_t context(1); + zmq::socket_t socket(context, ZMQ_REP); + + OTString strBindPath; strBindPath.Format("%s%d", "tcp://*:", nServerPort); + + socket.bind(strBindPath.Get()); + + // ----------------------------------------------------------------------- + // Let's get the HTTP server up and running... + // Switching out XmlRpc for 0MQ (ZeroMQ) + // +// XmlRpc::setVerbosity(1); +// +// // Create the server socket on the specified port +// theXmlRpcServer.bindAndListen(nServerPort); +// +// // Enable introspection, so clients can see what services this server supports. (Open Transactions...) +// theXmlRpcServer.enableIntrospection(true); + + // ----------------------------------------------------------------------- + + //  Initialize poll set + zmq::pollitem_t items [] = + { + { socket, 0, ZMQ_POLLIN, 0 }, + }; + + // ---------------------------------------------------------- + + do // THE HEARTBEAT LOOP FOR THE OPEN-TRANSACTIONS SERVER! + { + // The Server now processes certain things on a regular basis. + // ProcessCron is what gives it the opportunity to do that. + // All of the Cron Items (including market trades, and payment plans...) have their hooks here... + // + g_pServer->ProcessCron(); + + // ----------------------------------------------------------------------- + + // Wait for client http requests (and process replies out to them.) + // +// theXmlRpcServer.work(10.0); // supposedly milliseconds -- but it's actually seconds. + + // Loop: process up to 10 client requests, then sleep for 1/10th second. + // + // Then: check for shutdown. + // + // Then: go back to the top and repeat.... process cron, loop 10 client requests, sleep, check for shutdown, etc. + // + // + + + for (int i = 0; i < /*10*/OTServer::GetHeartbeatNoRequests(); i++) + { + // Switching to ZeroMQ library. + zmq::message_t message; + + zmq::poll(&items[0], 1, 0); // non-blocking +// zmq::poll(&items[0], 1, -1); + + if ((items[0].revents & ZMQ_POLLIN) && socket.recv(&message, ZMQ_NOBLOCK)) + { +// socket.recv(&message); + + // Convert the ZMQ message to a std::string + std::string str_Message; + str_Message.reserve(message.size()); + str_Message.append(static_cast(message.data()), message.size()); + + //  Process task + std::string str_Reply; // Output. + ProcessMessage_ZMQ(str_Message, str_Reply); + + // ----------------------------------------------- + + // Convert the std::string (reply) into a ZMQ message + zmq::message_t reply (str_Reply.length()); + + if (str_Reply.length() > 0) + memcpy((void *) reply.data(), str_Reply.c_str(), str_Reply.length()); + + // -------------------------------- + //  Send reply back to client + + int nSendTries = 0; + bool bSuccessSending = false; + + // HALF-SECOND DELAY IF FAILURE SENDING REPLY... + // (While it tries to re-send 5 times.) + // + while ((nSendTries++ < OTLog::GetLatencySendNoTries()/*5*/) && (false == (bSuccessSending = socket.send(reply, ZMQ_NOBLOCK)))) + OTLog::SleepMilliseconds(/*100*/OTLog::GetLatencySendMs()); + + if (false == bSuccessSending) + OTLog::vError("Socket error: failed while trying to send reply back to client! \n\n MESSAGE:\n%s\n\nREPLY:\n%s\n\n", + str_Message.c_str(), str_Reply.c_str()); + } + } // for + // ----------------------------------------------------------------------- + + // Now go to sleep for a tenth of a second. + // (The main loop processes ten times per second, currently.) + + OTLog::SleepMilliseconds(/*100*/OTServer::GetHeartbeatMsBetweenBeats()); // 100 ms == (1 second / 10) + + // ----------------------------------------------------------------------- + // ARTIFICIAL LIMIT: + // 10 requests per heartbeat, 10 rounds per second == 100 requests per second. + // + // *** ONE HUNDRED CLIENT MESSAGES PER SECOND is the same as: + // + // 6000 PER MINUTE == 360,000 PER HOUR == 8,640,000 PER DAY*** + // + // Speeding it up is just a matter of adjusting the above numbers, and TESTING to see if OT can handle it. + // (Not counting optimization of course.) + // + // ----------------------------------------------------------------------- + + if (g_pServer->IsFlaggedForShutdown()) + { + OTLog::Output(0, "Server is shutting down gracefully....\n"); + break; + } + } while (1); + + + // TODO: cleanup OpenSSL here. + +#ifdef _WIN32 + WSACleanup(); +#endif + + return 0; +} + + + +void ProcessMessage_ZMQ(const std::string & str_Message, std::string & str_Reply) +{ + OT_ASSERT(NULL != g_pServer); + + if (str_Message.size() < 1) + return; + + // -------------------- + + // return value. + std::string resultString = ""; // Whatever we put in this string is what will get returned. + + // First we grab the client's message + OTASCIIArmor ascMessage; + ascMessage.MemSet(str_Message.data(), str_Message.size()); + + // ------------------ +// +// OTPayload thePayload; +// thePayload.SetPayloadSize(str_Message.size()); +// memcpy((void*)thePayload.GetPayloadPointer(), str_Message.data(), str_Message.size()); + + // ---------------------------------------------------------------------- + +// OTLog::vError("Envelope: \n%s\n Size: %ld\n", ascMessage.Get(), ascMessage.GetLength()); + + OTMessage theMsg, theReply; // we'll need these in a sec... + +// OTEnvelope theEnvelope(ascMessage); // Now the base64 is decoded and unpacked, and the envelope is in binary form again. + OTEnvelope theEnvelope; // Now the base64 is decoded and the envelope is in binary form again. + + if (theEnvelope.SetAsciiArmoredData(ascMessage)) + { + OTLog::Output(2, "Successfully retrieved envelope from ZMQ message...\n"); + + OTString strEnvelopeContents; + +// OTString strPubkeyPath("TESTPUBKEY.txt"); +// g_pServer->GetServerNym().SavePublicKey(strPubkeyPath); + + // Decrypt the Envelope. + if (theEnvelope.Open(g_pServer->GetServerNym(), strEnvelopeContents)) // now strEnvelopeContents contains the decoded message. + { + // All decrypted--now let's load the results into an OTMessage. + // No need to call theMsg.ParseRawFile() after, since + // LoadContractFromString handles it. + // + if (strEnvelopeContents.Exists() && theMsg.LoadContractFromString(strEnvelopeContents)) + { + + // In case you want to see all the incoming messages... + // OTLog::vOutput(0, "%s\n\n", strEnvelopeContents.Get()); + + // By constructing this without a socket, I put it in XmlRpc/http mode, instead of tcp/ssl. + OTClientConnection theClient(*g_pServer); + + // By optionally passing in &theClient, the client Nym's public key will be + // set on it whenever verification is complete. (So for the reply, I'll + // have the key and thus I'll be able to encrypt reply to the recipient.) + if (g_pServer->ProcessUserCommand(theMsg, theReply, &theClient)) + { + // At this point the reply is ready to go, and theClient has the public key of the recipient... + + OTLog::vOutput(1, "Successfully processed user command: %s.\n", theMsg.m_strCommand.Get()); + + // The transaction is now processed, and the server's reply message is in theReply. + // Let's seal it up to the recipient's nym (in an envelope) and send back to the user... + OTEnvelope theRecipientEnvelope; + + bool bSealed = theClient.SealMessageForRecipient(theReply, theRecipientEnvelope); + + if (bSealed) + { +// OTPayload theReplyPayload; +// theReplyPayload.SetEnvelope(theRecipientEnvelope); +// +// resultString = ascReply.Get(); +// resultString.assign(theReplyPayload.GetPayloadPointer(), theReplyPayload.GetPayloadSize()); + + OTASCIIArmor ascReply; + if (theRecipientEnvelope.GetAsciiArmoredData(ascReply)); + resultString.assign(ascReply.Get(), ascReply.GetLength()); + } + else + OTLog::Output(0, "Unable to seal envelope in ProcessMessage_ZMQ.\n"); + } + else + OTLog::Output(0, "Unable to process user command in ProcessMessage_ZMQ.\n"); + } + else + OTLog::Error("Error loading message from envelope contents. ProcessMessage_ZMQ.\n"); + } + else + OTLog::Error("Unable to open envelope. ProcessMessage_ZMQ.\n"); + } + else + OTLog::Error("Error retrieving envelope from ProcessMessage_ZMQ.\n"); + + // ---------------------------------------------------------------------- + + str_Reply = resultString; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/util/NOTES.txt b/util/NOTES.txt new file mode 100755 index 000000000..e1499e69c --- /dev/null +++ b/util/NOTES.txt @@ -0,0 +1,28 @@ + + + +After building otcreatemint, place it in the transactions folder. +Whenever a new asset type is created (issued by a user) the server needs +to create the mint to go along with it. The problem is, the key generation takes +a long time -- so I put it in a separate process (otcreatemint.) + +For now, after you issue an asset type, you need to run otcreatemint by hand +on the server side if you want to do withdrawals and deposits with that digital +asset type. + +In a future version, the server will fire off otcreatemint automatically whenever +an asset type is created. The user can then call getmint to get a copy of the file. +The call to getmint won't work right away (there will be a delay while the keys are +generated.) But after a while it WILL work, and then the user can grab the mint file, +and then he can make withdrawal requests in that asset type. + + + + + +After building signcontract, put it in the testwallet folder if you want. You can +use it to sign ANY unsigned contract, with ANY Nym as long as you have the password. + +You can also use the wallet to sign contracts. + + diff --git a/util/otcreatemint/Makefile b/util/otcreatemint/Makefile new file mode 100644 index 000000000..448ee1b07 --- /dev/null +++ b/util/otcreatemint/Makefile @@ -0,0 +1,269 @@ +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = createmint.exe + +DEBUG_PROGRAM = createmint.debug + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := ___OT_PLATFORM_UNKNOWN___ + + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + +PLATFORM = $(OT_PLATFORM) + + + +OT_INCLUDEDIRS = \ + -I../../OTLib/irrxml \ + -I../../OTLib/simpleini \ + -I../../OTLib \ + -I./ + + +OT_LIBDIRS = \ + -L../../OTLib + + +API_CXXSOURCES = # empty +API_CFLAGS = # empty +API_LDFLAGS = # empty + + +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +#API_LIBS = -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +#API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd + + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +endif + +# SSL Folders! + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c +endif + + +# --------------------------------------------------------------------- + + +ifeq ($(DSP), 1) +OT_UTIL_PLATFORM_INCLUDEDIRS = -I../../openssl/include +OT_UTIL_PLATFORM_LIBDIRS = -L../../openssl +else +OT_UTIL_PLATFORM_INCLUDEDIRS = #empty +OT_UTIL_PLATFORM_LIBDIRS = #empty +endif + +# --------------------------------------------------------------------- + + + + + +# +# Eventually more platform stuff can go below here, like 64-bit, etc. +# +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +API_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd +endif +# End DARWIN ------------------------------------------------------------- + + + +ifeq ($(PLATFORM), linux) + +API_LDFLAGS += -ldl + +API_LIBS = -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack +API_DEBUG_LIBS = -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack + +endif +# End LINUX ------------------------------------------------------------- + + + + +# --- FreeBSD ---- + +ifeq ($(PLATFORM), freebsd) +API_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd +endif +# End FreeBSD ------------------------------------------------------------- + + + + +INCLUDEDIRS = $(OT_UTIL_PLATFORM_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) + +LIBDIRS = $(OT_UTIL_PLATFORM_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + + +CXXSOURCES = \ + main.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +CXXFLAGS = $(INCLUDEDIRS) $(API_CFLAGS) $(FT_FLAGS) -c +DEBUG_FLAGS = -g +CXX = g++ + +LIBS = $(API_LIBS) +DEBUG_LIBS = $(API_DEBUG_LIBS) + +# --- LDFLAGS +# +LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(DEBUG_LIBS) + + + + + + + +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +LINK_COMMAND = $(CXX) $(LDFLAGS) -o $(PROGRAM) $(CXXOBJECTS) +DEBUG_LINK_COMMAND = $(CXX) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) $(CXXOBJECTS) +endif +# End DARWIN ------------------------------------------------------------- + +ifeq ($(PLATFORM), linux) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End LINUX ------------------------------------------------------------- + +# --- FreeBSD ---- +ifeq ($(PLATFORM), freebsd) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End FreeBSD ------------------------------------------------------------- + + + + +# --------------------------------------------------------------------- + +# --- TARGETS + +# +# Default target: the first target is the default target. +# Just type "make PLATFORM=darwin" to build it. +# + +$(PROGRAM): $(CXXOBJECTS) + $(LINK_COMMAND) + +all: $(PROGRAM) + +debug: CXXFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + $(DEBUG_LINK_COMMAND) + + + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +main.o: main.cpp + $(CXX) $(CXXFLAGS) -c -o main.o main.cpp + + +# +# +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) diff --git a/util/otcreatemint/Makefile.linux b/util/otcreatemint/Makefile.linux new file mode 100644 index 000000000..14c6d8978 --- /dev/null +++ b/util/otcreatemint/Makefile.linux @@ -0,0 +1,114 @@ +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = createmint.exe + +DEBUG_PROGRAM = createmint.debug + +# +# Command line parameters: Edit these parameters so that you can +# easily run the sample by typing "make -f Makefile.Linux run". +# + +# +# The INCLUDEDIRS macro contains a list of include directories +# to pass to the compiler so it can find necessary header files. +# +# The LIBDIRS macro contains a list of library directories +# to pass to the linker so it can find necessary libraries. +# +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +# + +INCLUDEDIRS = \ + -I/usr/local/ssl/include \ + -I../../OTLib/irrxml \ + -I../../OTLib \ + -I./ + + +LIBDIRS = \ + -L../../OTLib + + +LIBS = -ldl $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLib $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLib +DEBUG_LIBS = -ldl $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLibd $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLibd + +# +# The CXXSOURCES macro contains a list of source files. +# +# The CXXOBJECTS macro converts the CXXSOURCES macro into a list +# of object files. +# +# The CXXFLAGS macro contains a list of options to be passed to +# the compiler. Adding "-g" to this line will cause the compiler +# to add debugging information to the executable. +# +# The CXX macro defines the C++ compiler. +# +# The LDFLAGS macro contains all of the library and library +# directory information to be passed to the linker. +# + +CXXSOURCES = \ + main.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +CXXFLAGS = $(INCLUDEDIRS) +DEBUG_FLAGS = -g +CXX = g++ +LDFLAGS = $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(LIBDIRS) $(DEBUG_LIBS) + +# +# Default target: the first target is the default target. +# Just type "make -f Makefile.Linux" to build it. +# + +all: $(PROGRAM) + +debug: CXXFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(DEBUG_PROGRAM) + +# +# Link target: automatically builds its object dependencies before +# executing its link command. +# + +$(DEBUG_PROGRAM): $(CXXOBJECTS) + $(CXX) $(CXXOBJECTS) $(DEBUG_LIBS) -o $@ + +$(PROGRAM): $(CXXOBJECTS) + $(CXX) $(CXXOBJECTS) $(LIBS) -o $@ + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +main.o: main.cpp + $(CXX) $(CXXFLAGS) -c -o main.o main.cpp + + +# +# Clean target: "make -f Makefile.Linux clean" to remove unwanted objects and executables. +# +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make -f Makefile.Linux run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) diff --git a/util/otcreatemint/main.cpp b/util/otcreatemint/main.cpp new file mode 100755 index 000000000..02663455d --- /dev/null +++ b/util/otcreatemint/main.cpp @@ -0,0 +1,287 @@ +/************************************************************************************ + * + * main.cpp (OT Create Mint) + * + * Open Transactions: Library, Protocol, Server, and Test Client + * + * -- Anonymous Numbered Accounts + * -- Untraceable Digital Cash + * -- Triple-Signed Receipts + * -- Basket Currencies + * -- Signed XML Contracts + * + * Copyright (C) 2010 by "Fellow Traveler" (A pseudonym) + * + * EMAIL: + * F3llowTraveler@gmail.com --- SEE PGP PUBLIC KEY IN CREDITS FILE. + * + * KEY FINGERPRINT: + * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E + * + * WEBSITE: + * http://www.OpenTransactions.org + * + * OFFICIAL PROJECT WIKI: + * http://wiki.github.com/FellowTraveler/Open-Transactions/ + * + * ---------------------------------------------------------------- + * + * Open Transactions was written including these libraries: + * + * Lucre --- Copyright (C) 1999-2009 Ben Laurie. + * http://anoncvs.aldigital.co.uk/lucre/ + * irrXML --- Copyright (C) 2002-2005 Nikolaus Gebhardt + * http://irrlicht.sourceforge.net/author.html + * easyzlib --- Copyright (C) 2008 First Objective Software, Inc. + * Used with permission. http://www.firstobject.com/ + * PGP to OpenSSL --- Copyright (c) 2010 Mounir IDRASSI + * Used with permission. http://www.idrix.fr + * SFSocket --- Copyright (C) 2009 Matteo Bertozzi + * Used with permission. http://th30z.netsons.org/ + * + * ---------------------------------------------------------------- + * + * Open Transactions links to these libraries: + * + * OpenSSL --- (Version 1.0.0a at time of writing.) + * http://openssl.org/about/ + * zlib --- Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler + * + * ---------------------------------------------------------------- + * + * LICENSE: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * If you would like to use this software outside of the free software + * license, please contact FellowTraveler. (Unfortunately many will run + * anonymously and untraceably, so who could really stop them?) + * + * This library is also "dual-license", meaning that Ben Laurie's license + * must also be included and respected, since the code for Lucre is also + * included with Open Transactions. + * The Laurie requirements are light, but if there is any problem with his + * license, simply remove the deposit/withdraw commands. Although there are + * no other blind token algorithms in Open Transactions (yet), the other + * functionality will continue to operate. + * + * OpenSSL WAIVER: + * This program is released under the AGPL with the additional exemption + * that compiling, linking, and/or using OpenSSL is allowed. + * + * DISCLAIMER: + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + ************************************************************************************/ + + +extern "C" +{ +#include +#include +#include +} + +#include + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTAssetContract.h" +#include "OTMint.h" + +#include "OTLog.h" + + +// run this program from inside the transaction directory (it's a tool for creating mints for the server.) + +int main (int argc, char * const argv[]) +{ + if (argc < 5) + { + printf("\n\nUsage: createmint server_id server_user_id asset_type_id full_path_to_data_folder\n\n" + "For now, expiration dates are automatically set:\n" + "-- FROM: Today, Now.\n" + "-- TO: 6 months from now.\n\n" + "It is recommended that you issue a new series (create a new mint) every 3 months for each\n" + "asset type, so that there is a 3-month overlap. In the future, this will be configured inside\n" + "the contracts themselves.\n\n" + "Server ID needs to match the Server ID from notaryServer.xml\n" + "Server user ID needs to match the Server User ID from notaryServer.xml\n" + "Asset Type ID needs to match the Asset ID (aka Hashed Contract ID) of the currency contract.\n" + "The path to the data folder is necessary for initialization of the OT library.\n\n"); + exit(1); + } + + SSL_library_init(); + SSL_load_error_strings(); + + // ----------------------------------------- + + OTString strServerID(argv[1]), strServerNymID(argv[2]), strAssetTypeID(argv[3]); + OTIdentifier ASSET_TYPE_ID(strAssetTypeID), SERVER_ID(strServerID); + + std::string strDataFolderPath(argv[4]), strWalletFile("wallet.xml"); + + bool bSuccessInitDefault = OTDB::InitDefaultStorage(OTDB_DEFAULT_STORAGE, + OTDB_DEFAULT_PACKER, strDataFolderPath, strWalletFile); + + // ----------------------------------------- + + OTString strMintPath; + bool bFileIsPresent = false; + int nSeries = 0; + + for (nSeries = 0; nSeries < 1000; nSeries++) + { + struct stat st; + + strMintPath.Format("%s%s%s%s%s%s%s%s%d", + OTLog::Path(), + OTLog::PathSeparator(), + OTLog::MintFolder(), + OTLog::PathSeparator(), + strServerID.Get(), + OTLog::PathSeparator(), + strAssetTypeID.Get(), ".", nSeries); + + bFileIsPresent = (stat(strMintPath.Get(), &st) == 0); + + if (!bFileIsPresent) + break; + } + + // if bFileIsPresent is STILL true, that means we got all the way up to 1000 and the + // file was present every time. + // Geez, there must be 1000 mints on this computer. At one new Mint per 3 months, + // that's 4 per year, that's 250 years already!! + if (bFileIsPresent) + { + OTLog::Output(0, "This program automatically finds the next series, up to 1000. You\n" + "have reached 1000. You will have to change the source code of this\n" + "program in order to continue. Sorry.\n"); + exit(1); + } + + + // nSeries now contains the number we need to use for the next series. + // and strMintPath now contains the correct file path. + + OTMint * pMint = new OTMint(strServerID, strServerNymID, strAssetTypeID); + + OTString strSeries; strSeries.Format("%s%d", ".", nSeries); + // + if ((NULL != pMint) && pMint->LoadMint(strSeries.Get())) + { + OTLog::Output(0, "The mint already exists. Delete it first if you wish to re-create it.\n"); + } + else + { + OTLog::vOutput(0, "Mint file does not (yet) exist for series %d and asset type:\n%s\n Creating......\n", + nSeries, strAssetTypeID.Get()); + + if (pMint) + { + // TODO: read the denominations out of the asset contract itself, instead of hardcoding them here. + + + // Calculate FROM as Today, Now, + // then calculate TO as 6 months from now, + // and EXPIRATION as 3 months from now. + // + // TODO: Let these numbers be configured either in server operator contract, or issuer contract. + // In the meantime, 3 and 6 months are good enough. + + OTPseudonym theNym; + theNym.SetIdentifier(strServerNymID); + + // 1 hour == 3600 Seconds + // 1 day == 86400 Seconds + // 30 days == 2592000 Seconds + // 3 months == 7776000 Seconds + // 6 months == 15552000 Seconds + + + // This part requires the server operator to enter his passphrase. + // Which is why the server can't just fire it off automatically and + // make a mint available to the client. The client has to wait a day or + // until the operator is able to run this script and type the passphrase. + if (theNym.Loadx509CertAndPrivateKey()) + { + const time_t CURRENT_TIME = time(NULL), + VALID_TO = CURRENT_TIME + 15552000, // Tokens generated by this mint are valid from today until 6 months from today + MINT_EXPIRATION = CURRENT_TIME + 7776000; // The mint itself will expire in 3 months from today, and be replaced with a new one. + + pMint->GenerateNewMint(nSeries, CURRENT_TIME, VALID_TO, MINT_EXPIRATION, ASSET_TYPE_ID, SERVER_ID, + // penny, nickel, dime, quarter, $1, $5, $10, $20, $100, $1000 + theNym, 1, 5, 10, 25, 100, 500, 1000, 2000, 10000, 100000); + // should be: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 + + // --------------------------------------- + +// OTString strFilename;// strPUBLICFilename; +// strFilename. Format("%s%s%s", strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get()); +// strPUBLICFilename. Format("%s%s%s%sPUBLIC",strServerID.Get(), OTLog::PathSeparator(), strAssetTypeID.Get(), "."); + + OTString strServerFolder; + strServerFolder.Format("%s%s%s", OTLog::MintFolder(), OTLog::PathSeparator(), strServerID.Get()); + + if (OTLog::ConfirmOrCreateFolder(OTLog::MintFolder()) && + OTLog::ConfirmOrCreateFolder(strServerFolder.Get())) + { + // ------------------------------------------------------------------- + // This causes the next serialization to save the private, not just public, keys. + pMint->SetSavePrivateKeys(); // <== PRIVATE MINT VERSION. + + pMint->SignContract(theNym); + pMint->SaveContract(); + + pMint->SaveMint(); // save the private mint file as: path/mints/server_id/Asset_TypeID (overwriting the last "current mint"...) + pMint->SaveMint(strSeries.Get()); // save the private mint file as: path/mints/server_id/Asset_TypeID.nSeries (These accumulate.) + + // When the server needs to reference the "current" private keys, then it just loads the + // mint without specifying the series number. Since this file is overwritten with each new + // mint, it is thus always the latest one. (Similarly, the latest public is always asset_id.PUBLIC) + // On the other hand, if I need to load the keys for a specific series, (since more than one may be + // redeemable, even if only the latest one is being issued) then they are all also saved by series + // number, which is not overwritten with each new mint, but accumulates. + // That is why above, you see me save the mint twice in two different files, and below you see + // it being saved with the .PUBLIC appending to the filename. + +// pMint->SaveContract(OTLog::MintFolder(), strFilename.Get()); // save the mint file. + + // ------------------------------------------------------------------- + // Now I sign it again, to get the private keys out of there. + pMint->ReleaseSignatures(); + pMint->SignContract(theNym); + pMint->SaveContract(); + + pMint->SaveMint(".PUBLIC"); // save the public mint file. +// pMint->SaveContract(OTLog::MintFolder(), strPUBLICFilename.Get()); // save the public mint file. + + OTLog::Output(0, "Done.\n"); + } + else + OTLog::Output(0, "Error calling OTLog::ConfirmOrCreateFolder() for path/mints/server_id\n"); + } + else + OTLog::Output(0, "Error calling theNym.Loadx509CertAndPrivateKey()\n"); + } + else + { + OTLog::Output(0, "Error allocating memory for new OTMint.\n"); + } + } + + return 0; +} diff --git a/util/otcreatemint/otcreatemint.xcodeproj/project.pbxproj b/util/otcreatemint/otcreatemint.xcodeproj/project.pbxproj new file mode 100644 index 000000000..01f80bbc6 --- /dev/null +++ b/util/otcreatemint/otcreatemint.xcodeproj/project.pbxproj @@ -0,0 +1,229 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 834F388311EEFF05001CFD0F /* libOTLib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 834F388211EEFF05001CFD0F /* libOTLib.dylib */; }; + 83AC196C120FF90600C5A816 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 83AC196B120FF90600C5A816 /* Makefile */; }; + 8DD76F650486A84900D96B5E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* main.cpp */; settings = {ATTRIBUTES = (); }; }; + 8DD76F6A0486A84900D96B5E /* otcreatemint.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* otcreatemint.1 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 8DD76F6A0486A84900D96B5E /* otcreatemint.1 in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 08FB7796FE84155DC02AAC07 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 834F388211EEFF05001CFD0F /* libOTLib.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libOTLib.dylib; sourceTree = ""; }; + 83AC196B120FF90600C5A816 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 8DD76F6C0486A84900D96B5E /* otcreatemint */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = otcreatemint; sourceTree = BUILT_PRODUCTS_DIR; }; + C6859E8B029090EE04C91782 /* otcreatemint.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = otcreatemint.1; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 834F388311EEFF05001CFD0F /* libOTLib.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* otcreatemint */ = { + isa = PBXGroup; + children = ( + 834F388211EEFF05001CFD0F /* libOTLib.dylib */, + 83AC196B120FF90600C5A816 /* Makefile */, + 08FB7795FE84155DC02AAC07 /* Source */, + C6859E8C029090F304C91782 /* Documentation */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = otcreatemint; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 08FB7796FE84155DC02AAC07 /* main.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* otcreatemint */, + ); + name = Products; + sourceTree = ""; + }; + C6859E8C029090F304C91782 /* Documentation */ = { + isa = PBXGroup; + children = ( + C6859E8B029090EE04C91782 /* otcreatemint.1 */, + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* otcreatemint */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "otcreatemint" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = otcreatemint; + productInstallPath = "$(HOME)/bin"; + productName = otcreatemint; + productReference = 8DD76F6C0486A84900D96B5E /* otcreatemint */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "otcreatemint" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* otcreatemint */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* otcreatemint */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DD76F650486A84900D96B5E /* main.cpp in Sources */, + 83AC196C120FF90600C5A816 /* Makefile in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = otcreatemint; + }; + name = Debug; + }; + 1DEB923308733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = otcreatemint; + }; + name = Release; + }; + 1DEB923608733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "/Users/REDACTED/Projects/Open-Transactions/OTLib"; + }; + name = Debug; + }; + 1DEB923708733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + OTHER_LDFLAGS = ( + "-lssl", + "-lcrypto", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "/Users/REDACTED/Projects/Open-Transactions/OTLib"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "otcreatemint" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug */, + 1DEB923308733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "otcreatemint" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug */, + 1DEB923708733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/util/signcontract/Makefile b/util/signcontract/Makefile new file mode 100644 index 000000000..7a4c67533 --- /dev/null +++ b/util/signcontract/Makefile @@ -0,0 +1,270 @@ +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = signcontract.exe + +DEBUG_PROGRAM = signcontract.debug + + + +# Find out what platform we're on. +UNAME := $(shell uname -s) + +OT_PLATFORM := ___OT_PLATFORM_UNKNOWN___ + + +# --------------------------------------------------------------------- + +ifeq ($(FELLOW_TRAVELER), 1) +FT_FLAGS = -DFELLOW_TRAVELER +else +FT_FLAGS = #empty +endif + +# --------------------------------------------------------------------- + +ifeq ($(DSP), 1) +FT_FLAGS += -DDSP +endif + +# --------------------------------------------------------------------- + +# I allow the user the option to force-override the build platform. +# Using make PLATFORM=darwin, for example, you will build in darwin mode +# even if you are on a linux box. +# + +ifeq ($(PLATFORM), darwin) +UNAME := Darwin +endif +ifeq ($(PLATFORM), linux) +UNAME := Linux +endif +ifeq ($(PLATFORM), freebsd) +UNAME := FreeBSD +endif + +ifeq ($(UNAME), Darwin) +OT_PLATFORM := darwin +endif +ifeq ($(UNAME), Linux) +OT_PLATFORM := linux +endif +ifeq ($(UNAME), FreeBSD) +OT_PLATFORM := freebsd +endif + + +PLATFORM = $(OT_PLATFORM) + + + +OT_INCLUDEDIRS = \ + -I../../OTLib/irrxml \ + -I../../OTLib \ + -I../../OTLib/simpleini \ + -I./ + + +OT_LIBDIRS = \ + -L../../OTLib + +API_CXXSOURCES = # empty +API_CFLAGS = # empty +API_LDFLAGS = # empty + + +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +#API_LIBS = -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +#API_DEBUG_LIBS = -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd + + + +LINUX_LIBDIR = lib +LBITS := $(shell getconf LONG_BIT) +ifeq ($(LBITS),64) +LINUX_LIBDIR = lib64 +endif + +# SSL Folders! + +# For Darwin I use /opt instead of /usr, since OpenSSL 1.0.0a is +# installed to that location by MacPorts. +# +ifeq ($(PLATFORM), darwin) +SSL_INCLUDEDIRS = -I/opt/local/include +SSL_LIBDIRS = -L/opt/local/lib +endif + +ifeq ($(PLATFORM), linux) +SSL_INCLUDEDIRS = -I/usr/local/ssl/include +SSL_LIBDIRS = -L/usr/local/ssl/$(LINUX_LIBDIR) +endif + +ifeq ($(PLATFORM), freebsd) +SSL_INCLUDEDIRS = -I/usr/local/include +SSL_LIBDIRS = -L/usr/local/lib +#SSL_LIBDIRS = -L/usr/ports/security/openssl/work/openssl-1.0.0c +endif + + +# --------------------------------------------------------------------- + + + +ifeq ($(DSP), 1) +OT_UTIL_PLATFORM_INCLUDEDIRS = -I../../openssl/include +OT_UTIL_PLATFORM_LIBDIRS = -L../../openssl +else +OT_UTIL_PLATFORM_INCLUDEDIRS = #empty +OT_UTIL_PLATFORM_LIBDIRS = #empty +endif + +# --------------------------------------------------------------------- + + + + + +# +# Eventually more platform stuff can go below here, like 64-bit, etc. +# +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +API_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd +endif +# End DARWIN ------------------------------------------------------------- + + + +ifeq ($(PLATFORM), linux) + +API_LDFLAGS += -ldl + +API_LIBS = -lOTLib -lssl -lcrypto -lprotobuf -lmsgpack +API_DEBUG_LIBS = -lOTLibd -lssl -lcrypto -lprotobuf -lmsgpack + +endif +# End LINUX ------------------------------------------------------------- + + + + +# --- FreeBSD ---- + +ifeq ($(PLATFORM), freebsd) +API_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLib +API_DEBUG_LIBS = -lssl -lcrypto -lprotobuf -lmsgpack -lOTLibd +endif +# End FreeBSD ------------------------------------------------------------- + + + + +INCLUDEDIRS = $(OT_UTIL_PLATFORM_INCLUDEDIRS) $(SSL_INCLUDEDIRS) $(OT_INCLUDEDIRS) + +LIBDIRS = $(OT_UTIL_PLATFORM_LIBDIRS) $(SSL_LIBDIRS) $(OT_LIBDIRS) + + +CXXSOURCES = \ + main.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +CXXFLAGS = $(INCLUDEDIRS) $(API_CFLAGS) $(FT_FLAGS) -c +DEBUG_FLAGS = -g +CXX = g++ + +LIBS = $(API_LIBS) +DEBUG_LIBS = $(API_DEBUG_LIBS) + +# --- LDFLAGS +# +LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(API_LDFLAGS) $(LIBDIRS) $(DEBUG_LIBS) + + + + + + + +# --------------------------------------------------------------------- + +# --- DARWIN +# +ifeq ($(PLATFORM), darwin) +LINK_COMMAND = $(CXX) $(LDFLAGS) -o $(PROGRAM) $(CXXOBJECTS) +DEBUG_LINK_COMMAND = $(CXX) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) $(CXXOBJECTS) +endif +# End DARWIN ------------------------------------------------------------- + +ifeq ($(PLATFORM), linux) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End LINUX ------------------------------------------------------------- + +# --- FreeBSD ---- +ifeq ($(PLATFORM), freebsd) +LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(LDFLAGS) -o $(PROGRAM) +DEBUG_LINK_COMMAND = $(CXX) $(CXXOBJECTS) $(DEBUG_LDFLAGS) -o $(DEBUG_PROGRAM) +endif +# End FreeBSD ------------------------------------------------------------- + + + + +# --------------------------------------------------------------------- + +# --- TARGETS + +# +# Default target: the first target is the default target. +# Just type "make PLATFORM=darwin" to build it. +# + +$(PROGRAM): $(CXXOBJECTS) + $(LINK_COMMAND) + +all: $(PROGRAM) + +debug: CXXFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(CXXOBJECTS) $(COBJECTS) + $(DEBUG_LINK_COMMAND) + + + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +main.o: main.cpp + $(CXX) $(CXXFLAGS) -c -o main.o main.cpp + +# +# +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) + diff --git a/util/signcontract/Makefile.linux b/util/signcontract/Makefile.linux new file mode 100644 index 000000000..830a3664f --- /dev/null +++ b/util/signcontract/Makefile.linux @@ -0,0 +1,112 @@ +# +# The PROGRAM macro defines the name of the program or project. It +# allows the program name to be changed by editing in only one +# location +# + +PROGRAM = signcontract.exe + +DEBUG_PROGRAM = signcontract.debug + +# +# Command line parameters: Edit these parameters so that you can +# easily run the sample by typing "make -f Makefile.Linux run". +# + +# +# The INCLUDEDIRS macro contains a list of include directories +# to pass to the compiler so it can find necessary header files. +# +# The LIBDIRS macro contains a list of library directories +# to pass to the linker so it can find necessary libraries. +# +# The LIBS macro contains a list of libraries that the the +# executable must be linked against. +# + +INCLUDEDIRS = \ + -I/usr/local/ssl/include \ + -I../../OTLib/irrxml \ + -I../../OTLib \ + -I./ + + +LIBDIRS = \ + -L../../OTLib + + +LIBS = -ldl $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLib $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLib +DEBUG_LIBS = -ldl $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLibd $(LIBDIRS) -lssl $(LIBDIRS) -lcrypto $(LIBDIRS) -lOTLibd + +# +# The CXXSOURCES macro contains a list of source files. +# +# The CXXOBJECTS macro converts the CXXSOURCES macro into a list +# of object files. +# +# The CXXFLAGS macro contains a list of options to be passed to +# the compiler. Adding "-g" to this line will cause the compiler +# to add debugging information to the executable. +# +# The CXX macro defines the C++ compiler. +# +# The LDFLAGS macro contains all of the library and library +# directory information to be passed to the linker. +# + +CXXSOURCES = \ + main.cpp + +CXXOBJECTS = $(CXXSOURCES:.cpp=.o) # expands to list of object files +CXXFLAGS = $(INCLUDEDIRS) +DEBUG_FLAGS = -g +CXX = g++ +LDFLAGS = $(LIBDIRS) $(LIBS) +DEBUG_LDFLAGS = $(LIBDIRS) $(DEBUG_LIBS) + +# +# Default target: the first target is the default target. +# + +all: $(PROGRAM) + +debug: CXXFLAGS += $(DEBUG_FLAGS) +debug: LIBS = $(DEBUG_LIBS) +debug: LDFLAGS = $(DEBUG_LDFLAGS) +debug: $(DEBUG_PROGRAM) + +# +# Link target: automatically builds its object dependencies before +# executing its link command. +# + +$(DEBUG_PROGRAM): $(CXXOBJECTS) + $(CXX) $(CXXOBJECTS) $(DEBUG_LIBS) -o $@ + +$(PROGRAM): $(CXXOBJECTS) + $(CXX) $(CXXOBJECTS) $(LIBS) -o $@ + +# +# Object targets: rules that define objects, their dependencies, and +# a list of commands for compilation. +# + +main.o: main.cpp + $(CXX) $(CXXFLAGS) -c -o main.o main.cpp + + +# +# +RM=rm + +clean: + $(RM) -f $(CXXOBJECTS) $(PROGRAM) $(DEBUG_PROGRAM) + +# +# Run target: "make -f Makefile.Linux run" to execute the application +# You will need to add $(VARIABLE_NAME) for any command line parameters +# that you defined earlier in this file. +# + +run: + ./$(PROGRAM) diff --git a/util/signcontract/main.cpp b/util/signcontract/main.cpp new file mode 100755 index 000000000..f0db38277 --- /dev/null +++ b/util/signcontract/main.cpp @@ -0,0 +1,124 @@ +extern "C" +{ +#include + +#include +} + +#include +#include +#include +#include + + +#include "OTStorage.h" + +#include "OTString.h" +#include "OTIdentifier.h" +#include "OTPseudonym.h" +#include "OTAssetContract.h" +#include "OTServerContract.h" +#include "OTSignedFile.h" +#include "OTLog.h" + + +// Run this program from inside the testwallet directory. + +int main (int argc, char * const argv[]) +{ + + if (argc < 5) + { + printf("Usage: signcontract s|a signer_nym_id path/to/data_folder path/to/unsigned/contract_file\n" + "Use 's' when signing a server contract, and 'a' for an asset contract.\n\n"); + exit(1); + } + + SSL_library_init(); + SSL_load_error_strings(); + +// std::string strDataFolderPath("/Users/Chris/Projects/Open-Transactions/testwallet/data_folder"), + + std::string strDataFolderPath(argv[3]), + strWalletFile("wallet.xml"); + bool bSuccessInitDefault = OTDB::InitDefaultStorage(OTDB_DEFAULT_STORAGE, + OTDB_DEFAULT_PACKER, strDataFolderPath, strWalletFile); + + bool bIsServerContract = (*(argv[1]) == 's') ? true : false; + + OTString strNymID(argv[2]), strContractFile(argv[4]); + OTString NymName(strNymID), NymFile; + + NymFile.Format("%s%s%s%s%s", OTLog::Path(), + OTLog::PathSeparator(), + OTLog::NymFolder(), + OTLog::PathSeparator(), strNymID.Get()); + + OTPseudonym theNym(NymName, NymFile, strNymID); + + OTSignedFile theFile("nyms", strNymID.Get()); + + // --------------------------------- + + + // -------------------------------- + + if (theFile.LoadFile()) + { + OTString strFileContents(theFile.GetFilePayload()); + + if (theNym.Loadx509CertAndPrivateKey() && theNym.VerifyPseudonym()) + { + // LoadFile() loads the OTSignedFile that contains the nym. + // VerifyFile() insures that the name I thought it would have, and + // where it was found, matches the name inside the file. + // VerifySignature() makes sure that the Nym signed it. + // (Won't work on server sign where Nyms don't sign themselves.) + // LoadFromString() loads the Nym object out of the string from the OTSignedFile. + // + if ( + //theFile.VerifyFile() && + //theFile.VerifySignature(theNym) && + theNym.LoadFromString(strFileContents)) + { + std::ifstream in(strContractFile.Get()); + + std::stringstream buffer; + buffer << in.rdbuf(); + + std::string contents(buffer.str()); + + OTString strContract(contents.c_str()); + + if (strContract.GetLength()) + { + OTAssetContract theAssetContract; + OTServerContract theServerContract; + + if (bIsServerContract) + theServerContract.CreateContract(strContract, theNym); + else + theAssetContract.CreateContract(strContract, theNym); + + OTString strOutput, strDigest; + + if (bIsServerContract) + { + theServerContract.GetIdentifier(strDigest); + theServerContract.SaveContract(strOutput); + } + else + { + theAssetContract.GetIdentifier(strDigest); + theAssetContract.SaveContract(strOutput); + } + + fprintf(stdout, "\n\n Contract ID:\n%s\n\nContract:\n%s\n", + strDigest.Get(), strOutput.Get()); + } + } + } + } + + return 0; +} diff --git a/util/signcontract/signcontract.xcodeproj/project.pbxproj b/util/signcontract/signcontract.xcodeproj/project.pbxproj new file mode 100644 index 000000000..01a7bd6d0 --- /dev/null +++ b/util/signcontract/signcontract.xcodeproj/project.pbxproj @@ -0,0 +1,229 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 830EC9A411F8F27200198F04 /* libOTLib.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 830EC9A311F8F27200198F04 /* libOTLib.dylib */; }; + 837720D2121438E4003712F8 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 837720D1121438E4003712F8 /* Makefile */; }; + 8DD76F650486A84900D96B5E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* main.cpp */; settings = {ATTRIBUTES = (); }; }; + 8DD76F6A0486A84900D96B5E /* signcontract.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859E8B029090EE04C91782 /* signcontract.1 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 8DD76F6A0486A84900D96B5E /* signcontract.1 in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 08FB7796FE84155DC02AAC07 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 830EC9A311F8F27200198F04 /* libOTLib.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libOTLib.dylib; sourceTree = ""; }; + 837720D1121438E4003712F8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 8DD76F6C0486A84900D96B5E /* signcontract */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = signcontract; sourceTree = BUILT_PRODUCTS_DIR; }; + C6859E8B029090EE04C91782 /* signcontract.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = signcontract.1; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 830EC9A411F8F27200198F04 /* libOTLib.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* signcontract */ = { + isa = PBXGroup; + children = ( + 837720D1121438E4003712F8 /* Makefile */, + 830EC9A311F8F27200198F04 /* libOTLib.dylib */, + 08FB7795FE84155DC02AAC07 /* Source */, + C6859E8C029090F304C91782 /* Documentation */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = signcontract; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 08FB7796FE84155DC02AAC07 /* main.cpp */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* signcontract */, + ); + name = Products; + sourceTree = ""; + }; + C6859E8C029090F304C91782 /* Documentation */ = { + isa = PBXGroup; + children = ( + C6859E8B029090EE04C91782 /* signcontract.1 */, + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* signcontract */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "signcontract" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = signcontract; + productInstallPath = "$(HOME)/bin"; + productName = signcontract; + productReference = 8DD76F6C0486A84900D96B5E /* signcontract */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "signcontract" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* signcontract */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* signcontract */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DD76F650486A84900D96B5E /* main.cpp in Sources */, + 837720D2121438E4003712F8 /* Makefile in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = signcontract; + }; + name = Debug; + }; + 1DEB923308733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + INSTALL_PATH = /usr/local/bin; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + PRODUCT_NAME = signcontract; + }; + name = Release; + }; + 1DEB923608733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-lcrypto", + "-lssl", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "/Users/REDACTED/Projects/Open-Transactions/OTLib"; + }; + name = Debug; + }; + 1DEB923708733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + OTHER_LDFLAGS = ( + "-lcrypto", + "-lssl", + ); + PREBINDING = NO; + SDKROOT = macosx10.6; + USER_HEADER_SEARCH_PATHS = "/Users/REDACTED/Projects/Open-Transactions/OTLib"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "signcontract" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug */, + 1DEB923308733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "signcontract" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug */, + 1DEB923708733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +}

Vi12?SCpdL4KK_3ya{A|yI&vDZ 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

k`=**u~#K8_87BP>c#D0LpC1u7WD6JZ-KT0Bz1i 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